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 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'])
170 del(kw['tareas_prueba'])
171 del(kw['tareas_fuente'])
173 flash(_(u'Se creó un nuevo %s.') % name)
174 raise redirect('list')
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"""
181 r.tareas_fuente = [{"id":t.id, "label":t.shortrepr()} for t in filter(lambda x: isinstance(x, TareaFuente), r.tareas)]
182 r.tareas_prueba = [{"id":t.id, "label":t.shortrepr()} for t in filter(lambda x: isinstance(x, TareaPrueba), r.tareas)]
183 return dict(name=name, namepl=namepl, record=r, form=form)
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'])
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')
213 @expose(template='kid:%s.templates.show' % __name__)
214 def show(self,id, **kw):
215 """Show record in model"""
217 if r.descripcion is None:
220 r.desc = publish_parts(r.descripcion, writer_name='html')['html_body']
221 return dict(name=name, namepl=namepl, record=r)
224 @identity.require(identity.has_permission('admin'))
225 def delete(self, id):
226 """Destroy record in model"""
229 flash(_(u'El %s fue eliminado permanentemente.') % name)
230 raise redirect('../list')
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)
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)