]> git.llucax.com Git - software/sercom-old.git/blob - src/T/Intento.php
Bugfix: faltaba copiar las entradas al chroot de las pruebas.
[software/sercom-old.git] / src / T / Intento.php
1 <?php // vim: set binary noeol et sts=4 sw=4 :
2
3 require_once 'DB.php';
4 require_once 'DB/DataObject.php';
5 require_once 'T/code.php';
6 require_once 'T/Prueba.php';
7
8 define('DATE_FORMAT', '%Y-%m-%d %H:%M:%S.000000');
9
10 /// @todo Poner todos los querys con quoting ('?').
11 /// @todo Mejorar manejo de errores con PEAR.
12 class T_Intento
13 {
14     var $base_dir;
15     var $cuatrimestre;
16     var $padron;
17     var $entrega;
18     var $ejercicio;
19     var $intento;
20
21     /**
22      * Constructor.
23      */
24     function T_Intento($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
25     {
26         $this->__construct($padron, $ej, $ent, $intento, $cuat);
27     }
28
29     /**
30      * Constructor (PHP5).
31      */
32     function __construct($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
33     {
34         $this->padron = $padron;
35         $this->ejercicio = $ej;
36         $this->entrega = $ent;
37         $this->intento = $intento;
38         $this->cuatrimestre = $cuat;
39     }
40
41     /**
42      * Representación de string
43      */
44     function __toString()
45     {
46         return <<<EOT
47 Entrega:
48     Padrón:       {$this->padron}
49     Ejercicio:    {$this->ejercicio}
50     Entrega:      {$this->entrega}
51     Cuatrimestre: {$this->cuatrimestre}
52     Intento:      {$this->intento}
53 EOT;
54     }
55
56     /**
57      * Muestra el intento como una línea.
58      */
59     function to_line()
60     {
61         return "{$this->padron} {$this->ejercicio}.{$this->entrega}.{$this->intento} {$this->cuatrimestre}";
62     }
63
64     /**
65      *  Toma de los atributos publicos padron, entrega y ejercicio
66      *  En el atributo publico intento deja el numero de intento que corresponderia
67      *  a esta entrega del alumno y en cuatrimestre el cuatrimestre en que cursa
68      *  @param  code  Código verificador
69      *  @param  clave Clave a utilizar para validar el código
70      *  @return string con la descripcion del error, si esta vacio fue ok
71      */
72     function validar_entrega($code, $claves)
73     {
74         $inscripto = DB_DataObject::factory('inscripto');
75         if (!$inscripto->getFrom($this->padron)) return 'El alumno no está inscripto';
76         $inscripto->getLinks();
77         $cuat = $inscripto->_curso_id->toLine();
78         $this->inscripto = $inscripto;
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->entrega_id = $entrega->id;
89         $intento->inscripto_id = $inscripto->id;
90         $cant = $intento->find();
91         $this->intento = 1 + $cant;
92         $this->id_entrega = $entrega->id;
93         $this->id_inscripto = $inscripto->id;
94         return '';  
95     }
96
97     /**
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
103      */
104     function hacer_entrega($mail)
105     {
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();
113     }
114
115     /**
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
118      */
119     function resultado_de_prueba($prueba, $salida, $descripcion = "")
120     {
121         if($memoria)$memoria = 1;
122         else $memoria = 0;
123         if($salida)$salida = 1;
124         else $salida = 0;
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}");
136     }
137
138     /**
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
144      */
145     function notificacion_pendiente($horas = 1)
146     {
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)");
164
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];
171         $mail = $row[5];
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";
182
183         return $mail;
184     }
185
186     /**
187      * Obtiene el directorio base de la entrega.
188      * El directorio base no contempla los datos propios del intento, como
189      * padrón e intento.
190      * @param base_dir Directorio base.
191      */
192     function path($base_dir) {
193         $curso = $this->inscripto->_curso_id;
194         return "$base_dir/{$curso->anio}.{$curso->cuatrimestre}/"
195             . "{$curso->curso}.{$this->ejercicio}.{$this->entrega}/"
196             . "{$this->padron}.{$this->intento}";
197     }
198
199 }
200
201 ?>