1 from sqlobject import *
2 from sqlobject.sqlbuilder import *
5 __all__ = ('Curso', 'Inscripto', 'Docente', 'Ejercicio', 'Entrega',
6 'CasoDePrueba', 'Intento', 'Correccion', 'Prueba')
8 # Directorio con los datos por default
11 class BaseSQLObject(SQLObject):
14 def by(cls, connection = None, **kw):
16 return cls.selectBy(connection = connection, **kw)[0]
18 raise SQLObjectNotFound, "The object %s with columns %s does not exist" % (cls.__name__, kw)
20 class Curso(BaseSQLObject):
23 cuatrimestre = IntCol()
26 descripcion = StringCol()
28 docentes = RelatedJoin('Docente')
29 entregas = MultipleJoin('Entrega')
30 inscriptos = MultipleJoin('Inscripto')
31 ejercicios = RelatedJoin('Curso', intermediateTable = 'entrega')
33 class Inscripto(BaseSQLObject):
35 padron = IntCol(alternateID = True)
37 curso = ForeignKey('Curso')
39 activo = BoolCol(default = True)
41 intentos = MultipleJoin('Intento')
42 correcciones = MultipleJoin('Correccion')
44 class Docente(BaseSQLObject):
46 nombre = StringCol(alternateID = True)
51 cursos = RelatedJoin('Curso')
52 ejercicios = MultipleJoin('Ejercicio')
53 correcciones = MultipleJoin('Correccion')
55 class Ejercicio(BaseSQLObject):
60 docente = ForeignKey('Docente')
62 casosDePrueba = MultipleJoin('CasoDePrueba', joinMethodName='casosDePrueba') # XXX hack
63 entregas = MultipleJoin('Entrega')
64 cursos = RelatedJoin('Curso', intermediateTable = 'entrega')
67 return path.join(dir_base, 'ejercicios', str(self.id))
69 class Entrega(BaseSQLObject):
71 curso = ForeignKey('Curso')
72 nroEjercicio = IntCol()
75 ejercicio = ForeignKey('Ejercicio')
79 cursos = MultipleJoin('Curso')
80 correcciones = MultipleJoin('Correccion')
81 intentos = MultipleJoin('Intento')
83 class CasoDePrueba(BaseSQLObject):
85 ejercicio = ForeignKey('Ejercicio')
89 activo = BoolCol(default = True)
90 parametros = StringCol(default = None)
91 codigoRetorno = IntCol(default = False)
92 tiempoCpu = FloatCol(default = None)
94 pruebas = MultipleJoin('Prueba')
97 return path.join(self.ejercicio.path, 'casos_de_prueba', self.nombre)
99 def _get_archivosEntrada(self):
101 return os.listdir(path.join(self.path, 'entradas'))
105 def _get_archivosSalida(self):
107 return os.listdir(path.join(self.path, 'salidas'))
111 class Intento(BaseSQLObject):
113 inscripto = ForeignKey('Inscripto')
114 entrega = ForeignKey('Entrega')
117 llegada = DateTimeCol()
118 inicioCompila = DateTimeCol(default = None)
119 finCompila = DateTimeCol(default = None)
120 inicioPruebas = DateTimeCol(default = None)
121 finPruebas = DateTimeCol(default = None)
122 compila = BoolCol(default = None)
123 mailRespuesta = StringCol()
124 observaciones = StringCol(default = None)
126 pruebas = MultipleJoin('Prueba')
129 def getProximoAProbar(cls, connection=None):
131 return cls.select(None == cls.q.compila, limit=1,
132 orderBy=cls.q.llegada, connection=connection)[0]
137 curso = self.inscripto.curso
138 entrega = self.entrega
139 return path.join(dir_base, 'intentos',
140 '%s.%s' % (curso.anio, curso.cuatrimestre),
141 '%s.%s.%s' % (curso.curso, entrega.nroEjercicio, entrega.entrega),
142 '%s.%s' % (self.inscripto.padron, self.numero))
144 def _get_pruebasPasadas(self):
145 for p in self.pruebas:
150 def _get_pruebasPublicasPasadas(self):
151 for p in self.pruebas:
152 if not p.pasada and not p.casoDePrueba.privado:
156 def _get_pruebasPrivadasPasadas(self):
157 for p in self.pruebas:
158 if not p.pasada and p.casoDePrueba.privado:
162 class Correccion(BaseSQLObject):
164 entrega = ForeignKey('Ejercicio')
165 inscripto = ForeignKey('Inscripto')
167 intento = ForeignKey('Intento')
168 docente = ForeignKey('Docente')
169 nota = IntCol(default = None)
170 observaciones = StringCol(default = None)
172 class Prueba(BaseSQLObject):
174 intento = ForeignKey('Intento')
175 casoDePrueba = ForeignKey('CasoDePrueba')
177 inicio = DateTimeCol()
178 fin = DateTimeCol(default = None)
179 pasada = BoolCol(default = None)
180 observaciones = StringCol(default = None)
182 # vim: set et sw=4 sts=4 :