From: Leandro Lucarella Date: Wed, 21 Feb 2007 04:11:04 +0000 (+0000) Subject: Hacer que formularios sean subclase de TableForm. X-Git-Tag: pre-merge~132 X-Git-Url: https://git.llucax.com/software/sercom.git/commitdiff_plain/57b45e8de6dd27348782f3478b785d87aa228c65?ds=sidebyside Hacer que formularios sean subclase de TableForm. Si los formularios son instancias de TableForm en vez de subclases, cuando quieren usar javascript modifican el atributo *de clase* 'javascript' de TableForm y termina inyectándose el javascript de *todos* los formularios juntos en cada formulario renderizado. Por ahora no encontré mejor solución que la subclase. --- diff --git a/sercom/controllers.py b/sercom/controllers.py index 714869a..186fe51 100644 --- a/sercom/controllers.py +++ b/sercom/controllers.py @@ -1,7 +1,7 @@ # vim: set et sw=4 sts=4 encoding=utf-8 : from turbogears import controllers, expose, view -from turbogears import widgets as w, validators +from turbogears import widgets as W, validators as V from turbogears import identity, redirect from cherrypy import request, response from model import * @@ -12,6 +12,17 @@ from subcontrollers import * import logging log = logging.getLogger("sercom.controllers") +class LoginForm(W.TableForm): + fields = [ + W.TextField(name='login_user', label=_(u'Usuario'), + validator=V.NotEmpty()), + W.PasswordField(name='login_password', label=_(u'Contraseña'), + validator=V.NotEmpty()) + ] + javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_login_user');")] + submit = W.SubmitButton(name='login_submit') + submit_text = _(u'Ingresar') + class Root(controllers.RootController): @expose(template='.templates.welcome') @@ -46,24 +57,13 @@ class Root(controllers.RootController): msg = _(u'Por favor ingrese.') forward_url = request.headers.get('Referer', '/') - fields = [ - w.TextField(name='login_user', label=_(u'Usuario'), - validator=validators.NotEmpty()), - w.PasswordField(name='login_password', label=_(u'Contraseña'), - validator=validators.NotEmpty()) - ] + fields = list(LoginForm.fields) if forward_url: - fields.append(w.HiddenField(name='forward_url')) - fields.extend([w.HiddenField(name=name) for name in request.params + fields.append(W.HiddenField(name='forward_url')) + fields.extend([W.HiddenField(name=name) for name in request.params if name not in ('login_user', 'login_password', 'login_submit', 'forward_url')]) - - submit = w.SubmitButton(name='login_submit') - - login_form = w.TableForm(fields=fields, action=previous_url, - submit_text=_(u'Ingresar'), submit=submit) - login_form.javascript.append( - w.JSSource("MochiKit.DOM.focusOnLoad('form_login_user');")) + login_form = LoginForm(fields=fields, action=previous_url) values = dict(forward_url=forward_url) values.update(request.params) diff --git a/sercom/subcontrollers/caso_de_prueba/__init__.py b/sercom/subcontrollers/caso_de_prueba/__init__.py index 21451e7..a65f41e 100644 --- a/sercom/subcontrollers/caso_de_prueba/__init__.py +++ b/sercom/subcontrollers/caso_de_prueba/__init__.py @@ -2,8 +2,9 @@ #{{{ Imports from turbogears import controllers, expose, redirect -from turbogears import validate, validators, flash, error_handler -from turbogears.widgets import * +from turbogears import validate, flash, error_handler +from turbogears import validators as V +from turbogears import widgets as W from turbogears import identity from turbogears import paginate from docutils.core import publish_parts @@ -53,20 +54,24 @@ def get_options(): return [(0, _(u'<>'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()] -form = TableForm(fields=[ - TextField(name='nombre', label=_(u'Nombre'), - help_text=_(u'Requerido y único.'), - validator=validators.UnicodeString(min=5, max=60, strip=True)), - SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()), - options=get_options, validator=validators.Int(not_empty=False)), - TextField(name='descripcion', label=_(u'Descripción'), - validator=validators.UnicodeString(not_empty=False, max=255, strip=True)), - TextField(name='retorno', label=_(u'Código de retorno'), - validator=validators.Int(not_empty=False, strip=True)), - TextField(name='tiempo_cpu', label=_(u'Tiempo de CPU'), - validator=validators.Number(not_empty=False, strip=True)), -]) -form.javascript.append(JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")) +class CasoDePruebaForm(W.TableForm): + fields = [ + W.TextField(name='nombre', label=_(u'Nombre'), + help_text=_(u'Requerido y único.'), + validator=V.UnicodeString(min=5, max=60, strip=True)), + W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()), + options=get_options, validator=V.Int(not_empty=False)), + W.TextField(name='descripcion', label=_(u'Descripción'), + validator=V.UnicodeString(not_empty=False, max=255, + strip=True)), + W.TextField(name='retorno', label=_(u'Código de retorno'), + validator=V.Int(not_empty=False, strip=True)), + W.TextField(name='tiempo_cpu', label=_(u'Tiempo de CPU'), + validator=V.Number(not_empty=False, strip=True)), + ] + javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")] + +form = CasoDePruebaForm() #}}} #{{{ Controlador @@ -84,7 +89,7 @@ class CasoDePruebaController(controllers.Controller, identity.SecureResource): raise redirect('list') @expose(template='kid:%s.templates.list' % __name__) - @validate(validators=dict(enunciado=validators.Int)) + @validate(validators=dict(enunciado=V.Int)) @paginate('records') def list(self, enunciado=None): """List records in model""" diff --git a/sercom/subcontrollers/docente/__init__.py b/sercom/subcontrollers/docente/__init__.py index 12fd147..3ab67c8 100644 --- a/sercom/subcontrollers/docente/__init__.py +++ b/sercom/subcontrollers/docente/__init__.py @@ -3,8 +3,9 @@ #{{{ Imports import cherrypy from turbogears import controllers, expose, redirect -from turbogears import validate, validators, flash, error_handler -from turbogears.widgets import * +from turbogears import validate, flash, error_handler +from turbogears import validators as V +from turbogears import widgets as W from turbogears import identity from turbogears import paginate from docutils.core import publish_parts @@ -30,32 +31,37 @@ def validate_new(data): #}}} #{{{ Formulario -form = TableForm(fields=[ - TextField(name='usuario', label=_(u'Usuario'), - help_text=_(u'Requerido y único.'), - validator=validators.UnicodeString(min=3, max=10, strip=True)), - TextField(name='nombre', label=_(u'Nombre'), - help_text=_(u'Requerido.'), - validator=validators.UnicodeString(min=10, max=255, strip=True)), - TextField(name='email', label=_(u'E-Mail'), - #help_text=_(u'Dirección de e-mail.'), - validator=validators.All( - validators.Email(not_empty=False, resolve_domain=True), - validators.UnicodeString(not_empty=False, max=255, strip=True))), - TextField(name='telefono', label=_(u'Teléfono'), - #help_text=_(u'Texto libre para teléfono, se puede incluir horarios o varias entradas.'), - validator=validators.UnicodeString(not_empty=False, min=7, max=255, strip=True)), - TextArea(name='observaciones', label=_(u'Observaciones'), - #help_text=_(u'Observaciones.'), - validator=validators.UnicodeString(not_empty=False, strip=True)), - CheckBox(name='nombrado', label=_(u'Nombrado'), default=1, - #help_text=_(u'Indica si tiene cargo.'), - validator=validators.Bool(if_empty=1)), - CheckBox(name='activo', label=_(u'Activo'), default=1, - #help_text=_(u'Si no está activo no puede ingresar al sistema.'), - validator=validators.Bool(if_empty=1)), -]) -form.javascript.append(JSSource("MochiKit.DOM.focusOnLoad('form_usuario');")) +class DocenteForm(W.TableForm): + fields = [ + W.TextField(name='usuario', label=_(u'Usuario'), + help_text=_(u'Requerido y único.'), + validator=V.UnicodeString(min=3, max=10, strip=True)), + W.TextField(name='nombre', label=_(u'Nombre'), + help_text=_(u'Requerido.'), + validator=V.UnicodeString(min=10, max=255, strip=True)), + W.TextField(name='email', label=_(u'E-Mail'), + #help_text=_(u'Dirección de e-mail.'), + validator=V.All( + V.Email(not_empty=False, resolve_domain=True), + V.UnicodeString(not_empty=False, max=255, strip=True))), + W.TextField(name='telefono', label=_(u'Teléfono'), + #help_text=_(u'Texto libre para teléfono, se puede incluir ' + # 'horarios o varias entradas.'), + validator=V.UnicodeString(not_empty=False, min=7, max=255, + strip=True)), + W.TextArea(name='observaciones', label=_(u'Observaciones'), + #help_text=_(u'Observaciones.'), + validator=V.UnicodeString(not_empty=False, strip=True)), + W.CheckBox(name='nombrado', label=_(u'Nombrado'), default=1, + #help_text=_(u'Indica si tiene cargo.'), + validator=V.Bool(if_empty=1)), + W.CheckBox(name='activo', label=_(u'Activo'), default=1, + #help_text=_(u'Si no está activo no puede ingresar al sistema.'), + validator=V.Bool(if_empty=1)), + ] + javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_usuario');")] + +form = DocenteForm() #}}} #{{{ Controlador diff --git a/sercom/subcontrollers/enunciado/__init__.py b/sercom/subcontrollers/enunciado/__init__.py index 2743f44..31a4c30 100644 --- a/sercom/subcontrollers/enunciado/__init__.py +++ b/sercom/subcontrollers/enunciado/__init__.py @@ -2,8 +2,9 @@ #{{{ Imports from turbogears import controllers, expose, redirect -from turbogears import validate, validators, flash, error_handler -from turbogears.widgets import * +from turbogears import validate, flash, error_handler +from turbogears import validators as V +from turbogears import widgets as W from turbogears import identity from turbogears import paginate from docutils.core import publish_parts @@ -52,16 +53,19 @@ def validate_new(data): def get_options(): return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()] -form = TableForm(fields=[ - TextField(name='nombre', label=_(u'Nombre'), - help_text=_(u'Requerido y único.'), - validator=validators.UnicodeString(min=5, max=60, strip=True)), - SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()), - options=get_options, validator=validators.Int(not_empty=False)), - TextField(name='descripcion', label=_(u'Descripción'), - validator=validators.UnicodeString(not_empty=False, max=255, strip=True)), -]) -form.javascript.append(JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")) +class EnunciadoForm(W.TableForm): + fields = [ + W.TextField(name='nombre', label=_(u'Nombre'), + help_text=_(u'Requerido y único.'), + validator=V.UnicodeString(min=5, max=60, strip=True)), + W.SingleSelectField(name=fkname+'ID', label=_(fkname.capitalize()), + options=get_options, validator=V.Int(not_empty=False)), + W.TextField(name='descripcion', label=_(u'Descripción'), + validator=V.UnicodeString(not_empty=False, max=255, strip=True)), + ] + javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")] + +form = EnunciadoForm() #}}} #{{{ Controlador @@ -79,7 +83,7 @@ class EnunciadoController(controllers.Controller, identity.SecureResource): raise redirect('list') @expose(template='kid:%s.templates.list' % __name__) - @validate(validators=dict(autor=validators.Int)) + @validate(validators=dict(autor=V.Int)) @paginate('records') def list(self, autor=None): """List records in model"""