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