From: Leandro Lucarella Date: Sat, 10 Feb 2007 00:36:26 +0000 (+0000) Subject: Reutilizar validación de ID y existencia de objetos. X-Git-Tag: pre-merge~154 X-Git-Url: https://git.llucax.com/z.facultad/75.52/sercom.git/commitdiff_plain/59972c6fd03ea093bd26eca762a7f4fa5a1320dd?hp=c319838b39466b11a0cf2e7f2e31d8fe23bb6352 Reutilizar validación de ID y existencia de objetos. Se mueve la parte de validación de id y de existencia de SQLObjects al módulo validate de subcontrollers. De esta forma se puede reutilizar esta validación en otros controladores. En el controlador de docentes se 'bindean' las funciones con los parámetros de clase y nombre para que sea más simple el uso (tipo aplicación parcial :). --- diff --git a/sercom/subcontrollers/docente/__init__.py b/sercom/subcontrollers/docente/__init__.py index 721ec34..c93184d 100644 --- a/sercom/subcontrollers/docente/__init__.py +++ b/sercom/subcontrollers/docente/__init__.py @@ -7,14 +7,19 @@ from turbogears.widgets import * from turbogears import identity from turbogears import paginate from docutils.core import publish_parts +from sercom.subcontrollers import validate as val cls = Docente name = 'docente' namepl = name + 's' +def validate_get(id): return val.validate_get(cls, name, id) +def validate_set(id, data): return val.validate_set(cls, name, id, data) +def validate_new(data): return val.validate_new(cls, name, data) + form = TableForm(fields=[ TextField(name='usuario', label=_(u'Usuario'), - help_text=_(u'Requerido.'), + 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.'), @@ -57,26 +62,16 @@ class DocenteController(controllers.Controller, identity.SecureResource): """List records in model""" f = kw.get('tg_flash', None) r = cls.select() - return dict(records=r, name=name, namepl=namepl, tg_flash=f) @expose() def activate(self, id, activo): """Save or create record to model""" + r = validate_get(id) try: - id = int(id) - except ValueError: - raise redirect('../list', - tg_flash=_(u'Identificador inválido: %s.') % id) - - try: - r = cls.get(id) - except LookupError: - f = _(u'No existe el %s con identificador %d.') % (name, id) - raise redirect('../list', tg_flash=f) - - r.activo = bool(int(activo)) - + r.activo = bool(int(activo)) + except ValueError, e: + raise redirect('../list', tg_flash=_(u'Acción inválida.')) raise redirect('../list') @expose(template='kid:sercom.subcontrollers.%s.templates.new' % name) @@ -90,97 +85,37 @@ class DocenteController(controllers.Controller, identity.SecureResource): @expose() def create(self, **kw): """Save or create record to model""" - try: - cls(**kw) - except Exception, e: - raise redirect('new', tg_flash=_(u'No se pudo crear el nuevo %s, ' \ - 'probablemente ya existe uno con el mismo usuario (error: %s).' - % (name, e)), **kw) - + validate_new(kw) raise redirect('list', tg_flash=_(u'Se creó un nuevo %s.') % name) @expose(template='kid:sercom.subcontrollers.%s.templates.edit' % name) def edit(self, id, **kw): """Edit record in model""" - try: - id = int(id) - except ValueError: - raise redirect('../list', - tg_flash=_(u'Identificador inválido: %s.') % id) - - f = kw.get('tg_flash', None) - try: - r = cls.get(id) - except LookupError: - f = _(u'No existe el %s con identificador %d.') % (name, id) - raise redirect('../list', tg_flash=f) - - return dict(name=name, namepl=namepl, record=r, form=form, tg_flash=f) + r = validate_get(id) + return dict(name=name, namepl=namepl, record=r, form=form, + tg_flash=kw.get('tg_flash', None)) @validate(form=form) @error_handler(edit) @expose() def update(self, id, **kw): """Save or create record to model""" - try: - id = int(id) - except ValueError: - raise redirect('../list', - tg_flash=_(u'Identificador inválido: %s.') % id) - - try: - record = cls.get(id) - except LookupError: - raise redirect('../list', - tg_flash=_(u'No existe el %s con identificador %d.') - % (name, id)) - - try: - record.set(**kw) - except Exception, e: - raise redirect('../edit/%d' % id, tg_flash=_(u'No se pudo ' \ - 'modificar el %s, probablemente ya existe uno con el mismo ' \ - 'usuario (error: %s).' % (name, e)), **kw) - + r = validate_set(id, kw) raise redirect('../list', tg_flash=_(u'El %s fue actualizado.') % name) @expose(template='kid:sercom.subcontrollers.%s.templates.show' % name) def show(self,id, **kw): """Show record in model""" - try: - id = int(id) - except ValueError: - raise redirect('../list', - tg_flash=_(u'Identificador inválido: %s.') % id) - - try: - r = cls.get(id) - except LookupError: - raise redirect('../list', - tg_flash=_(u'No existe el %s con identificador %d.') - % (name, id)) - + r = validate_get(id) r.obs = publish_parts(r.observaciones, writer_name='html')['html_body'] - return dict(name=name, namepl=namepl, record=r) @expose() def delete(self, id): """Destroy record in model""" - try: - id = int(id) - except ValueError: - raise redirect('../list', - tg_flash=_(u'Identificador inválido: %s.') % id) - - try: - cls.delete(id) - except LookupError: - raise redirect('../list', - tg_flash=_(u'No existe el %s con identificador %d.') - % (name, id)) - + r = validate_get(id) + r.destroySelf() raise redirect('../list', tg_flash=_(u'El %s fue eliminado permanentemente.') % name) diff --git a/sercom/subcontrollers/validate.py b/sercom/subcontrollers/validate.py new file mode 100644 index 0000000..67b749a --- /dev/null +++ b/sercom/subcontrollers/validate.py @@ -0,0 +1,32 @@ +# vim: set et sw=4 sts=4 encoding=utf-8 : + +__all__ = ('validate_get', 'validate_set', 'validate_new') + +from turbogears import redirect + +def validate_get(cls, name, id, url='../list'): + try: + id = int(id) + except ValueError: + raise redirect(url, tg_flash=_(u'Identificador inválido: %s.') % id) + try: + return cls.get(id) + except LookupError: + raise redirect(url, tg_flash=_(u'No existe %s con identificador %d') + % (name, id)) + +def validate_set(cls, name, id, data, url='../edit'): + r = validate_get(cls, name, id) + try: + r.set(**data) + except Exception, e: + raise redirect('%s/%s' % (url, id), tg_flash=_(u'No se pudo ' \ + 'modificar el %s (error: %s).') % (name, e), **data) + +def validate_new(cls, name, data, url='new'): + try: + return cls(**data) + except Exception, e: + raise redirect(url, tg_flash=_(u'No se pudo crear el nuevo %s ' \ + '(error: %s).') % (name, e), **data) +