[Checkins] SVN: zope.mimetype/trunk/src/zope/mimetype/ Catch up with Zope 3 bugfixes: after the fix of issue 592 renderItemsWithValues

Marius Gedminas cvs-admin at zope.org
Mon Jun 19 13:46:07 EDT 2006


Log message for revision 68758:
  Catch up with Zope 3 bugfixes: after the fix of issue 592 renderItemsWithValues
  is responsible for rendering the missing value choice.
  
  

Changed:
  U   zope.mimetype/trunk/src/zope/mimetype/tests.py
  U   zope.mimetype/trunk/src/zope/mimetype/widget.py
  A   zope.mimetype/trunk/src/zope/mimetype/widget.txt

-=-
Modified: zope.mimetype/trunk/src/zope/mimetype/tests.py
===================================================================
--- zope.mimetype/trunk/src/zope/mimetype/tests.py	2006-06-19 17:09:48 UTC (rev 68757)
+++ zope.mimetype/trunk/src/zope/mimetype/tests.py	2006-06-19 17:46:03 UTC (rev 68758)
@@ -62,6 +62,9 @@
                              tearDown=placelesssetup.tearDown),
         doctest.DocFileSuite('typegetter.txt'),
         doctest.DocFileSuite('utils.txt'),
+        doctest.DocFileSuite('widget.txt',
+                             setUp=placelesssetup.setUp,
+                             tearDown=placelesssetup.tearDown),
         doctest.DocFileSuite(
             'codec.txt',
             optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,

Modified: zope.mimetype/trunk/src/zope/mimetype/widget.py
===================================================================
--- zope.mimetype/trunk/src/zope/mimetype/widget.py	2006-06-19 17:09:48 UTC (rev 68757)
+++ zope.mimetype/trunk/src/zope/mimetype/widget.py	2006-06-19 17:46:03 UTC (rev 68758)
@@ -47,22 +47,39 @@
         # vocabulary, so that need not be considered here
         rendered_items = []
         count = 0
+
+        # Handle case of missing value
+        missing = self._toFormValue(self.context.missing_value)
+
+        if self._displayItemForMissingValue and not self.context.required:
+            if missing in values:
+                render = self.renderSelectedItem
+            else:
+                render = self.renderItem
+
+            missing_item = render(count,
+                self.translate(self._messageNoValue),
+                missing,
+                self.name,
+                cssClass)
+            rendered_items.append(missing_item)
+            count += 1
+
+        # Render normal values
         for value in self.order:
             item_text, token = self.displays[value]
 
             if value in values:
-                rendered_item = self.renderSelectedItem(count,
-                                                        item_text,
-                                                        token,
-                                                        self.name,
-                                                        cssClass)
+                render = self.renderSelectedItem
             else:
-                rendered_item = self.renderItem(count,
-                                                item_text,
-                                                token,
-                                                self.name,
-                                                cssClass)
+                render = self.renderItem
 
+            rendered_item = render(count,
+                item_text,
+                token,
+                self.name,
+                cssClass)
+
             rendered_items.append(rendered_item)
             count += 1
 

Added: zope.mimetype/trunk/src/zope/mimetype/widget.txt
===================================================================
--- zope.mimetype/trunk/src/zope/mimetype/widget.txt	2006-06-19 17:09:48 UTC (rev 68757)
+++ zope.mimetype/trunk/src/zope/mimetype/widget.txt	2006-06-19 17:46:03 UTC (rev 68758)
@@ -0,0 +1,94 @@
+==============================
+TranslatableSourceSelectWidget
+==============================
+
+TranslatableSourceSelectWidget is a SourceSelectWidget that translates
+and sorts the choices.
+
+We will borrow the boring set up code from the SourceSelectWidget test
+(source.txt in zope.app.form.browser).
+
+    >>> import zope.interface
+    >>> import zope.component
+    >>> import zope.schema
+    >>> import zope.schema.interfaces
+
+    >>> class SourceList(list):
+    ...     zope.interface.implements(zope.schema.interfaces.IIterableSource)
+
+    >>> import zope.publisher.interfaces.browser
+    >>> import zope.app.form.browser.interfaces
+    >>> from zope.schema.vocabulary import SimpleTerm
+    >>> class ListTerms:
+    ...
+    ...     zope.interface.implements(
+    ...         zope.app.form.browser.interfaces.ITerms)
+    ...
+    ...     def __init__(self, source, request):
+    ...         pass # We don't actually need the source or the request :)
+    ...
+    ...     def getTerm(self, value):
+    ...         title = unicode(value)
+    ...         try:
+    ...             token = title.encode('base64').strip()
+    ...         except binascii.Error:
+    ...             raise LookupError(token)
+    ...         return SimpleTerm(value, token=token, title=title)
+    ...
+    ...     def getValue(self, token):
+    ...         return token.decode('base64')
+
+    >>> zope.component.provideAdapter(
+    ...     ListTerms,
+    ...     (SourceList, zope.publisher.interfaces.browser.IBrowserRequest))
+
+    >>> dog = zope.schema.Choice(
+    ...    __name__ = 'dog',
+    ...    title=u"Dogs",
+    ...    source=SourceList(['spot', 'bowser', 'prince', 'duchess', 'lassie']),
+    ...    )
+    >>> dog = dog.bind(object())
+
+Now that we have a field and a working source, we can construct and render
+a widget.
+
+    >>> from zope.mimetype.widget import TranslatableSourceSelectWidget
+    >>> from zope.publisher.browser import TestRequest
+    >>> request = TestRequest()
+    >>> widget = TranslatableSourceSelectWidget(
+    ...     dog, dog.source, request)
+
+    >>> print widget()
+    <div>
+    <div class="value">
+    <select id="field.dog" name="field.dog" size="5" >
+    <option value="Ym93c2Vy">bowser</option>
+    <option value="ZHVjaGVzcw==">duchess</option>
+    <option value="bGFzc2ll">lassie</option>
+    <option value="cHJpbmNl">prince</option>
+    <option value="c3BvdA==">spot</option>
+    </select>
+    </div>
+    <input name="field.dog-empty-marker" type="hidden" value="1" />
+    </div>
+
+Note that the options are ordered alphabetically.
+
+If the field is not required, we will also see a special choice labeled
+"(no value)" at the top of the list
+
+    >>> dog.required = False
+    >>> print widget()
+    <div>
+    <div class="value">
+    <select id="field.dog" name="field.dog" size="5" >
+    <option selected="selected" value="">(no value)</option>
+    <option value="Ym93c2Vy">bowser</option>
+    <option value="ZHVjaGVzcw==">duchess</option>
+    <option value="bGFzc2ll">lassie</option>
+    <option value="cHJpbmNl">prince</option>
+    <option value="c3BvdA==">spot</option>
+    </select>
+    </div>
+    <input name="field.dog-empty-marker" type="hidden" value="1" />
+    </div>


Property changes on: zope.mimetype/trunk/src/zope/mimetype/widget.txt
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list