]> git.llucax.com Git - software/sercom-old.git/blobdiff - src/sercom/sqlo.py
Nuevo comando para hacer la entrega final de una entrega: sc_deliver.
[software/sercom-old.git] / src / sercom / sqlo.py
index f4824df116387bbbc87a0c3d2ce74c6d8d67d4ed..9673e00ddd64ba6b93bf2634235a4d6b80d5bdc3 100644 (file)
@@ -1,6 +1,9 @@
 from sqlobject import *
 from sqlobject.sqlbuilder import *
 from sqlobject import *
 from sqlobject.sqlbuilder import *
+import errno
+import os
 from os import path
 from os import path
+from datetime import datetime
 
 __all__ = ('Curso', 'Inscripto', 'Docente', 'Ejercicio', 'Entrega',
            'CasoDePrueba', 'Intento', 'Correccion', 'Prueba')
 
 __all__ = ('Curso', 'Inscripto', 'Docente', 'Ejercicio', 'Entrega',
            'CasoDePrueba', 'Intento', 'Correccion', 'Prueba')
@@ -11,9 +14,9 @@ dir_base = '.'
 class BaseSQLObject(SQLObject):
 
     @classmethod
 class BaseSQLObject(SQLObject):
 
     @classmethod
-    def by(cls, connection = None, **kw):
+    def by(cls, **kw):
         try:
         try:
-            return cls.selectBy(connection = connection, **kw)[0]
+            return cls.selectBy(limit=1, **kw)[0]
         except IndexError:
             raise SQLObjectNotFound, "The object %s with columns %s does not exist" % (cls.__name__, kw)
 
         except IndexError:
             raise SQLObjectNotFound, "The object %s with columns %s does not exist" % (cls.__name__, kw)
 
@@ -75,11 +78,18 @@ class Entrega(BaseSQLObject):
     ejercicio       = ForeignKey('Ejercicio')
     desde           = DateTimeCol()
     hasta           = DateTimeCol()
     ejercicio       = ForeignKey('Ejercicio')
     desde           = DateTimeCol()
     hasta           = DateTimeCol()
+    finalizada      = BoolCol(default=False)
     # Joins
     cursos          = MultipleJoin('Curso')
     correcciones    = MultipleJoin('Correccion')
     intentos        = MultipleJoin('Intento')
 
     # Joins
     cursos          = MultipleJoin('Curso')
     correcciones    = MultipleJoin('Correccion')
     intentos        = MultipleJoin('Intento')
 
+    @classmethod
+    def getPendientes(cls, connection=None):
+        return cls.select((cls.q.finalizada == False)
+            & (cls.q.hasta <= datetime.now()),
+            orderBy=cls.q.hasta, connection=connection)
+
 class CasoDePrueba(BaseSQLObject):
     # Clave
     ejercicio       = ForeignKey('Ejercicio')
 class CasoDePrueba(BaseSQLObject):
     # Clave
     ejercicio       = ForeignKey('Ejercicio')
@@ -96,17 +106,29 @@ class CasoDePrueba(BaseSQLObject):
     def _get_path(self):
         return path.join(self.ejercicio.path, 'casos_de_prueba', self.nombre)
 
     def _get_path(self):
         return path.join(self.ejercicio.path, 'casos_de_prueba', self.nombre)
 
+    def _get_pathEntradas(self):
+        return path.join(self.path, 'entradas')
+
+    def _get_pathSalidas(self):
+        return path.join(self.path, 'salidas')
+
     def _get_archivosEntrada(self):
         try:
     def _get_archivosEntrada(self):
         try:
-            return os.listdir(path.join(self.path, 'entradas'))
-        except:
-            return []
+            return frozenset(os.listdir(self.pathEntradas))
+        except OSError, (err, msg):
+            if err == errno.ENOENT:
+                return frozenset()
+            else:
+                raise
 
     def _get_archivosSalida(self):
         try:
 
     def _get_archivosSalida(self):
         try:
-            return os.listdir(path.join(self.path, 'salidas'))
-        except:
-            return []
+            return frozenset(os.listdir(self.pathSalidas))
+        except OSError, (err, msg):
+            if err == errno.ENOENT:
+                return frozenset()
+            else:
+                raise
 
 class Intento(BaseSQLObject):
     # Clave
 
 class Intento(BaseSQLObject):
     # Clave
@@ -128,7 +150,7 @@ class Intento(BaseSQLObject):
     @classmethod
     def getProximoAProbar(cls, connection=None):
         try:
     @classmethod
     def getProximoAProbar(cls, connection=None):
         try:
-            return cls.select(None == cls.q.compila, limit=1,
+            return cls.select(cls.q.compila == None, limit=1,
                 orderBy=cls.q.llegada, connection=connection)[0]
         except IndexError:
             return None
                 orderBy=cls.q.llegada, connection=connection)[0]
         except IndexError:
             return None
@@ -141,6 +163,9 @@ class Intento(BaseSQLObject):
             '%s.%s.%s' % (curso.curso, entrega.nroEjercicio, entrega.entrega),
             '%s.%s' % (self.inscripto.padron, self.numero))
 
             '%s.%s.%s' % (curso.curso, entrega.nroEjercicio, entrega.entrega),
             '%s.%s' % (self.inscripto.padron, self.numero))
 
+    def _get_chrootPath(self):
+        return path.join(self.path, 'chroot')
+
     def _get_pruebasPasadas(self):
         for p in self.pruebas:
             if not p.pasada:
     def _get_pruebasPasadas(self):
         for p in self.pruebas:
             if not p.pasada:
@@ -179,4 +204,10 @@ class Prueba(BaseSQLObject):
     pasada          = BoolCol(default = None)
     observaciones   = StringCol(default = None)
 
     pasada          = BoolCol(default = None)
     observaciones   = StringCol(default = None)
 
+    def _get_archivosSalida(self):
+        ent = self.casoDePrueba.archivosEntrada
+        sal = self.casoDePrueba.archivosSalida
+        return frozenset([f for f in os.listdir(self.intento.chrootPath) \
+                    if f in sal or f not in ent and f <> 'tp'])
+
 # vim: set et sw=4 sts=4 :
 # vim: set et sw=4 sts=4 :