]> git.llucax.com Git - z.facultad/75.52/sercom.git/blob - sercom/subcontrollers/curso/__init__.py
88734587df62a9d4d6b1078859c2c9b08f44796c
[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         r = validate_new(kw)
216         docentes = kw.get('docentes_curso', [])
217         alumnos = kw.get('alumnos', [])
218         """ Elimino todos los docentes asignados al curso y los agrego nuevamente""" 
219         for d in DocenteInscripto.selectBy(curso=r):
220             d.destroySelf()
221         """ Agrego la nueva seleccion """ 
222         for d in docentes:
223             r.add_docente(Docente(d))
224         """ El curso es nuevo, por ende no hay alumnos inscriptos """
225         for a in alumnos:
226             r.add_alumno(Alumno(a))
227         flash(_(u'Se creó un nuevo %s.') % name)
228         raise redirect('list')
229     
230     @expose(template='kid:%s.templates.edit' % __name__)
231     def edit(self, id, **kw):
232         """Edit record in model"""
233         r = validate_get(id)
234         docentes = kw.get('docentes_curso', [])
235         alumnos = kw.get('alumnos', [])
236         """ Elimino todos los docentes asignados al curso y los agrego nuevamente""" 
237         for d in DocenteInscripto.selectBy(curso=r):
238             d.destroySelf()
239         """ Agrego la nueva seleccion """ 
240         for d in docentes:
241             r.add_docente(Docente(d))
242         """ Verifico que los alumnos no esten ya inscriptos  """
243        
244         try:
245             for a in alumnos:
246                 r.add_alumno(Alumno(a))
247         except DuplicateEntryError:
248             flash(_(u'El alumno con padron %s ya esta inscripto.') % Alumno(a).padron)
249             raise redirect('create')
250         flash(_(u'Se creó un nuevo %s.') % name)
251         
252         return dict(name=name, namepl=namepl, record=r, form=form)
253
254     @validate(form=form)
255     @error_handler(edit)
256     @expose()
257     def update(self, id, **kw):
258         """Save or create record to model"""
259         params = dict([(k,v) for (k,v) in kw.iteritems() if k in Curso.sqlmeta.columns.keys()])
260         r = validate_set(id, params)
261         flash(_(u'El %s fue actualizado.') % name)
262         raise redirect('../list')
263
264     @expose(template='kid:%s.templates.show' % __name__)
265     def show(self,id, **kw):
266         """Show record in model"""
267         r = validate_get(id)
268         return dict(name=name, namepl=namepl, record=r)
269
270     @expose()
271     def delete(self, id):
272         """Destroy record in model"""
273         r = validate_get(id)
274         r.destroySelf()
275         flash(_(u'El %s fue eliminado permanentemente.') % name)
276         raise redirect('../list')
277 #}}}
278