[Checkins] SVN: z3c.form/branches/adamg-missing-terms/src/z3c/form/util. added tests
Adam Groszer
cvs-admin at zope.org
Mon Sep 10 12:19:36 UTC 2012
Log message for revision 127810:
added tests
Changed:
U z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py
U z3c.form/branches/adamg-missing-terms/src/z3c/form/util.txt
-=-
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py 2012-09-10 11:43:45 UTC (rev 127809)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py 2012-09-10 12:19:32 UTC (rev 127810)
@@ -143,6 +143,8 @@
if context is None:
# IObjectWidget madness
return True
+ if zope.schema.interfaces.IObject.providedBy(field):
+ return True
# Get the datamanager and get the original value
dm = zope.component.getMultiAdapter(
@@ -150,9 +152,7 @@
# now figure value chaged status
# Or we can not get the original value, in which case we can not check
# Or it is an Object, in case we'll never know
- if (not dm.canAccess() or
- dm.query() != value or
- zope.schema.interfaces.IObject.providedBy(field)):
+ if (not dm.canAccess() or dm.query() != value):
return True
else:
return False
@@ -167,6 +167,8 @@
# if the widget is context aware, figure if it's field changed
if field is None:
field = widget.field
+ if context is None:
+ context = widget.context
return changedField(field, value, context=context)
# otherwise we cannot, return 'always changed'
return True
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/util.txt
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/util.txt 2012-09-10 11:43:45 UTC (rev 127809)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/util.txt 2012-09-10 12:19:32 UTC (rev 127810)
@@ -451,3 +451,102 @@
True
>>> bazMarker1 is bazMarker2
True
+
+`changedField()` function
+-------------------------
+
+Decide whether a field was changed/modified.
+
+ >>> class IPerson(zope.interface.Interface):
+ ... login = zope.schema.TextLine(
+ ... title=u'Login')
+ ... address = zope.schema.Object(
+ ... schema=zope.interface.Interface)
+
+ >>> class Person(object):
+ ... zope.interface.implements(IPerson)
+ ... login = 'johndoe'
+ >>> person = Person()
+
+field.context is None and no context passed:
+
+ >>> util.changedField(IPerson['login'], 'foo')
+ True
+
+IObject field:
+
+ >>> util.changedField(IPerson['address'], object(), context = person)
+ True
+
+field.context or context passed:
+
+ >>> import z3c.form.datamanager
+ >>> zope.component.provideAdapter(z3c.form.datamanager.AttributeField)
+
+ >>> util.changedField(IPerson['login'], 'foo', context = person)
+ True
+ >>> util.changedField(IPerson['login'], 'johndoe', context = person)
+ False
+
+ >>> fld = IPerson['login'].bind(person)
+ >>> util.changedField(fld, 'foo')
+ True
+ >>> util.changedField(fld, 'johndoe')
+ False
+
+No access:
+
+ >>> save = z3c.form.datamanager.AttributeField.canAccess
+ >>> z3c.form.datamanager.AttributeField.canAccess = lambda self: False
+
+ >>> util.changedField(IPerson['login'], 'foo', context = person)
+ True
+ >>> util.changedField(IPerson['login'], 'johndoe', context = person)
+ True
+
+ >>> z3c.form.datamanager.AttributeField.canAccess = save
+
+
+`changedWidget()` function
+---------------------------
+
+Decide whether a widget value was changed/modified.
+
+ >>> import z3c.form.testing
+ >>> request = z3c.form.testing.TestRequest()
+ >>> import z3c.form.widget
+ >>> widget = z3c.form.widget.Widget(request)
+
+If the widget is not IContextAware, there's nothing to check:
+
+ >>> from z3c.form import interfaces
+ >>> interfaces.IContextAware.providedBy(widget)
+ False
+
+ >>> util.changedWidget(widget, 'foo')
+ True
+
+Make it IContextAware:
+
+ >>> widget.context = person
+ >>> zope.interface.alsoProvides(widget, interfaces.IContextAware)
+
+ >>> widget.field = IPerson['login']
+
+ >> util.changedWidget(widget, 'foo')
+ True
+
+ >>> util.changedWidget(widget, 'johndoe')
+ False
+
+Field and context is also overridable:
+
+ >>> widget.field = None
+ >>> util.changedWidget(widget, 'johndoe', field=IPerson['login'])
+ False
+
+ >>> p2 = Person()
+ >>> p2.login = 'foo'
+
+ >>> util.changedWidget(widget, 'foo', field=IPerson['login'], context=p2)
+ False
More information about the checkins
mailing list