]> git.llucax.com Git - software/sercom-old.git/blob - src/sercom/dbo.py
Un recurso más para tratar de evitar el race.
[software/sercom-old.git] / src / sercom / dbo.py
1 from sqlobject import *
2 from sqlobject.sqlbuilder import *
3
4 __all__ = ('Curso', 'Inscripto', 'Docente', 'Ejercicio', 'Entrega',
5            'CasoDePrueba', 'Intento', 'Correccion', 'Prueba')
6
7 class BaseSQLObject(SQLObject):
8
9     @classmethod
10     def by(cls, connection = None, **kw):
11         try:
12             return cls.selectBy(connection = connection, **kw)[0]
13         except IndexError:
14             raise SQLObjectNotFound, "The object %s with columns %s does not exist" % (cls.__name__, kw)
15
16 class Curso(BaseSQLObject):
17     # Clave
18     anio            = Col()
19     cuatrimestre    = Col()
20     curso           = Col()
21     # Campos
22     descripcion     = Col()
23     # Joins
24     docentes        = RelatedJoin('Docente')
25     entregas        = MultipleJoin('Entrega')
26     inscriptos      = MultipleJoin('Inscripto')
27     ejercicios      = RelatedJoin('Curso', intermediateTable = 'entrega')
28
29 class Inscripto(BaseSQLObject):
30     # Clave
31     padron          = Col(alternateID = True)
32     # Campos
33     curso           = ForeignKey('Curso')
34     mail            = Col()
35     activo          = Col(default = 1)
36     # Joins
37     intentos        = MultipleJoin('Intento')
38     correcciones    = MultipleJoin('Correccion')
39
40 class Docente(BaseSQLObject):
41     # Clave
42     nombre          = Col(alternateID = True)
43     # Campos
44     mail            = Col()
45     corrige         = Col()
46     # Joins
47     cursos          = RelatedJoin('Curso')
48     ejercicios      = MultipleJoin('Ejercicio')
49     correcciones    = MultipleJoin('Correccion')
50
51 class Ejercicio(BaseSQLObject):
52     # Clave
53     nombre          = Col()
54     # Campos
55     numero          = Col()
56     docente         = ForeignKey('Docente')
57     # Joins
58     casosDePrueba   = MultipleJoin('CasoDePrueba', joinMethodName='casosDePrueba') # XXX hack
59     entregas        = MultipleJoin('Entrega')
60     cursos          = RelatedJoin('Curso', intermediateTable = 'entrega')
61
62 class Entrega(BaseSQLObject):
63     # Clave
64     curso           = ForeignKey('Curso')
65     nroEjercicio    = Col()
66     entrega         = Col()
67     # Campos
68     ejercicio       = ForeignKey('Ejercicio')
69     desde           = Col()
70     hasta           = Col()
71     # Joins
72     cursos          = MultipleJoin('Curso')
73     correcciones    = MultipleJoin('Correccion')
74     intentos        = MultipleJoin('Intento')
75
76 class CasoDePrueba(BaseSQLObject):
77     # Clave
78     ejercicio       = ForeignKey('Ejercicio')
79     nombre          = Col()
80     # Campos
81     privado         = Col()
82     activo          = Col(default = 1)
83     parametros      = Col(default = None)
84     codigoRetorno   = Col(default = 0)
85     tiempoCpu       = Col(default = None)
86     # Joins
87     pruebas         = MultipleJoin('Prueba')
88
89 class Intento(BaseSQLObject):
90     # Clave
91     inscripto       = ForeignKey('Inscripto')
92     entrega         = ForeignKey('Entrega')
93     numero          = Col()
94     # Campos
95     llegada         = Col()
96     inicioCompila   = Col(default = None)
97     finCompila      = Col(default = None)
98     inicioPruebas   = Col(default = None)
99     finPruebas      = Col(default = None)
100     compila         = Col(default = None)
101     notificado      = Col(default = 0)
102     mailRespuesta   = Col()
103     observaciones   = Col(default = None)
104     # Joins
105     pruebas         = MultipleJoin('Prueba')
106
107     @classmethod
108     def getProximoAProbar(cls, connection=None):
109         try:
110             return cls.select(None == cls.q.compila, limit=1,
111                 orderBy=cls.q.llegada, connection=connection)[0]
112         except IndexError:
113             return None
114
115     def path(self, dir_base):
116         from os.path import join
117         curso = self.inscripto.curso
118         entrega = self.entrega
119         return join(dir_base, '%s.%s' % (curso.anio, curso.cuatrimestre),
120             '%s.%s.%s' % (curso.curso, entrega.nroEjercicio, entrega.entrega),
121             '%s.%s' % (self.inscripto.padron, self.numero))
122
123 class Correccion(BaseSQLObject):
124     # Clave
125     entrega         = ForeignKey('Ejercicio')
126     inscripto       = ForeignKey('Inscripto')
127     # Campos
128     intento         = ForeignKey('Intento')
129     docente         = ForeignKey('Docente')
130     nota            = Col(default = None)
131     observaciones   = Col(default = None)
132
133 class Prueba(BaseSQLObject):
134     # Clave
135     intento         = ForeignKey('Intento')
136     casoDePrueba    = ForeignKey('CasoDePrueba')
137     # Campos
138     inicio          = Col()
139     fin             = Col(default = None)
140     pasada          = Col(default = None)
141     observaciones   = Col(default = None)
142
143 # vim: set et sw=4 sts=4 :