]> git.llucax.com Git - software/sercom.git/blobdiff - sercom/model.py
pongo la query de luca
[software/sercom.git] / sercom / model.py
index c01b63c57b6845df67f4b95925622743bc335033..b7353e505c4a56f91ec7dcaaf49d3e295411aaca 100644 (file)
@@ -109,16 +109,7 @@ def srepr(obj): #{{{
     return obj
 #}}}
 
-class ByObject(object): #{{{
-    @classmethod
-    def by(cls, **kw):
-        try:
-            return cls.selectBy(**kw)[0]
-        except IndexError:
-            raise SQLObjectNotFound, "The object %s with columns %s does not exist" % (cls.__name__, kw)
-#}}}
-
-class Curso(SQLObject, ByObject): #{{{
+class Curso(SQLObject): #{{{
     # Clave
     anio            = IntCol(notNone=True)
     cuatrimestre    = IntCol(notNone=True)
@@ -162,7 +153,7 @@ class Curso(SQLObject, ByObject): #{{{
             % (self.anio, self.cuatrimestre, self.numero)
 #}}}
 
-class Usuario(InheritableSQLObject, ByObject): #{{{
+class Usuario(InheritableSQLObject): #{{{
     # Clave (para docentes puede ser un nombre de usuario arbitrario)
     usuario         = UnicodeCol(length=10, alternateID=True)
     # Campos
@@ -267,7 +258,17 @@ class Alumno(Usuario): #{{{
                     self.telefono, self.activo, self.creado, self.observaciones)
 #}}}
 
-class Tarea(InheritableSQLObject, ByObject): #{{{
+class Tarea(InheritableSQLObject): #{{{
+    class sqlmeta:
+        createSQL = r'''
+CREATE TABLE dependencia (
+    padre_id INTEGER NOT NULL CONSTRAINT tarea_id_exists
+        REFERENCES tarea(id),
+    hijo_id INTEGER NOT NULL CONSTRAINT tarea_id_exists
+        REFERENCES tarea(id),
+    orden INT,
+    PRIMARY KEY (padre_id, hijo_id)
+)'''
     # Clave
     nombre          = UnicodeCol(length=30, alternateID=True)
     # Campos
@@ -322,7 +323,17 @@ class Tarea(InheritableSQLObject, ByObject): #{{{
         return self.nombre
 #}}}
 
-class Enunciado(SQLObject, ByObject): #{{{
+class Enunciado(SQLObject): #{{{
+    class sqlmeta:
+        createSQL = r'''
+CREATE TABLE enunciado_tarea (
+    enunciado_id INTEGER NOT NULL CONSTRAINT enunciado_id_exists
+        REFERENCES enunciado(id),
+    tarea_id INTEGER NOT NULL CONSTRAINT tarea_id_exists
+        REFERENCES tarea(id),
+    orden INT,
+    PRIMARY KEY (enunciado_id, tarea_id)
+)'''
     # Clave
     nombre          = UnicodeCol(length=60)
     anio            = IntCol(notNone=True)
@@ -419,7 +430,7 @@ class CasoDePrueba(SQLObject): #{{{
         return '%s:%s' % (self.enunciado.shortrepr(), self.nombre)
 #}}}
 
-class Ejercicio(SQLObject, ByObject): #{{{
+class Ejercicio(SQLObject): #{{{
     # Clave
     curso           = ForeignKey('Curso', notNone=True)
     numero          = IntCol(notNone=True)
@@ -446,7 +457,17 @@ class Ejercicio(SQLObject, ByObject): #{{{
                 self.enunciado.shortrepr())
 #}}}
 
-class InstanciaDeEntrega(SQLObject, ByObject): #{{{
+class InstanciaDeEntrega(SQLObject): #{{{
+    class sqlmeta:
+        createSQL = r'''
+CREATE TABLE instancia_tarea (
+    instancia_id INTEGER NOT NULL CONSTRAINT instancia_id_exists
+        REFERENCES instancia_de_entrega(id),
+    tarea_id INTEGER NOT NULL CONSTRAINT tarea_id_exists
+        REFERENCES tarea(id),
+    orden INT,
+    PRIMARY KEY (instancia_id, tarea_id)
+)'''
     # Clave
     ejercicio       = ForeignKey('Ejercicio', notNone=True)
     numero          = IntCol(notNone=True)
@@ -510,7 +531,7 @@ class InstanciaDeEntrega(SQLObject, ByObject): #{{{
         return self.numero
 #}}}
 
-class DocenteInscripto(SQLObject, ByObject): #{{{
+class DocenteInscripto(SQLObject): #{{{
     # Clave
     curso           = ForeignKey('Curso', notNone=True)
     docente         = ForeignKey('Docente', notNone=True)
@@ -538,7 +559,7 @@ class DocenteInscripto(SQLObject, ByObject): #{{{
         return self.docente.shortrepr()
 #}}}
 
-class Entregador(InheritableSQLObject, ByObject): #{{{
+class Entregador(InheritableSQLObject): #{{{
     # Campos
     nota            = DecimalCol(size=3, precision=1, default=None)
     nota_cursada    = DecimalCol(size=3, precision=1, default=None)
@@ -615,7 +636,7 @@ class AlumnoInscripto(Entregador): #{{{
         return self.alumno.shortrepr()
 #}}}
 
-class Tutor(SQLObject, ByObject): #{{{
+class Tutor(SQLObject): #{{{
     # Clave
     grupo           = ForeignKey('Grupo', notNone=True)
     docente         = ForeignKey('DocenteInscripto', notNone=True)
@@ -633,7 +654,7 @@ class Tutor(SQLObject, ByObject): #{{{
         return '%s-%s' % (self.docente.shortrepr(), self.grupo.shortrepr())
 #}}}
 
-class Miembro(SQLObject, ByObject): #{{{
+class Miembro(SQLObject): #{{{
     # Clave
     grupo           = ForeignKey('Grupo', notNone=True)
     alumno          = ForeignKey('AlumnoInscripto', notNone=True)
@@ -652,7 +673,7 @@ class Miembro(SQLObject, ByObject): #{{{
         return '%s-%s' % (self.alumno.shortrepr(), self.grupo.shortrepr())
 #}}}
 
-class Entrega(SQLObject, ByObject): #{{{
+class Entrega(SQLObject): #{{{
     # Clave
     instancia       = ForeignKey('InstanciaDeEntrega', notNone=True)
     entregador      = ForeignKey('Entregador', default=None) # Si es None era un Docente
@@ -697,7 +718,7 @@ class Entrega(SQLObject, ByObject): #{{{
             self.codigo)
 #}}}
 
-class Correccion(SQLObject, ByObject): #{{{
+class Correccion(SQLObject): #{{{
     # Clave
     instancia       = ForeignKey('InstanciaDeEntrega', notNone=True)
     entregador      = ForeignKey('Entregador', notNone=True) # Docente no tiene
@@ -722,7 +743,7 @@ class Correccion(SQLObject, ByObject): #{{{
         return '%s,%s' % (self.entrega.shortrepr(), self.corrector.shortrepr())
 #}}}
 
-class TareaEjecutada(InheritableSQLObject, ByObject): #{{{
+class TareaEjecutada(InheritableSQLObject): #{{{
     # Clave
     tarea           = ForeignKey('Tarea', notNone=True)
     entrega         = ForeignKey('Entrega', notNone=True)
@@ -811,7 +832,10 @@ class Rol(SQLObject): #{{{
 # No es un SQLObject porque no tiene sentido agregar/sacar permisos, están
 # hardcodeados en el código
 class Permiso(object): #{{{
+    max_valor = 1
     def __init__(self, nombre, descripcion):
+        self.valor = Permiso.max_valor
+        Permiso.max_valor <<= 1
         self.nombre = nombre
         self.descripcion = descripcion
 
@@ -823,6 +847,12 @@ class Permiso(object): #{{{
     def permission_name(self): # para identity
         return self.nombre
 
+    def __and__(self, other):
+        return self.valor & other.valor
+
+    def __or__(self, other):
+        return self.valor | other.valor
+
     def __repr__(self):
         return self.nombre
 #}}}