]> git.llucax.com Git - software/sercom.git/blob - sercom/subcontrollers/misentregas/__init__.py
a516c8817c03472bbdab60c15be047e685d4ca06
[software/sercom.git] / sercom / subcontrollers / misentregas / __init__.py
1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
2
3 #{{{ Imports
4 import cherrypy
5 from turbogears import controllers, expose, redirect
6 from turbogears import validate, flash, error_handler
7 from turbogears import validators as V
8 from turbogears import widgets as W
9 from turbogears import identity
10 from turbogears import paginate
11 from docutils.core import publish_parts
12 from sercom.subcontrollers import validate as val
13 from sercom.model import Entrega, Correccion, Curso, Ejercicio, InstanciaDeEntrega
14 from sqlobject import *
15
16 #}}}
17
18 #{{{ Configuración
19 cls = Entrega
20 name = 'entrega'
21 namepl = name + 's'
22 #}}}
23
24 #{{{ Validación
25 def validate_get(id):
26     return val.validate_get(cls, name, id)
27
28 def validate_set(id, data):
29     return val.validate_set(cls, name, id, data)
30
31 def validate_new(data):
32     return val.validate_new(cls, name, data)
33 #}}}
34
35 def get_ejercicios_activos():
36     # TODO : Mostrar solo los ejercicios con instancias de entrega activos
37     return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in Ejercicio.select()]
38
39 ajax = """
40     function clearInstancias ()
41     {
42         l = MochiKit.DOM.getElement('form_instancia');
43         l.options.length = 0;
44         l.disabled = true;
45     }
46
47     function mostrarInstancias(res)
48     {
49         clearInstancias();
50         for(i=0; i < res.instancias.length; i++) {
51             id = res.instancias[i].id;
52             label = res.instancias[i].numero;
53             MochiKit.DOM.appendChildNodes("form_instancia", OPTION({"value":id}, label))
54         }
55         if (l.options.length > 0)
56             l.disabled = false;
57     }
58
59     function err (err)
60     {
61         alert("The metadata for MochiKit.Async could not be fetched :(");
62     }
63
64     function actualizar_instancias ()
65     {
66         l = MochiKit.DOM.getElement('form_ejercicio');
67         id = l.options[l.selectedIndex].value;
68         if (id == 0) {
69             clearInstancias();
70             return;
71         }
72
73         url = "/mis_entregas/instancias?ejercicio_id="+id;
74         var d = loadJSONDoc(url);
75         d.addCallbacks(mostrarInstancias, err);
76     }
77
78     function prepare()
79     {
80         connect('form_ejercicio', 'onchange', actualizar_instancias);
81         clearInstancias();
82     }
83
84     MochiKit.DOM.addLoadEvent(prepare)
85 """
86 #{{{ Formulario
87 class EntregaForm(W.TableForm):
88     class Fields(W.WidgetsList):
89         ejercicio = W.SingleSelectField(label=_(u'Ejercicio'),
90             options=get_ejercicios_activos, validator=V.Int(not_empty=True))
91         instancia = W.SingleSelectField(label=_(u'Instancia de Entrega'), validator=V.Int(not_empty=True))
92         archivo = W.FileField(label=_(u'Archivo'), help_text=_(u'Archivo en formaro ZIP con tu entrega'))
93     fields = Fields()
94     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_ejercicio');"), W.JSSource(ajax)]
95
96 form = EntregaForm()
97 #}}}
98
99 #{{{ Controlador
100 class MisEntregasController(controllers.Controller, identity.SecureResource):
101     """Basic model admin interface"""
102     require = identity.has_permission('entregar')
103
104     @expose()
105     def default(self, tg_errors=None):
106         """handle non exist urls"""
107         raise redirect('list')
108
109     @expose()
110     def index(self):
111         raise redirect('list')
112
113     @expose(template='kid:%s.templates.new' % __name__)
114     def new(self, **kw):
115         """Create new records in model"""
116         return dict(name=name, namepl=namepl, form=form, values=kw)
117
118     @expose(template='kid:%s.templates.list' % __name__)
119     @paginate('records')
120     def list(self):
121         """List records in model"""
122         r = cls.select(cls.q.entregadorID == identity.current.user.id)
123         return dict(records=r, name=name, namepl=namepl)
124
125     @expose(template='kid:%s.templates.show' % __name__)
126     def show(self,id, **kw):
127         """Show record in model"""
128         r = validate_get(id)
129         if r.observaciones is None:
130             r.obs = ''
131         else:
132             r.obs = publish_parts(r.observaciones, writer_name='html')['html_body']
133         return dict(name=name, namepl=namepl, record=r)
134
135     @validate(form=form)
136     @error_handler(new)
137     @expose()
138     def create(self, archivo, ejercicio, **kw):
139         """Save or create record to model"""
140         kw['archivos'] = archivo.file.read()
141         kw['entregador'] = identity.current.user
142         validate_new(kw)
143         flash(_(u'Se creó una nueva %s.') % name)
144         raise redirect('list')
145
146     @expose("json")
147     def instancias(self, ejercicio_id):
148         c = Ejercicio.get(ejercicio_id)
149         return dict(instancias=c.instancias)
150 #}}}
151