]> git.llucax.com Git - software/sercom.git/commitdiff
Pasar Ejercicio a Curso.
authorLeandro Lucarella <llucax@gmail.com>
Fri, 16 Mar 2007 04:18:52 +0000 (04:18 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Fri, 16 Mar 2007 04:18:52 +0000 (04:18 +0000)
Todavía no andan bien las instancias de entrega.

17 files changed:
sercom/controllers.py
sercom/subcontrollers/__init__.py
sercom/subcontrollers/curso/__init__.py
sercom/subcontrollers/curso/ejercicio/__init__.py [moved from sercom/subcontrollers/ejercicio/__init__.py with 59% similarity]
sercom/subcontrollers/curso/ejercicio/entrega/__init__.py [moved from sercom/subcontrollers/ejercicio/entrega/__init__.py with 83% similarity]
sercom/subcontrollers/curso/ejercicio/entrega/templates/__init__.py [moved from sercom/subcontrollers/ejercicio/entrega/templates/__init__.py with 100% similarity]
sercom/subcontrollers/curso/ejercicio/entrega/templates/list.kid [moved from sercom/subcontrollers/ejercicio/entrega/templates/list.kid with 78% similarity]
sercom/subcontrollers/curso/ejercicio/entrega/templates/new.kid [moved from sercom/subcontrollers/ejercicio/templates/new.kid with 54% similarity]
sercom/subcontrollers/curso/ejercicio/templates/__init__.py [moved from sercom/subcontrollers/ejercicio/templates/__init__.py with 100% similarity]
sercom/subcontrollers/curso/ejercicio/templates/edit.kid [new file with mode: 0644]
sercom/subcontrollers/curso/ejercicio/templates/list.kid [moved from sercom/subcontrollers/ejercicio/templates/list.kid with 50% similarity]
sercom/subcontrollers/curso/ejercicio/templates/new.kid [moved from sercom/subcontrollers/ejercicio/entrega/templates/new.kid with 68% similarity]
sercom/subcontrollers/curso/ejercicio/templates/show.kid [moved from sercom/subcontrollers/ejercicio/templates/show.kid with 63% similarity]
sercom/subcontrollers/curso/grupo/__init__.py
sercom/subcontrollers/curso/grupo/templates/new.kid
sercom/subcontrollers/curso/templates/list.kid
sercom/subcontrollers/ejercicio/templates/edit.kid [deleted file]

index 695878d4722db0b092ea14140d9d54c1dc2131f9..f80973100a1e4e1844c41f4889b029bfcd0c882e 100644 (file)
@@ -115,8 +115,6 @@ class Root(controllers.RootController):
 
     enunciado = EnunciadoController()
 
-    ejercicio = EjercicioController()
-
     tarea_fuente = TareaFuenteController()
 
     tarea_prueba = TareaPruebaController()
index 1610c3faf6897b1db1e7751390597339f1d06b42..eadd6a057f81fd0023a0b734e959b677640df464 100644 (file)
@@ -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
index fe63512fae4339f0f1de6551766252cc8aaeec00..36101033ac5944fc9048d1d7746419a33e9a8490 100644 (file)
@@ -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):
similarity index 59%
rename from sercom/subcontrollers/ejercicio/__init__.py
rename to sercom/subcontrollers/curso/ejercicio/__init__.py
index 58a36b214671ffaee610bbb8bdac9f4d4947e538..338dda166f26acfd11bd7d3115270ebef4d3d0d2 100644 (file)
@@ -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):
similarity index 83%
rename from sercom/subcontrollers/ejercicio/entrega/__init__.py
rename to sercom/subcontrollers/curso/ejercicio/entrega/__init__.py
index 0c2d4e581a66577f30e4ce26433eeebef6418dff..67f3ccbb64a5fe71fffc4cb8b33e39d6646e7a2d 100644 (file)
@@ -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)
 
 #}}}
 
similarity index 78%
rename from sercom/subcontrollers/ejercicio/entrega/templates/list.kid
rename to sercom/subcontrollers/curso/ejercicio/entrega/templates/list.kid
index 9be5c1698335d398ceb75e039946163b018e4012..f4590946a06c68c1e4ba08b520672604d221f5d8 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <?python from turbogears import identity ?>
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
-    py:extends="'../../../../templates/master.kid'">
+    py:extends="'../../../../../templates/master.kid'">
 <head>
 <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
 <title>list</title>
         <td><span py:replace="tg.strbool(record.activo)">activa</span></td>
         <td><span py:replace="record.observaciones">obs</span></td>
         <td>
-            <a py:if="'admin' in identity.current.permissions" href="${tg.url('/ejercicio/entrega/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Yo creo que no...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
+            <a py:if="'admin' in identity.current.permissions" href="${tg.url('/curso/ejercicio/entrega/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Yo creo que no...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
         </td>
     </tr>
 </table>
 
 <br/>
-<a py:if="'admin' in identity.current.permissions" href="${tg.url('/ejercicio/entrega/new/'+parcial)}">Agregar</a>
-<a href="${tg.url('/ejercicio/list')}">Volver a Ejericicios</a>
+<a py:if="'admin' in identity.current.permissions" href="${tg.url('/curso/ejercicio/entrega/new/%s' % ejercicio)}">Agregar</a>
+<a href="${tg.url('/curso/ejercicio/list')}">Volver a Ejericicios</a>
 
 <div py:for="page in tg.paginate.pages">
     <a py:if="page != tg.paginate.current_page"
similarity index 54%
rename from sercom/subcontrollers/ejercicio/templates/new.kid
rename to sercom/subcontrollers/curso/ejercicio/entrega/templates/new.kid
index 8e28a9cb74143865487387eebb6611fa9798c2a2..d51c17772707d83df6ef8e44f2b75ac16cb93512 100644 (file)
@@ -1,25 +1,18 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
-    py:extends="'../../../templates/master.kid'">
+    py:extends="'../../../../../templates/master.kid'">
 <head>
 <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
 <title>new</title>
 </head>
-<script type="text/javascript">
-    function select_enunciado() {}
-</script>
 <body>
 
 <h1>Crear Nuevo <span py:replace="name">Objeto</span></h1>
 
-<div id="hint">
-    Buscando registros ...
-</div>
-
-<p py:replace="form(action=tg.url('/ejercicio/create'), value=values, submit_text=_('Crear'))">Formulario</p>
+<p py:replace="form(action=tg.url('/curso/ejercicio/entrega/create'), value=values, submit_text=_('Crear'))">Formulario</p>
 
 <br/>
-<a href="${tg.url('/ejercicio/list')}">Cancelar</a>
+<a href="${tg.url('/curso/ejercicio/entrega/%s' % values.ejercicioID)}">Cancelar</a>
 
 </body>
 </html>
diff --git a/sercom/subcontrollers/curso/ejercicio/templates/edit.kid b/sercom/subcontrollers/curso/ejercicio/templates/edit.kid
new file mode 100644 (file)
index 0000000..182b431
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
+    py:extends="'../../../../templates/master.kid'">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
+<title>edit</title>
+</head>
+<body>
+
+<h1>Modificación de <span py:replace="name">Objeto</span></h1>
+
+<div py:replace="form(value=record, action=tg.url('/curso/ejercicio/update/%d' % record.id),
+       options=options, submit_text=_(u'Guardar'))">Formulario</div>
+
+<br/>
+<a href="${tg.url('/curso/ejercicio/show/%s' % record.id)}">Ver (cancela)</a> |
+<a href="${tg.url('/curso/ejercicio/list/%s' % record.cursoID)}">Volver (cancela)</a>
+</body>
+</html>
similarity index 50%
rename from sercom/subcontrollers/ejercicio/templates/list.kid
rename to sercom/subcontrollers/curso/ejercicio/templates/list.kid
index a4bb19ff25161f1185c21308a8fb83c0d4538663..4a4ef2cbea6545e26d6c046d7896f830fec0cc06 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <?python from turbogears import identity ?>
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
-    py:extends="'../../../templates/master.kid'">
+    py:extends="'../../../../templates/master.kid'">
 <head>
 <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
 <title>list</title>
 
 <table class="list">
     <tr>
-        <th py:if="'admin' in identity.current.permissions">Curso</th>
         <th>Numero</th>
         <th>Enunciado</th>
         <th>Es Grupal?</th>
         <th>Operaciones</th>
     </tr>
     <tr py:for="record in records">
-        <td py:if="'admin' in identity.current.permissions"><a href="${tg.url('/curso/show/%d' % record.id)}"><span py:replace="record.curso.shortrepr()">curso</span></a></td>
         <td><span py:replace="record.numero">numero</span></td>
-        <td><a py:if="record.enunciadoID is not None"
-                href="${tg.url('/enunciado/show/%d' % record.enunciado.id)}"><span
-                    py:replace="record.enunciado.shortrepr()">enunciado</span></a></td>
-        <td align="center">
-            <span py:replace="tg.strbool(record.grupal)">grupal</span>
-        </td>
+        <td><a href="${tg.url('/enunciado/show/%d' % record.enunciado.id)}"><span py:replace="record.enunciado.shortrepr()">enunciado</span></a></td>
+        <td><span py:replace="tg.strbool(record.grupal)">grupal</span></td>
         <td>
-            <a href="${tg.url('/ejercicio/entrega/%d' % record.id)}">Entregas</a>
-            <a py:if="'admin' in identity.current.permissions" href="${tg.url('/ejercicio/edit/%d' % record.id)}">Editar</a>
-            <a py:if="'admin' in identity.current.permissions" href="${tg.url('/ejercicio/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Yo creo que no...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
+            <a href="${tg.url('/curso/ejercicio/show/%d' % record.id)}">Ver</a>
+            <a href="${tg.url('/curso/ejercicio/entrega/%d' % record.id)}">Entregas</a>
+            <a py:if="'admin' in identity.current.permissions" href="${tg.url('/curso/ejercicio/edit/%d' % record.id)}">Editar</a>
+            <a py:if="'admin' in identity.current.permissions" href="${tg.url('/curso/ejercicio/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Yo creo que no...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
         </td>
     </tr>
 </table>
 
 <br/>
-<a py:if="'admin' in identity.current.permissions" href="${tg.url('/ejercicio/new')}">Agregar</a>
-<a py:if="parcial" href="${tg.url('/ejercicio/list')}">Ver todo</a>
+<a py:if="'admin' in identity.current.permissions" href="${tg.url('/curso/ejercicio/new/%s' % curso)}">Agregar</a>
 
 <div py:for="page in tg.paginate.pages">
     <a py:if="page != tg.paginate.current_page"
similarity index 68%
rename from sercom/subcontrollers/ejercicio/entrega/templates/new.kid
rename to sercom/subcontrollers/curso/ejercicio/templates/new.kid
index ffa916cd14e00e66985fbc7b49ff6c90cd4ebfd4..3273a3813ba6a230116ae355507d92a370d58fd8 100644 (file)
@@ -9,10 +9,10 @@
 
 <h1>Crear Nuevo <span py:replace="name">Objeto</span></h1>
 
-<p py:replace="form(action=tg.url('/ejercicio/entrega/create'), value=values, submit_text=_('Crear'))">Formulario</p>
+<p py:replace="form(action=tg.url('/curso/ejercicio/create'), options=options, value=values, submit_text=_('Crear'))">Formulario</p>
 
 <br/>
-<a href="${tg.url('/ejercicio/entrega/'+partial)}">Cancelar</a>
+<a href="${tg.url('/curso/ejercicio/list/%s' % values['cursoID'])}">Cancelar</a>
 
 </body>
 </html>
similarity index 63%
rename from sercom/subcontrollers/ejercicio/templates/show.kid
rename to sercom/subcontrollers/curso/ejercicio/templates/show.kid
index 0281c7d9cb6b581d03a7a567ee813fe199f192d6..6a0653b726e2c15584aeb56306e2511067b6f085 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
-    py:extends="'../../../templates/master.kid'">
+    py:extends="'../../../../templates/master.kid'">
 <head>
 <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
 <title>show</title>
@@ -8,14 +8,6 @@
 <body>
 
 <table>
-    <tr>
-        <th>Curso:</th>
-                               <td>
-                                       <a href="${tg.url('/curso/show/%d' % record.curso.id)}">
-                                               <span py:replace="record.curso.shortrepr()">nombre</span>
-                                       </a>
-                               </td>
-    </tr>
     <tr>
         <th>Número:</th>
        <td><span py:replace="record.numero">descripcion</span></td>
     <tr>
         <th>Es grupal?:</th>
        <td>
-                       <span py:replace="record.grupal">grupal</span>
+                       <span py:replace="tg.strbool(record.grupal)">grupal</span>
        </td>
   </tr>
 </table>
 
 <br/>
-<a href="${tg.url('/ejercicio/edit/%d' % record.id)}">Editar</a> |
-<a href="${tg.url('/ejercicio/list')}">Volver</a>
+<a href="${tg.url('/curso/ejercicio/edit/%s' % record.id)}">Editar</a> |
+<a href="${tg.url('/curso/ejercicio/list/%s' % record.cursoID)}">Volver</a>
 
 </body>
 </html>
index b76e9a4509f2178eb77d1e6cb322978524e415d6..f6588096de188877ee50ad94c407537c5ca4b0b5 100644 (file)
@@ -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)
index 853abf07d8799512ff04441b38088523bc1d3f2d..c02471a362b693e3e6f5e364b6d3e2e801dba22c 100644 (file)
@@ -12,7 +12,7 @@
 <p py:replace="form(action=tg.url('/curso/grupo/create'), options=options, value=values, submit_text=_('Crear'))">Formulario</p>
 
 <br/>
-<a href="${tg.url('/curso/grupo/list/%d' % cursoID)}">Cancelar</a>
+<a href="${tg.url('/curso/grupo/list/%d' % values['cursoID'])}">Cancelar</a>
 
 </body>
 </html>
index 13eeb1ccc1b3c87aaec0d4635a0431a20a56d14e..72f2bf9d402938e4a4c7596a39fbef47bab15ac8 100644 (file)
@@ -18,8 +18,8 @@
         <th>Docentes</th>
         <th>Alumnos</th>
         <th>Grupos</th>
-               <th>Ejercicios</th>
-               <th>Operaciones</th>
+        <th>Ejercicios</th>
+        <th>Operaciones</th>
     </tr>
     <tr py:for="record in records">
         <!--td><input type="checkbox" onclick="var f =
         <td><span py:replace="record.cuatrimestre">cuatrimestre</span></td>
         <td><span py:replace="record.anio">anio</span></td>
         <td><span py:replace="record.descripcion">descripcion</span></td>
-        <td><a py:if="len(record.docentes)" href="${tg.url('/docente/list')}"><span py:replace="len(record.docentes)">Docentes</span></a></td>
-        <td><a py:if="len(record.alumnos)"  href="${tg.url('/curso/alumno/list/%d' % record.id)}"><span py:replace="len(record.alumnos)">Alumnos</span></a></td>
+        <td><a href="${tg.url('/docente/list')}"><span py:replace="len(record.docentes)">Docentes</span></a></td>
+        <td><a href="${tg.url('/curso/alumno/list/%d' % record.id)}"><span py:replace="len(record.alumnos)">Alumnos</span></a></td>
         <td align="center"><a href="${tg.url('/curso/grupo/list/%d' % record.id)}"><span py:replace="len(record.grupos)">Grupos</span></a></td>
-        <td><a py:if="len(record.ejercicios)" href="${tg.url('/ejercicio/list')}"><span py:replace="len(record.ejercicios)">Ejercicio</span></a></td>
+        <td><a href="${tg.url('/curso/ejercicio/list/%s' % record.id)}"><span py:replace="len(record.ejercicios)">Ejercicio</span></a></td>
         <td><a href="${tg.url('/curso/show/%d' % record.id)}">Ver</a>
             <a href="${tg.url('/curso/edit/%d' % record.id)}">Editar</a>
             <a href="${tg.url('/curso/notas/%d' % record.id)}">Notas</a>
diff --git a/sercom/subcontrollers/ejercicio/templates/edit.kid b/sercom/subcontrollers/ejercicio/templates/edit.kid
deleted file mode 100644 (file)
index a3fbb30..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
-    py:extends="'../../../templates/master.kid'">
-<head>
-<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
-<title>edit</title>
-</head>
-<script type="text/javascript">
-       function select_enunciado() {
-               lista = MochiKit.DOM.getElement('enunciadoID');
-               for(i=0; i &lt; l.options.length; i++) {
-                       if (l.options[i].value == ${record.enunciado.id}) {
-                               l.options[i].selected = true;
-                               l.selectedIndex = i;
-                               break;
-                       }
-               }
-       }
-</script>
-<body>
-
-<h1>Modificación de <span py:replace="name">Objeto</span></h1>
-
-<div id="hint">
-       Buscando registros ...
-</div>
-
-<div py:replace="form(value=record, action=tg.url('/ejercicio/update/%d' % record.id),
-       submit_text=_(u'Guardar'))">Formulario</div>
-
-<br/>
-<a href="${tg.url('/ejercicio/show/%d' % record.id)}">Ver (cancela)</a> |
-<a href="${tg.url('/ejercicio/list')}">Volver (cancela)</a>
-</body>
-</html>