]> git.llucax.com Git - software/sercom.git/blob - sercom/subcontrollers/enunciado/__init__.py
Uso AjaxDosListas para seleccionar Tareas por separado.
[software/sercom.git] / sercom / subcontrollers / enunciado / __init__.py
1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
2
3 #{{{ Imports
4 from turbogears import controllers, expose, redirect
5 from turbogears import validate, flash, error_handler
6 from turbogears import validators as V
7 from turbogears import widgets as W
8 from turbogears import identity
9 from turbogears import paginate
10 from docutils.core import publish_parts
11 from sercom.subcontrollers import validate as val
12 from sercom.model import Enunciado, Docente, Curso, Tarea, TareaFuente, TareaPrueba
13 from cherrypy import request, response
14 from sercom.widgets import *
15 #}}}
16
17 #{{{ Configuración
18 cls = Enunciado
19 name = 'enunciado'
20 namepl = name + 's'
21
22 fkcls = Docente
23 fkname = 'autor'
24 fknamepl = fkname + 'es'
25 #}}}
26
27 ajax = u"""
28     function doSubmit()
29     {
30         /* TODO : Validar datos y evitar el submit si no esta completo */
31
32         /* Selecciono todos los miembros si no, no llegan al controllere*/
33         l = MochiKit.DOM.getElement('form_tareas_fuente_to');
34         for (i=0; i<l.options.length; i++) {
35             l.options[i].selected = true;
36         }
37         l = MochiKit.DOM.getElement('form_tareas_prueba_to');
38         for (i=0; i<l.options.length; i++) {
39             l.options[i].selected = true;
40         }
41         return true; // Dejo hacer el submit
42     }
43 """
44
45 #{{{ Validación
46 def validate_fk(data):
47     fk = data.get(fkname + 'ID', None)
48     if fk == 0: fk = None
49     if fk is not None:
50         try:
51             fk = fkcls.get(fk)
52         except LookupError:
53             flash(_(u'No se pudo crear el nuevo %s porque el %s con '
54                 'identificador %d no existe.' % (name, fkname, fk)))
55             raise redirect('new', **data)
56     data.pop(fkname + 'ID', None)
57     data[fkname] = fk
58     return fk
59
60 def validate_get(id):
61     return val.validate_get(cls, name, id)
62
63 def validate_set(id, data):
64     validate_fk(data)
65     return val.validate_set(cls, name, id, data)
66
67 def validate_new(data):
68     validate_fk(data)
69     return val.validate_new(cls, name, data)
70 #}}}
71
72 #{{{ Formulario
73 def get_options():
74     return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()]
75
76 def get_tareas_fuente():
77     return [(fk.id, fk.shortrepr()) for fk in TareaFuente.select()]
78
79 def get_tareas_prueba():
80     return [(fk.id, fk.shortrepr()) for fk in TareaPrueba.select()]
81
82 class EnunciadoForm(W.TableForm):
83     class Fields(W.WidgetsList):
84         anio = W.TextField(label=_(u'Año'),
85             help_text=_(u'Requerido.'),
86             validator=V.Number(min=4, max=4, strip=True))
87         cuatrimestre = W.TextField(label=_(u'Cuatrimestre'),
88             help_text=_(u'Requerido.'),
89             validator=V.Number(min=1, max=1, strip=True))
90         nombre = W.TextField(label=_(u'Nombre'),
91             help_text=_(u'Requerido y Único.'),
92             validator=V.UnicodeString(min=5, max=60, strip=True))
93         fk = W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()),
94             options=get_options, validator=V.Int(not_empty=False))
95         descripcion = W.TextField(label=_(u'Descripción'),
96             validator=V.UnicodeString(not_empty=False, max=255, strip=True))
97         archivo = W.FileField(label=_(u'Archivo'))
98         tareas_fuente = AjaxDosListasSelect(label=_(u'Tareas Fuente'),
99             title_from=u'Disponibles',
100             title_to=u'Asignadas',
101             options=get_tareas_fuente,
102             validator=V.Int(not_empty=True))
103         tareas_prueba = AjaxDosListasSelect(label=_(u'Tareas Prueba'),
104             title_from=u'Disponibles',
105             title_to=u'Asignadas',
106             options=get_tareas_prueba,
107             validator=V.Int(not_empty=True))
108     fields = Fields()
109     form_attrs = dict(onsubmit='return doSubmit();')
110     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)]
111
112 form = EnunciadoForm()
113 #}}}
114
115 #{{{ Controlador
116 class EnunciadoController(controllers.Controller, identity.SecureResource):
117     """Basic model admin interface"""
118     require = identity.has_permission('entregar')
119
120     @expose()
121     def default(self, tg_errors=None):
122         """handle non exist urls"""
123         raise redirect('list')
124
125     @expose()
126     def index(self):
127         raise redirect('list')
128
129     @expose(template='kid:%s.templates.list' % __name__)
130     @validate(validators=dict(autor=V.Int))
131     @paginate('records')
132     def list(self, autor=None):
133         """List records in model"""
134         if autor is None:
135             r = cls.select()
136         else:
137             r = cls.selectBy(autorID=autor)
138         return dict(records=r, name=name, namepl=namepl, parcial=autor)
139
140     @expose(template='kid:%s.templates.new' % __name__)
141     @identity.require(identity.has_permission('admin'))
142     def new(self, **kw):
143         """Create new records in model"""
144         return dict(name=name, namepl=namepl, form=form, values=kw)
145
146     @validate(form=form)
147     @error_handler(new)
148     @expose()
149     @identity.require(identity.has_permission('admin'))
150     def create(self, archivo, **kw):
151         """Save or create record to model"""
152         kw['archivo'] = archivo.file.read()
153         kw['archivo_name'] = archivo.filename
154         kw['archivo_type'] = archivo.type
155         if 'tareas_fuente_to' in kw.keys() and 'tareas_prueba_to' in kw.keys():
156             kw['tareas'] = list(kw['tareas_fuente_to']) + list(kw['tareas_prueba_to'])
157             del(kw['tareas_fuente_to'])
158             del(kw['tareas_prueba_to'])
159         elif 'tareas_fuente_to' in kw.keys():
160             kw['tareas'] = list(kw['tareas_fuente_to'])
161             del(kw['tareas_fuente_to'])
162         elif 'tareas_prueba_to' in kw.keys():
163             kw['tareas'] = list(kw['tareas_prueba_to'])
164             del(kw['tareas_prueba_to'])
165         else:
166             kw['tareas'] = []
167         del(kw['tareas_prueba'])
168         del(kw['tareas_fuente'])
169         validate_new(kw)
170         flash(_(u'Se creó un nuevo %s.') % name)
171         raise redirect('list')
172
173     @expose(template='kid:%s.templates.edit' % __name__)
174     @identity.require(identity.has_permission('admin'))
175     def edit(self, id, **kw):
176         """Edit record in model"""
177         r = validate_get(id)
178         r.tareas_fuente = [{"id":t.id, "label":t.shortrepr()} for t in filter(lambda x: isinstance(x, TareaFuente), r.tareas)]
179         r.tareas_prueba = [{"id":t.id, "label":t.shortrepr()} for t in filter(lambda x: isinstance(x, TareaPrueba), r.tareas)]
180         return dict(name=name, namepl=namepl, record=r, form=form)
181
182     @validate(form=form)
183     @error_handler(edit)
184     @expose()
185     @identity.require(identity.has_permission('admin'))
186     def update(self, id, archivo, **kw):
187         """Save or create record to model"""
188         if 'tareas_fuente_to' in kw.keys() and 'tareas_prueba_to' in kw.keys():
189             kw['tareas'] = list(kw['tareas_fuente_to']) + list(kw['tareas_prueba_to'])
190             del(kw['tareas_fuente_to'])
191             del(kw['tareas_prueba_to'])
192         elif 'tareas_fuente_to' in kw.keys():
193             kw['tareas'] = list(kw['tareas_fuente_to'])
194             del(kw['tareas_fuente_to'])
195         elif 'tareas_prueba_to' in kw.keys():
196             kw['tareas'] = list(kw['tareas_prueba_to'])
197             del(kw['tareas_prueba_to'])
198         else:
199             kw['tareas'] = []
200         del(kw['tareas_prueba'])
201         del(kw['tareas_fuente'])
202         r = validate_set(id, kw)
203         flash(_(u'El %s fue actualizado.') % name)
204         raise redirect('../list')
205
206     @expose(template='kid:%s.templates.show' % __name__)
207     def show(self,id, **kw):
208         """Show record in model"""
209         r = validate_get(id)
210         if r.descripcion is None:
211             r.desc = ''
212         else:
213             r.desc = publish_parts(r.descripcion, writer_name='html')['html_body']
214         return dict(name=name, namepl=namepl, record=r)
215
216     @expose()
217     @identity.require(identity.has_permission('admin'))
218     def delete(self, id):
219         """Destroy record in model"""
220         r = validate_get(id)
221         r.destroySelf()
222         flash(_(u'El %s fue eliminado permanentemente.') % name)
223         raise redirect('../list')
224
225     @expose()
226     def files(self, id):
227         r = validate_get(id)
228         response.headers["Content-Type"] = r.archivo_type
229         response.headers["Content-disposition"] = "attachment;filename=%s" % (r.archivo_name)
230         flash(_(u'El %s fue eliminado permanentemente.') % name)
231         return r.archivo
232
233     @expose("json")
234     @identity.require(identity.has_permission('admin'))
235     def de_curso(self, curso_id):
236         c = Curso.get(curso_id)
237         e = Enunciado.selectByCurso(c)
238         return dict(enunciados=e)
239 #}}}
240