]> git.llucax.com Git - software/sercom-old.git/blob - src/T/Intento.php
Se cambia el esquema de la base de datos y se empieza a utilizar PEAR
[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 /// @todo Poner todos los querys con quoting ('?').
9 /// @todo Mejorar manejo de errores con PEAR.
10 class T_Intento
11 {
12     var $base_dir;
13     var $cuatrimestre;
14     var $padron;
15     var $entrega;
16     var $ejercicio;
17     var $intento;
18
19     /**
20      * Constructor.
21      */
22     function T_Intento($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
23     {
24         $this->__construct($padron, $ej, $ent, $intento, $cuat);
25     }
26
27     /**
28      * Constructor (PHP5).
29      */
30     function __construct($padron = null, $ej = null, $ent = null, $intento = null, $cuat = null)
31     {
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';
38     }
39
40     /**
41      * Representación de string
42      */
43     function __toString()
44     {
45         return <<<EOT
46 Entrega:
47     Padrón:       {$this->padron}
48     Ejercicio:    {$this->ejercicio}
49     Entrega:      {$this->entrega}
50     Cuatrimestre: {$this->cuatrimestre}
51     Intento:      {$this->intento}
52 EOT;
53     }
54
55     /**
56      * Muestra el intento como una línea.
57      */
58     function to_line()
59     {
60         return "{$this->padron} {$this->ejercicio}.{$this->entrega}.{$this->intento} {$this->cuatrimestre}";
61     }
62
63     /**
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
70      */
71     function validar_entrega($code, $claves)
72     {
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);
87 var_dump($this);
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;
103         return '';  
104     }
105
106     /**
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
112      */
113     function hacer_entrega($mail)
114     {
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();
122     }
123
124     /**
125      *  Pone en los atributos publicos cuatrimestre, padron, entrega, ejercicio e intento
126      *  retorna true si encuentra alguno y false sino.
127      */
128     function proximo_a_probar()
129     {
130         $result = $this->db->getRow("SELECT cuatrimestre, padron, ejercicio, entrega, intento, mail
131             FROM intento
132             WHERE inicio_pruebas is null
133             ORDER BY llegada
134             LIMIT 1");
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}");
148         return $result[5];
149     }
150
151     /**
152      *  Toma de los atributos publicos cuatrimestre, padron, entrega, ejercicio e intento
153      *  el parametro indica si compilo ok es true, sino es false
154      */
155     function informar_compilacion($compilo_ok)
156     {
157         if ($compilo_ok) $compilo_ok = 1;
158         else             $compilo_ok = 0;
159         $date = date('YmdHis');
160
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}");
168     }
169
170     /**
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
174      */
175     function pedir_caso_de_prueba()
176     {
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
190         )");
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);
194         }
195         return $prueba;
196     }
197
198     /**
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
201      */
202     function resultado_de_prueba($prueba, $salida, $descripcion = "")
203     {
204         if($memoria)$memoria = 1;
205         else $memoria = 0;
206         if($salida)$salida = 1;
207         else $salida = 0;
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}");
219     }
220
221     /**
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
227      */
228     function notificacion_pendiente($horas = 1)
229     {
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)");
247
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];
254         $mail = $row[5];
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";
265
266         return $mail;
267     }
268
269     /**
270      * Obtiene el directorio en el cual se almacena el intento.
271      */
272     function path() {
273         return $this->base_path() . "/{$this->padron}/{$this->intento}";
274     }
275
276     /**
277      * Obtiene el directorio base de la entrega.
278      * El directorio base no contempla los datos propios del intento, como
279      * padrón e intento.
280      * @param base_dir Directorio base, si no se especifica se usa el directorio
281      *                 base del intento.
282      */
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}";
286     }
287
288 }
289
290 ?>