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