]> git.llucax.com Git - software/sercom-old.git/blob - src/sercom/sqlo.py
Manda mails notificando si compila bien.
[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            = Col()
23     cuatrimestre    = Col()
24     curso           = Col()
25     # Campos
26     descripcion     = Col()
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          = Col(alternateID = True)
36     # Campos
37     curso           = ForeignKey('Curso')
38     mail            = Col()
39     activo          = Col(default = True)
40     # Joins
41     intentos        = MultipleJoin('Intento')
42     correcciones    = MultipleJoin('Correccion')
43
44 class Docente(BaseSQLObject):
45     # Clave
46     nombre          = Col(alternateID = True)
47     # Campos
48     mail            = Col()
49     corrige         = Col()
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    = Col()
73     entrega         = Col()
74     # Campos
75     ejercicio       = ForeignKey('Ejercicio')
76     desde           = Col()
77     hasta           = Col()
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          = Col()
87     # Campos
88     privado         = Col()
89     activo          = Col(default = True)
90     parametros      = Col(default = None)
91     codigoRetorno   = Col(default = False)
92     tiempoCpu       = Col(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          = Col()
116     # Campos
117     llegada         = Col()
118     inicioCompila   = Col(default = None)
119     finCompila      = Col(default = None)
120     inicioPruebas   = Col(default = None)
121     finPruebas      = Col(default = None)
122     compila         = Col(default = None)
123     notificado      = Col(default = False)
124     mailRespuesta   = Col()
125     observaciones   = Col(default = None)
126     # Joins
127     pruebas         = MultipleJoin('Prueba')
128
129     @classmethod
130     def getProximoAProbar(cls, connection=None):
131         try:
132             return cls.select(None == cls.q.compila, limit=1,
133                 orderBy=cls.q.llegada, connection=connection)[0]
134         except IndexError:
135             return None
136
137     def _get_path(self):
138         curso = self.inscripto.curso
139         entrega = self.entrega
140         return path.join(dir_base, 'intentos',
141             '%s.%s' % (curso.anio, curso.cuatrimestre),
142             '%s.%s.%s' % (curso.curso, entrega.nroEjercicio, entrega.entrega),
143             '%s.%s' % (self.inscripto.padron, self.numero))
144
145 class Correccion(BaseSQLObject):
146     # Clave
147     entrega         = ForeignKey('Ejercicio')
148     inscripto       = ForeignKey('Inscripto')
149     # Campos
150     intento         = ForeignKey('Intento')
151     docente         = ForeignKey('Docente')
152     nota            = Col(default = None)
153     observaciones   = Col(default = None)
154
155 class Prueba(BaseSQLObject):
156     # Clave
157     intento         = ForeignKey('Intento')
158     casoDePrueba    = ForeignKey('CasoDePrueba')
159     # Campos
160     inicio          = Col()
161     fin             = Col(default = None)
162     pasada          = Col(default = None)
163     observaciones   = Col(default = None)
164
165 # vim: set et sw=4 sts=4 :