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 /// @todo Poner todos los querys con quoting ('?').
9 /// @todo Mejorar manejo de errores con PEAR.
22 function T_Intento($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
24 $this->__construct($padron, $ej, $ent, $intento, $cuat);
30 function __construct($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
32 $this->padron = $padron;
33 $this->ejercicio = $ej;
34 $this->entrega = $ent;
35 $this->intento = $intento;
36 $this->cuatrimestre = $cuat;
37 $this->base_dir = 'intentos';
41 * Representación de string
47 Padrón: {$this->padron}
48 Ejercicio: {$this->ejercicio}
49 Entrega: {$this->entrega}
50 Cuatrimestre: {$this->cuatrimestre}
51 Intento: {$this->intento}
56 * Muestra el intento como una línea.
60 return "{$this->padron} {$this->ejercicio}.{$this->entrega}.{$this->intento} {$this->cuatrimestre}";
64 * Toma de los atributos publicos padron, entrega y ejercicio
65 * En el atributo publico intento deja el numero de intento que corresponderia
66 * a esta entrega del alumno y en cuatrimestre el cuatrimestre en que cursa
67 * @param code Código verificador
68 * @param clave Clave a utilizar para validar el código
69 * @return string con la descripcion del error, si esta vacio fue ok
71 function validar_entrega($code, $claves)
73 $query = "SELECT C.id, C.anio, C.cuatrimestre, C.curso
74 FROM alumno A JOIN cuatrimestre C ON (A.id_cuatrimestre = C.id)
75 WHERE A.padron = {$this->padron} AND C.activo = 1";
76 $inscripto = DB_DataObject::factory('inscripto');
77 if (!$inscripto->getFrom($this->padron)) return 'El alumno no está inscripto';
78 $inscripto->getLinks();
79 $cuat = $inscripto->_curso_id->toLine();
80 $this->cuatrimestre = $cuat;
81 if (!T_chequear_codigo($code, $this->padron, $claves))
82 return 'La clave de la entrega no es válida';
83 $this->llegada = time();
84 $date = date('Y-m-d H:i:s', $this->llegada);
85 $entrega = DB_DataObject::factory('entrega');
86 $entrega->getFrom($inscripto->curso_id, $this->ejercicio, $this->entrega);
88 var_dump($inscripto->id);
89 var_dump($inscripto->curso_id);
90 var_dump($entrega->id);
91 # 2005-01-06, 2005-02-26 20:00:00, 2005-02-03 19:48:15
92 var_dump($entrega->desde, $entrega->hasta, $date);
93 var_dump($entrega->desde <= $date);
94 var_dump($entrega->hasta >= $date);
95 if (!($entrega->desde <= $date and $entrega->hasta >= $date)) return 'El ejercicio está siendo entregado fuera de fecha';
96 $intento = DB_DataObject::factory('intento');
97 $intento->id_entrega = $entrega->id;
98 $intento->id_inscripto = $inscripto->id;
99 $cant = $intento->find();
100 $this->intento = 1 + $cant;
101 $this->id_entrega = $entrega->id;
102 $this->id_inscripto = $inscripto->id;
107 * Toma de los atributos publicos cuatrimestre, padron, entrega, ejercicio, mail e intento
108 * Debería llamarse antes a validar_entrega siempre
109 * En el atributo publico intento deja el numero de intento del alumno
110 * @param mail Mail con el que se recibió la entrega
111 * @return resultado del query
113 function hacer_entrega($mail)
115 $intento = DB_DataObject::factory('intento');
116 $intento->inscripto_id = $this->id_inscripto;
117 $intento->entrega_id = $this->id_entrega;
118 $intento->numero = $this->intento;
119 $intento->llegada = date('Y-m-d H:i:s', $this->llegada);
120 $intento->mail_respuesta = $mail;
121 return $intento->insert();
125 * Pone en los atributos publicos cuatrimestre, padron, entrega, ejercicio e intento
126 * retorna true si encuentra alguno y false sino.
128 function proximo_a_probar()
130 $result = $this->db->getRow("SELECT cuatrimestre, padron, ejercicio, entrega, intento, mail
132 WHERE inicio_pruebas is null
135 if (DB::isError($result) or is_null($result)) return false;
136 $date = date('YmdHis');
137 $this->cuatrimestre = $result[0];
138 $this->padron = $result[1];
139 $this->ejercicio = $result[2];
140 $this->entrega = $result[3];
141 $this->intento = $result[4];
142 $this->db->query("UPDATE intento SET inicio_pruebas = '$date'
143 WHERE cuatrimestre = {$this->cuatrimestre} AND
144 padron = {$this->padron} AND
145 ejercicio = {$this->ejercicio} AND
146 entrega = {$this->entrega} AND
147 intento = {$this->intento}");
152 * Toma de los atributos publicos cuatrimestre, padron, entrega, ejercicio e intento
153 * el parametro indica si compilo ok es true, sino es false
155 function informar_compilacion($compilo_ok)
157 if ($compilo_ok) $compilo_ok = 1;
158 else $compilo_ok = 0;
159 $date = date('YmdHis');
161 return $this->db->query("
162 UPDATE intento SET fin_pruebas = '$date' AND compila_ok = $compilo_ok
163 WHERE cuatrimestre = {$this->cuatrimestre} AND
164 padron = {$this->padron} AND
165 ejercicio = {$this->ejercicio} AND
166 entrega = {$this->entrega} AND
167 intento = {$this->intento}");
171 * Toma de los atributos publicos cuatrimestre, padron, entrega, ejercicio e intento
172 * carga el atributo publico caso_de_prueba con el proximo caso de prueba a usar
173 * devuelve true si encuentra alguno, sino devuelve false
175 function pedir_caso_de_prueba()
177 $prueba = $this->db->getRow("
178 SELECT C.caso_de_prueba, C.privado, C.descripcion, C.parametros, C.salidas
179 FROM caso_de_prueba as C
180 WHERE C.cuatrimestre = $this->cuatrimestre AND
181 C.ejercicio = $this->ejercicio AND
182 C.entrega = $this->entrega AND
183 C.caso_de_prueba NOT IN (
184 SELECT P.caso_de_prueba from prueba as P
185 WHERE P.cuatrimestre = $this->cuatrimestre
186 AND P.entrega = $this->entrega
187 AND P.ejercicio = $this->ejercicio
188 AND P.padron = $this->padron
189 AND P.intento = $this->intento
191 if (!is_null($prueba) && !DB::isError($prueba)) {
192 list($id, $priv, $desc, $params, $salidas) = $prueba;
193 return new T_Prueba($id, $priv, $desc, $params, $salidas);
199 * Toma de los atributos publicos cuatrimestre, padron, entrega, ejerciico e intento
200 * Carga los resultados de una prueba en un nuevo registro en prueba
202 function resultado_de_prueba($prueba, $salida, $descripcion = "")
204 if($memoria)$memoria = 1;
206 if($salida)$salida = 1;
208 $date = date("YmdHis");
209 $this->db->query("INSERT INTO prueba
210 (cuatrimestre, padron, ejercicio, entrega, intento, caso_de_prueba, memoria_ok, salida_ok, descripcion)
211 VALUES ($this->cuatrimestre, $this->padron, $this->ejercicio, $this->entrega, $this->intento, $prueba->id,
212 $prueba->memoria, $salida, '$descripcion')");
213 $this->db->query("UPDATE intento SET fin_pruebas = '$date'
214 WHERE cuatrimestre = {$this->cuatrimestre} AND
215 padron = {$this->padron} AND
216 ejercicio = {$this->ejercicio} AND
217 entrega = {$this->entrega} AND
218 intento = {$this->intento}");
222 * Busca una de los intentos no notificados cual tiene todas las pruebas terminadas y la
223 * hora de llegada + $hora es menor que ahora. el registro despues se marca como notificado.
224 * Deja en los atributos publicos cuatrimestre, padron, ejercicio, entrega, intento y mail
225 * en mail deja la suma del mail del intento y del mail del alumno
226 * devuelve el/los mails a donde mandar la notificación si encuentra alguno y false sino
228 function notificacion_pendiente($horas = 1)
230 $date = date("YmdHis");
231 $date -= 10000*$horas;
232 $row = $this->db->getRow("SELECT I.cuatrimestre as cuatrimestre, I.padron, I.ejercicio as ejercicio,
233 I.entrega as entrega, I.intento, I.mail
234 FROM intento I JOIN prueba P ON (I.ejercicio = P.ejercicio AND
235 I.cuatrimestre = P.cuatrimestre AND
236 I.entrega = P.entrega AND
237 I.padron = P.padron AND
238 I.intento = P.intento)
239 WHERE notificado is null
240 AND '$date' >= I.llegada
241 GROUP BY I.cuatrimestre, I.padron, I.ejercicio, I.entrega, I.intento, I.mail
242 HAVING count(P.memoria_ok) = (
243 SELECT count(1) FROM caso_de_prueba C
244 WHERE ejercicio = C.ejercicio AND
245 entrega = C.entrega AND
246 cuatrimestre = C.cuatrimestre)");
248 if(is_null($row) || is_a($row, "db_error")) return false;
249 $this->cuatrimestre = $row[0];
250 $this->padron = $row[1];
251 $this->ejercicio = $row[2];
252 $this->entrega = $row[3];
253 $this->intento = $row[4];
255 $this->db->query("UPDATE intento SET notificado = 1
256 WHERE cuatrimestre = $this->cuatrimestre and
257 padron = $this->padron and
258 ejercicio = $this->ejercicio and
259 entrega = $this->entrega and
260 intento = $this->intento");
261 $mail2 = $this->db->getOne("select mail_alumno FROM alumno
262 WHERE cuatrimestre = $this->cuatrimestre AND
263 padron = $this->padron");
264 if(strtolower($mail) != strtolower($mail2)) $mail .= ";$mail2";
270 * Obtiene el directorio en el cual se almacena el intento.
273 return $this->base_path() . "/{$this->padron}/{$this->intento}";
277 * Obtiene el directorio base de la entrega.
278 * El directorio base no contempla los datos propios del intento, como
280 * @param base_dir Directorio base, si no se especifica se usa el directorio
283 function base_path($base_dir = null) {
284 if (is_null($base_dir)) $base_dir = $this->base_dir;
285 return "$base_dir/{$this->cuatrimestre}/{$this->ejercicio}-{$this->entrega}";