X-Git-Url: https://git.llucax.com/software/sercom.git/blobdiff_plain/65b45e5ceacbabe6f5851b83a57e94fe72ab0317..17edba03ed2f41f69b7be0b637c91414cd2e3f79:/sercom/subcontrollers/ejercicio/__init__.py?ds=sidebyside diff --git a/sercom/subcontrollers/ejercicio/__init__.py b/sercom/subcontrollers/ejercicio/__init__.py index f0b0157..cacbad5 100644 --- a/sercom/subcontrollers/ejercicio/__init__.py +++ b/sercom/subcontrollers/ejercicio/__init__.py @@ -11,6 +11,9 @@ from docutils.core import publish_parts from sercom.subcontrollers import validate as val from sercom.model import Ejercicio, Curso, Enunciado from cherrypy import request, response + +from entrega import * + #}}} #{{{ Configuración @@ -68,14 +71,80 @@ def validate_new(data): validate_fk(data) validate_fk1(data) return val.validate_new(cls, name, data) + +def validate_del(id): + return val.validate_del(cls, name, id) #}}} #{{{ Formulario def get_options(): return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()] -def get_options1(): - return [(0, _(u'--'))] + [(fk1.id, fk1.shortrepr()) for fk1 in fk1cls.select()] +# Un poco de ajax para llenar los cursos +ajax = """ + function showHint() + { + MochiKit.DOM.showElement('hint') + } + + function hideHint() + { + MochiKit.DOM.hideElement('hint') + } + + function clearEnunciados () + { + l = MochiKit.DOM.getElement('form_enunciadoID'); + l.options.length = 0; + l.disabled = true; + } + + function mostrarEnunciados (res) + { + clearEnunciados(); + for(i in res.enunciados) { + id = res.enunciados[i].id; + label = res.enunciados[i].nombre; + MochiKit.DOM.appendChildNodes("form_enunciadoID", OPTION({"value":id}, label)) + } + l.disabled = false; + hideHint(); + } + + function err (err) + { + alert("The metadata for MochiKit.Async could not be fetched :("); + hideHint(); + } + + function actualizar_enunciados () + { + l = MochiKit.DOM.getElement('form_cursoID'); + id = l.options[l.selectedIndex].value; + if (id == 0) { + clearEnunciados(); + return; + } + + url = "/enunciado/de_curso?curso_id="+id; + var d = loadJSONDoc(url); + d.addCallbacks(mostrarEnunciados, err); + showHint(); + } + + function prepare() + { + connect('form_cursoID', 'onchange', actualizar_enunciados); + hideHint(); + clearEnunciados(); + actualizar_enunciados(); + if (select_enunciado) { + wait(0.1).addCallback(function (res) { return select_enunciado() }); + } + } + + MochiKit.DOM.addLoadEvent(prepare) +""" class EjercicioForm(W.TableForm): class Fields(W.WidgetsList): @@ -85,10 +154,10 @@ class EjercicioForm(W.TableForm): help_text=_(u'Requerido.'), validator=V.Int(not_empty=True)) fk1 = W.SingleSelectField(name=fk1name+'ID', label=_(fk1name.capitalize()), - options=get_options1, validator=V.Int(not_empty=True)) + validator=V.Int(not_empty=True)) grupal = W.CheckBox(name='grupal', label=_(u"Grupal?")) fields = Fields() - javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")] + javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)] form = EjercicioForm() #}}} @@ -98,6 +167,8 @@ class EjercicioController(controllers.Controller, identity.SecureResource): """Basic model admin interface""" require = identity.has_permission('admin') + entrega = EntregaController() + @expose() def default(self, tg_errors=None): """handle non exist urls""" @@ -148,17 +219,12 @@ class EjercicioController(controllers.Controller, identity.SecureResource): def show(self,id, **kw): """Show record in model""" r = validate_get(id) - if r.descripcion is None: - r.desc = '' - else: - r.desc = publish_parts(r.descripcion, writer_name='html')['html_body'] return dict(name=name, namepl=namepl, record=r) @expose() def delete(self, id): """Destroy record in model""" - r = validate_get(id) - r.destroySelf() + validate_del(id) flash(_(u'El %s fue eliminado permanentemente.') % name) raise redirect('../list')