from sercom.model import Curso, Ejercicio, Alumno, Docente, Grupo, DocenteInscripto
from curso_alumno import *
from sqlobject import *
+from sqlobject.dberrors import *
from sercom.widgets import *
#}}}
namepl = name + 's'
#}}}
-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))
- );
- }
-
+ajax = u"""
function alumnos_agregar_a_la_lista(texto, lista)
{
t = MochiKit.DOM.getElement(texto);
d.addCallbacks(procesar, err);
}
- function prepare()
- {
- connect('form_responsable', 'onblur', buscar_alumno);
- }
-
function onsubmit()
{
/* 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_miembros');
- for (i=0; i<l.options.length; i++) {
- l.options[i].selected = true;
+ l = MochiKit.DOM.getElement('form_alumnos');
+ 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_docentes_curso');
+ for (i=0; i<l.options.length; i++) {
+ l.options[i].selected = true;
}
return true; // Dejo hacer el submit
}
-
- MochiKit.DOM.addLoadEvent(prepare)
-
"""
def validate_new(data):
return val.validate_new(cls, name, data)
+
+def validate_del(id):
+ return val.validate_del(cls, name, id)
#}}}
def get_ejercicios():
def get_grupos():
return [(fk1.id, fk1.shortrepr()) for fk1 in Grupo.select()]
+
#{{{ Formulario
class CursoForm(W.TableForm):
class Fields(W.WidgetsList):
descripcion = W.TextArea(name='descripcion', label=_(u'Descripcion'),
help_text=_(u'Descripcion.'),
validator=V.UnicodeString(not_empty=False, strip=True))
-
+
docentes = W.MultipleSelectField(name="docentes",
label=_(u'Docentes'),
attrs=dict(style='width:300px'),
options=get_docentes,
validator=V.Int(not_empty=True))
addDocente = W.Button(default='Asignar', label='',
- attrs=dict( onclick='moveOption("form_docentes","form_docentes_curso")'))
+ attrs=dict( onclick='mover("form_docentes","form_docentes_curso")'))
remDocente = W.Button(default='Remover', label='',
- attrs=dict( onclick='moveOption("form_docentes_curso","form_docentes")'))
+ attrs=dict( onclick='remover("form_docentes_curso","form_docentes")'))
docentes_curso = W.MultipleSelectField(name="docentes_curso",
label=_(u'Docentes del curso'),
attrs=dict(style='width:300px'),
alumnos = AjaxMultiSelect(label=_(u'Alumnos'),
validator=V.Int(),
+ attrs = dict(size='20'),
on_add="alumnos_agregar_a_la_lista")
fields = Fields()
@expose()
def create(self, **kw):
"""Save or create record to model"""
- r = validate_new(kw)
+ print "--KW--"
+ print kw
docentes = kw.get('docentes_curso', [])
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 """
+ del(kw['remDocente'])
+ del(kw['addDocente'])
+ del(kw['docentes_curso'])
+ del(kw['alumnos'])
+ r = validate_new(kw)
+ """ Agrego la nueva seleccion de docentes """
for d in docentes:
- r.add_docente(Docente(d))
+ r.add_docente(d)
""" El curso es nuevo, por ende no hay alumnos inscriptos """
for a in alumnos:
- r.add_alumno(Alumno(a))
+ r.add_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)
- docentes = kw.get('docentes_curso', [])
- 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))
- """ Verifico que los alumnos no esten ya inscriptos """
-
- try:
- for a in alumnos:
- r.add_alumno(Alumno(a))
- except DuplicateEntryError:
- flash(_(u'El alumno con padron %s ya esta inscripto.') % Alumno(a).padron)
- raise redirect('create')
- flash(_(u'Se creó un nuevo %s.') % name)
-
- return dict(name=name, namepl=namepl, record=r, form=form)
+ class EmptyClass:
+ pass
+ values = EmptyClass()
+ values.id = r.id
+ values.anio = r.anio
+ values.numero = r.numero
+ values.cuatrimestre = r.cuatrimestre
+ values.cursoID = r.id
+ values.descripcion = r.descripcion
+ # cargo la lista con los docentes asignados al curso
+ values.docentes_curso = [{"id":d.docente.id, "label":d.docente.shortrepr()} for d in DocenteInscripto.selectBy(curso=r.id)]
+ values.alumnos_inscriptos = [{"id":a.alumno.id, "label":a.alumno.shortrepr()} for a in AlumnoInscripto.selectBy(curso=r.id)]
+
+ return dict(name=name, namepl=namepl, record=values, form=form)
@validate(form=form)
@error_handler(edit)
"""Save or create record to model"""
params = dict([(k,v) for (k,v) in kw.iteritems() if k in Curso.sqlmeta.columns.keys()])
r = validate_set(id, params)
+
+ docentes = kw.get('docentes_curso', [])
+ alumnos = kw.get('alumnos', [])
+ alumnos_inscriptos = AlumnoInscripto.selectBy(curso=id)
+ """ levanto los doncentes del curso para ver cuales tengo que agregar """
+ docentes_inscriptos = DocenteInscripto.selectBy(curso=id)
+
+ """ elimino a los docentes que no fueron seleccionados """
+ for di in docentes_inscriptos:
+ if di.id not in docentes:
+ r.remove_docente(di.docente)
+
+ """ Agrego la nueva seleccion """
+ for d in docentes:
+ try:
+ r.add_docente(d)
+ except:
+ pass
+
+ """ Verifico que los alumnos no esten ya inscriptos """
+ for a in alumnos_inscriptos:
+ if (a.id not in alumnos):
+ try:
+ r.remove_alumno(a.alumno)
+ except:
+ pass
+ for a in alumnos:
+ try:
+ r.add_alumno(a)
+ except:
+ pass
flash(_(u'El %s fue actualizado.') % name)
raise redirect('../list')
@expose()
def delete(self, id):
"""Destroy record in model"""
- r = validate_get(id)
- r.destroySelf()
+ validate_del(id)
flash(_(u'El %s fue eliminado permanentemente.') % name)
raise redirect('../list')
+
+ @expose(template='kid:%s.templates.from_file' % __name__)
+ def from_file(self, id):
+ return dict(cursoID=int(id))
+
+ @expose(template='kid:%s.templates.import_results' % __name__)
+ def from_file_add(self, id, archivo):
+ """ Se espera :
+ padron,nombre,email,telefono
+ """
+ import csv
+ lines = archivo.file.read().split('\n')
+ ok = []
+ fail = []
+ curso = Curso.get(int(id))
+ for line in lines:
+ for row in csv.reader([line]):
+ if row == []:
+ continue
+ try:
+ u = Alumno(row[0], nombre=row[1])
+ except:
+ u = Alumno.byPadron(row[0])
+ try:
+ u.email = row[2]
+ u.telefono = row[3]
+ u.contrasenia = row[0]
+ u.activo = True
+ curso.add_alumno(u)
+ ok.append(row)
+ except Exception, e:
+ row.append(str(e))
+ fail.append(row)
+ return dict(ok=ok, fail=fail)
#}}}