Zope3: Testen von felderübergreifenden Bedingungen in Interfaces mit zope.formlib
Um felderübergreifende Bedinungen (interface invariants) mit zope.formlib testen zu können sind in Zope 3.2 einige Anstrengungen nötig.
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.schema.ValidationError als Basisklasse:
class PasswordsAreNotEqual(zope.schema.ValidationError):
u"""Das Passwort und die Wiederholung sind nicht gleich."""
zope.interface.implements(zope.app.form.interfaces.IWidgetInputError)
Der docstring der Klasse wird dem Benutzer angezeigt. (Weil die Klasse von zope.schema.ValidationError erbt.)
Es ist notwendig, zope.app.form.interfaces.IWidgetInputError
zu implementieren, da nur für dieses Interface in Adapter besteht, um
den Fehler in der Benutzungsoberfläche anzuzeigen. (Ein ValidationError
erfüllt das angegebene Interface, so dass das implements-Statement der
Wahrheit entspricht.)
Folgende Funktion testet die Gleichheit der Passwörter. Als Argument wird ihr das Objekt übergeben. Im Fehlerfall wird die angegebene Exception geworfen.
def arePasswordsEqual(obj)
if obj.password != obj.password2:
raise PasswordsAreNotEqual
Das Interface hat dann als Minimum folgende Gestalt:
from zope.interface import Interface, invariantEs werden die beiden Felder definiert und zum Schluss wird die Funktion arePasswordsEqual als Invariante des Interfaces definiert.
class IUser(Interface):
password = zope.schema.Password(title=u"Passwort")
password2 = zope.schema.Password(title=u"Wiederholung des Passworts")
arePasswordsEqual = invariant(arePasswordsEqual)
Benutzung mit zope.formlib
zope.formlib testet die Invarianten automatisch und zeigt Fehler oberhalb des Fomulars an, indem die Methode doc der Instanz der Fehlerklasse aufgerufen wird. (Diese Liefert im Fall von zope.schema.ValidationError den docstring der Exception-Klasse)
Wenn man auf dem Exception-Objekt das Attribut widget_title setzt, wird dieses mit einem Doppelpunkt getrennt vor der Fehlermeldung angezeigt. Eine Zuordnung zu einem Feld im Formular findet nicht statt.
- Category(s)
- Zope 3
- The URL to Trackback this entry is:
- http://blog.gocept.com/zope3-testen-von-felderuebergreifenden-bedingungen-in-interfaces-mit-zope-formlib/tbping