__construct($padron, $ej, $ent, $intento, $cuat); } /** * Constructor (PHP5). */ function __construct($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null) { $this->padron = $padron; $this->ejercicio = $ej; $this->entrega = $ent; $this->intento = $intento; $this->cuatrimestre = $cuat; } /** * Representación de string */ function __toString() { return <<padron} Ejercicio: {$this->ejercicio} Entrega: {$this->entrega} Cuatrimestre: {$this->cuatrimestre} Intento: {$this->intento} EOT; } /** * Muestra el intento como una línea. */ function to_line() { return "{$this->padron} {$this->ejercicio}.{$this->entrega}.{$this->intento} {$this->cuatrimestre}"; } /** * Toma de los atributos publicos padron, entrega y ejercicio * En el atributo publico intento deja el numero de intento que corresponderia * a esta entrega del alumno y en cuatrimestre el cuatrimestre en que cursa * @param code Código verificador * @param clave Clave a utilizar para validar el código * @return string con la descripcion del error, si esta vacio fue ok */ function validar_entrega($code, $claves) { $inscripto = DB_DataObject::factory('inscripto'); if (!$inscripto->getFrom($this->padron)) return 'El alumno no está inscripto'; $inscripto->getLinks(); $cuat = $inscripto->_curso_id->toLine(); $this->inscripto = $inscripto; $this->cuatrimestre = $cuat; if (!T_chequear_codigo($code, $this->padron, $claves)) return 'La clave de la entrega no es válida'; $this->llegada = time(); $date = strftime(DATE_FORMAT, $this->llegada); $entrega = DB_DataObject::factory('entrega'); $entrega->getFrom($inscripto->curso_id, $this->ejercicio, $this->entrega); if (!($entrega->desde <= $date and $entrega->hasta >= $date)) return 'El ejercicio está siendo entregado fuera de fecha'; $intento = DB_DataObject::factory('intento'); $intento->entrega_id = $entrega->id; $intento->inscripto_id = $inscripto->id; $cant = $intento->find(); $this->intento = 1 + $cant; $this->id_entrega = $entrega->id; $this->id_inscripto = $inscripto->id; return ''; } /** * Toma de los atributos publicos cuatrimestre, padron, entrega, ejercicio, mail e intento * Debería llamarse antes a validar_entrega siempre * En el atributo publico intento deja el numero de intento del alumno * @param mail Mail con el que se recibió la entrega * @return resultado del query */ function hacer_entrega($mail) { $intento = DB_DataObject::factory('intento'); $intento->inscripto_id = $this->id_inscripto; $intento->entrega_id = $this->id_entrega; $intento->numero = $this->intento; $intento->llegada = strftime(DATE_FORMAT, $this->llegada); $intento->mail_respuesta = $mail; return $intento->insert(); } /** * Toma de los atributos publicos cuatrimestre, padron, entrega, ejerciico e intento * Carga los resultados de una prueba en un nuevo registro en prueba */ function resultado_de_prueba($prueba, $salida, $descripcion = "") { if($memoria)$memoria = 1; else $memoria = 0; if($salida)$salida = 1; else $salida = 0; $date = date("YmdHis"); $this->db->query("INSERT INTO prueba (cuatrimestre, padron, ejercicio, entrega, intento, caso_de_prueba, memoria_ok, salida_ok, descripcion) VALUES ($this->cuatrimestre, $this->padron, $this->ejercicio, $this->entrega, $this->intento, $prueba->id, $prueba->memoria, $salida, '$descripcion')"); $this->db->query("UPDATE intento SET fin_pruebas = '$date' WHERE cuatrimestre = {$this->cuatrimestre} AND padron = {$this->padron} AND ejercicio = {$this->ejercicio} AND entrega = {$this->entrega} AND intento = {$this->intento}"); } /** * Busca una de los intentos no notificados cual tiene todas las pruebas terminadas y la * hora de llegada + $hora es menor que ahora. el registro despues se marca como notificado. * Deja en los atributos publicos cuatrimestre, padron, ejercicio, entrega, intento y mail * en mail deja la suma del mail del intento y del mail del alumno * devuelve el/los mails a donde mandar la notificación si encuentra alguno y false sino */ function notificacion_pendiente($horas = 1) { $date = date("YmdHis"); $date -= 10000*$horas; $row = $this->db->getRow("SELECT I.cuatrimestre as cuatrimestre, I.padron, I.ejercicio as ejercicio, I.entrega as entrega, I.intento, I.mail FROM intento I JOIN prueba P ON (I.ejercicio = P.ejercicio AND I.cuatrimestre = P.cuatrimestre AND I.entrega = P.entrega AND I.padron = P.padron AND I.intento = P.intento) WHERE notificado is null AND '$date' >= I.llegada GROUP BY I.cuatrimestre, I.padron, I.ejercicio, I.entrega, I.intento, I.mail HAVING count(P.memoria_ok) = ( SELECT count(1) FROM caso_de_prueba C WHERE ejercicio = C.ejercicio AND entrega = C.entrega AND cuatrimestre = C.cuatrimestre)"); if(is_null($row) || is_a($row, "db_error")) return false; $this->cuatrimestre = $row[0]; $this->padron = $row[1]; $this->ejercicio = $row[2]; $this->entrega = $row[3]; $this->intento = $row[4]; $mail = $row[5]; $this->db->query("UPDATE intento SET notificado = 1 WHERE cuatrimestre = $this->cuatrimestre and padron = $this->padron and ejercicio = $this->ejercicio and entrega = $this->entrega and intento = $this->intento"); $mail2 = $this->db->getOne("select mail_alumno FROM alumno WHERE cuatrimestre = $this->cuatrimestre AND padron = $this->padron"); if(strtolower($mail) != strtolower($mail2)) $mail .= ";$mail2"; return $mail; } /** * Obtiene el directorio base de la entrega. * El directorio base no contempla los datos propios del intento, como * padrón e intento. * @param base_dir Directorio base. */ function path($base_dir) { $curso = $this->inscripto->_curso_id; return "$base_dir/{$curso->anio}.{$curso->cuatrimestre}/" . "{$curso->curso}.{$this->ejercicio}.{$this->entrega}/" . "{$this->padron}.{$this->intento}"; } } ?>