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 *
24 fknamepl = fkname + 'es'
30 /* TODO : Validar datos y evitar el submit si no esta completo */
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;
37 l = MochiKit.DOM.getElement('form_tareas_prueba_to');
38 for (i=0; i<l.options.length; i++) {
39 l.options[i].selected = true;
41 return true; // Dejo hacer el submit
46 def validate_fk(data):
47 fk = data.get(fkname + 'ID', None)
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)
61 return val.validate_get(cls, name, id)
63 def validate_set(id, data):
65 return val.validate_set(cls, name, id, data)
67 def validate_new(data):
69 return val.validate_new(cls, name, data)
74 return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()]
76 def get_tareas_fuente():
77 return [(fk.id, fk.shortrepr()) for fk in TareaFuente.select()]
79 def get_tareas_prueba():
80 return [(fk.id, fk.shortrepr()) for fk in TareaPrueba.select()]
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))
109 form_attrs = dict(onsubmit='return doSubmit();')
110 javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)]
112 form = EnunciadoForm()
116 class EnunciadoController(controllers.Controller, identity.SecureResource):
117 """Basic model admin interface"""
118 require = identity.has_permission('entregar')
121 def default(self, tg_errors=None):
122 """handle non exist urls"""
123 raise redirect('list')
127 raise redirect('list')
129 @expose(template='kid:%s.templates.list' % __name__)
130 @validate(validators=dict(autor=V.Int))
132 def list(self, autor=None):
133 """List records in model"""
137 r = cls.selectBy(autorID=autor)
138 return dict(records=r, name=name, namepl=namepl, parcial=autor)
140 @expose(template='kid:%s.templates.new' % __name__)
141 @identity.require(identity.has_permission('admin'))
143 """Create new records in model"""
144 return dict(name=name, namepl=namepl, form=form, values=kw)
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'])
167 del(kw['tareas_prueba'])
168 del(kw['tareas_fuente'])
170 flash(_(u'Se creó un nuevo %s.') % name)
171 raise redirect('list')
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"""
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)
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'])
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')
206 @expose(template='kid:%s.templates.show' % __name__)
207 def show(self,id, **kw):
208 """Show record in model"""
210 if r.descripcion is None:
213 r.desc = publish_parts(r.descripcion, writer_name='html')['html_body']
214 return dict(name=name, namepl=namepl, record=r)
217 @identity.require(identity.has_permission('admin'))
218 def delete(self, id):
219 """Destroy record in model"""
222 flash(_(u'El %s fue eliminado permanentemente.') % name)
223 raise redirect('../list')
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)
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)