]> git.llucax.com Git - software/sercom.git/commitdiff
Cursos y alumnos
authortailor <ndimov@gmail.com>
Thu, 1 Mar 2007 01:51:23 +0000 (01:51 +0000)
committertailor <ndimov@gmail.com>
Thu, 1 Mar 2007 01:51:23 +0000 (01:51 +0000)
* Agrego provisoriamente ua pantalla para inscribir alumnos
  que todavia no hace mas que pasar registros de una lista a la otra..

sercom/controllers.py
sercom/subcontrollers/curso/__init__.py
sercom/subcontrollers/curso/curso_alumno/__init__.py [new file with mode: 0644]
sercom/subcontrollers/curso/curso_alumno/templates/__init__.py [new file with mode: 0644]
sercom/subcontrollers/curso/curso_alumno/templates/edit.kid [new file with mode: 0644]
sercom/subcontrollers/curso/curso_alumno/templates/list.kid [new file with mode: 0644]
sercom/subcontrollers/curso/curso_alumno/templates/new.kid [new file with mode: 0644]
sercom/subcontrollers/curso/curso_alumno/templates/show.kid [new file with mode: 0644]
sercom/subcontrollers/curso/templates/edit.kid
sercom/subcontrollers/curso/templates/list.kid
sercom/subcontrollers/curso/templates/show.kid

index 4edbe606e9ef541245839fa87468007672220e37..f7e9d830d829524717b76b9c29f9f2d57d4fa449 100644 (file)
@@ -93,6 +93,7 @@ class Root(controllers.RootController):
     
     docente_inscripto = DocenteInscriptoController()
 
+
 #{{{ 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
index bd66334065bf348a9ef3742413107f3d72203db2..8b3c0824d5e0050c1c4a02ca512d05d30091042e 100644 (file)
@@ -11,6 +11,8 @@ from turbogears import paginate
 from docutils.core import publish_parts
 from sercom.subcontrollers import validate as val
 from sercom.model import Curso, Ejercicio, Alumno, Docente, Grupo, DocenteInscripto
+from curso_alumno import *
+
 #}}}
 
 #{{{ Configuración
@@ -78,6 +80,7 @@ form = CursoForm()
 class CursoController(controllers.Controller, identity.SecureResource):
     """Basic model admin interface"""
     require = identity.has_permission('admin')
+    curso_alumno = CursoAlumnoController()
 
     @expose()
     def default(self, tg_errors=None):
diff --git a/sercom/subcontrollers/curso/curso_alumno/__init__.py b/sercom/subcontrollers/curso/curso_alumno/__init__.py
new file mode 100644 (file)
index 0000000..4ab007f
--- /dev/null
@@ -0,0 +1,174 @@
+# 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, Ejercicio, Alumno, Docente, Grupo, DocenteInscripto, AlumnoInscripto
+#}}}
+
+#{{{ Configuración
+cls = Curso
+name = 'Alumno del curso'
+namepl = 'Alumnos del curso'
+#}}}
+
+#{{{ Validación
+def validate_get(id):
+    return val.validate_get(cls, name, id)
+
+def validate_set(id, data):
+    return val.validate_set(cls, name, id, data)
+
+def validate_new(data):
+    return val.validate_new(cls, name, data)
+#}}}
+
+def get_ejercicios():
+    return [(fk1.id, fk1.shortrepr()) for fk1 in Ejercicio.select()]
+
+def get_docentes():
+    return [(fk1.id, fk1.shortrepr()) for fk1 in Docente.select()]
+
+def get_alumnos_inscriptos(curso):
+    return [(fk1.id, fk1.shortrepr()) for fk1 in AlumnoInscripto.selectBy(curso)]
+
+def get_alumnos():
+    return [(fk1.id, fk1.shortrepr()) for fk1 in Alumno.select()]
+
+def get_grupos():
+    return [(fk1.id, fk1.shortrepr()) for fk1 in Grupo.select()]
+
+ajax = u""" 
+function makeOption(option) {
+    return OPTION({"value": option.value}, option.text);
+}
+                   
+function moveOption( fromSelect, toSelect) {
+    // add 'selected' nodes toSelect
+    appendChildNodes(toSelect,
+    map( makeOption,ifilter(itemgetter('selected'), $(fromSelect).options)));
+    // remove the 'selected' fromSelect
+    replaceChildNodes(fromSelect,
+        list(ifilterfalse(itemgetter('selected'), $(fromSelect).options))
+    );
+}
+"""
+
+#{{{ Formulario
+class CursoAlumnoForm(W.TableForm):
+    class Fields(W.WidgetsList):
+        alumnos = W.MultipleSelectField(label=_(u'Alumnos'),
+            attrs=dict( style='width:250px'),
+            options=get_alumnos,
+            validator = V.Int(not_empty=False))
+        inscribir = W.Button(default='Inscribir', label='',
+            attrs=dict( onclick='moveOption("form_alumnos","form_inscriptos")'))
+        desinscribir = W.Button(default='Desinscribir', label='',
+            attrs=dict( onclick='moveOption("form_inscriptos","form_alumnos")'))
+        inscriptos = W.MultipleSelectField(label=_(u'Alumnos Inscriptos'),
+            attrs=dict( style='width:250px'),
+            validator = V.Int(not_empty=False))
+    fields = Fields()
+    javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('alumnos');"),
+                  W.JSSource(ajax)]
+form = CursoAlumnoForm()
+#}}}
+
+#{{{ Controlador
+class CursoAlumnoController(controllers.Controller, identity.SecureResource):
+    """Basic model admin interface"""
+    require = identity.has_permission('admin')
+
+    @expose()
+    def default(self, curso_id):
+        """handle non exist urls"""
+        return dict(records=r, name=name, namepl=namepl, alumnos=alumnos)
+    
+    @expose()
+    def index(self):
+        raise redirect('/curso/list')
+
+    @expose(template='kid:%s.templates.list' % __name__)
+    @paginate('records')
+    def list(self):
+        """List records in model"""
+        r = cls.select()
+        return dict(records=r, name=name, namepl=namepl)
+
+    @expose()
+    def activate(self, id, activo):
+        """Save or create record to model"""
+        r = validate_get(id)
+        try:
+            r.activo = bool(int(activo))
+        except ValueError:
+            raise cherrypy.NotFound
+        raise redirect('../../list')
+
+    @expose(template='kid:%s.templates.new' % __name__)
+    def new(self,curso_id, **kw):
+        """Create new records in model"""
+        curso = Curso.get(curso_id)
+        alumnos_inscriptos = AlumnoInscripto.selectBy(curso=curso)
+#        kw['alumnos'] = alumnos_inscriptos
+#        form.fields.alumnos.options = alumnos_inscriptos
+        return dict(name=name, namepl=namepl, form=form, values=kw)
+
+    @validate(form=form)
+    @error_handler(new)
+    @expose()
+    def create(self, **kw):
+        """Save or create record to model"""
+        r = validate_new(kw)
+        docentes = kw.get('docentes', [])
+        alumnos = kw.get('alumnos', [])
+        """ Elimino todos los docentes asignados al curso y los agrego nuevamente""" 
+        for d in DocenteInscripto.selectBy(curso=r):
+            d.destroySelf()
+        """ Agrego la nueva seleccion """ 
+        for d in docentes:
+            r.add_docente(Docente(d))
+        """ Elimino a los alumnos y los vuelvo a agregar """
+        for a in AlumnoInscripto.selectBy(curso=r):
+            d.destroySelf()
+        for a in alumnos:
+            r.add_alumno(Alumno(a))
+        flash(_(u'Se creó un nuevo %s.') % name)
+        raise redirect('list')
+    
+    @expose(template='kid:%s.templates.edit' % __name__)
+    def edit(self, id, **kw):
+        """Edit record in model"""
+        r = validate_get(id)
+        return dict(name=name, namepl=namepl, record=r, form=form)
+
+    @validate(form=form)
+    @error_handler(edit)
+    @expose()
+    def update(self, id, **kw):
+        """Save or create record to model"""
+        r = validate_set(id, kw)
+        flash(_(u'El %s fue actualizado.') % name)
+        raise redirect('../list')
+
+    @expose(template='kid:%s.templates.show' % __name__)
+    def show(self,id, **kw):
+        """Show record in model"""
+        r = validate_get(id)
+        return dict(name=name, namepl=namepl, record=r)
+
+    @expose()
+    def delete(self, id):
+        """Destroy record in model"""
+        r = validate_get(id)
+        r.destroySelf()
+        flash(_(u'El %s fue eliminado permanentemente.') % name)
+        raise redirect('../list')
+#}}}
diff --git a/sercom/subcontrollers/curso/curso_alumno/templates/__init__.py b/sercom/subcontrollers/curso/curso_alumno/templates/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/sercom/subcontrollers/curso/curso_alumno/templates/edit.kid b/sercom/subcontrollers/curso/curso_alumno/templates/edit.kid
new file mode 100644 (file)
index 0000000..8c17c7b
--- /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_alumno/update/%d' % record.id),
+       submit_text=_(u'Guardar'))">Formulario</div>
+<br/>
+<a href="${tg.url('/curso/show/%d' % record.id)}">Ver (cancela)</a> |
+<a href="${tg.url('/curso/list')}">Volver (cancela)</a>
+
+</body>
+</html>
diff --git a/sercom/subcontrollers/curso/curso_alumno/templates/list.kid b/sercom/subcontrollers/curso/curso_alumno/templates/list.kid
new file mode 100644 (file)
index 0000000..5222788
--- /dev/null
@@ -0,0 +1,56 @@
+<!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>list</title>
+</head>
+<body>
+
+<h1>Administración de <span py:replace="namepl">Objetos</span></h1>
+
+<table>
+    <tr>
+        <th>Numero</th>
+        <th>Cuatrimestre</th>
+        <th>Anio</th>
+        <th>Descripcion</th>
+        <th>Docentes</th>
+        <th>Alumnos</th>
+        <th>Grupos</th>
+               <th>Ejercicios</th>
+               <th>Operaciones</th>
+    </tr>
+    <tr py:for="record in records">
+        <!--td><input type="checkbox" onclick="var f =
+            document.createElement('form'); this.parentNode.appendChild(f);
+            f.method = 'POST'; f.action = '${tg.url('/alumno/activate/%d/%d' % (record.id, int(not record.activo)))}';
+            f.submit(); return false;"
+            py:attrs="checked=tg.checker(record.activo)" /></td-->
+        <td><a href="${tg.url('/curso/show/%d' % record.id)}"><span py:replace="record.numero">numero</span></a></td>
+        <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('/alumno/list')}"><span py:replace="len(record.alumnos)">Alumnos</span></a></td>
+        <td><a py:if="len(record.grupos)"  href="${tg.url('/grupo/list')}"><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/show/%d' % record.id)}">Ver</a>
+            <a href="${tg.url('/curso/edit/%d' % record.id)}">Editar</a>
+            <a href="${tg.url('/curso/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Tal vez sólo quieras desactivarlo mejor...')}')) { 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 href="${tg.url('/curso/new')}">Agregar</a>
+
+<div py:for="page in tg.paginate.pages">
+    <a py:if="page != tg.paginate.current_page"
+        href="${tg.paginate.get_href(page)}">${page}</a>
+    <b py:if="page == tg.paginate.current_page">${page}</b>
+</div>
+
+</body>
+</html>
+
+<!-- vim: set et sw=4 sts=4 : -->
diff --git a/sercom/subcontrollers/curso/curso_alumno/templates/new.kid b/sercom/subcontrollers/curso/curso_alumno/templates/new.kid
new file mode 100644 (file)
index 0000000..0d1719a
--- /dev/null
@@ -0,0 +1,16 @@
+<!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>new</title>
+</head>
+<body>
+
+<h1>Asignar Nuevo <span py:replace="name">Objeto</span></h1>
+<p py:replace="form(action=tg.url('/curso_alumno/create'), value=values, submit_text=_('Crear'))">Formulario</p>
+
+<br/>
+<a href="${tg.url('/curso/list')}">Cancelar</a>
+
+</body>
+</html>
diff --git a/sercom/subcontrollers/curso/curso_alumno/templates/show.kid b/sercom/subcontrollers/curso/curso_alumno/templates/show.kid
new file mode 100644 (file)
index 0000000..f241d50
--- /dev/null
@@ -0,0 +1,50 @@
+<!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>show</title>
+</head>
+<body>
+
+<table class="show">
+    <tr>
+        <th>Anio:</th>
+        <td><span py:replace="record.anio">anio</span></td>
+    </tr>
+    <tr>
+        <th>Cuatrimestre:</th>
+       <td><span py:replace="record.cuatrimestre">cuatrimestre</span></td>
+    </tr>
+    <tr>
+        <th>Numero:</th>
+       <td><span py:replace="record.numero">numero</span></td>
+    </tr>
+    <tr>
+        <th>Descripcion:</th>
+       <td><span py:replace="record.descripcion">descripcion</span></td>
+    </tr>
+    <tr>
+        <th>Docentes:</th>
+       <td><span py:replace="len(record.docentes)">Docentes</span></td>
+    </tr>
+    <tr>
+        <th>Alumnos:</th>
+       <td><span py:replace="len(record.alumnos)">alumnos</span></td>
+    </tr>
+    <tr>
+        <th>Grupos:</th>
+       <td><span py:replace="len(record.grupos)">grupos</span></td>
+    </tr>
+    <tr>
+        <th>Ejercicios:</th>
+       <td><span py:replace="len(record.ejercicios)">ejercicios</span></td>
+    </tr>
+</table>
+
+<br/>
+<a href="${tg.url('/curso/edit/%d' % record.id)}">Editar</a> |
+<a href="${tg.url('/curso/list')}">Volver</a>
+
+</body>
+</html>
index 7b50a66d2f81063ea5d11985c21bd6717e1ec888..5c29a141a14410760078ed759f9fbd92845e1824 100644 (file)
@@ -11,8 +11,9 @@
 
 <div py:replace="form(value=record, action=tg.url('/curso/update/%d' % record.id),
        submit_text=_(u'Guardar'))">Formulario</div>
-
-<br/>
+<a href="${tg.url('/curso/curso_alumno/new/%d' % record.id)}">Agregar Alumnos</a>
+       <br/>
+       <br/>
 <a href="${tg.url('/curso/show/%d' % record.id)}">Ver (cancela)</a> |
 <a href="${tg.url('/curso/list')}">Volver (cancela)</a>
 
index a1327df5423fb30643fd2adfe99c75bba96e621e..2634178f9bb3e18aeeefa5e51f7f28c22a3cef54 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 =
@@ -27,8 +27,7 @@
             f.method = 'POST'; f.action = '${tg.url('/alumno/activate/%d/%d' % (record.id, int(not record.activo)))}';
             f.submit(); return false;"
             py:attrs="checked=tg.checker(record.activo)" /></td-->
-        <td><a href="${tg.url('/curso/show/%d' % record.id)}"><span
-                    py:replace="record.numero">numero</span></a></td>
+        <td><a href="${tg.url('/curso/show/%d' % record.id)}"><span py:replace="record.numero">numero</span></a></td>
         <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>
@@ -36,7 +35,8 @@
         <td><a py:if="len(record.alumnos)"  href="${tg.url('/alumno/list')}"><span py:replace="len(record.alumnos)">Alumnos</span></a></td>
         <td><a py:if="len(record.grupos)"  href="${tg.url('/grupo/list')}"><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/edit/%d' % record.id)}">Editar</a>
+        <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/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Tal vez sólo quieras desactivarlo mejor...')}')) { 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>
index 5b6d63a0425f9f205fa38d1e0b57d89b004938ad..f241d50d5cc1c024e552edd1e3d37f2e3c96694f 100644 (file)
     </tr>
     <tr>
         <th>Docentes:</th>
-       <td><span py:replace="record.docentes">docentes</span></td>
+       <td><span py:replace="len(record.docentes)">Docentes</span></td>
     </tr>
     <tr>
         <th>Alumnos:</th>
-       <td><span py:replace="record.alumnos">alumnos</span></td>
+       <td><span py:replace="len(record.alumnos)">alumnos</span></td>
     </tr>
     <tr>
         <th>Grupos:</th>
-       <td><span py:replace="record.grupos">grupos</span></td>
+       <td><span py:replace="len(record.grupos)">grupos</span></td>
     </tr>
     <tr>
         <th>Ejercicios:</th>
-       <td><span py:replace="record.ejercicios">ejercicios</span></td>
+       <td><span py:replace="len(record.ejercicios)">ejercicios</span></td>
     </tr>
 </table>