1 <?php // vim: set binary noeol et sts=4 sw=4 :
4 require_once 'DB/DataObject.php';
5 require_once 'T/code.php';
6 require_once 'T/Prueba.php';
8 define('DATE_FORMAT', '%Y-%m-%d %H:%M:%S.000000');
10 /// @todo Poner todos los querys con quoting ('?').
11 /// @todo Mejorar manejo de errores con PEAR.
24 function T_Intento($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
26 $this->__construct($padron, $ej, $ent, $intento, $cuat);
32 function __construct($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
34 $this->padron = $padron;
35 $this->ejercicio = $ej;
36 $this->entrega = $ent;
37 $this->intento = $intento;
38 $this->cuatrimestre = $cuat;
39 $this->base_dir = 'intentos';
43 * Representación de string
49 Padrón: {$this->padron}
50 Ejercicio: {$this->ejercicio}
51 Entrega: {$this->entrega}
52 Cuatrimestre: {$this->cuatrimestre}
53 Intento: {$this->intento}
58 * Muestra el intento como una línea.
62 return "{$this->padron} {$this->ejercicio}.{$this->entrega}.{$this->intento} {$this->cuatrimestre}";
66 * Toma de los atributos publicos padron, entrega y ejercicio
67 * En el atributo publico intento deja el numero de intento que corresponderia
68 * a esta entrega del alumno y en cuatrimestre el cuatrimestre en que cursa
69 * @param code Código verificador
70 * @param clave Clave a utilizar para validar el código
71 * @return string con la descripcion del error, si esta vacio fue ok
73 function validar_entrega($code, $claves)
75 $inscripto = DB_DataObject::factory('inscripto');
76 if (!$inscripto->getFrom($this->padron)) return 'El alumno no está inscripto';
77 $inscripto->getLinks();
78 $cuat = $inscripto->_curso_id->toLine();
79 $this->cuatrimestre = $cuat;
80 if (!T_chequear_codigo($code, $this->padron, $claves))
81 return 'La clave de la entrega no es válida';
82 $this->llegada = time();
83 $date = strftime(DATE_FORMAT, $this->llegada);
84 $entrega = DB_DataObject::factory('entrega');
85 $entrega->getFrom($inscripto->curso_id, $this->ejercicio, $this->entrega);
86 if (!($entrega->desde <= $date and $entrega->hasta >= $date)) return 'El ejercicio está siendo entregado fuera de fecha';
87 $intento = DB_DataObject::factory('intento');
88 $intento->id_entrega = $entrega->id;
89 $intento->id_inscripto = $inscripto->id;
90 $cant = $intento->find();
91 $this->intento = 1 + $cant;
92 $this->id_entrega = $entrega->id;
93 $this->id_inscripto = $inscripto->id;
98 * Toma de los atributos publicos cuatrimestre, padron, entrega, ejercicio, mail e intento
99 * Debería llamarse antes a validar_entrega siempre
100 * En el atributo publico intento deja el numero de intento del alumno
101 * @param mail Mail con el que se recibió la entrega
102 * @return resultado del query
104 function hacer_entrega($mail)
106 $intento = DB_DataObject::factory('intento');
107 $intento->inscripto_id = $this->id_inscripto;
108 $intento->entrega_id = $this->id_entrega;
109 $intento->numero = $this->intento;
110 $intento->llegada = strftime(DATE_FORMAT, $this->llegada);
111 $intento->mail_respuesta = $mail;
112 return $intento->insert();
116 * Toma de los atributos publicos cuatrimestre, padron, entrega, ejerciico e intento
117 * Carga los resultados de una prueba en un nuevo registro en prueba
119 function resultado_de_prueba($prueba, $salida, $descripcion = "")
121 if($memoria)$memoria = 1;
123 if($salida)$salida = 1;
125 $date = date("YmdHis");
126 $this->db->query("INSERT INTO prueba
127 (cuatrimestre, padron, ejercicio, entrega, intento, caso_de_prueba, memoria_ok, salida_ok, descripcion)
128 VALUES ($this->cuatrimestre, $this->padron, $this->ejercicio, $this->entrega, $this->intento, $prueba->id,
129 $prueba->memoria, $salida, '$descripcion')");
130 $this->db->query("UPDATE intento SET fin_pruebas = '$date'
131 WHERE cuatrimestre = {$this->cuatrimestre} AND
132 padron = {$this->padron} AND
133 ejercicio = {$this->ejercicio} AND
134 entrega = {$this->entrega} AND
135 intento = {$this->intento}");
139 * Busca una de los intentos no notificados cual tiene todas las pruebas terminadas y la
140 * hora de llegada + $hora es menor que ahora. el registro despues se marca como notificado.
141 * Deja en los atributos publicos cuatrimestre, padron, ejercicio, entrega, intento y mail
142 * en mail deja la suma del mail del intento y del mail del alumno
143 * devuelve el/los mails a donde mandar la notificación si encuentra alguno y false sino
145 function notificacion_pendiente($horas = 1)
147 $date = date("YmdHis");
148 $date -= 10000*$horas;
149 $row = $this->db->getRow("SELECT I.cuatrimestre as cuatrimestre, I.padron, I.ejercicio as ejercicio,
150 I.entrega as entrega, I.intento, I.mail
151 FROM intento I JOIN prueba P ON (I.ejercicio = P.ejercicio AND
152 I.cuatrimestre = P.cuatrimestre AND
153 I.entrega = P.entrega AND
154 I.padron = P.padron AND
155 I.intento = P.intento)
156 WHERE notificado is null
157 AND '$date' >= I.llegada
158 GROUP BY I.cuatrimestre, I.padron, I.ejercicio, I.entrega, I.intento, I.mail
159 HAVING count(P.memoria_ok) = (
160 SELECT count(1) FROM caso_de_prueba C
161 WHERE ejercicio = C.ejercicio AND
162 entrega = C.entrega AND
163 cuatrimestre = C.cuatrimestre)");
165 if(is_null($row) || is_a($row, "db_error")) return false;
166 $this->cuatrimestre = $row[0];
167 $this->padron = $row[1];
168 $this->ejercicio = $row[2];
169 $this->entrega = $row[3];
170 $this->intento = $row[4];
172 $this->db->query("UPDATE intento SET notificado = 1
173 WHERE cuatrimestre = $this->cuatrimestre and
174 padron = $this->padron and
175 ejercicio = $this->ejercicio and
176 entrega = $this->entrega and
177 intento = $this->intento");
178 $mail2 = $this->db->getOne("select mail_alumno FROM alumno
179 WHERE cuatrimestre = $this->cuatrimestre AND
180 padron = $this->padron");
181 if(strtolower($mail) != strtolower($mail2)) $mail .= ";$mail2";
187 * Obtiene el directorio en el cual se almacena el intento.
190 return $this->base_path() . "/{$this->padron}/{$this->intento}";
194 * Obtiene el directorio base de la entrega.
195 * El directorio base no contempla los datos propios del intento, como
197 * @param base_dir Directorio base, si no se especifica se usa el directorio
200 function base_path($base_dir = null) {
201 if (is_null($base_dir)) $base_dir = $this->base_dir;
202 return "$base_dir/{$this->cuatrimestre}/{$this->ejercicio}-{$this->entrega}";