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.

by Michael Howitz posted at 2006-01-30 11:57 last modified 2006-01-31 14:09

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, invariant

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

arePasswordsEqual = invariant(arePasswordsEqual)
Es werden die beiden Felder definiert und zum Schluss wird die Funktion arePasswordsEqual als Invariante des Interfaces definiert.

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