Hi again,

   Thanks for the help so far. Using schemas I can do the following:

   class IBuddy(interface.Interface):
       """Provides access to basic buddy information"""

       fullname = TextLine(title=_("Name"))
       email = TextLine(title=_("Email Address"), required=False)
       phone = TextLine(title=_("Phone Contact"), required=False)

       @interface.invariant
       def buddyInvariants(ob):
           if ob.fullname.startswith("Z"):
               raise zope.interface.Invalid("Names cannot start with Z")
           if ob.email is None and ob.phone is None:
raise zope.interface.Invalid("Email and Phone cannot both be None")

and:

   class Buddy(persistent.Persistent):
       """Buddy Information"""

       zope.interface.implements(IBuddy)

       def __init__(self,fullname=None, email=None, phone=None):
               self.fullname = fullname
               self.email = email
               self.phone = phone
               IBuddy.validateInvariants(self)

This will do the validation on add. But how do I get the schema to be validated on an
update to it?

One way I can see is to have update method with named parameters (which does the validation at the end of the method), but then (I think) I lose the ability to have a <browser:editform> directive to generate the html form based on the schema for free.

Any suggestions?

Thanks in advance,
Adam

[EMAIL PROTECTED] wrote:

[EMAIL PROTECTED] wrote on 31/10/2005 06.12.43:


Just added this to FAQ (http://zissue.berlios.de/z3/z3faq.html).
I expects more contribution  in coming months.


How to validate two or more fields simultaneously?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Use `invariants` to control more fields.

Look at zope.interface/README.txt for details.

Let's consider this more specific question asked to list:

 How do I implement a validation rule that says either email or phone
 have to exist, but not necissarily both.

 Using the buddy demo as an example, with the following interface::

   class IBuddy(zope.interface.Interface):
       """Provides access to basic buddy information"""

       fullname = TextLine(title=_("Name"))
       email = TextLine(title=_("Email Address"))
       phone = TextLine(title=_("Phone Contact"))

First we have to make a callable object, either a simple function or
callable instance of a class::

 def contacts_invariant(obj):
     if not (obj.email or obj.phone):
         raise Exception("At least one contact info is rquired")

Now use `validateInvariants` method of the interface to validate::

 buddy = Buddy()
 buddy.email = u"[EMAIL PROTECTED]"
 IBuddy.validateInvariants(buddy)

What I would want to be further explained is: When should I call
validateInvariants?
Of course I would call it when I'm creating or editing the object. Then,
frequently, just after an add or edit form.
More: can I then use auto generated forms (by using events after the form,
but how?), or I just have do define a custom form?
And then: what do I do if the validation falils? How do I return the form,
possibly with an error message?

I feel these are genuine FAQs, and I still don't have answers for many of
them. Working through them at a steday pace, though ;)
Thanks for all your help, really.

ciao
Guido

_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to