]> git.llucax.com Git - software/sercom-old.git/blob - src/sercom/sqlo.py
Chequeo de errores al abrir archivo de configuración y opción de línea de comando...
[software/sercom-old.git] / src / sercom / sqlo.py
1 from sqlobject import *
2 from sqlobject.sqlbuilder import *
3 from os import path
4
5 __all__ = ('Curso', 'Inscripto', 'Docente', 'Ejercicio', 'Entrega',
6            'CasoDePrueba', 'Intento', 'Correccion', 'Prueba')
7
8 # Directorio con los datos por default
9 dir_base = '.'
10
11 class BaseSQLObject(SQLObject):
12
13     @classmethod
14     def by(cls, connection = None, **kw):
15         try:
16             return cls.selectBy(connection = connection, **kw)[0]
17         except IndexError:
18             raise SQLObjectNotFound, "The object %s with columns %s does not exist" % (cls.__name__, kw)
19
20 class Curso(BaseSQLObject):
21     # Clave
22     anio            = IntCol()
23     cuatrimestre    = IntCol()
24     curso           = IntCol()
25     # Campos
26     descripcion     = StringCol()
27     # Joins
28     docentes        = RelatedJoin('Docente')
29     entregas        = MultipleJoin('Entrega')
30     inscriptos      = MultipleJoin('Inscripto')
31     ejercicios      = RelatedJoin('Curso', intermediateTable = 'entrega')
32
33 class Inscripto(BaseSQLObject):
34     # Clave
35     padron          = IntCol(alternateID = True)
36     # Campos
37     curso           = ForeignKey('Curso')
38     mail            = StringCol()
39     activo          = BoolCol(default = True)
40     # Joins
41     intentos        = MultipleJoin('Intento')
42     correcciones    = MultipleJoin('Correccion')
43
44 class Docente(BaseSQLObject):
45     # Clave
46     nombre          = StringCol(alternateID = True)
47     # Campos
48     mail            = StringCol()
49     corrige         = BoolCol()
50     # Joins
51     cursos          = RelatedJoin('Curso')
52     ejercicios      = MultipleJoin('Ejercicio')
53     correcciones    = MultipleJoin('Correccion')
54
55 class Ejercicio(BaseSQLObject):
56     # Clave
57     nombre          = Col()
58     # Campos
59     numero          = Col()
60     docente         = ForeignKey('Docente')
61     # Joins
62     casosDePrueba   = MultipleJoin('CasoDePrueba', joinMethodName='casosDePrueba') # XXX hack
63     entregas        = MultipleJoin('Entrega')
64     cursos          = RelatedJoin('Curso', intermediateTable = 'entrega')
65
66     def _get_path(self):
67         return path.join(dir_base, 'ejercicios', str(self.id))
68
69 class Entrega(BaseSQLObject):
70     # Clave
71     curso           = ForeignKey('Curso')
72     nroEjercicio    = IntCol()
73     entrega         = IntCol()
74     # Campos
75     ejercicio       = ForeignKey('Ejercicio')
76     desde           = DateTimeCol()
77     hasta           = DateTimeCol()
78     # Joins
79     cursos          = MultipleJoin('Curso')
80     correcciones    = MultipleJoin('Correccion')
81     intentos        = MultipleJoin('Intento')
82
83 class CasoDePrueba(BaseSQLObject):
84     # Clave
85     ejercicio       = ForeignKey('Ejercicio')
86     nombre          = StringCol()
87     # Campos
88     privado         = BoolCol()
89     activo          = BoolCol(default = True)
90     parametros      = StringCol(default = None)
91     codigoRetorno   = IntCol(default = False)
92     tiempoCpu       = FloatCol(default = None)
93     # Joins
94     pruebas         = MultipleJoin('Prueba')
95
96     def _get_path(self):
97         return path.join(self.ejercicio.path, 'casos_de_prueba', self.nombre)
98
99     def _get_archivosEntrada(self):
100         try:
101             return os.listdir(path.join(self.path, 'entradas'))
102         except:
103             return []
104
105     def _get_archivosSalida(self):
106         try:
107             return os.listdir(path.join(self.path, 'salidas'))
108         except:
109             return []
110
111 class Intento(BaseSQLObject):
112     # Clave
113     inscripto       = ForeignKey('Inscripto')
114     entrega         = ForeignKey('Entrega')
115     numero          = IntCol()
116     # Campos
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)
125     # Joins
126     pruebas         = MultipleJoin('Prueba')
127
128     @classmethod
129     def getProximoAProbar(cls, connection=None):
130         try:
131             return cls.select(None == cls.q.compila, limit=1,
132                 orderBy=cls.q.llegada, connection=connection)[0]
133         except IndexError:
134             return None
135
136     def _get_path(self):
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))
143
144     def _get_pruebasPasadas(self):
145         for p in self.pruebas:
146             if not p.pasada:
147                 return False
148         return True
149
150     def _get_pruebasPublicasPasadas(self):
151         for p in self.pruebas:
152             if not p.pasada and not p.casoDePrueba.privado:
153                 return False
154         return True
155
156     def _get_pruebasPrivadasPasadas(self):
157         for p in self.pruebas:
158             if not p.pasada and p.casoDePrueba.privado:
159                 return False
160         return True
161
162 class Correccion(BaseSQLObject):
163     # Clave
164     entrega         = ForeignKey('Ejercicio')
165     inscripto       = ForeignKey('Inscripto')
166     # Campos
167     intento         = ForeignKey('Intento')
168     docente         = ForeignKey('Docente')
169     nota            = IntCol(default = None)
170     observaciones   = StringCol(default = None)
171
172 class Prueba(BaseSQLObject):
173     # Clave
174     intento         = ForeignKey('Intento')
175     casoDePrueba    = ForeignKey('CasoDePrueba')
176     # Campos
177     inicio          = DateTimeCol()
178     fin             = DateTimeCol(default = None)
179     pasada          = BoolCol(default = None)
180     observaciones   = StringCol(default = None)
181
182 # vim: set et sw=4 sts=4 :