]> git.llucax.com Git - z.facultad/75.52/sercom.git/blob - sercom/subcontrollers/enunciado/__init__.py
Mejorar especificación "dinámica" de templates.
[z.facultad/75.52/sercom.git] / sercom / subcontrollers / enunciado / __init__.py
1 # vim: set et sw=4 sts=4 encoding=utf-8 :
2
3 from turbogears import controllers, expose, redirect
4 from turbogears import validate, validators, flash, error_handler
5 from sercom.model import Enunciado, Docente
6 from turbogears.widgets import *
7 from turbogears import identity
8 from turbogears import paginate
9 from docutils.core import publish_parts
10 from sercom.subcontrollers import validate as val
11
12 cls = Enunciado
13 name = 'enunciado'
14 namepl = name + 's'
15
16 def validate_autor(data):
17     autor = data.get('autorID', None)
18     if autor == 0: autor = None
19     if autor is not None:
20         try:
21             autor = Docente.get(autor)
22         except LookupError:
23             raise redirect('new', tg_flash=_(u'No se pudo crear el nuevo ' \
24                 '%s porque el autor con identificador %d no existe.'
25                     % (name, autor)), **data)
26     data.pop('autorID', None)
27     data['autor'] = autor
28
29 def validate_get(id):
30     return val.validate_get(cls, name, id)
31
32 def validate_set(id, data):
33     validate_autor(data)
34     return val.validate_set(cls, name, id, data)
35
36 def validate_new(data):
37     validate_autor(data)
38     return val.validate_new(cls, name, data)
39
40 def get_options():
41     return [(0, _(u'--'))] + [(a.id, a.shortrepr()) for a in Docente.select()]
42
43 form = TableForm(fields=[
44     TextField(name='nombre', label=_(u'Nombre'),
45         help_text=_(u'Requerido y único.'),
46         validator=validators.UnicodeString(min=5, max=60, strip=True)),
47     SingleSelectField(name='autorID', label=_(u'Autor'),
48         options=get_options, validator=validators.Int(not_empty=False)),
49     TextField(name='descripcion', label=_(u'Descripción'),
50         validator=validators.UnicodeString(not_empty=False, max=255, strip=True)),
51 ])
52
53 class EnunciadoController(controllers.Controller, identity.SecureResource):
54     """Basic model admin interface"""
55     require = identity.has_permission('admin')
56
57     @expose()
58     def default(self, tg_errors=None):
59         """handle non exist urls"""
60         raise redirect('list')
61
62     @expose()
63     def index(self):
64         raise redirect('list')
65
66     @expose(template='kid:%s.templates.list' % __name__)
67     @paginate('records')
68     def list(self, **kw):
69         """List records in model"""
70         f = kw.get('tg_flash', None)
71         r = cls.select()
72         return dict(records=r, name=name, namepl=namepl, tg_flash=f)
73
74     @expose(template='kid:%s.templates.new' % __name__)
75     def new(self, **kw):
76         """Create new records in model"""
77         f = kw.get('tg_flash', None)
78         return dict(name=name, namepl=namepl, form=form, tg_flash=f, values=kw)
79
80     @validate(form=form)
81     @error_handler(new)
82     @expose()
83     def create(self, **kw):
84         """Save or create record to model"""
85         validate_new(kw)
86         raise redirect('list', tg_flash=_(u'Se creó un nuevo %s.') % name)
87
88     @expose(template='kid:%s.templates.edit' % __name__)
89     def edit(self, id, **kw):
90         """Edit record in model"""
91         r = validate_get(id)
92         return dict(name=name, namepl=namepl, record=r, form=form,
93             tg_flash=kw.get('tg_flash', None))
94
95     @validate(form=form)
96     @error_handler(edit)
97     @expose()
98     def update(self, id, **kw):
99         """Save or create record to model"""
100         r = validate_set(id, kw)
101         raise redirect('../list',
102             tg_flash=_(u'El %s fue actualizado.') % name)
103
104     @expose(template='kid:%s.templates.show' % __name__)
105     def show(self,id, **kw):
106         """Show record in model"""
107         r = validate_get(id)
108         r.desc = publish_parts(r.descripcion, writer_name='html')['html_body']
109         return dict(name=name, namepl=namepl, record=r)
110
111     @expose()
112     def delete(self, id):
113         """Destroy record in model"""
114         r = validate_get(id)
115         r.destroySelf()
116         raise redirect('../list',
117             tg_flash=_(u'El %s fue eliminado permanentemente.') % name)
118