On Feb 2, 2008 1:44 PM, Derek Richardson <[EMAIL PROTECTED]> wrote: > I have a schema, let's call it B. It contains an @invariant function. I > observed that it is not being called during form validation. > > After help from Philipp and some investigation, I determined that the > problem is that schema B isn't itself the main form, but is nested > within schema A as the value_type of a Tuple field. When schema A is > validated, schema B's invariant is not checked. I think this may be a > bug. If someone more knowledgeable will confirm, then I will open a bug > report. > > In the mean time, I need a workaround that verifies that the invariants > on all instances of schema B in the Tuple on schema A hold during form > validation. My nascent idea is to put an invariant on schema A that > checks all the invariants on all schema B instances. However, I am not > familiar enough with formlib internals to code this up without > significant research. Can someone help me out with an implementation for > this workaround or an idea for a different, better workaround?
I have a similar problem using Tuple with Choice. formlib validation don't check is this field has a value. Is that a bug? Then I create my own validate method and custom widget that follow: def validate(self, action, data): """Validate form using same as FormBase along with a customized validation. """ return (form.getWidgetsData(self.widgets, self.prefix, data) + form.checkInvariants(self.form_fields, data) + self.validate_enviar(action, data) ) def validate_enviar(self, action, data): """Validation for field Tuple with value_type=Choice and my own widget derived from MultiCheckBoxWidget """ errors = [] for form_field in self.form_fields: error = None field_name = form_field.__name__ widget = self.widgets[field_name] empty_marker_name = getattr(widget, 'empty_marker_name', None) if widget.name not in self.request.form and empty_marker_name: if empty_marker_name not in self.request.form: error = WidgetInputError(field_name=field_name, widget_title=form_field.field.title, errors=('Campo obrigatório não informado.') ) if error: widget.error = error.errors errors.append(error) return errors class MyMultiCheckBoxWidget(MultiCheckBoxWidget): """Subclass to customized MultiCheckBoxWidget """ orientation = 'horizontal' def _emptyMarker(self): """Disable _empytMarker """ return '' > Thanks, > > Derek > > _______________________________________________ > Zope3-users mailing list > Zope3-users@zope.org > http://mail.zope.org/mailman/listinfo/zope3-users > -- Rudá Porto Filgueiras Weimar Consultoria http://python-blog.blogspot.com Hospedagem Plone, Zope e Python? http://www.pytown.com
_______________________________________________ Zope3-users mailing list Zope3-users@zope.org http://mail.zope.org/mailman/listinfo/zope3-users