]> git.llucax.com Git - software/sercom-old.git/blob - src/sercom/sqlobject.py
d01e0f78156ba56003aacbe738492aa683f4aa65
[software/sercom-old.git] / src / sercom / sqlobject.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 = 1)
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 = 1)
90     parametros      = Col(default = None)
91     codigoRetorno   = Col(default = 0)
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 class Intento(BaseSQLObject):
100     # Clave
101     inscripto       = ForeignKey('Inscripto')
102     entrega         = ForeignKey('Entrega')
103     numero          = Col()
104     # Campos
105     llegada         = Col()
106     inicioCompila   = Col(default = None)
107     finCompila      = Col(default = None)
108     inicioPruebas   = Col(default = None)
109     finPruebas      = Col(default = None)
110     compila         = Col(default = None)
111     notificado      = Col(default = 0)
112     mailRespuesta   = Col()
113     observaciones   = Col(default = None)
114     # Joins
115     pruebas         = MultipleJoin('Prueba')
116
117     @classmethod
118     def getProximoAProbar(cls, connection=None):
119         try:
120             return cls.select(None == cls.q.compila, limit=1,
121                 orderBy=cls.q.llegada, connection=connection)[0]
122         except IndexError:
123             return None
124
125     def _get_path(self):
126         curso = self.inscripto.curso
127         entrega = self.entrega
128         return path.join(dir_base, 'intentos',
129             '%s.%s' % (curso.anio, curso.cuatrimestre),
130             '%s.%s.%s' % (curso.curso, entrega.nroEjercicio, entrega.entrega),
131             '%s.%s' % (self.inscripto.padron, self.numero))
132
133 class Correccion(BaseSQLObject):
134     # Clave
135     entrega         = ForeignKey('Ejercicio')
136     inscripto       = ForeignKey('Inscripto')
137     # Campos
138     intento         = ForeignKey('Intento')
139     docente         = ForeignKey('Docente')
140     nota            = Col(default = None)
141     observaciones   = Col(default = None)
142
143 class Prueba(BaseSQLObject):
144     # Clave
145     intento         = ForeignKey('Intento')
146     casoDePrueba    = ForeignKey('CasoDePrueba')
147     # Campos
148     inicio          = Col()
149     fin             = Col(default = None)
150     pasada          = Col(default = None)
151     observaciones   = Col(default = None)
152
153 # vim: set et sw=4 sts=4 :