]> 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 c775d24737416ff0e9e92acdbb8a2c4b7ccbbc4b..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
@@ -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,