X-Git-Url: https://git.llucax.com/software/sercom.git/blobdiff_plain/2344dcf6736372c1dd359a95819fb3c2e131afc2..2c78ffb5988eb53bc7b6dd221f9da5ebdf36067c:/sercom/model.py diff --git a/sercom/model.py b/sercom/model.py index 78772f3..7354509 100644 --- a/sercom/model.py +++ b/sercom/model.py @@ -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 #}}} @@ -177,7 +179,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 +271,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 +280,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 +394,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,