X-Git-Url: https://git.llucax.com/software/sercom-old.git/blobdiff_plain/9c348742728b33f40e9fe55936741c544dbd7050..03ce95b6b4735ac353999a4ee8969762a3a25766:/src/sercom/sqlo.py diff --git a/src/sercom/sqlo.py b/src/sercom/sqlo.py index f4824df..9673e00 100644 --- a/src/sercom/sqlo.py +++ b/src/sercom/sqlo.py @@ -1,6 +1,9 @@ from sqlobject import * from sqlobject.sqlbuilder import * +import errno +import os from os import path +from datetime import datetime __all__ = ('Curso', 'Inscripto', 'Docente', 'Ejercicio', 'Entrega', 'CasoDePrueba', 'Intento', 'Correccion', 'Prueba') @@ -11,9 +14,9 @@ dir_base = '.' class BaseSQLObject(SQLObject): @classmethod - def by(cls, connection = None, **kw): + def by(cls, **kw): 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) @@ -75,11 +78,18 @@ class Entrega(BaseSQLObject): ejercicio = ForeignKey('Ejercicio') desde = DateTimeCol() hasta = DateTimeCol() + finalizada = BoolCol(default=False) # 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') @@ -96,17 +106,29 @@ class CasoDePrueba(BaseSQLObject): 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: - 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: - 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 @@ -128,7 +150,7 @@ class Intento(BaseSQLObject): @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 @@ -141,6 +163,9 @@ class Intento(BaseSQLObject): '%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: @@ -179,4 +204,10 @@ class Prueba(BaseSQLObject): 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 :