[Zope3-checkins] SVN: Zope3/trunk/ - added widget for zope.schema.FrozenSet like for zope.schema.Set.

Christian Zagrodnick cz at gocept.com
Thu Mar 8 04:49:49 EST 2007


Log message for revision 73058:
  - added widget for zope.schema.FrozenSet like for zope.schema.Set.
  
  

Changed:
  U   Zope3/trunk/doc/CHANGES.txt
  U   Zope3/trunk/src/zope/app/form/browser/__init__.py
  U   Zope3/trunk/src/zope/app/form/browser/configure.zcml
  U   Zope3/trunk/src/zope/app/form/browser/itemswidgets.py
  U   Zope3/trunk/src/zope/app/form/browser/tests/test_itemswidget.py

-=-
Modified: Zope3/trunk/doc/CHANGES.txt
===================================================================
--- Zope3/trunk/doc/CHANGES.txt	2007-03-08 09:35:13 UTC (rev 73057)
+++ Zope3/trunk/doc/CHANGES.txt	2007-03-08 09:49:48 UTC (rev 73058)
@@ -10,6 +10,8 @@
 
     New features
 
+      - added widget for zope.schema.FrozenSet like for zope.schema.Set.
+
       - icon zcml directive supports now 'width' and 'height'
 
       - Added a master checkbox to the ZMI and toggles all other checkboxes in

Modified: Zope3/trunk/src/zope/app/form/browser/__init__.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/__init__.py	2007-03-08 09:35:13 UTC (rev 73057)
+++ Zope3/trunk/src/zope/app/form/browser/__init__.py	2007-03-08 09:49:48 UTC (rev 73058)
@@ -66,6 +66,7 @@
 # These widgets are multi-views on (field, vocabulary)
 from zope.app.form.browser.itemswidgets import MultiSelectWidget
 from zope.app.form.browser.itemswidgets import MultiSelectSetWidget
+from zope.app.form.browser.itemswidgets import MultiSelectFrozenSetWidget
 from zope.app.form.browser.itemswidgets import MultiCheckBoxWidget
 from zope.app.form.browser.itemswidgets import OrderedMultiSelectWidget
 

Modified: Zope3/trunk/src/zope/app/form/browser/configure.zcml
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/configure.zcml	2007-03-08 09:35:13 UTC (rev 73057)
+++ Zope3/trunk/src/zope/app/form/browser/configure.zcml	2007-03-08 09:49:48 UTC (rev 73058)
@@ -401,7 +401,26 @@
       factory=".ChoiceCollectionInputWidget"
       permission="zope.Public"
       />
+  
+  <!-- FrozenSet + Choice -->
+  <adapter
+      for="zope.schema.interfaces.IFrozenSet
+           zope.schema.interfaces.IChoice
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.app.form.interfaces.IDisplayWidget"
+      factory=".ChoiceCollectionDisplayWidget"
+      permission="zope.Public"
+      />
 
+  <adapter
+      for="zope.schema.interfaces.IFrozenSet
+           zope.schema.interfaces.IChoice
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.app.form.browser.interfaces.ISimpleInputWidget"
+      factory=".ChoiceCollectionInputWidget"
+      permission="zope.Public"
+      />
+
   <!-- Default Multi-Views for fields and vocabularies -->
 
   <adapter
@@ -432,6 +451,15 @@
       factory=".source.SourceMultiSelectSetWidget"
       permission="zope.Public"
       />
+  
+  <adapter
+      for="zope.schema.interfaces.IFrozenSet
+           zope.schema.interfaces.IIterableSource
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.app.form.browser.interfaces.ISimpleInputWidget"
+      factory=".source.SourceMultiSelectSetWidget"
+      permission="zope.Public"
+      />
 
   <adapter
       for="zope.schema.interfaces.IChoice
@@ -464,6 +492,15 @@
       />
       
   <adapter
+      for="zope.schema.interfaces.IFrozenSet
+           zope.schema.interfaces.IVocabularyTokenized
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.app.form.browser.interfaces.ISimpleInputWidget"
+      factory=".MultiSelectFrozenSetWidget"
+      permission="zope.Public"
+      />
+
+  <adapter
       for="zope.schema.interfaces.ISet
            zope.schema.interfaces.IBaseVocabulary
            zope.publisher.interfaces.browser.IBrowserRequest"
@@ -473,6 +510,15 @@
       />
 
   <adapter
+      for="zope.schema.interfaces.IFrozenSet
+           zope.schema.interfaces.IBaseVocabulary
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.app.form.interfaces.IDisplayWidget"
+      factory=".SetDisplayWidget"
+      permission="zope.Public"
+      />
+
+  <adapter
       for="zope.schema.interfaces.IList
            zope.schema.interfaces.IVocabularyTokenized
            zope.publisher.interfaces.browser.IBrowserRequest"

Modified: Zope3/trunk/src/zope/app/form/browser/itemswidgets.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/itemswidgets.py	2007-03-08 09:35:13 UTC (rev 73057)
+++ Zope3/trunk/src/zope/app/form/browser/itemswidgets.py	2007-03-08 09:49:48 UTC (rev 73058)
@@ -532,6 +532,15 @@
         return value
 
 
+class MultiSelectFrozenSetWidget(MultiSelectWidget):
+    """Provide a selection list for the set to be selected."""
+
+    def _toFieldValue(self, input):
+        value = super(MultiSelectFrozenSetWidget, self)._toFieldValue(input)
+        if isinstance(value, list):
+            value = frozenset(value)
+        return value
+
 class OrderedMultiSelectWidget(ItemsMultiEditWidgetBase):
     """A multi-selection widget with ordering support."""
 

Modified: Zope3/trunk/src/zope/app/form/browser/tests/test_itemswidget.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/tests/test_itemswidget.py	2007-03-08 09:35:13 UTC (rev 73057)
+++ Zope3/trunk/src/zope/app/form/browser/tests/test_itemswidget.py	2007-03-08 09:49:48 UTC (rev 73058)
@@ -19,7 +19,7 @@
 import unittest
 
 from zope.interface import Interface, implements
-from zope.schema import Choice, List, Set, TextLine
+from zope.schema import Choice, List, Set, TextLine, FrozenSet
 from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
 from zope.publisher.browser import TestRequest
 
@@ -37,7 +37,7 @@
 from zope.app.form.browser.itemswidgets import OrderedMultiSelectWidget
 from zope.app.form.browser.itemswidgets import MultiCheckBoxWidget
 from zope.app.form.browser.tests.support import VerifyResults
-from zope.app.testing.placelesssetup import PlacelessSetup 
+from zope.app.testing.placelesssetup import PlacelessSetup
 
 vocab = SimpleVocabulary(
     [SimpleTerm(value, token, title) for value, token, title in (
@@ -65,7 +65,13 @@
         value_type=choice,
         required=False)
 
+    frozenLetters = FrozenSet(
+        title=u"Frozen Letters",
+        description=u"The Frozen Letters",
+        value_type=choice,
+        required=False)
 
+
 class Collector(object):
     implements(ICollector)
 
@@ -83,7 +89,7 @@
         request = TestRequest(form=form or {})
         collector = Collector(nums)
         bound = self._field.bind(collector)
-        return self._widget(bound, self._vocabulary, request) 
+        return self._widget(bound, self._vocabulary, request)
 
     def test_setPrefix(self):
         widget = self._makeWidget()
@@ -113,7 +119,7 @@
 
 
 class ItemDisplayWidgetTest(ItemsWidgetBaseTest):
-    
+
     _widget = ItemDisplayWidget
 
     def test_setVocabulary(self):
@@ -123,7 +129,7 @@
 
     def test__call__(self):
         widget = self._makeWidget()
-        self.assertEqual(widget(), '')        
+        self.assertEqual(widget(), '')
         widget = self._makeWidget(form={'field.choice': 'token1'})
         self.assertEqual(widget(), 'One')
 
@@ -131,15 +137,15 @@
         self.failIf(self._makeWidget().required)
 
 class ItemsMultiDisplayWidgetTest(ItemsWidgetBaseTest):
-    
+
     _widget = ItemsMultiDisplayWidget
-    _field = ICollector.get('numbers')    
+    _field = ICollector.get('numbers')
     _vocabulary = _field.value_type.vocabulary
     _tag = 'ol'
 
     def test__call__(self):
         widget = self._makeWidget()
-        self.assertEqual(widget(), '')        
+        self.assertEqual(widget(), '')
         widget = self._makeWidget(form={'field.numbers': ['token1', 'token2']})
         self.assertEqual(
             widget(),
@@ -159,12 +165,10 @@
     def test_not_required(self):
         numbers = List(value_type=ICollector['choice']).bind(Collector(None))
         request = TestRequest()
-        widget = self._widget(numbers, self._vocabulary, request) 
+        widget = self._widget(numbers, self._vocabulary, request)
         self.failIf(widget.required)
 
 
-        
-
 class ListDisplayWidgetTest(ItemsMultiDisplayWidgetTest):
     _widget = ListDisplayWidget
     _tag = 'ol'
@@ -212,12 +216,12 @@
             widget.renderItemsWithValues(['one', 'two']),
             [u'<option selected="selected" value="token1">One</option>',
              u'<option selected="selected" value="token2">Two</option>',
-             u'<option value="token3">Three</option>'])             
+             u'<option value="token3">Three</option>'])
         self.assertEqual(
             widget.renderItemsWithValues([]),
             [u'<option value="token1">One</option>',
              u'<option value="token2">Two</option>',
-             u'<option value="token3">Three</option>'])             
+             u'<option value="token3">Three</option>'])
 
 # This test is disabled because it tests for the presense of a missfeature,
 # which has been removed.  Did someone actually *want* this?
@@ -226,14 +230,14 @@
 ##         widget.setPrefix('field.')
 ##         widget._getFormValue()
 ##         self.assert_(isinstance(widget._error, ConversionError))
-    
+
     def test_hidden(self):
         widget = self._makeWidget(form={'field.choice': 'token2'})
         widget.setPrefix('field.')
         widget.context.required = False
         self.verifyResult(
             widget.hidden(),
-            ['<input', 'type="hidden"', 'value="token2"', 'id="field.choice"', 
+            ['<input', 'type="hidden"', 'value="token2"', 'id="field.choice"',
              'name="field.choice"'])
 
 class SelectWidgetTest(ItemsEditWidgetBaseTest):
@@ -351,7 +355,7 @@
                 item,
                 ['<label', '<input', 'class="radioType"', 'name="field.choice"',
                  'id="field.choice.%i' %index, 'type="radio"',
-                 'value="%s"' %values[index][0], 
+                 'value="%s"' %values[index][0],
                  '&nbsp;%s' %values[index][1]])
         self.verifyResult(items[0], ['checked="checked"'])
 
@@ -372,14 +376,14 @@
         widget.context.required = False
         items = widget.renderItems([])
         values = [('', '(no value)'),
-                  ('token1','One'), 
-                  ('token2','Two'), 
+                  ('token1','One'),
+                  ('token2','Two'),
                   ('token3','Three')]
         for index, item in enumerate(items):
             self.verifyResult(
                 item,
-                ['<label', '<input', 'class="radioType"', 'name="field.choice"',
-                 'type="radio"', 
+                ['<label', '<input', 'class="radioType"',
+                 'name="field.choice"', 'type="radio"',
                  'value="%s"' %values[index][0], '&nbsp;%s' %values[index][1]])
 
     def test_renderItems_firstItem(self):
@@ -390,9 +394,10 @@
         for index, item in enumerate(items):
             self.verifyResult(
                 item,
-                ['<label', '<input', 'class="radioType"', 'name="field.choice"',
-                 'id="field.choice.%i"' %index, 'type="radio"',
-                 'value="%s"' %values[index][0], '&nbsp;%s' %values[index][1]])
+                ['<label', '<input', 'class="radioType"',
+                 'name="field.choice"', 'id="field.choice.%i"' % index,
+                 'type="radio"', 'value="%s"' % values[index][0],
+                 '&nbsp;%s' % values[index][1]])
 
     def test_renderValue(self):
         widget = self._makeWidget()
@@ -437,7 +442,7 @@
 ##         widget.setPrefix('field.')
 ##         widget._getFormValue()
 ##         self.assert_(isinstance(widget._error, ConversionError))
-    
+
     def test_hidden(self):
         widget = self._makeWidget(
             form={'field.numbers': ['two','three']})
@@ -445,20 +450,26 @@
         widget.context.required = False
         self.verifyResult(
             widget.hidden(),
-            ['<input', 'type="hidden"', 'value="token2"', 'id="field.numbers"', 
+            ['<input', 'type="hidden"', 'value="token2"', 'id="field.numbers"',
              'name="field.numbers:list"', 'value="token3"'])
 
     def test_getInputValue(self):
-        widget = self._makeWidget(form={'field.numbers': ['token2','token3']})
+        widget = self._makeWidget(form={'field.numbers': ['token2', 'token3']})
         widget.setPrefix('field.')
         self.assertEqual(widget.getInputValue(), ['two', 'three'])
 
         self._field = ICollector.get('letters')
-        widget = self._makeWidget(form={'field.letters': ['token2','token3']})
+        widget = self._makeWidget(form={'field.letters': ['token2', 'token3']})
         widget.setPrefix('field.')
         self.assertEqual(widget.getInputValue(), sets.Set(['two', 'three']))
-        self._field = ICollector.get('numbers')
 
+        self._field = ICollector.get('frozenLetters')
+        widget = self._makeWidget(form={'field.frozenLetters':
+                                        ['token2', 'token3']})
+        widget.setPrefix('field.')
+        field_value = widget.getInputValue()
+        self.assertEqual(field_value, frozenset(['two', 'three']))
+        self.assert_(isinstance(field_value, frozenset))
 
 
 class MultiSelectWidgetTest(ItemsMultiEditWidgetBaseTest):
@@ -486,8 +497,8 @@
         selected = [select['text'] for select in widget.selected()]
         selected.sort()
         self.assertEqual(selected, ['One'])
-    
 
+
 class MultiCheckBoxWidgetTest(ItemsMultiEditWidgetBaseTest):
 
     _widget = MultiCheckBoxWidget
@@ -528,8 +539,8 @@
             self.verifyResult(
                 item,
                 ['<input', 'class="checkboxType',
-                 'id="field.numbers.%i"' %index, 'type="checkbox"', 
-                 'value="%s"' % values[index][0], 
+                 'id="field.numbers.%i"' %index, 'type="checkbox"',
+                 'value="%s"' % values[index][0],
                  '/>&nbsp;%s' % values[index][1]])
 
         self.verifyResult(items[0], ['checked="checked"'])



More information about the Zope3-Checkins mailing list