[Checkins] SVN: z3c.formwidget.query/trunk/ Add an ignoreMissing parameter and widget subclasses to avoid errors when
Laurence Rowe
l at lrowe.co.uk
Mon Mar 28 09:11:30 EDT 2011
Log message for revision 121141:
Add an ignoreMissing parameter and widget subclasses to avoid errors when
rendering missing values.
Changed:
U z3c.formwidget.query/trunk/CHANGES.txt
U z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt
U z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py
-=-
Modified: z3c.formwidget.query/trunk/CHANGES.txt
===================================================================
--- z3c.formwidget.query/trunk/CHANGES.txt 2011-03-28 12:57:13 UTC (rev 121140)
+++ z3c.formwidget.query/trunk/CHANGES.txt 2011-03-28 13:11:30 UTC (rev 121141)
@@ -4,6 +4,10 @@
0.6 (unreleased)
----------------
+* Add an ignoreMissing parameter and widget subclasses to avoid errors when
+ rendering missing values.
+ [elro]
+
* Create changelog file.
[dukebody]
Modified: z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt
===================================================================
--- z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt 2011-03-28 12:57:13 UTC (rev 121140)
+++ z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt 2011-03-28 13:11:30 UTC (rev 121141)
@@ -72,8 +72,9 @@
Widgets
-------
-There are two widgets available; one that corresponds to a single
-selection or a multi-selection of items from the source.
+There are four widgets available; one that corresponds to a single selection,
+a multi-selection of items from the source, and variants of these that set the
+ignoreMissing to True by default.
To enable multiple selections, wrap the ``zope.schema.Choice`` in a field
derived from ``zope.schema.Collection``.
@@ -172,6 +173,29 @@
>>> 'palermo' in set([term.token for term in widget.terms])
False
+If the source changes so that the value is no longer available, rendering the
+widget raises an error.
+
+ >>> missinglocation = Location()
+ >>> missinglocation.city = u"Pompeii"
+
+ >>> request = TestRequest()
+ >>> widget = setupWidget(city, missinglocation, request)
+
+ >>> widget.update()
+ Traceback (most recent call last):
+ ...
+ LookupError: Pompeii
+
+This can be avoided by setting ``ignoreMissing`` on the widget:
+
+ >>> request = TestRequest()
+ >>> widget = setupWidget(city, missinglocation, request)
+
+ >>> widget.ignoreMissing = True
+ >>> 'type="radio"' in widget()
+ False
+
Now we want to try out selection of multiple items.
>>> cities = zope.schema.Set(
Modified: z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py
===================================================================
--- z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py 2011-03-28 12:57:13 UTC (rev 121140)
+++ z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py 2011-03-28 13:11:30 UTC (rev 121141)
@@ -70,6 +70,7 @@
_queryform = None
_resultsform = None
_bound_source = None
+ ignoreMissing = False
noValueLabel = _(u'(nothing)')
@@ -112,8 +113,15 @@
if not isinstance(request_values, (tuple, set, list)):
request_values = (request_values,)
- terms = set([source.getTermByToken(token) for token in request_values
- if token and token != self.noValueToken])
+ for token in request_values:
+ if not token or token == self.noValueToken:
+ continue
+ try:
+ terms.add(source.getTermByToken(token))
+ except LookupError:
+ # Term no longer available
+ if not self.ignoreMissing:
+ raise
elif not self.ignoreContext:
@@ -125,7 +133,15 @@
elif not isinstance(selection, (tuple, set, list)):
selection = [selection]
- terms = set([source.getTerm(value) for value in selection if value])
+ for value in selection:
+ if not value:
+ continue
+ try:
+ terms.add(source.getTerm(value))
+ except LookupError:
+ # Term no longer available
+ if not self.ignoreMissing:
+ raise
# Set up query form
@@ -214,3 +230,23 @@
@zope.interface.implementer(z3c.form.interfaces.IFieldWidget)
def QuerySourceFieldCheckboxWidget(field, request):
return z3c.form.widget.FieldWidget(field, QuerySourceCheckboxWidget(request))
+
+class IgnoreMissingQuerySourceRadioWidget(QuerySourceRadioWidget):
+ """Query source widget that allows single selection and ignores missing
+ values."""
+ ignoreMissing = True
+
+class IgnoreMissingQuerySourceCheckboxWidget(QuerySourceRadioWidget):
+ """Query source widget that allows multiple selections and ignores missing
+ values."""
+ ignoreMissing = True
+
+ at zope.interface.implementer(z3c.form.interfaces.IFieldWidget)
+def IgnoreMissingQuerySourceFieldRadioWidget(field, request):
+ return z3c.form.widget.FieldWidget(field,
+ IgnoreMissingQuerySourceRadioWidget(request))
+
+ at zope.interface.implementer(z3c.form.interfaces.IFieldWidget)
+def IgnoreMissingQuerySourceFieldCheckboxWidget(field, request):
+ return z3c.form.widget.FieldWidget(field,
+ IgnoreMissingQuerySourceCheckboxWidget(request))
More information about the checkins
mailing list