]> git.llucax.com Git - software/sercom.git/blob - sercom/subcontrollers/enunciado/__init__.py
completo el show de caso de prueba con download de archivos
[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         if el_archivo.filename:
156             kw['archivos'] = el_archivo.file.read() # TODO verificar que es ZIP
157         if 'tareas_fuente_to' in kw.keys() and 'tareas_prueba_to' in kw.keys():
158             kw['tareas'] = list(kw['tareas_fuente_to']) + list(kw['tareas_prueba_to'])
159             del(kw['tareas_fuente_to'])
160             del(kw['tareas_prueba_to'])
161         elif 'tareas_fuente_to' in kw.keys():
162             kw['tareas'] = list(kw['tareas_fuente_to'])
163             del(kw['tareas_fuente_to'])
164         elif 'tareas_prueba_to' in kw.keys():
165             kw['tareas'] = list(kw['tareas_prueba_to'])
166             del(kw['tareas_prueba_to'])
167         else:
168             kw['tareas'] = []
169         del(kw['tareas_prueba'])
170         del(kw['tareas_fuente'])
171         validate_new(kw)
172         flash(_(u'Se creó un nuevo %s.') % name)
173         raise redirect('list')
174
175     @expose(template='kid:%s.templates.edit' % __name__)
176     @identity.require(identity.has_permission('admin'))
177     def edit(self, id, **kw):
178         """Edit record in model"""
179         r = validate_get(id)
180         r.tareas_fuente = [{"id":t.id, "label":t.shortrepr()} for t in r.tareas if isinstance(t, TareaFuente)]
181         r.tareas_prueba = [{"id":t.id, "label":t.shortrepr()} for t in r.tareas if isinstance(t, TareaPrueba)]
182         return dict(name=name, namepl=namepl, record=r, form=form)
183
184     @validate(form=form)
185     @error_handler(edit)
186     @expose()
187     @identity.require(identity.has_permission('admin'))
188     def update(self, id, el_archivo, **kw):
189         """Save or create record to model"""
190         if el_archivo.filename:
191             kw['archivos'] = el_archivo.file.read()
192         if 'tareas_fuente_to' in kw.keys() and 'tareas_prueba_to' in kw.keys():
193             kw['tareas'] = list(kw['tareas_fuente_to']) + list(kw['tareas_prueba_to'])
194             del(kw['tareas_fuente_to'])
195             del(kw['tareas_prueba_to'])
196         elif 'tareas_fuente_to' in kw.keys():
197             kw['tareas'] = list(kw['tareas_fuente_to'])
198             del(kw['tareas_fuente_to'])
199         elif 'tareas_prueba_to' in kw.keys():
200             kw['tareas'] = list(kw['tareas_prueba_to'])
201             del(kw['tareas_prueba_to'])
202         else:
203             kw['tareas'] = []
204         del(kw['tareas_prueba'])
205         del(kw['tareas_fuente'])
206         r = validate_set(id, kw)
207         flash(_(u'El %s fue actualizado.') % name)
208         raise redirect('../list')
209
210     @expose(template='kid:%s.templates.show' % __name__)
211     def show(self,id, **kw):
212         """Show record in model"""
213         r = validate_get(id)
214         if r.descripcion is None:
215             r.desc = ''
216         else:
217             r.desc = publish_parts(r.descripcion, writer_name='html')['html_body']
218         return dict(name=name, namepl=namepl, record=r)
219
220     @expose()
221     @identity.require(identity.has_permission('admin'))
222     def delete(self, id):
223         """Destroy record in model"""
224         r = validate_get(id)
225         r.destroySelf()
226         flash(_(u'El %s fue eliminado permanentemente.') % name)
227         raise redirect('../list')
228
229     @expose()
230     def files(self, id):
231         r = validate_get(id)
232         response.headers["Content-Type"] = 'application/zip'
233         response.headers["Content-disposition"] = 'attachment;filename=enunciado.zip'
234         return r.archivos
235
236     @expose('json')
237     @identity.require(identity.has_permission('admin'))
238     def de_curso(self, curso_id):
239         c = Curso.get(curso_id)
240         e = Enunciado.selectByCurso(c)
241         return dict(enunciados=e)
242 #}}}
243