[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],
' %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], ' %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], ' %s' %values[index][1]])
+ ['<label', '<input', 'class="radioType"',
+ 'name="field.choice"', 'id="field.choice.%i"' % index,
+ 'type="radio"', 'value="%s"' % values[index][0],
+ ' %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],
'/> %s' % values[index][1]])
self.verifyResult(items[0], ['checked="checked"'])
More information about the Zope3-Checkins
mailing list