]> git.llucax.com Git - z.facultad/75.52/sercom.git/blob - sercom/subcontrollers/curso/__init__.py
ca216fe70461e4c4044c8bd25a626d69763468c0
[z.facultad/75.52/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 sercom.widgets import *
17 #}}}
18
19 #{{{ Configuración
20 cls = Curso
21 name = 'curso'
22 namepl = name + 's'
23 #}}}
24
25 ajax = u""" 
26     function makeOption(option) {
27         return OPTION({"value": option.value}, option.text);
28     }
29                    
30     function moveOption( fromSelect, toSelect) {
31         // add 'selected' nodes toSelect
32         appendChildNodes(toSelect,
33         map( makeOption,ifilter(itemgetter('selected'), $(fromSelect).options)));
34         // remove the 'selected' fromSelect
35         replaceChildNodes(fromSelect,
36             list(ifilterfalse(itemgetter('selected'), $(fromSelect).options))
37         );
38     }
39
40     function alumnos_agregar_a_la_lista(texto, lista)
41     {
42         t = MochiKit.DOM.getElement(texto);
43
44         url = "/alumno/get_alumno?padron="+t.value;
45         t.value = "";
46         return url;
47     }
48
49     function err (err)
50     {
51         alert("The metadata for MochiKit.Async could not be fetched :(");
52     }
53
54     function procesar(result)
55     {
56         l = MochiKit.DOM.getElement('form_responsable_info');
57         if (result.error)
58             l.innerHTML = result.msg;
59         else
60             l.innerHTML = result.msg.value;
61     }
62
63     function buscar_alumno()
64     {
65         /* Obtengo el curso */
66         l = MochiKit.DOM.getElement('form_cursoID');
67         cursoid = l.options[l.selectedIndex].value;
68         if (cursoid <= 0) {
69             alert('Debe seleccionar un curso');
70             return;
71         }
72         /* Obtengo el padron ingresado */
73         p = MochiKit.DOM.getElement('form_responsable');
74         padron = p.value;
75         if (padron == '') {
76             alert('Debe ingresar el padrón del alumno responsable');
77             return;
78         }
79         url = "/grupo/get_inscripto?cursoid="+cursoid+'&padron='+padron;
80         var d = loadJSONDoc(url);
81         d.addCallbacks(procesar, err);
82     }
83
84     function prepare()
85     {
86         connect('form_responsable', 'onblur', buscar_alumno);
87     }
88
89     function onsubmit()
90     {
91         /* TODO : Validar datos y evitar el submit si no esta completo */
92
93         /* Selecciono todos los miembros si no, no llegan al controllere*/
94         l = MochiKit.DOM.getElement('form_miembros');
95         for (i=0; i<l.options.length; i++) { 
96             l.options[i].selected = true; 
97         }
98         return true; // Dejo hacer el submit
99     }
100
101     MochiKit.DOM.addLoadEvent(prepare)
102
103 """
104
105
106
107 #{{{ Validación
108 def validate_get(id):
109     return val.validate_get(cls, name, id)
110
111 def validate_set(id, data):
112     return val.validate_set(cls, name, id, data)
113
114 def validate_new(data):
115     return val.validate_new(cls, name, data)
116 #}}}
117
118 def get_ejercicios():
119     return [(fk1.id, fk1.shortrepr()) for fk1 in Ejercicio.select()]
120
121 def get_docentes():
122     return [(fk1.id, fk1.shortrepr()) for fk1 in Docente.select()]
123
124 def get_alumnos():
125     return [(fk1.id, fk1.shortrepr()) for fk1 in Alumno.select()]
126
127 def get_grupos():
128     return [(fk1.id, fk1.shortrepr()) for fk1 in Grupo.select()]
129
130 #{{{ Formulario
131 class CursoForm(W.TableForm):
132     class Fields(W.WidgetsList):
133         anio = W.TextField(label=_(u'Anio'),
134             help_text=_(u'Requerido y único.'),
135             validator=V.Number(min=4, max=4, strip=True))
136         cuatrimestre = W.TextField(label=_(u'Cuatrimestre'),
137             help_text=_(u'Requerido.'),
138             validator=V.Number(min=1, max=1, strip=True))
139         numero = W.TextField(label=_(u'Numero'),
140             help_text=_(u'Requerido'),
141             validator=V.Number(min=1, max=2, strip=True))
142         descripcion = W.TextArea(name='descripcion', label=_(u'Descripcion'),
143             help_text=_(u'Descripcion.'),
144             validator=V.UnicodeString(not_empty=False, strip=True))
145         
146         docentes = W.MultipleSelectField(name="docentes",
147             label=_(u'Docentes'),
148             attrs=dict(style='width:300px'),
149             options=get_docentes,
150             validator=V.Int(not_empty=True))
151         addDocente = W.Button(default='Asignar', label='',
152             attrs=dict( onclick='moveOption("form_docentes","form_docentes_curso")'))
153         remDocente = W.Button(default='Remover', label='',
154             attrs=dict( onclick='moveOption("form_docentes_curso","form_docentes")'))
155         docentes_curso = W.MultipleSelectField(name="docentes_curso",
156             label=_(u'Docentes del curso'),
157             attrs=dict(style='width:300px'),
158 #            options=get_docentes_curso,
159             validator=V.Int(not_empty=True))
160
161         alumnos = AjaxMultiSelect(label=_(u'Alumnos'),
162                 validator=V.Int(),
163                 on_add="alumnos_agregar_a_la_lista")
164
165     fields = Fields()
166     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('anio');"),
167                   W.JSSource(ajax)]
168     form_attrs = dict(onsubmit='return onsubmit()')
169 form = CursoForm()
170 #}}}
171
172 #{{{ Controlador
173 class CursoController(controllers.Controller, identity.SecureResource):
174     """Basic model admin interface"""
175     require = identity.has_permission('admin')
176     curso_alumno = CursoAlumnoController()
177
178     @expose()
179     def default(self, tg_errors=None):
180         """handle non exist urls"""
181         raise redirect('list')
182
183     @expose()
184     def index(self):
185         raise redirect('list')
186
187     @expose(template='kid:%s.templates.list' % __name__)
188     @paginate('records')
189     def list(self):
190         """List records in model"""
191         r = cls.select()
192         return dict(records=r, name=name, namepl=namepl)
193
194     @expose()
195     def activate(self, id, activo):
196         """Save or create record to model"""
197         r = validate_get(id)
198         try:
199             r.activo = bool(int(activo))
200         except ValueError:
201             raise cherrypy.NotFound
202         raise redirect('../../list')
203
204     @expose(template='kid:%s.templates.new' % __name__)
205     def new(self, **kw):
206         """Create new records in model"""
207         params = dict([(k,v) for (k,v) in kw.iteritems() if k in Curso.sqlmeta.columns.keys()])
208         return dict(name=name, namepl=namepl, form=form, values=params)
209
210     @validate(form=form)
211     @error_handler(new)
212     @expose()
213     def create(self, **kw):
214         """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'])
220         del(kw['alumnos'])
221         r = validate_new(kw)
222         """ Elimino todos los docentes asignados al curso y los agrego nuevamente""" 
223         for d in DocenteInscripto.selectBy(curso=r):
224             d.destroySelf()
225         """ Agrego la nueva seleccion """ 
226         for d in docentes:
227             r.add_docente(Docente(d))
228         """ El curso es nuevo, por ende no hay alumnos inscriptos """
229         for a in alumnos:
230             r.add_alumno(Alumno(a))
231         flash(_(u'Se creó un nuevo %s.') % name)
232         raise redirect('list')
233     
234     @expose(template='kid:%s.templates.edit' % __name__)
235     def edit(self, id, **kw):
236         """Edit record in model"""
237         r = validate_get(id)
238         docentes = kw.get('docentes_curso', [])
239         alumnos = kw.get('alumnos', [])
240         """ Elimino todos los docentes asignados al curso y los agrego nuevamente""" 
241         for d in DocenteInscripto.selectBy(curso=r):
242             d.destroySelf()
243         """ Agrego la nueva seleccion """ 
244         for d in docentes:
245             r.add_docente(Docente(d))
246         """ Verifico que los alumnos no esten ya inscriptos  """
247        
248         try:
249             for a in alumnos:
250                 r.add_alumno(Alumno(a))
251         except DuplicateEntryError:
252             flash(_(u'El alumno con padron %s ya esta inscripto.') % Alumno(a).padron)
253             raise redirect('create')
254         flash(_(u'Se creó un nuevo %s.') % name)
255         
256         return dict(name=name, namepl=namepl, record=r, form=form)
257
258     @validate(form=form)
259     @error_handler(edit)
260     @expose()
261     def update(self, id, **kw):
262         """Save or create record to model"""
263         params = dict([(k,v) for (k,v) in kw.iteritems() if k in Curso.sqlmeta.columns.keys()])
264         r = validate_set(id, params)
265         flash(_(u'El %s fue actualizado.') % name)
266         raise redirect('../list')
267
268     @expose(template='kid:%s.templates.show' % __name__)
269     def show(self,id, **kw):
270         """Show record in model"""
271         r = validate_get(id)
272         return dict(name=name, namepl=namepl, record=r)
273
274     @expose()
275     def delete(self, id):
276         """Destroy record in model"""
277         r = validate_get(id)
278         r.destroySelf()
279         flash(_(u'El %s fue eliminado permanentemente.') % name)
280         raise redirect('../list')
281 #}}}
282