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.
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.interfaceEs werden die beiden Felder definiert und zum Schluss wird die Funktion arePasswordsEqual als über den Dekorator (@zope.interface.invariant) als Invariante des Interfaces definiert.
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.""")
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