1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
5 from turbogears import controllers, expose, redirect
6 from turbogears import validate, flash, error_handler
7 from turbogears import validators as V
8 from turbogears import widgets as W
9 from turbogears import identity
10 from turbogears import paginate
11 from docutils.core import publish_parts
12 from sercom.subcontrollers import validate as val
13 from sercom.model import Curso, Ejercicio, Alumno, Docente, Grupo, DocenteInscripto
14 from curso_alumno import *
15 from sqlobject import *
16 from sqlobject.dberrors import *
17 from sercom.widgets import *
27 function makeOption(option) {
28 return OPTION({"value": option.value}, option.text);
31 function moveOption( fromSelect, toSelect) {
32 // add 'selected' nodes toSelect
33 appendChildNodes(toSelect,
34 map( makeOption,ifilter(itemgetter('selected'), $(fromSelect).options)));
35 // remove the 'selected' fromSelect
36 replaceChildNodes(fromSelect,
37 list(ifilterfalse(itemgetter('selected'), $(fromSelect).options))
41 function alumnos_agregar_a_la_lista(texto, lista)
43 t = MochiKit.DOM.getElement(texto);
45 url = "/alumno/get_alumno?padron="+t.value;
52 alert("The metadata for MochiKit.Async could not be fetched :(");
55 function procesar(result)
57 l = MochiKit.DOM.getElement('form_responsable_info');
59 l.innerHTML = result.msg;
61 l.innerHTML = result.msg.value;
64 function buscar_alumno()
66 /* Obtengo el curso */
67 l = MochiKit.DOM.getElement('form_cursoID');
68 cursoid = l.options[l.selectedIndex].value;
70 alert('Debe seleccionar un curso');
73 /* Obtengo el padron ingresado */
74 p = MochiKit.DOM.getElement('form_responsable');
77 alert('Debe ingresar el padrón del alumno responsable');
80 url = "/grupo/get_inscripto?cursoid="+cursoid+'&padron='+padron;
81 var d = loadJSONDoc(url);
82 d.addCallbacks(procesar, err);
87 /* TODO : Validar datos y evitar el submit si no esta completo */
89 /* Selecciono todos los miembros si no, no llegan al controllere*/
90 l = MochiKit.DOM.getElement('form_alumnos');
91 for (i=0; i<l.options.length; i++) {
92 l.options[i].selected = true;
94 /* Selecciono todos los miembros si no, no llegan al controllere*/
95 l = MochiKit.DOM.getElement('form_docentes_curso');
96 for (i=0; i<l.options.length; i++) {
97 l.options[i].selected = true;
99 return true; // Dejo hacer el submit
106 def validate_get(id):
107 return val.validate_get(cls, name, id)
109 def validate_set(id, data):
110 return val.validate_set(cls, name, id, data)
112 def validate_new(data):
113 return val.validate_new(cls, name, data)
116 def get_ejercicios():
117 return [(fk1.id, fk1.shortrepr()) for fk1 in Ejercicio.select()]
120 return [(fk1.id, fk1.shortrepr()) for fk1 in Docente.select()]
123 return [(fk1.id, fk1.shortrepr()) for fk1 in Alumno.select()]
126 return [(fk1.id, fk1.shortrepr()) for fk1 in Grupo.select()]
129 class CursoForm(W.TableForm):
130 class Fields(W.WidgetsList):
131 anio = W.TextField(label=_(u'Anio'),
132 help_text=_(u'Requerido y único.'),
133 validator=V.Number(min=4, max=4, strip=True))
134 cuatrimestre = W.TextField(label=_(u'Cuatrimestre'),
135 help_text=_(u'Requerido.'),
136 validator=V.Number(min=1, max=1, strip=True))
137 numero = W.TextField(label=_(u'Numero'),
138 help_text=_(u'Requerido'),
139 validator=V.Number(min=1, max=2, strip=True))
140 descripcion = W.TextArea(name='descripcion', label=_(u'Descripcion'),
141 help_text=_(u'Descripcion.'),
142 validator=V.UnicodeString(not_empty=False, strip=True))
144 docentes = W.MultipleSelectField(name="docentes",
145 label=_(u'Docentes'),
146 attrs=dict(style='width:300px'),
147 options=get_docentes,
148 validator=V.Int(not_empty=True))
149 addDocente = W.Button(default='Asignar', label='',
150 attrs=dict( onclick='moveOption("form_docentes","form_docentes_curso")'))
151 remDocente = W.Button(default='Remover', label='',
152 attrs=dict( onclick='moveOption("form_docentes_curso","form_docentes")'))
153 docentes_curso = W.MultipleSelectField(name="docentes_curso",
154 label=_(u'Docentes del curso'),
155 attrs=dict(style='width:300px'),
156 # options=get_docentes_curso,
157 validator=V.Int(not_empty=True))
159 alumnos = AjaxMultiSelect(label=_(u'Alumnos'),
161 on_add="alumnos_agregar_a_la_lista")
164 javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('anio');"),
166 form_attrs = dict(onsubmit='return onsubmit()')
171 class CursoController(controllers.Controller, identity.SecureResource):
172 """Basic model admin interface"""
173 require = identity.has_permission('admin')
174 curso_alumno = CursoAlumnoController()
177 def default(self, tg_errors=None):
178 """handle non exist urls"""
179 raise redirect('list')
183 raise redirect('list')
185 @expose(template='kid:%s.templates.list' % __name__)
188 """List records in model"""
190 return dict(records=r, name=name, namepl=namepl)
193 def activate(self, id, activo):
194 """Save or create record to model"""
197 r.activo = bool(int(activo))
199 raise cherrypy.NotFound
200 raise redirect('../../list')
202 @expose(template='kid:%s.templates.new' % __name__)
204 """Create new records in model"""
205 params = dict([(k,v) for (k,v) in kw.iteritems() if k in Curso.sqlmeta.columns.keys()])
206 return dict(name=name, namepl=namepl, form=form, values=params)
211 def create(self, **kw):
212 """Save or create record to model"""
215 docentes = kw.get('docentes_curso', [])
216 alumnos = kw.get('alumnos', [])
217 del(kw['remDocente'])
218 del(kw['addDocente'])
219 del(kw['docentes_curso'])
222 """ Agrego la nueva seleccion de docentes """
225 """ El curso es nuevo, por ende no hay alumnos inscriptos """
228 flash(_(u'Se creó un nuevo %s.') % name)
229 raise redirect('list')
231 @expose(template='kid:%s.templates.edit' % __name__)
232 def edit(self, id, **kw):
233 """Edit record in model"""
237 values = EmptyClass()
240 values.numero = r.numero
241 values.cuatrimestre = r.cuatrimestre
242 values.cursoID = r.id
243 values.descripcion = r.descripcion
244 # cargo la lista con los docentes asignados al curso
245 values.docentes_curso = [{"id":d.docente.id, "label":d.docente.nombre} for d in DocenteInscripto.selectBy(curso=r.id)]
246 values.alumnos_inscriptos = [{"id":a.alumno.id, "label":a.alumno.nombre} for a in AlumnoInscripto.selectBy(curso=r.id)]
248 return dict(name=name, namepl=namepl, record=values, form=form)
253 def update(self, id, **kw):
254 """Save or create record to model"""
255 params = dict([(k,v) for (k,v) in kw.iteritems() if k in Curso.sqlmeta.columns.keys()])
256 r = validate_set(id, params)
258 docentes = kw.get('docentes_curso', [])
259 alumnos = kw.get('alumnos', [])
260 """ levanto los doncentes del curso para ver cuales tengo que agregar """
261 docentes_inscriptos = DocenteInscripto.selectBy(curso=id)
263 """ elimino a los docentes que no fueron seleccionados """
264 for di in docentes_inscriptos:
265 if di.id not in docentes:
266 r.remove_docente(di.docente)
268 """ Agrego la nueva seleccion """
275 """ Verifico que los alumnos no esten ya inscriptos """
281 flash(_(u'El %s fue actualizado.') % name)
282 raise redirect('../list')
284 @expose(template='kid:%s.templates.show' % __name__)
285 def show(self,id, **kw):
286 """Show record in model"""
288 return dict(name=name, namepl=namepl, record=r)
291 def delete(self, id):
292 """Destroy record in model"""
295 flash(_(u'El %s fue eliminado permanentemente.') % name)
296 raise redirect('../list')