[Checkins] SVN: z3c.formwidget.query/trunk/src/z3c/formwidget/query/ Make this work with vocabularies as sources by binding the field within the widget

Alec Mitchell apm13 at columbia.edu
Sun Oct 12 12:08:25 EDT 2008


Log message for revision 92086:
  Make this work with vocabularies as sources by binding the field within the widget
  

Changed:
  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/src/z3c/formwidget/query/README.txt
===================================================================
--- z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt	2008-10-12 15:30:30 UTC (rev 92085)
+++ z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt	2008-10-12 16:08:24 UTC (rev 92086)
@@ -84,7 +84,6 @@
   ...     city = None
   
   >>> location = Location()
-  >>> field = city.bind(location)
 
   >>> from z3c.formwidget.query.widget import QuerySourceFieldRadioWidget
 
@@ -99,7 +98,7 @@
 
 An empty query is not carried out.
   
-  >>> widget = setupWidget(field, location, request)
+  >>> widget = setupWidget(city, location, request)
   >>> 'type="radio"' in widget()
   False
 
@@ -107,7 +106,7 @@
 
   >>> location.city = u"Palermo"
 
-  >>> widget = setupWidget(field, location, request)
+  >>> widget = setupWidget(city, location, request)
 
 We now expect a radio button to be present.
   
@@ -119,7 +118,7 @@
   >>> request = TestRequest(form={
   ...     'city.widgets.query': u'bologna'})
   
-  >>> widget = setupWidget(field, location, request)
+  >>> widget = setupWidget(city, location, request)
 
 Verify results:
   
@@ -135,7 +134,7 @@
   ...     'city.widgets.query': u'bologna',
   ...     'city': ('bologna',)})
 
-  >>> widget = setupWidget(field, location, request)
+  >>> widget = setupWidget(city, location, request)
 
   >>> 'checked="checked"' in widget()
   True
@@ -154,11 +153,10 @@
   ...     cities = ()
   
   >>> route = Route()
-  >>> field = cities.bind(route)
 
   >>> from z3c.formwidget.query.widget import QuerySourceFieldCheckboxWidget
 
-  >>> def setupWidget(field, context, request):
+  >>> def setupMultiWidget(field, context, request):
   ...     widget = QuerySourceFieldCheckboxWidget(field, request)
   ...     widget.name = field.__name__
   ...     widget.context = context
@@ -168,7 +166,7 @@
   
 An empty query is not carried out.
   
-  >>> widget = setupWidget(field, route, request)
+  >>> widget = setupMultiWidget(cities, route, request)
   >>> 'type="checkbox"' in widget()
   False
 
@@ -176,7 +174,7 @@
 
   >>> route.cities = (u"Palermo",)
 
-  >>> widget = setupWidget(field, route, request)
+  >>> widget = setupMultiWidget(cities, route, request)
   >>> 'type="checkbox"' in widget()
   True
   
@@ -185,7 +183,7 @@
   >>> request = TestRequest(form={
   ...     'cities.widgets.query': u'bologna'})
   
-  >>> widget = setupWidget(field, route, request)
+  >>> widget = setupMultiWidget(cities, route, request)
 
 Verify results:
 
@@ -201,7 +199,7 @@
   ...     'cities.widgets.query': u'bologna',
   ...     'cities': ('bologna',)})
 
-  >>> widget = setupWidget(field, route, request)
+  >>> widget = setupMultiWidget(cities, route, request)
 
 Verify that Bologna has been selected.
 
@@ -214,7 +212,7 @@
   >>> request = TestRequest(form={
   ...     'cities': ()})
 
-  >>> widget = setupWidget(field, route, request)
+  >>> widget = setupMultiWidget(cities, route, request)
 
 We expect an unchecked box.
 
@@ -224,6 +222,51 @@
   >>> 'checked="checked"' in widget()
   False
 
+Named Sources
+-------------
+
+We can also provide a data source using named vocabularies.  First we register
+our source as a named vocabulary::
+
+  >>> from zope.schema.interfaces import IVocabularyFactory
+  >>> from zope.schema.vocabulary import getVocabularyRegistry
+  >>> vr = getVocabularyRegistry()
+  >>> vr.register(u'test vocabulary name', ItalianCities)
+  >>> city2 = zope.schema.Choice(
+  ...     __name__='city',
+  ...     title=u'City',
+  ...     description=u'Select a city.',
+  ...     vocabulary=u'test vocabulary name')
+  >>> request = TestRequest(form={
+  ...     'city.widgets.query': u'bologna',
+  ...     'city': ('bologna',)})
+  >>> location = Location()
+  >>> widget = setupWidget(city2, location, request)
+  >>> 'Bologna' in widget()
+  True
+  >>> 'Palermo' in widget()
+  False
+
+The same is true of multi-select widgets::
+
+  >>> cities2 = zope.schema.Set(
+  ...     __name__='cities',
+  ...     title=u'Cities',
+  ...     description=u'Select one or more cities.',
+  ...     value_type=zope.schema.Choice(
+  ...        vocabulary=u'test vocabulary name' 
+  ...     ))
+  >>> route = Route()
+  >>> request = TestRequest(form={
+  ...     'cities.widgets.query': u'bologna',
+  ...     'cities': ('bologna',)})
+  >>> widget = setupMultiWidget(cities2, route, request)
+  >>> 'Bologna' in widget()
+  True
+  >>> 'Palermo' in widget()
+  False
+
+
 Todo
 ----
 

Modified: z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py
===================================================================
--- z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py	2008-10-12 15:30:30 UTC (rev 92085)
+++ z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py	2008-10-12 16:08:24 UTC (rev 92086)
@@ -72,8 +72,10 @@
 
     @property
     def source(self):
-        return self.field.source
-        
+        """We need to bind the field to the context so that vocabularies
+        appear as sources"""
+        return self.field.bind(self.context).source
+
     @property
     def bound_source(self):
         if self._bound_source is None:
@@ -179,7 +181,7 @@
 
     @property
     def source(self):
-        return self.field.value_type.source
+        return self.field.bind(self.context).value_type.source
 
     def updateQueryWidget(self):
         z3c.form.browser.checkbox.CheckBoxWidget.update(self)



More information about the Checkins mailing list