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