]> git.llucax.com Git - z.facultad/75.52/sercom.git/blob - sercom/subcontrollers/ejercicio/__init__.py
Reporar mejor los errores en subcontrollers.validate.
[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 # Un poco de ajax para llenar los cursos
81 ajax = """
82     function showHint()
83     {
84         MochiKit.DOM.showElement('hint')
85     }
86
87     function hideHint()
88     {
89         MochiKit.DOM.hideElement('hint')
90     }
91
92     function clearEnunciados ()
93     {
94         l = MochiKit.DOM.getElement('form_enunciadoID');
95         l.options.length = 0;
96         l.disabled = true;
97     }
98
99     function mostrarEnunciados (res)
100     {
101         clearEnunciados();
102         for(i in res.enunciados) {
103             id = res.enunciados[i].id;
104             label = res.enunciados[i].nombre;
105             MochiKit.DOM.appendChildNodes("form_enunciadoID", OPTION({"value":id}, label))
106         }
107         l.disabled = false;
108         hideHint();
109     }
110
111     function err (err)
112     {
113         alert("The metadata for MochiKit.Async could not be fetched :(");
114         hideHint();
115     }
116
117     function actualizar_enunciados ()
118     {
119         l = MochiKit.DOM.getElement('form_cursoID');
120         id = l.options[l.selectedIndex].value;
121         if (id == 0) {
122             clearEnunciados();
123             return;
124         }
125
126         url = "/enunciado/de_curso?curso_id="+id;
127         var d = loadJSONDoc(url);
128         d.addCallbacks(mostrarEnunciados, err);
129         showHint();
130     }
131
132     function prepare()
133     {
134         connect('form_cursoID', 'onchange', actualizar_enunciados);
135         hideHint();
136         clearEnunciados();
137     }
138
139     MochiKit.DOM.addLoadEvent(prepare)
140 """
141
142 class EjercicioForm(W.TableForm):
143     class Fields(W.WidgetsList):
144         fk = W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()),
145             options=get_options, validator=V.Int(not_empty=True))
146         numero = W.TextField(name="numero",label=_(u'Nro'),
147             help_text=_(u'Requerido.'),
148             validator=V.Int(not_empty=True))
149         fk1 = W.SingleSelectField(name=fk1name+'ID', label=_(fk1name.capitalize()),
150             validator=V.Int(not_empty=True))
151         grupal = W.CheckBox(name='grupal', label=_(u"Grupal?"))
152     fields = Fields()
153     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)]
154
155 form = EjercicioForm()
156 #}}}
157
158 #{{{ Controlador
159 class EjercicioController(controllers.Controller, identity.SecureResource):
160     """Basic model admin interface"""
161     require = identity.has_permission('admin')
162
163     entrega = EntregaController()
164
165     @expose()
166     def default(self, tg_errors=None):
167         """handle non exist urls"""
168         raise redirect('list')
169
170     @expose()
171     def index(self):
172         raise redirect('list')
173
174     @expose(template='kid:%s.templates.list' % __name__)
175     @validate(validators=dict(autor=V.Int))
176     @paginate('records')
177     def list(self, autor=None):
178         """List records in model"""
179         r = cls.select()
180         return dict(records=r, name=name, namepl=namepl, parcial=autor)
181
182     @expose(template='kid:%s.templates.new' % __name__)
183     def new(self, **kw):
184         """Create new records in model"""
185         return dict(name=name, namepl=namepl, form=form, values=kw)
186
187     @validate(form=form)
188     @error_handler(new)
189     @expose()
190     def create(self, **kw):
191         """Save or create record to model"""
192         validate_new(kw)
193         flash(_(u'Se creó un nuevo %s.') % name)
194         raise redirect('list')
195
196     @expose(template='kid:%s.templates.edit' % __name__)
197     def edit(self, id, **kw):
198         """Edit record in model"""
199         r = validate_get(id)
200         return dict(name=name, namepl=namepl, record=r, form=form)
201
202     @validate(form=form)
203     @error_handler(edit)
204     @expose()
205     def update(self, id, **kw):
206         """Save or create record to model"""
207         r = validate_set(id, kw)
208         flash(_(u'El %s fue actualizado.') % name)
209         raise redirect('../list')
210
211     @expose(template='kid:%s.templates.show' % __name__)
212     def show(self,id, **kw):
213         """Show record in model"""
214         r = validate_get(id)
215         return dict(name=name, namepl=namepl, record=r)
216
217     @expose()
218     def delete(self, id):
219         """Destroy record in model"""
220         r = validate_get(id)
221         r.destroySelf()
222         flash(_(u'El %s fue eliminado permanentemente.') % name)
223         raise redirect('../list')
224
225     @expose()
226     def files(self, id):
227         r = validate_get(id)
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)
231         return r.archivo
232 #}}}
233