From 435b160c7f45d1aa993e2f933fd0343543a1b512 Mon Sep 17 00:00:00 2001 From: tailor Date: Sun, 11 Mar 2007 22:36:04 +0000 Subject: [PATCH] mergeador de grupos * Pantalla para mezclar los grupos. Solo se puede acceder desde la edicion de un curso, porque solo se puede trabajar con grupos de un solo curso. * Crea nuevos cursos si es necesario, elimina los que quedan vacios. * Todavia tiene algunos bugs.. Pero mas o menos anda. --- sercom/controllers.py | 4 +- sercom/subcontrollers/__init__.py | 1 + .../subcontrollers/curso/templates/edit.kid | 31 +- sercom/subcontrollers/grupo/__init__.py | 25 +- .../subcontrollers/grupo/templates/list.kid | 17 +- sercom/subcontrollers/grupo_admin/__init__.py | 335 ++++++++++++++++++ .../grupo_admin/templates/__init__.py | 0 .../grupo_admin/templates/edit.kid | 29 ++ .../grupo_admin/templates/list.kid | 43 +++ .../grupo_admin/templates/new.kid | 22 ++ .../grupo_admin/templates/show.kid | 48 +++ sercom/widgets.py | 60 ++-- 12 files changed, 561 insertions(+), 54 deletions(-) create mode 100644 sercom/subcontrollers/grupo_admin/__init__.py create mode 100644 sercom/subcontrollers/grupo_admin/templates/__init__.py create mode 100644 sercom/subcontrollers/grupo_admin/templates/edit.kid create mode 100644 sercom/subcontrollers/grupo_admin/templates/list.kid create mode 100644 sercom/subcontrollers/grupo_admin/templates/new.kid create mode 100644 sercom/subcontrollers/grupo_admin/templates/show.kid diff --git a/sercom/controllers.py b/sercom/controllers.py index 3bd0d8a..9f82838 100644 --- a/sercom/controllers.py +++ b/sercom/controllers.py @@ -46,7 +46,7 @@ class Root(controllers.RootController): .orderBy(InstanciaDeEntrega.q.fin)) return dict(a_corregir=correcciones, instancias_activas=instancias, now=now) - + if 'entregar' in identity.current.permissions: # Proximas instancias de entrega instancias = list(InstanciaDeEntrega.select( @@ -135,6 +135,8 @@ class Root(controllers.RootController): mis_correcciones = MisCorreccionesController() + grupo_admin = GrupoAdminController() + #{{{ Agrega summarize a namespace tg de KID def summarize(text, size, concat=True, continuation='...'): """Summarize a string if it's length is greater than a specified size. This diff --git a/sercom/subcontrollers/__init__.py b/sercom/subcontrollers/__init__.py index 20d7948..6ca2f59 100644 --- a/sercom/subcontrollers/__init__.py +++ b/sercom/subcontrollers/__init__.py @@ -9,4 +9,5 @@ from grupo import GrupoController from correccion import CorreccionController from alumno_inscripto import AlumnoInscriptoController from misentregas import MisEntregasController +from grupo_admin import GrupoAdminController from miscorrecciones import MisCorreccionesController diff --git a/sercom/subcontrollers/curso/templates/edit.kid b/sercom/subcontrollers/curso/templates/edit.kid index feda8f5..294be12 100644 --- a/sercom/subcontrollers/curso/templates/edit.kid +++ b/sercom/subcontrollers/curso/templates/edit.kid @@ -12,22 +12,22 @@ MochiKit.DOM.appendChildNodes("form_docentes_to", OPTION({"value":${d['id']}}, '${d['label']}')) - + MochiKit.DOM.appendChildNodes("form_alumnos", OPTION({"value":${a['id']}}, '${a['label']}')) - // Saco de FROM los que ya estan en TO - replaceChildNodes('form_docentes_from', list(ifilterfalse( - partial(esta_en_to, $('form_docentes_to').options), - $('form_docentes_from').options - ))); - } - function esta_en_to (options, i) { - for (j=0; j < options.length; j++) - if (options[j].value == i.value) - return true; - return false; - } + // Saco de FROM los que ya estan en TO + replaceChildNodes('form_docentes_from', list(ifilterfalse( + partial(esta_en_to, $('form_docentes_to').options), + $('form_docentes_from').options + ))); + } + function esta_en_to (options, i) { + for (j=0; j < options.length; j++) + if (options[j].value == i.value) + return true; + return false; + } MochiKit.DOM.addLoadEvent(init_data) @@ -40,7 +40,10 @@ Agregar Alumnos desde archivo

-Ver (cancela) | +Mezclar, Juntar, Separar Grupos +
+
+Ver (cancela) Volver (cancela) diff --git a/sercom/subcontrollers/grupo/__init__.py b/sercom/subcontrollers/grupo/__init__.py index 77e21c5..6cb6cd1 100644 --- a/sercom/subcontrollers/grupo/__init__.py +++ b/sercom/subcontrollers/grupo/__init__.py @@ -10,7 +10,7 @@ from turbogears import identity from turbogears import paginate from docutils.core import publish_parts from sercom.subcontrollers import validate as val -from sercom.model import Curso, AlumnoInscripto, Docente, Grupo, Alumno +from sercom.model import Curso, AlumnoInscripto, Docente, Grupo, Alumno, Miembro from sqlobject import * from sercom.widgets import * @@ -279,5 +279,28 @@ class GrupoController(controllers.Controller, identity.SecureResource): msg = u"""Se ha producido un error inesperado al buscar el registro:\n %s""" % str(inst) error = True return dict(msg=msg, error=error) + + @expose('json') + def get_alumnos(self, grupoid): + msg = u'' + error=False + try: + # Busco los alumnos del grupo + grupo = Grupo.get(int(grupoid)) + miembros = Miembro.selectBy(baja=None, grupo=grupo) + print miembros + integrantes = [] + for m in miembros: + msg = {} + alumnoInscripto = AlumnoInscripto.get(m.alumno.id) + msg['id'] = alumnoInscripto.id + msg['label'] = alumnoInscripto.shortrepr() + integrantes.append(msg) + except Exception, (inst): + msg = u"""Se ha producido un error inesperado al buscar el registro:\n %s""" % str(inst) + error = True + integrantes = [] + integrantes.append(msg) + return dict(msg=integrantes, error=error) #}}} diff --git a/sercom/subcontrollers/grupo/templates/list.kid b/sercom/subcontrollers/grupo/templates/list.kid index ab3c056..a715913 100644 --- a/sercom/subcontrollers/grupo/templates/list.kid +++ b/sercom/subcontrollers/grupo/templates/list.kid @@ -17,20 +17,21 @@ Operaciones - curso + curso nombre - - - Ver - Editar - Eliminar - + + + Ver + Editar + Eliminar +
Agregar - +
+
${page} diff --git a/sercom/subcontrollers/grupo_admin/__init__.py b/sercom/subcontrollers/grupo_admin/__init__.py new file mode 100644 index 0000000..b431e84 --- /dev/null +++ b/sercom/subcontrollers/grupo_admin/__init__.py @@ -0,0 +1,335 @@ +# vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker : + +#{{{ Imports +import cherrypy +from turbogears import controllers, expose, redirect +from turbogears import validate, flash, error_handler +from turbogears import validators as V +from turbogears import widgets as W +from turbogears import identity +from turbogears import paginate +from docutils.core import publish_parts +from sercom.subcontrollers import validate as val +from sercom.model import Curso, AlumnoInscripto, Docente, Grupo, Alumno, Miembro +from sqlobject import * + +from sercom.widgets import * + +#}}} +""" Administrador de grupos, mezclar, juntar, dividir""" +#{{{ Configuración +cls = Grupo +name = 'grupo' +namepl = 'grupos' + +#}}} + +#{{{ Validación +def validate_fk(data): + fk = data.get(fkname + 'ID', None) + if fk == 0: fk = None + if fk is not None: + try: + fk = fkcls.get(fk) + except LookupError: + flash(_(u'No se pudo crear el nuevo %s porque el %s con ' + 'identificador %d no existe.' % (name, fkname, fk))) + raise redirect('new', **data) + data.pop(fkname + 'ID', None) + data[fkname] = fk + return fk + +def validate_get(id): + return val.validate_get(cls, name, id) + +def validate_set(id, data): + validate_fk(data) + return val.validate_set(cls, name, id, data) + +def validate_new(data): + validate_fk(data) + return val.validate_new(cls, name, data) + +def validate_del(id): + return val.validate_del(cls, name, id) +#}}} + +#{{{ Formulario +def get_docentes(): + return [(fk1.id, fk1.shortrepr()) for fk1 in Docente.select()] + +def get_cursos(): + return [(0, u'---')] + [(fk1.id, fk1.shortrepr()) for fk1 in Curso.select()] + +def get_gruposA(): + return [(0, u'---')] + [(g.id, g.shortrepr()) for g in Grupo.select()] + +def get_gruposB(): + return [(0, u'Nuevo Grupo')] + [(g.id, g.shortrepr()) for g in Grupo.select()] + +ajax = u""" + function alumnos_agregar_a_la_lista(texto, lista) + { + t = MochiKit.DOM.getElement(texto); + + url = "/alumno/get_alumno?padron="+t.value; + t.value = ""; + return url; + } + + function err (err) + { + alert("The metadata for MochiKit.Async could not be fetched :("); + } + + function procesar(result) + { + l = MochiKit.DOM.getElement('form_responsable_info'); + if (result.error) + l.innerHTML = result.msg; + else + l.innerHTML = result.msg.value; + } + + function onsubmit() + { + /* TODO : Validar datos y evitar el submit si no esta completo */ + + /* Selecciono todos los miembros si no, no llegan al controllere*/ + l = MochiKit.DOM.getElement('form_grupos_to'); + for (i=0; i + + + +edit + + + + +

Modificación de Objeto

+ +
Formulario
+ +
+Volver (cancela) + + + diff --git a/sercom/subcontrollers/grupo_admin/templates/list.kid b/sercom/subcontrollers/grupo_admin/templates/list.kid new file mode 100644 index 0000000..ab3c056 --- /dev/null +++ b/sercom/subcontrollers/grupo_admin/templates/list.kid @@ -0,0 +1,43 @@ + + + + +list + + + +

Administración de Objetos

+ + + + + + + + + + + + + + +
CursoNombreResponsableOperaciones
cursonombre + Ver + Editar + Eliminar +
+ +
+Agregar + +
+ ${page} + ${page} +
+ + + + + diff --git a/sercom/subcontrollers/grupo_admin/templates/new.kid b/sercom/subcontrollers/grupo_admin/templates/new.kid new file mode 100644 index 0000000..531f288 --- /dev/null +++ b/sercom/subcontrollers/grupo_admin/templates/new.kid @@ -0,0 +1,22 @@ + + + + + +new + + + +

Administrar Objeto

+

Formulario

+ +
+Cancelar + + + + + diff --git a/sercom/subcontrollers/grupo_admin/templates/show.kid b/sercom/subcontrollers/grupo_admin/templates/show.kid new file mode 100644 index 0000000..d0074ef --- /dev/null +++ b/sercom/subcontrollers/grupo_admin/templates/show.kid @@ -0,0 +1,48 @@ + + + + +show + + + + + + + + + + + + + + + + + + + + + + + + +
Nombre:nombre
Curso:curso
Tutores: + + +
+
+
Responsable:numero
Integrantes: + + +
+
+
+ +
+Editar | +Volver + + + diff --git a/sercom/widgets.py b/sercom/widgets.py index f642266..c19f54c 100644 --- a/sercom/widgets.py +++ b/sercom/widgets.py @@ -7,13 +7,13 @@ class CustomTextField(widgets.TextField): """Un input con un div al lado para ponerle info""" template = ''' - @@ -72,7 +72,7 @@ MultiSelectAjax = ''' class AjaxMultiSelect(widgets.MultipleSelectField): template = ''' -
+
-
@@ -136,7 +136,7 @@ DosListasAjax = ''' class AjaxDosListasSelect(widgets.MultipleSelectField): template = ''' -
+
@@ -145,7 +145,7 @@ class AjaxDosListasSelect(widgets.MultipleSelectField):
${title_from}
- @@ -165,7 +165,7 @@ class AjaxDosListasSelect(widgets.MultipleSelectField): -