]> git.llucax.com Git - z.facultad/75.52/sercom.git/commitdiff
Muevo Mezclar/Juntar/Separar Grupos a /curso/grupo.
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Thu, 15 Mar 2007 01:51:02 +0000 (01:51 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Thu, 15 Mar 2007 01:51:02 +0000 (01:51 +0000)
sercom/subcontrollers/curso/grupo/__init__.py
sercom/subcontrollers/curso/grupo/templates/admin.kid [new file with mode: 0644]
sercom/subcontrollers/curso/grupo/templates/list.kid
sercom/subcontrollers/curso/templates/edit.kid

index 7d1e8d1b6d0d391567252eb6bc02e05bc0573d7e..cdabdb0dafe82b393d1fe880fa81c233b336af1e 100644 (file)
@@ -132,6 +132,153 @@ class GrupoForm(W.TableForm):
 
 form = GrupoForm()
 
+def get_gruposA(cursoID):
+    return [(0, u'---')] + [(g.id, g.shortrepr()) for g in Grupo.select(Grupo.q.cursoID==cursoID)]
+
+def get_gruposB(cursoID):
+    return [(0, u'Nuevo Grupo')] + [(g.id, g.shortrepr()) for g in Grupo.select(Grupo.q.cursoID==cursoID)]
+
+ajaxadmin = 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 doSubmit()
+    {
+        /* 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<l.options.length; i++) {
+            l.options[i].selected = true;
+        }
+        /* Selecciono todos los miembros si no, no llegan al controllere*/
+        l = MochiKit.DOM.getElement('form_grupos_from');
+        for (i=0; i<l.options.length; i++) {
+            l.options[i].selected = true;
+        }
+
+        return true; // Dejo hacer el submit
+    }
+
+    function initWidgets(disabled) {
+        if ( disabled ) {
+            MochiKit.DOM.getElement('form_listaGrupoA').selectedIndex = 0;
+        }
+        MochiKit.DOM.getElement('form_listaGrupoB').selectedIndex = 0;
+        MochiKit.DOM.getElement('form_grupos_to').options.length = 0;
+        MochiKit.DOM.getElement('form_grupos_from').options.length = 0;
+        MochiKit.DOM.getElement('form_listaGrupoB').disabled = disabled;
+        MochiKit.DOM.getElement('form_grupos_to').disabled = disabled;
+        MochiKit.DOM.getElement('form_grupos_from').disabled = disabled;
+    }
+
+    function onListaAChange() {
+        lista = MochiKit.DOM.getElement('form_listaGrupoA');
+        if ( lista.selectedIndex != '0' ) {
+            initWidgets(false);
+        } else {
+            initWidgets(true);
+            return;
+        }
+        // carga el grupo en el multiple select
+        grupoA = MochiKit.DOM.getElement('form_grupos_from');
+        id = lista.options[lista.selectedIndex].value
+        cargarGrupo(id, grupoA);
+        //carga la lista para seleccionar un responsable
+        responsableA = MochiKit.DOM.getElement('form_responsableA');
+        responsableA.options.length = 0;
+        MochiKit.DOM.appendChildNodes(responsableA, OPTION({"value":0}, "---"));
+        cargarGrupo(id, responsableA);
+    }
+
+    function onListaBChange() {
+        lista = MochiKit.DOM.getElement('form_listaGrupoB');
+        listaA =  MochiKit.DOM.getElement('form_listaGrupoA');
+        MochiKit.DOM.getElement('form_grupos_to').options.length = 0;
+        if ( lista.selectedIndex == 0 ) {
+            return;
+        }
+        if ( lista.selectedIndex != '0' ) {
+            if ( lista.selectedIndex == listaA.selectedIndex ) {
+                window.alert('Debe seleccionar 2 grupos distintos');
+                MochiKit.DOM.getElement('form_grupos_to').options.length = 0;
+                return;
+            }
+            grupoB = MochiKit.DOM.getElement('form_grupos_to');
+            id = lista.options[lista.selectedIndex].value
+            cargarGrupo(id, grupoB);
+
+            //carga la lista para seleccionar un responsable
+            responsableB = MochiKit.DOM.getElement('form_responsableB');
+            responsableB.options.length = 0;
+            MochiKit.DOM.appendChildNodes(responsableB, OPTION({"value":0}, "---"));
+            cargarGrupo(id, responsableB);
+        }
+    }
+
+    function cargarGrupo(grupoid, lista) {
+        //url = "/grupo/get_inscripto?cursoid="+cursoid+'&padron='+padron
+        var result = loadJSONDoc('/curso/grupo/get_alumnos?grupoid='+id);
+        result.addCallbacks(partial(cargarLista, lista), err)
+    }
+
+    function err (err)
+    {
+        alert("The metadata for MochiKit.Async could not be fetched :(");
+    }
+
+    function cargarLista(lista, result) {
+        var alumnos = result.msg;
+        if (result.error) {
+            window.alert(result.msg);
+            return;
+        }
+        for (i in alumnos) {
+            id = alumnos[i].id;
+            label = alumnos[i].label;
+            MochiKit.DOM.appendChildNodes(lista, OPTION({"value":id}, label))
+        }
+    }
+
+"""
+
+class GrupoAdminForm(W.TableForm):
+    class Fields(W.WidgetsList):
+        cursoID = W.HiddenField()
+        listaGrupoA = W.SingleSelectField(label=_(u'Grupo A'), attrs = dict(onChange='onListaAChange()'), validator = V.Int(not_empty=True))
+        listaGrupoB = W.SingleSelectField(label=_(u'Grupo B'), attrs = dict(onChange='onListaBChange()'), validator = V.Int(not_empty=True))
+        grupos = AjaxDosListasSelect(label=_(u'Grupos'),title_from=u"Grupo A", size=8, title_to=u"Grupo B", validator=V.Int(not_empty=True))
+        responsableA = W.SingleSelectField(label=_(u'Responsable A'), validator = V.Int())
+        responsableB = W.SingleSelectField(label=_(u'Responsable B'), validator = V.Int())
+        tutoresA = W.MultipleSelectField(label=_(u'Tutores A'), validator = V.Int(not_empty=True))
+        tutoresB = W.MultipleSelectField(label=_(u'Tutores B'), validator = V.Int(not_empty=True))
+
+    fields = Fields()
+    javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('listaGrupoA');"), W.JSSource(ajaxadmin)]
+    form_attrs = dict(onsubmit='return doSubmit();')
+
+formadmin = GrupoAdminForm()
+
 #}}}
 
 #{{{ Controlador
@@ -274,5 +421,16 @@ class GrupoController(controllers.Controller, identity.SecureResource):
             integrantes = []
             integrantes.append(msg)
         return dict(msg=integrantes, error=error)
+
+    @expose(template='kid:%s.templates.admin' % __name__)
+    def admin(self, cursoID, **kw):
+        """Create new records in model"""
+        options = dict(
+            listaGrupoA=get_gruposA(cursoID),
+            listaGrupoB=get_gruposB(cursoID),
+            tutoresA=get_docentes_inscriptos(cursoID),
+            tutoresB=get_docentes_inscriptos(cursoID),
+        )
+        return dict(name=name, namepl=namepl, options=options, form=formadmin, values=kw, cursoID=int(cursoID))
 #}}}
 
diff --git a/sercom/subcontrollers/curso/grupo/templates/admin.kid b/sercom/subcontrollers/curso/grupo/templates/admin.kid
new file mode 100644 (file)
index 0000000..500fd1c
--- /dev/null
@@ -0,0 +1,22 @@
+<!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>Administrar <span py:replace="namepl">Objeto</span></h1>
+<p py:replace="form(action=tg.url('/curso/admin/adminupdate/%d' % cursoID), options=options, value=values, submit_text=_('Actualizar'))">Formulario</p>
+
+<br/>
+<a href="${tg.url('/curso/grupo/list/%d' % cursoID)}">Cancelar</a>
+
+<script language="javascript">
+    initWidgets(true);
+</script>
+
+</body>
+</html>
index 31be7009e397ede5e8c6f42e1baa65949a9ddc4b..36dbd8b7997573448397d2ed010aa14c99e8f637 100644 (file)
 
 <br/>
 <a href="${tg.url('/curso/grupo/new/%d' % cursoID)}">Agregar</a> |
+<a href="${tg.url('/curso/grupo/admin/%d' % cursoID)}">Mezclar, Juntar, Separar Grupos</a> |
 <a href="${tg.url('/curso/list')}">Volver a Cursos</a>
 <br/>
 <br/>
+<br/>
+<br/>
 <div py:for="page in tg.paginate.pages">
     <a py:if="page != tg.paginate.current_page"
         href="${tg.paginate.get_href(page)}">${page}</a>
index 294be12dd55008668fa77b06709c43a249b24545..ca5e84cca512fff41a37f0f236c9703244e9ceab 100644 (file)
 <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/from_file/%d' % record.id)}">Agregar Alumnos desde archivo</a>
-    <br/>
-    <br/>
-<a href="${tg.url('/grupo_admin/new/%d' % record.id)}">Mezclar, Juntar, Separar Grupos</a>
-<br/>
-<br/>
-<a href="${tg.url('/curso/show/%d' % record.id)}">Ver (cancela)</a>
-<a href="${tg.url('/curso/list')}">Volver (cancela)</a>
+<a href="${tg.url('/curso/from_file/%d' % record.id)}">Agregar Alumnos desde archivo</a> |
+<a href="${tg.url('/curso/show/%d' % record.id)}">Ver (cancela)</a> |
+<a href="${tg.url('/curso/list')}">Volver (cancela)</a> |
 
 </body>
 </html>