]> git.llucax.com Git - z.facultad/75.52/sercom.git/blobdiff - sercom/model.py
Manejar bien error de registro duplicado al crear.
[z.facultad/75.52/sercom.git] / sercom / model.py
index 78772f310b0a1f17ac46c7cd58301fcac9b16e7c..7b36029b116acae299cab54ed94e82c2ae2b495b 100644 (file)
@@ -61,6 +61,8 @@ SQLExpression.__hash__ = lambda self: hash(str(self))
 
 instancia_tarea_t = table.instancia_tarea
 
+enunciado_tarea_t = table.enunciado_tarea
+
 dependencia_t = table.dependencia
 
 #}}}
@@ -136,7 +138,6 @@ class Usuario(InheritableSQLObject, ByObject): #{{{
     observaciones   = UnicodeCol(default=None)
     activo          = BoolCol(notNone=True, default=True)
     # Joins
-    grupos          = RelatedJoin('Grupo')
     roles           = RelatedJoin('Rol')
 
     def _get_user_name(self): # para identity
@@ -177,7 +178,7 @@ class Docente(Usuario): #{{{
     # Campos
     nombrado        = BoolCol(notNone=True, default=True)
     # Joins
-    enunciados      = MultipleJoin('Enunciado')
+    enunciados      = MultipleJoin('Enunciado', joinColumn='autor_id')
     inscripciones   = MultipleJoin('DocenteInscripto')
 
     def add_entrega(self, instancia, **opts):
@@ -269,7 +270,7 @@ class Enunciado(SQLObject, ByObject): #{{{
     nombre          = UnicodeCol(length=60, alternateID=True)
     # Campos
     descripcion     = UnicodeCol(length=255, default=None)
-    autor           = ForeignKey('Docente', default=None, dbName='docente_id')
+    autor           = ForeignKey('Docente', default=None)
     creado          = DateTimeCol(notNone=True, default=DateTimeCol.now)
     # Joins
     ejercicios      = MultipleJoin('Ejercicio')
@@ -278,6 +279,40 @@ class Enunciado(SQLObject, ByObject): #{{{
     def add_caso_de_prueba(self, nombre, **opts):
         return CasoDePrueba(enunciadoID=self.id, nombre=nombre, **opts)
 
+    def _get_tareas(self):
+        self.__tareas = tuple(Tarea.select(
+            AND(
+                Tarea.q.id == enunciado_tarea_t.tarea_id,
+                Enunciado.q.id == enunciado_tarea_t.enunciado_id,
+                Enunciado.q.id == self.id
+            ),
+            clauseTables=(enunciado_tarea_t, Enunciado.sqlmeta.table),
+            orderBy=enunciado_tarea_t.orden,
+        ))
+        return self.__tareas
+
+    def _set_tareas(self, tareas):
+        orden = {}
+        for i, t in enumerate(tareas):
+            orden[t.id] = i
+        new = frozenset([t.id for t in tareas])
+        old = frozenset([t.id for t in self.tareas])
+        tareas = dict([(t.id, t) for t in tareas])
+        for tid in old - new: # eliminadas
+            self._connection.query(str(Delete(enunciado_tarea_t, where=AND(
+                enunciado_tarea_t.enunciado_id == self.id,
+                enunciado_tarea_t.tarea_id == tid))))
+        for tid in new - old: # creadas
+            self._connection.query(str(Insert(enunciado_tarea_t, values=dict(
+                enunciado_id=self.id, tarea_id=tid, orden=orden[tid]
+            ))))
+        for tid in new & old: # actualizados
+            self._connection.query(str(Update(enunciado_tarea_t,
+                values=dict(orden=orden[tid]), where=AND(
+                    enunciado_tarea_t.enunciado_id == self.id,
+                    enunciado_tarea_t.tarea_id == tid,
+                ))))
+
     def __repr__(self):
         return 'Enunciado(id=%s, autor=%s, nombre=%s, descripcion=%s, ' \
             'creado=%s)' \
@@ -358,7 +393,8 @@ class InstanciaDeEntrega(SQLObject, ByObject): #{{{
         self.__tareas = tuple(Tarea.select(
             AND(
                 Tarea.q.id == instancia_tarea_t.tarea_id,
-                InstanciaDeEntrega.q.id == instancia_tarea_t.instancia_id
+                InstanciaDeEntrega.q.id == instancia_tarea_t.instancia_id,
+                InstanciaDeEntrega.q.id == self.id,
             ),
             clauseTables=(instancia_tarea_t, InstanciaDeEntrega.sqlmeta.table),
             orderBy=instancia_tarea_t.orden,