1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
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
25 fknamepl = fkname + 'es'
31 /* TODO : Validar datos y evitar el submit si no esta completo */
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;
38 l = MochiKit.DOM.getElement('form_tareas_prueba_to');
39 for (i=0; i<l.options.length; i++) {
40 l.options[i].selected = true;
42 return true; // Dejo hacer el submit
47 def validate_fk(data):
48 fk = data.get(fkname + 'ID', None)
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)
62 return val.validate_get(cls, name, id)
64 def validate_set(id, data):
66 return val.validate_set(cls, name, id, data)
68 def validate_new(data):
70 return val.validate_new(cls, name, data)
75 return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()]
77 def get_tareas_fuente():
78 return [(fk.id, fk.shortrepr()) for fk in TareaFuente.select()]
80 def get_tareas_prueba():
81 return [(fk.id, fk.shortrepr()) for fk in TareaPrueba.select()]
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))
110 form_attrs = dict(onsubmit='return doSubmit();')
111 javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)]
113 form = EnunciadoForm()
117 class EnunciadoController(controllers.Controller, identity.SecureResource):
118 """Basic model admin interface"""
119 require = identity.has_permission('entregar')
121 caso_de_prueba = CasoDePruebaController()
124 def default(self, tg_errors=None):
125 """handle non exist urls"""
126 raise redirect('list')
130 raise redirect('list')
132 @expose(template='kid:%s.templates.list' % __name__)
133 @validate(validators=dict(autor=V.Int))
135 def list(self, autor=None):
136 """List records in model"""
140 r = cls.selectBy(autorID=autor)
141 return dict(records=r, name=name, namepl=namepl, parcial=autor)
143 @expose(template='kid:%s.templates.new' % __name__)
144 @identity.require(identity.has_permission('admin'))
146 """Create new records in model"""
147 return dict(name=name, namepl=namepl, form=form, values=kw)
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'])
169 del(kw['tareas_prueba'])
170 del(kw['tareas_fuente'])
172 flash(_(u'Se creó un nuevo %s.') % name)
173 raise redirect('list')
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"""
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)
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'])
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')
210 @expose(template='kid:%s.templates.show' % __name__)
211 def show(self,id, **kw):
212 """Show record in model"""
214 if r.descripcion is None:
217 r.desc = publish_parts(r.descripcion, writer_name='html')['html_body']
218 return dict(name=name, namepl=namepl, record=r)
221 @identity.require(identity.has_permission('admin'))
222 def delete(self, id):
223 """Destroy record in model"""
226 flash(_(u'El %s fue eliminado permanentemente.') % name)
227 raise redirect('../list')
232 response.headers["Content-Type"] = 'application/zip'
233 response.headers["Content-disposition"] = 'attachment;filename=enunciado.zip'
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)