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