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
13 from cherrypy import request, response
14 from tarea import TareaController
25 fknamepl = fkname + 'es'
29 def validate_fk(data):
30 fk = data.get(fkname + 'ID', None)
36 flash(_(u'No se pudo crear el nuevo %s porque el %s con '
37 'identificador %d no existe.' % (name, fkname, fk)))
38 raise redirect('new', **data)
39 data.pop(fkname + 'ID', None)
44 return val.validate_get(cls, name, id)
46 def validate_set(id, data):
48 return val.validate_set(cls, name, id, data)
50 def validate_new(data):
52 return val.validate_new(cls, name, data)
57 return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()]
59 class EnunciadoForm(W.TableForm):
60 class Fields(W.WidgetsList):
61 anio = W.TextField(label=_(u'Año'),
62 help_text=_(u'Requerido.'),
63 validator=V.Number(min=4, max=4, strip=True))
64 cuatrimestre = W.TextField(label=_(u'Cuatrimestre'),
65 help_text=_(u'Requerido.'),
66 validator=V.Number(min=1, max=1, strip=True))
67 nombre = W.TextField(label=_(u'Nombre'),
68 help_text=_(u'Requerido y único.'),
69 validator=V.UnicodeString(min=5, max=60, strip=True))
70 fk = W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()),
71 options=get_options, validator=V.Int(not_empty=False))
72 descripcion = W.TextField(label=_(u'Descripción'),
73 validator=V.UnicodeString(not_empty=False, max=255, strip=True))
74 archivo = W.FileField(label=_(u'Archivo'))
76 javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")]
78 form = EnunciadoForm()
82 class EnunciadoController(controllers.Controller, identity.SecureResource):
83 """Basic model admin interface"""
84 require = identity.has_permission('entregar')
86 tarea = TareaController()
89 def default(self, tg_errors=None):
90 """handle non exist urls"""
91 raise redirect('list')
95 raise redirect('list')
97 @expose(template='kid:%s.templates.list' % __name__)
98 @validate(validators=dict(autor=V.Int))
100 def list(self, autor=None):
101 """List records in model"""
105 r = cls.selectBy(autorID=autor)
106 return dict(records=r, name=name, namepl=namepl, parcial=autor)
108 @expose(template='kid:%s.templates.new' % __name__)
109 @identity.require(identity.has_permission('admin'))
111 """Create new records in model"""
112 return dict(name=name, namepl=namepl, form=form, values=kw)
117 @identity.require(identity.has_permission('admin'))
118 def create(self, archivo, **kw):
119 """Save or create record to model"""
120 kw['archivo'] = archivo.file.read()
121 kw['archivo_name'] = archivo.filename
122 kw['archivo_type'] = archivo.type
124 flash(_(u'Se creó un nuevo %s.') % name)
125 raise redirect('list')
127 @expose(template='kid:%s.templates.edit' % __name__)
128 @identity.require(identity.has_permission('admin'))
129 def edit(self, id, **kw):
130 """Edit record in model"""
132 return dict(name=name, namepl=namepl, record=r, form=form)
137 @identity.require(identity.has_permission('admin'))
138 def update(self, id, **kw):
139 """Save or create record to model"""
140 r = validate_set(id, kw)
141 flash(_(u'El %s fue actualizado.') % name)
142 raise redirect('../list')
144 @expose(template='kid:%s.templates.show' % __name__)
145 def show(self,id, **kw):
146 """Show record in model"""
148 if r.descripcion is None:
151 r.desc = publish_parts(r.descripcion, writer_name='html')['html_body']
152 return dict(name=name, namepl=namepl, record=r)
155 @identity.require(identity.has_permission('admin'))
156 def delete(self, id):
157 """Destroy record in model"""
160 flash(_(u'El %s fue eliminado permanentemente.') % name)
161 raise redirect('../list')
166 response.headers["Content-Type"] = r.archivo_type
167 response.headers["Content-disposition"] = "attachment;filename=%s" % (r.archivo_name)
168 flash(_(u'El %s fue eliminado permanentemente.') % name)
172 @identity.require(identity.has_permission('admin'))
173 def de_curso(self, curso_id):
174 c = Curso.get(curso_id)
175 e = Enunciado.selectByCurso(c)
176 return dict(enunciados=e)