1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
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 *
26 return val.validate_get(cls, name, id)
28 def validate_set(id, data):
29 return val.validate_set(cls, name, id, data)
31 def validate_new(data):
32 return val.validate_new(cls, name, data)
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()]
40 function clearInstancias ()
42 l = MochiKit.DOM.getElement('form_instancia');
47 function mostrarInstancias(res)
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))
55 if (l.options.length > 0)
61 alert("The metadata for MochiKit.Async could not be fetched :(");
64 function actualizar_instancias ()
66 l = MochiKit.DOM.getElement('form_ejercicio');
67 id = l.options[l.selectedIndex].value;
73 url = "/mis_entregas/instancias?ejercicio_id="+id;
74 var d = loadJSONDoc(url);
75 d.addCallbacks(mostrarInstancias, err);
80 connect('form_ejercicio', 'onchange', actualizar_instancias);
84 MochiKit.DOM.addLoadEvent(prepare)
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'))
94 javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_ejercicio');"), W.JSSource(ajax)]
100 class MisEntregasController(controllers.Controller, identity.SecureResource):
101 """Basic model admin interface"""
102 require = identity.has_permission('entregar')
105 def default(self, tg_errors=None):
106 """handle non exist urls"""
107 raise redirect('list')
111 raise redirect('list')
113 @expose(template='kid:%s.templates.new' % __name__)
115 """Create new records in model"""
116 return dict(name=name, namepl=namepl, form=form, values=kw)
118 @expose(template='kid:%s.templates.list' % __name__)
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)
125 @expose(template='kid:%s.templates.show' % __name__)
126 def show(self,id, **kw):
127 """Show record in model"""
129 if r.observaciones is None:
132 r.obs = publish_parts(r.observaciones, writer_name='html')['html_body']
133 return dict(name=name, namepl=namepl, record=r)
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
143 flash(_(u'Se creó una nueva %s.') % name)
144 raise redirect('list')
147 def instancias(self, ejercicio_id):
148 c = Ejercicio.get(ejercicio_id)
149 return dict(instancias=c.instancias)