]> git.llucax.com Git - software/sercom.git/blob - sercom/subcontrollers/curso/__init__.py
curso; alumnos y docentes
[software/sercom.git] / sercom / subcontrollers / curso / __init__.py
1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
2
3 #{{{ Imports
4 import cherrypy
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 *
18 #}}}
19
20 #{{{ Configuración
21 cls = Curso
22 name = 'curso'
23 namepl = name + 's'
24 #}}}
25
26 ajax = u""" 
27     function makeOption(option) {
28         return OPTION({"value": option.value}, option.text);
29     }
30                    
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))
38         );
39     }
40
41     function alumnos_agregar_a_la_lista(texto, lista)
42     {
43         t = MochiKit.DOM.getElement(texto);
44
45         url = "/alumno/get_alumno?padron="+t.value;
46         t.value = "";
47         return url;
48     }
49
50     function err (err)
51     {
52         alert("The metadata for MochiKit.Async could not be fetched :(");
53     }
54
55     function procesar(result)
56     {
57         l = MochiKit.DOM.getElement('form_responsable_info');
58         if (result.error)
59             l.innerHTML = result.msg;
60         else
61             l.innerHTML = result.msg.value;
62     }
63
64     function buscar_alumno()
65     {
66         /* Obtengo el curso */
67         l = MochiKit.DOM.getElement('form_cursoID');
68         cursoid = l.options[l.selectedIndex].value;
69         if (cursoid <= 0) {
70             alert('Debe seleccionar un curso');
71             return;
72         }
73         /* Obtengo el padron ingresado */
74         p = MochiKit.DOM.getElement('form_responsable');
75         padron = p.value;
76         if (padron == '') {
77             alert('Debe ingresar el padrón del alumno responsable');
78             return;
79         }
80         url = "/grupo/get_inscripto?cursoid="+cursoid+'&padron='+padron;
81         var d = loadJSONDoc(url);
82         d.addCallbacks(procesar, err);
83     }
84
85     function onsubmit()
86     {
87         /* TODO : Validar datos y evitar el submit si no esta completo */
88
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; 
93         }
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; 
98         }
99         return true; // Dejo hacer el submit
100     }
101 """
102
103
104
105 #{{{ Validación
106 def validate_get(id):
107     return val.validate_get(cls, name, id)
108
109 def validate_set(id, data):
110     return val.validate_set(cls, name, id, data)
111
112 def validate_new(data):
113     return val.validate_new(cls, name, data)
114 #}}}
115
116 def get_ejercicios():
117     return [(fk1.id, fk1.shortrepr()) for fk1 in Ejercicio.select()]
118
119 def get_docentes():
120     return [(fk1.id, fk1.shortrepr()) for fk1 in Docente.select()]
121
122 def get_alumnos():
123     return [(fk1.id, fk1.shortrepr()) for fk1 in Alumno.select()]
124
125 def get_grupos():
126     return [(fk1.id, fk1.shortrepr()) for fk1 in Grupo.select()]
127
128 #{{{ Formulario
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))
143         
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))
158
159         alumnos = AjaxMultiSelect(label=_(u'Alumnos'),
160                 validator=V.Int(),
161                 on_add="alumnos_agregar_a_la_lista")
162
163     fields = Fields()
164     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('anio');"),
165                   W.JSSource(ajax)]
166     form_attrs = dict(onsubmit='return onsubmit()')
167 form = CursoForm()
168 #}}}
169
170 #{{{ Controlador
171 class CursoController(controllers.Controller, identity.SecureResource):
172     """Basic model admin interface"""
173     require = identity.has_permission('admin')
174     curso_alumno = CursoAlumnoController()
175
176     @expose()
177     def default(self, tg_errors=None):
178         """handle non exist urls"""
179         raise redirect('list')
180
181     @expose()
182     def index(self):
183         raise redirect('list')
184
185     @expose(template='kid:%s.templates.list' % __name__)
186     @paginate('records')
187     def list(self):
188         """List records in model"""
189         r = cls.select()
190         return dict(records=r, name=name, namepl=namepl)
191
192     @expose()
193     def activate(self, id, activo):
194         """Save or create record to model"""
195         r = validate_get(id)
196         try:
197             r.activo = bool(int(activo))
198         except ValueError:
199             raise cherrypy.NotFound
200         raise redirect('../../list')
201
202     @expose(template='kid:%s.templates.new' % __name__)
203     def new(self, **kw):
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)
207
208     @validate(form=form)
209     @error_handler(new)
210     @expose()
211     def create(self, **kw):
212         """Save or create record to model"""
213         print "--KW--"
214         print kw
215         docentes = kw.get('docentes_curso', [])
216         alumnos = kw.get('alumnos', [])
217         del(kw['remDocente'])
218         del(kw['addDocente'])
219         del(kw['docentes_curso'])
220         del(kw['alumnos'])
221         r = validate_new(kw)
222         """ Agrego la nueva seleccion de docentes """ 
223         for d in docentes:
224             r.add_docente(d)
225         """ El curso es nuevo, por ende no hay alumnos inscriptos """
226         for a in alumnos:
227             r.add_alumno(a)
228         flash(_(u'Se creó un nuevo %s.') % name)
229         raise redirect('list')
230     
231     @expose(template='kid:%s.templates.edit' % __name__)
232     def edit(self, id, **kw):
233         """Edit record in model"""
234         r = validate_get(id)
235         class EmptyClass:
236             pass
237         values = EmptyClass()
238         values.id = r.id
239         values.anio = r.anio
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)]
247        
248         return dict(name=name, namepl=namepl, record=values, form=form)
249
250     @validate(form=form)
251     @error_handler(edit)
252     @expose()
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)
257         
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)
262         
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)
267         
268         """ Agrego la nueva seleccion """
269         for d in docentes:
270             try:
271                 r.add_docente(d)
272             except:
273                 pass
274          
275         """ Verifico que los alumnos no esten ya inscriptos """
276         for a in alumnos:
277             try:
278                 r.add_alumno(a)
279             except:
280                 pass
281         flash(_(u'El %s fue actualizado.') % name)
282         raise redirect('../list')
283
284     @expose(template='kid:%s.templates.show' % __name__)
285     def show(self,id, **kw):
286         """Show record in model"""
287         r = validate_get(id)
288         return dict(name=name, namepl=namepl, record=r)
289
290     @expose()
291     def delete(self, id):
292         """Destroy record in model"""
293         r = validate_get(id)
294         r.destroySelf()
295         flash(_(u'El %s fue eliminado permanentemente.') % name)
296         raise redirect('../list')
297 #}}}
298