[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