From: Leandro Lucarella Date: Sat, 27 Jan 2007 05:34:38 +0000 (+0000) Subject: Agrega nueva relación ordenada entre Enunciado y Tarea. X-Git-Tag: pre-merge~168 X-Git-Url: https://git.llucax.com/z.facultad/75.52/sercom.git/commitdiff_plain/596509780382d79f0de8ea6496180a900f4b4840?ds=inline Agrega nueva relación ordenada entre Enunciado y Tarea. Se agrega una relación entre Enunciado y Tarea igual que la relación entre InstanciaDeEntrega y Tarea. La idea es usar como template estas tareas a la hora de agregar una nueva InstanciaDeEntrega. --- diff --git a/doc/schema.sql b/doc/schema/schema.sql similarity index 96% rename from doc/schema.sql rename to doc/schema/schema.sql index a4e8da4..6e8fefc 100644 --- a/doc/schema.sql +++ b/doc/schema/schema.sql @@ -53,6 +53,13 @@ CREATE TABLE enunciado ( creado TIMESTAMP NOT NULL ); +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) +); + CREATE TABLE caso_de_prueba ( id INTEGER PRIMARY KEY, enunciado_id INT CONSTRAINT enunciado_id_exists REFERENCES enunciado(id), diff --git a/doc/testdata.py b/doc/testdata.py index 39477e5..72027bd 100644 --- a/doc/testdata.py +++ b/doc/testdata.py @@ -22,6 +22,8 @@ t4.dependencias = (t3, t2) e1 = Enunciado(nombre=u'Un enunciado', autor=d, descripcion=u'Ejercicio reeee jodido') e2 = Enunciado(nombre=u'Otro enunciado', autor=d, descripcion=u'Ejercicio facilongo') e3 = Enunciado(nombre=u'Más enunciados', descripcion=u'Ejercicio anónimo') +e1.tareas = (t4,) +e2.tareas = (t2, t4) cp1 = e1.add_caso_de_prueba(u'Sin parámetros', retorno=0, descripcion=u'Un caso') cp2 = e1.add_caso_de_prueba(u'2 parámetross', retorno=0, parametros=('--test', '-c')) @@ -31,6 +33,7 @@ ej2 = c.add_ejercicio(2, e2) ide = ej1.add_instancia(1, datetime(2007, 1, 25), datetime(2007, 1, 31, 20), observaciones='Entrega fea', activo=False) +ide.tareas = (t2, t4) di = c.add_docente(d, corrige=True, observaciones=u'Tipo Pulenta') diff --git a/sercom/model.py b/sercom/model.py index c775d24..38fb924 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 #}}} @@ -278,6 +280,39 @@ 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 + ), + 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)' \