]> git.llucax.com Git - z.facultad/75.52/sercom.git/blob - sercom/subcontrollers/ejercicio/__init__.py
Actualizar esquema de la DB con cambios de archivo en Enunciado.
[z.facultad/75.52/sercom.git] / sercom / subcontrollers / ejercicio / __init__.py
1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
2
3 #{{{ Imports
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 Ejercicio, Curso, Enunciado
13 from cherrypy import request, response
14
15 from entrega import  *
16
17 #}}}
18
19 #{{{ Configuración
20 cls = Ejercicio
21 name = 'ejercicio'
22 namepl = name + 's'
23
24 fkcls = Curso
25 fkname = 'curso'
26 fknamepl = fkname + 's'
27
28 fk1cls = Enunciado
29 fk1name = 'enunciado'
30 fk1namepl = fk1name + 's'
31 #}}}
32
33 #{{{ Validación
34 def validate_fk(data):
35     fk = data.get(fkname + 'ID', None)
36     if fk == 0: fk = None
37     if fk is not None:
38         try:
39             fk = fkcls.get(fk)
40         except LookupError:
41             flash(_(u'No se pudo crear el nuevo %s porque el %s con '
42                 'identificador %d no existe.' % (name, fkname, fk)))
43             raise redirect('new', **data)
44     data.pop(fkname + 'ID', None)
45     data[fkname] = fk
46     return fk
47
48 def validate_fk1(data):
49     fk = data.get(fk1name + 'ID', None)
50     if fk == 0: fk = None
51     if fk is not None:
52         try:
53             fk = fk1cls.get(fk)
54         except LookupError:
55             flash(_(u'No se pudo crear el nuevo %s porque el %s con '
56                 'identificador %d no existe.' % (name, fk1name, fk)))
57             raise redirect('new', **data)
58     data.pop(fk1name + 'ID', None)
59     data[fk1name] = fk
60     return fk
61
62 def validate_get(id):
63     return val.validate_get(cls, name, id)
64
65 def validate_set(id, data):
66     validate_fk(data)
67     validate_fk1(data)
68     return val.validate_set(cls, name, id, data)
69
70 def validate_new(data):
71     validate_fk(data)
72     validate_fk1(data)
73     return val.validate_new(cls, name, data)
74 #}}}
75
76 #{{{ Formulario
77 def get_options():
78     return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()]
79
80 def get_options1():
81     return [(0, _(u'--'))] + [(fk1.id, fk1.shortrepr()) for fk1 in fk1cls.select()]
82
83 class EjercicioForm(W.TableForm):
84     class Fields(W.WidgetsList):
85         fk = W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()),
86             options=get_options, validator=V.Int(not_empty=True))
87         numero = W.TextField(name="numero",label=_(u'Nro'),
88             help_text=_(u'Requerido.'),
89             validator=V.Int(not_empty=True))
90         fk1 = W.SingleSelectField(name=fk1name+'ID', label=_(fk1name.capitalize()),
91             options=get_options1, validator=V.Int(not_empty=True))
92         grupal = W.CheckBox(name='grupal', label=_(u"Grupal?"))
93     fields = Fields()
94     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")]
95
96 form = EjercicioForm()
97 #}}}
98
99 #{{{ Controlador
100 class EjercicioController(controllers.Controller, identity.SecureResource):
101     """Basic model admin interface"""
102     require = identity.has_permission('admin')
103
104     entrega = EntregaController()
105
106     @expose()
107     def default(self, tg_errors=None):
108         """handle non exist urls"""
109         raise redirect('list')
110
111     @expose()
112     def index(self):
113         raise redirect('list')
114
115     @expose(template='kid:%s.templates.list' % __name__)
116     @validate(validators=dict(autor=V.Int))
117     @paginate('records')
118     def list(self, autor=None):
119         """List records in model"""
120         r = cls.select()
121         return dict(records=r, name=name, namepl=namepl, parcial=autor)
122
123     @expose(template='kid:%s.templates.new' % __name__)
124     def new(self, **kw):
125         """Create new records in model"""
126         return dict(name=name, namepl=namepl, form=form, values=kw)
127
128     @validate(form=form)
129     @error_handler(new)
130     @expose()
131     def create(self, **kw):
132         """Save or create record to model"""
133         validate_new(kw)
134         flash(_(u'Se creó un nuevo %s.') % name)
135         raise redirect('list')
136
137     @expose(template='kid:%s.templates.edit' % __name__)
138     def edit(self, id, **kw):
139         """Edit record in model"""
140         r = validate_get(id)
141         return dict(name=name, namepl=namepl, record=r, form=form)
142
143     @validate(form=form)
144     @error_handler(edit)
145     @expose()
146     def update(self, id, **kw):
147         """Save or create record to model"""
148         r = validate_set(id, kw)
149         flash(_(u'El %s fue actualizado.') % name)
150         raise redirect('../list')
151
152     @expose(template='kid:%s.templates.show' % __name__)
153     def show(self,id, **kw):
154         """Show record in model"""
155         r = validate_get(id)
156         return dict(name=name, namepl=namepl, record=r)
157
158     @expose()
159     def delete(self, id):
160         """Destroy record in model"""
161         r = validate_get(id)
162         r.destroySelf()
163         flash(_(u'El %s fue eliminado permanentemente.') % name)
164         raise redirect('../list')
165
166     @expose()
167     def files(self, id):
168         r = validate_get(id)
169         response.headers["Content-Type"] = r.archivo_type
170         response.headers["Content-disposition"] = "attachment;filename=%s" % (r.archivo_name)
171         flash(_(u'El %s fue eliminado permanentemente.') % name)
172         return r.archivo
173 #}}}
174