]> git.llucax.com Git - software/sercom.git/blobdiff - sercom/subcontrollers/curso/grupo/__init__.py
Degrade de colores para las entregas.
[software/sercom.git] / sercom / subcontrollers / curso / grupo / __init__.py
index dc162383886cd68abe5664ab61f20d73e4182886..a38234012ae6be371bb6c114b5e0253e411c48c8 100644 (file)
@@ -12,6 +12,7 @@ from docutils.core import publish_parts
 from sercom.subcontrollers import validate as val
 from sercom.model import Curso, AlumnoInscripto, Docente, DocenteInscripto, Grupo, Alumno, Miembro
 from sqlobject import *
+from sqlobject.dberrors import *
 
 from sercom.widgets import *
 
@@ -124,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)]
@@ -143,29 +144,11 @@ 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 */
@@ -194,6 +177,10 @@ ajaxadmin = u"""
         MochiKit.DOM.getElement('form_listaGrupoB').disabled = disabled;
         MochiKit.DOM.getElement('form_grupos_to').disabled = disabled;
         MochiKit.DOM.getElement('form_grupos_from').disabled = disabled;
+        MochiKit.DOM.getElement('form_tutoresA').disabled = true;
+        MochiKit.DOM.getElement('form_tutoresB').disabled = true;
+        MochiKit.DOM.getElement('form_responsableA').disabled = true;
+        MochiKit.DOM.getElement('form_responsableB').disabled = true;
     }
 
     function onListaAChange() {
@@ -208,11 +195,6 @@ ajaxadmin = u"""
         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() {
@@ -231,17 +213,14 @@ ajaxadmin = u"""
             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 makeOption(option) {
+        return OPTION({"value": option.value}, option.text);
+    }
 
     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)
     }
@@ -262,8 +241,31 @@ ajaxadmin = u"""
             label = alumnos[i].label;
             MochiKit.DOM.appendChildNodes(lista, OPTION({"value":id}, label))
         }
+        ActualizarResponsables();
     }
 
+    function ActualizarResponsables()
+    {
+        replaceChildNodes('form_responsableA', '');
+        replaceChildNodes('form_responsableB', '');
+        appendChildNodes('form_responsableA', map(makeOption, $('form_grupos_from').options));
+        appendChildNodes('form_responsableB', map(makeOption, $('form_grupos_to').options));
+
+        if (getElement('form_grupos_from').options.length == 0) {
+            getElement('form_tutoresA').disabled = true;
+            getElement('form_responsableA').disabled = true;
+        } else {
+            getElement('form_tutoresA').disabled = false;
+            getElement('form_responsableA').disabled = false;
+        }
+        if (getElement('form_grupos_to').options.length == 0) {
+            getElement('form_tutoresB').disabled = true;
+            getElement('form_responsableB').disabled = true;
+        } else {
+            getElement('form_tutoresB').disabled = false;
+            getElement('form_responsableB').disabled = false;
+        }
+    }
 """
 
 class GrupoAdminForm(W.TableForm):
@@ -271,7 +273,7 @@ class GrupoAdminForm(W.TableForm):
         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))
+        grupos = AjaxDosListasSelect(label=_(u'Grupos'),title_from=u"Grupo A", size=8, move_signal="ActualizarResponsables();", 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))
@@ -300,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.capitalize(), curso=Curso.get(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)
@@ -487,7 +491,7 @@ class GrupoController(controllers.Controller, identity.SecureResource):
             flash(_(u'Error A %s.' % e))
             raise redirect(url('/curso/grupo/list' % int(cursoID)))
         # seteo el reponsable del grupo
-        if int(responsableA) != 0:
+        if responsableA and int(responsableA) != 0:
             grupoA.responsable = AlumnoInscripto.get(int(responsableA))
 
         for t in tutoresA:
@@ -513,7 +517,7 @@ class GrupoController(controllers.Controller, identity.SecureResource):
                 nuevosMiembros.append(AlumnoInscripto.get(int(m)))
             nuevosTutores = []
             for t in tutoresB:
-                nuevosTutores.append(Docente.get(t))
+                nuevosTutores.append(DocenteInscripto.get(t))
             #Creo el nuevo grupo
             Grupo(miembros = nuevosMiembros, tutores = nuevosTutores, cursoID=cursoID, nombre='NuevoGrupo'+str(cursoID))
         else:
@@ -537,7 +541,7 @@ class GrupoController(controllers.Controller, identity.SecureResource):
                 flash(_(u'Error B %s.' % e))
                 raise redirect(url('/curso/grupo/list/%d' % int(cursoID)))
             # seteo el reponsable del grupo
-            if int(responsableB) != 0:
+            if responsableB and int(responsableB) != 0:
                 grupoB.responsable = AlumnoInscripto.get(int(responsableB))
 
             #Elimino el grupo si quedo vacio