From: Leandro Lucarella Date: Fri, 16 Mar 2007 04:18:52 +0000 (+0000) Subject: Pasar Ejercicio a Curso. X-Git-Tag: 0_9_0~87 X-Git-Url: https://git.llucax.com/software/sercom.git/commitdiff_plain/52359436d60992517ff1b7a7f1a89652e28c0c62?ds=sidebyside Pasar Ejercicio a Curso. Todavía no andan bien las instancias de entrega. --- diff --git a/sercom/controllers.py b/sercom/controllers.py index 695878d..f809731 100644 --- a/sercom/controllers.py +++ b/sercom/controllers.py @@ -115,8 +115,6 @@ class Root(controllers.RootController): enunciado = EnunciadoController() - ejercicio = EjercicioController() - tarea_fuente = TareaFuenteController() tarea_prueba = TareaPruebaController() diff --git a/sercom/subcontrollers/__init__.py b/sercom/subcontrollers/__init__.py index 1610c3f..eadd6a0 100644 --- a/sercom/subcontrollers/__init__.py +++ b/sercom/subcontrollers/__init__.py @@ -2,7 +2,6 @@ from docente import DocenteController from alumno import AlumnoController from curso import CursoController from enunciado import EnunciadoController -from ejercicio import EjercicioController from docente_inscripto import DocenteInscriptoController from correccion import CorreccionController from misentregas import MisEntregasController diff --git a/sercom/subcontrollers/curso/__init__.py b/sercom/subcontrollers/curso/__init__.py index fe63512..3610103 100644 --- a/sercom/subcontrollers/curso/__init__.py +++ b/sercom/subcontrollers/curso/__init__.py @@ -17,6 +17,7 @@ from sqlobject.dberrors import * from sercom.widgets import * from alumno import AlumnoInscriptoController from grupo import GrupoController +from ejercicio import EjercicioController #}}} #{{{ Configuración @@ -163,6 +164,7 @@ class CursoController(controllers.Controller, identity.SecureResource): curso_alumno = CursoAlumnoController() alumno = AlumnoInscriptoController() grupo = GrupoController() + ejercicio = EjercicioController() @expose() def default(self, tg_errors=None): diff --git a/sercom/subcontrollers/ejercicio/__init__.py b/sercom/subcontrollers/curso/ejercicio/__init__.py similarity index 59% rename from sercom/subcontrollers/ejercicio/__init__.py rename to sercom/subcontrollers/curso/ejercicio/__init__.py index 58a36b2..338dda1 100644 --- a/sercom/subcontrollers/ejercicio/__init__.py +++ b/sercom/subcontrollers/curso/ejercicio/__init__.py @@ -21,13 +21,9 @@ cls = Ejercicio name = 'ejercicio' namepl = name + 's' -fkcls = Curso -fkname = 'curso' +fkcls = Enunciado +fkname = 'enunciado' fknamepl = fkname + 's' - -fk1cls = Enunciado -fk1name = 'enunciado' -fk1namepl = fk1name + 's' #}}} #{{{ Validación @@ -45,31 +41,15 @@ def validate_fk(data): data[fkname] = fk return fk -def validate_fk1(data): - fk = data.get(fk1name + 'ID', None) - if fk == 0: fk = None - if fk is not None: - try: - fk = fk1cls.get(fk) - except LookupError: - flash(_(u'No se pudo crear el nuevo %s porque el %s con ' - 'identificador %d no existe.' % (name, fk1name, fk))) - raise redirect('new', **data) - data.pop(fk1name + 'ID', None) - data[fk1name] = fk - return fk - def validate_get(id): return val.validate_get(cls, name, id) def validate_set(id, data): validate_fk(data) - validate_fk1(data) return val.validate_set(cls, name, id, data) def validate_new(data): validate_fk(data) - validate_fk1(data) return val.validate_new(cls, name, data) def validate_del(id): @@ -77,87 +57,17 @@ def validate_del(id): #}}} #{{{ Formulario -def get_options(): - return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()] - -# Un poco de ajax para llenar los cursos -ajax = """ - function showHint() - { - MochiKit.DOM.showElement('hint') - } - - function hideHint() - { - MochiKit.DOM.hideElement('hint') - } - - function clearEnunciados () - { - l = MochiKit.DOM.getElement('form_enunciadoID'); - l.options.length = 0; - l.disabled = true; - } - - function mostrarEnunciados (res) - { - clearEnunciados(); - for(i in res.enunciados) { - id = res.enunciados[i].id; - label = res.enunciados[i].nombre; - MochiKit.DOM.appendChildNodes("form_enunciadoID", OPTION({"value":id}, label)) - } - l.disabled = false; - hideHint(); - } - - function err (err) - { - alert("The metadata for MochiKit.Async could not be fetched :("); - hideHint(); - } - - function actualizar_enunciados () - { - l = MochiKit.DOM.getElement('form_cursoID'); - id = l.options[l.selectedIndex].value; - if (id == 0) { - clearEnunciados(); - return; - } - - url = "/enunciado/de_curso?curso_id="+id; - var d = loadJSONDoc(url); - d.addCallbacks(mostrarEnunciados, err); - showHint(); - } - - function prepare() - { - connect('form_cursoID', 'onchange', actualizar_enunciados); - hideHint(); - clearEnunciados(); - actualizar_enunciados(); - if (select_enunciado) { - wait(0.1).addCallback(function (res) { return select_enunciado() }); - } - } - - MochiKit.DOM.addLoadEvent(prepare) -""" - class EjercicioForm(W.TableForm): class Fields(W.WidgetsList): - fk = W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()), - options=get_options, validator=V.Int(not_empty=True)) + cursoID = W.HiddenField(validator=V.Int) numero = W.TextField(name="numero",label=_(u'Nro'), help_text=_(u'Requerido.'), validator=V.Int(not_empty=True)) - fk1 = W.SingleSelectField(name=fk1name+'ID', label=_(fk1name.capitalize()), + fk = W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()), validator=V.Int(not_empty=True)) - grupal = W.CheckBox(name='grupal', label=_(u"Grupal?")) + grupal = W.CheckBox(name='grupal', label=_(u"Grupal?"), validator=V.Bool(if_empty=0), default=0) fields = Fields() - javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)] + javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_numero');")] form = EjercicioForm() #}}} @@ -172,25 +82,31 @@ class EjercicioController(controllers.Controller, identity.SecureResource): @expose() def default(self, tg_errors=None): """handle non exist urls""" - raise redirect('list') + raise redirect('../list') @expose() def index(self): - raise redirect('list') + raise redirect('../list') @expose(template='kid:%s.templates.list' % __name__) - @validate(validators=dict(autor=V.Int)) + @validate(validators=dict(curso=V.Int)) @paginate('records') - def list(self, autor=None): + def list(self, curso): """List records in model""" - r = cls.select() - return dict(records=r, name=name, namepl=namepl, parcial=autor) + r = cls.selectBy(cursoID=curso) + return dict(records=r, name=name, namepl=namepl, curso=curso) @expose(template='kid:%s.templates.new' % __name__) + @validate(validators=dict(curso=V.Int)) @identity.require(identity.has_permission('admin')) - def new(self, **kw): + def new(self, curso, **kw): """Create new records in model""" - return dict(name=name, namepl=namepl, form=form, values=kw) + kw['cursoID'] = curso + curso = Curso.get(curso) + options = { fkname+'ID': [(fk.id, fk.shortrepr()) for fk in + Enunciado.selectBy(anio=curso.anio, + cuatrimestre=curso.cuatrimestre)] } + return dict(name=name, namepl=namepl, form=form, values=kw, options=options) @validate(form=form) @error_handler(new) @@ -200,14 +116,18 @@ class EjercicioController(controllers.Controller, identity.SecureResource): """Save or create record to model""" validate_new(kw) flash(_(u'Se creó un nuevo %s.') % name) - raise redirect('list') + raise redirect('list/%s' % kw['cursoID']) @expose(template='kid:%s.templates.edit' % __name__) @identity.require(identity.has_permission('admin')) def edit(self, id, **kw): """Edit record in model""" r = validate_get(id) - return dict(name=name, namepl=namepl, record=r, form=form) + curso = Curso.get(r.cursoID) + options = { fkname+'ID': [(fk.id, fk.shortrepr()) for fk in + Enunciado.selectBy(anio=curso.anio, + cuatrimestre=curso.cuatrimestre)] } + return dict(name=name, namepl=namepl, record=r, form=form, options=options) @validate(form=form) @error_handler(edit) @@ -217,7 +137,7 @@ class EjercicioController(controllers.Controller, identity.SecureResource): """Save or create record to model""" r = validate_set(id, kw) flash(_(u'El %s fue actualizado.') % name) - raise redirect('../list') + raise redirect('../list/%s' % r.cursoID) @expose(template='kid:%s.templates.show' % __name__) def show(self,id, **kw): diff --git a/sercom/subcontrollers/ejercicio/entrega/__init__.py b/sercom/subcontrollers/curso/ejercicio/entrega/__init__.py similarity index 83% rename from sercom/subcontrollers/ejercicio/entrega/__init__.py rename to sercom/subcontrollers/curso/ejercicio/entrega/__init__.py index 0c2d4e5..67f3ccb 100644 --- a/sercom/subcontrollers/ejercicio/entrega/__init__.py +++ b/sercom/subcontrollers/curso/ejercicio/entrega/__init__.py @@ -52,9 +52,6 @@ def validate_new(data): #}}} #{{{ Formulario -def get_options(): - return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()] - class EntregaForm(W.TableForm): class Fields(W.WidgetsList): numero = W.TextField(name="numero",label=_(u'Nro'), help_text=_(u'Requerido.'), @@ -65,7 +62,7 @@ class EntregaForm(W.TableForm): observaciones = W.TextArea(rows="5", cols="40") ejercicio_id= W.HiddenField() fields = Fields() - javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")] + javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_numero');")] form = EntregaForm() #}}} @@ -78,37 +75,37 @@ class EntregaController(controllers.Controller, identity.SecureResource): @expose(template='kid:%s.templates.list' % __name__) @validate(validators=dict(ejercicio_id=V.Int)) @paginate('records') - def default(self, ejercicio_id): - e = Ejercicio.get(ejercicio_id) - r = e.instancias - return dict(records=r, name=name, namepl=namepl, parcial=str(ejercicio_id)) + def list(self, ejercicio_id): + r = cls.selectBy(ejercicioID=ejercicio_id) + return dict(records=r, name=name, namepl=namepl, ejercicio=ejercicio_id) @expose(template='kid:%s.templates.new' % __name__) @identity.require(identity.has_permission('admin')) def new(self, ejercicio_id, **kw): """Create new records in model""" - form.fields[5].attrs['value'] = ejercicio_id - return dict(name=name, namepl=namepl, form=form, values=kw, partial=str(ejercicio_id)) + kw['ejercicioID'] = ejercicio_id + return dict(name=name, namepl=namepl, form=form, values=kw) @validate(form=form) @error_handler(new) @expose() @identity.require(identity.has_permission('admin')) - def create(self, ejercicio_id, **kw): + def create(self, **kw): """Save or create record to model""" - e = Ejercicio.get(ejercicio_id) + e = Ejercicio.get(kw['ejercicioID']) e.add_instancia(**kw) flash(_(u'Se creó un nuevo %s.') % name) - raise redirect('/ejercicio/entrega/'+str(e.id)) + raise redirect('list/%s' % e.id) @expose() @identity.require(identity.has_permission('admin')) def delete(self, id): """Destroy record in model""" r = validate_get(id) + ejercicio_id = r.ejercicioID r.destroySelf() flash(_(u'El %s fue eliminado permanentemente.') % name) - raise redirect('../list') + raise redirect('../list/%s' % ejercicio_id) #}}} diff --git a/sercom/subcontrollers/ejercicio/entrega/templates/__init__.py b/sercom/subcontrollers/curso/ejercicio/entrega/templates/__init__.py similarity index 100% rename from sercom/subcontrollers/ejercicio/entrega/templates/__init__.py rename to sercom/subcontrollers/curso/ejercicio/entrega/templates/__init__.py diff --git a/sercom/subcontrollers/ejercicio/entrega/templates/list.kid b/sercom/subcontrollers/curso/ejercicio/entrega/templates/list.kid similarity index 78% rename from sercom/subcontrollers/ejercicio/entrega/templates/list.kid rename to sercom/subcontrollers/curso/ejercicio/entrega/templates/list.kid index 9be5c16..f459094 100644 --- a/sercom/subcontrollers/ejercicio/entrega/templates/list.kid +++ b/sercom/subcontrollers/curso/ejercicio/entrega/templates/list.kid @@ -1,7 +1,7 @@ + py:extends="'../../../../../templates/master.kid'"> list @@ -30,14 +30,14 @@ activa obs - Eliminar + Eliminar
-Agregar -Volver a Ejericicios +Agregar +Volver a Ejericicios
+ py:extends="'../../../../../templates/master.kid'"> new -

Crear Nuevo Objeto

-
- Buscando registros ... -
- -

Formulario

+

Formulario


-
Cancelar +Cancelar diff --git a/sercom/subcontrollers/ejercicio/templates/__init__.py b/sercom/subcontrollers/curso/ejercicio/templates/__init__.py similarity index 100% rename from sercom/subcontrollers/ejercicio/templates/__init__.py rename to sercom/subcontrollers/curso/ejercicio/templates/__init__.py diff --git a/sercom/subcontrollers/curso/ejercicio/templates/edit.kid b/sercom/subcontrollers/curso/ejercicio/templates/edit.kid new file mode 100644 index 0000000..182b431 --- /dev/null +++ b/sercom/subcontrollers/curso/ejercicio/templates/edit.kid @@ -0,0 +1,19 @@ + + + + +edit + + + +

Modificación de Objeto

+ +
Formulario
+ +
+Ver (cancela) | +Volver (cancela) + + diff --git a/sercom/subcontrollers/ejercicio/templates/list.kid b/sercom/subcontrollers/curso/ejercicio/templates/list.kid similarity index 50% rename from sercom/subcontrollers/ejercicio/templates/list.kid rename to sercom/subcontrollers/curso/ejercicio/templates/list.kid index a4bb19f..4a4ef2c 100644 --- a/sercom/subcontrollers/ejercicio/templates/list.kid +++ b/sercom/subcontrollers/curso/ejercicio/templates/list.kid @@ -1,7 +1,7 @@ + py:extends="'../../../../templates/master.kid'"> list @@ -12,32 +12,26 @@ - - - - + +
Curso Numero Enunciado Es Grupal? Operaciones
curso numeroenunciado - grupal - enunciadogrupal - Entregas - Editar - Eliminar + Ver + Entregas + Editar + Eliminar

-Agregar -Ver todo +Agregar
Crear Nuevo Objeto -

Formulario

+

Formulario


-
Cancelar +Cancelar diff --git a/sercom/subcontrollers/ejercicio/templates/show.kid b/sercom/subcontrollers/curso/ejercicio/templates/show.kid similarity index 63% rename from sercom/subcontrollers/ejercicio/templates/show.kid rename to sercom/subcontrollers/curso/ejercicio/templates/show.kid index 0281c7d..6a0653b 100644 --- a/sercom/subcontrollers/ejercicio/templates/show.kid +++ b/sercom/subcontrollers/curso/ejercicio/templates/show.kid @@ -1,6 +1,6 @@ + py:extends="'../../../../templates/master.kid'"> show @@ -8,14 +8,6 @@ - - - - @@ -31,14 +23,14 @@
Curso: - - nombre - -
Número: descripcion
Es grupal?: - grupal + grupal

-Editar | -Volver +Editar | +Volver diff --git a/sercom/subcontrollers/curso/grupo/__init__.py b/sercom/subcontrollers/curso/grupo/__init__.py index b76e9a4..f658809 100644 --- a/sercom/subcontrollers/curso/grupo/__init__.py +++ b/sercom/subcontrollers/curso/grupo/__init__.py @@ -125,11 +125,11 @@ ajax = u""" class GrupoForm(W.TableForm): class Fields(W.WidgetsList): - cursoID = W.HiddenField() + cursoID = W.HiddenField(validator=V.Int) nombre = W.TextField(label=_(u'Nombre'), validator=V.UnicodeString(not_empty=True,strip=True)) responsable = CustomTextField(label=_(u'Responsable'), validator=V.UnicodeString(), attrs=dict(size='8')) miembros = AjaxMultiSelect(label=_(u'Miembros'), validator=V.Int(), on_add="alumnos_agregar_a_la_lista") - tutores = W.MultipleSelectField(label=_(u'Tutores'), validator=V.Int()) + tutores = W.MultipleSelectField(label=_(u'Tutores'), validator=V.Int) fields = Fields() javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)] @@ -302,18 +302,20 @@ class GrupoController(controllers.Controller, identity.SecureResource): raise redirect(tg.url('/curso/list')) @expose(template='kid:%s.templates.list' % __name__) + @validate(validators=dict(curso=V.Int)) @paginate('records') - def list(self, cursoID): + def list(self, curso): """List records in model""" - r = cls.select(cls.q.cursoID == cursoID) - return dict(records=r, name=name, namepl=namepl, cursoID=int(cursoID)) + r = cls.selectBy(cursoID=curso) + return dict(records=r, name=name, namepl=namepl, cursoID=curso) @expose(template='kid:%s.templates.new' % __name__) - def new(self, cursoID, **kw): + @validate(validators=dict(curso=V.Int)) + def new(self, curso, **kw): """Create new records in model""" - form.fields[0].attrs['value'] = cursoID - options = dict(tutores=get_docentes_inscriptos(cursoID)) - return dict(name=name, namepl=namepl, cursoID=int(cursoID), form=form, options=options, values=kw) + kw['cursoID'] = curso # FIXME esto está roto porque los widgets son stateless + options = dict(tutores=get_docentes_inscriptos(curso)) + return dict(name=name, namepl=namepl, form=form, options=options, values=kw) @validate(form=form) @error_handler(new) diff --git a/sercom/subcontrollers/curso/grupo/templates/new.kid b/sercom/subcontrollers/curso/grupo/templates/new.kid index 853abf0..c02471a 100644 --- a/sercom/subcontrollers/curso/grupo/templates/new.kid +++ b/sercom/subcontrollers/curso/grupo/templates/new.kid @@ -12,7 +12,7 @@

Formulario


-Cancelar +Cancelar diff --git a/sercom/subcontrollers/curso/templates/list.kid b/sercom/subcontrollers/curso/templates/list.kid index 13eeb1c..72f2bf9 100644 --- a/sercom/subcontrollers/curso/templates/list.kid +++ b/sercom/subcontrollers/curso/templates/list.kid @@ -18,8 +18,8 @@ Docentes Alumnos Grupos - Ejercicios - Operaciones + Ejercicios + Operaciones