Zope3: Testen von felderübergreifenden Bedingungen in Interfaces mit zope.formlib -- aktualisiert

Um felderübergreifende Bedinungen (interface invariants) mit zope.formlib testen zu können sind in Zope 3.4 keine Klimmzüge mehr nötig.

by Michael Howitz posted at 2007-08-03 09:03 last modified 2007-08-03 09:03

Dieser Eintrag ist eine Aktualisierung des Eintrags Testen von felderübergreifenden Bedingungen in Interfaces mit zope.formlib, der sich auf Zope 3.2 bezieht. Mit Zope 3.4 ist alles viel einfacher. (Zope 3.3 habe ich nicht getestet, da die Ideen aber aus Philipp von Weitershausens Buch stammen, sollte es auch da funktionieren.)

Definition

Feldübergreiffende Bedingungen werden in Interfaces als invariants definiert. Als Beispiel soll ein Passwortfeld und eins für die Wiederholung des Passworts dienen. Beide Werte müssen also gleich sein.

Wenn die Bedingung nicht erfüllt ist, soll eine Exception geworfen werden. Da es sich um einen Validierungsfehler handelt, nutze ich zope.interface.Invalid.

Das Interface hat dann im Minimum folgende Gestalt:

import zope.interface

class IUser(zope.interface.Interface):
password = zope.schema.Password(title=u"Passwort")
password2 = zope.schema.Password(title=u"Wiederholung des Passworts")

@zope.interface.invariant
def arePasswordsEqual(user):
if user.password != user.password2:
raise zope.interface.Invalid(
u"""Das Passwort und die Wiederholung sind nicht gleich.""")
Es werden die beiden Felder definiert und zum Schluss wird die Funktion arePasswordsEqual als über den Dekorator  (@zope.interface.invariant) als Invariante des Interfaces definiert.

Benutzung mit zope.formlib

zope.formlib testet die Invarianten automatisch und zeigt Fehler oberhalb des Fomulars an. Es wird der Text der Exception angezeigt, der sich problemlos internationalisieren lassen sollte.

Category(s)
Zope 3
The URL to Trackback this entry is:
http://blog.gocept.com/zope3-testen-von-felderuebergreifenden-bedingungen-invariants-in-interfaces-mit-zope-formlib-aktualisiert/tbping