[Checkins] SVN: z3c.form/trunk/src/z3c/form/ objectwidget: conert sub-widget value before assign.

Adam Groszer agroszer at gmail.com
Tue Dec 23 11:11:08 EST 2008


Log message for revision 94290:
  objectwidget: conert sub-widget value before assign.
  btw: added test for selectwidget DISPLAY_MODE
  

Changed:
  U   z3c.form/trunk/src/z3c/form/browser/select.txt
  U   z3c.form/trunk/src/z3c/form/object.py

-=-
Modified: z3c.form/trunk/src/z3c/form/browser/select.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/select.txt	2008-12-23 15:55:35 UTC (rev 94289)
+++ z3c.form/trunk/src/z3c/form/browser/select.txt	2008-12-23 16:11:08 UTC (rev 94290)
@@ -51,7 +51,7 @@
          value="1" />
 
 Let's provide some values for this widget. We can do this by defining a source
-providing ``ITerms``. This source uses descriminators wich will fit our setup.
+providing ``ITerms``. This source uses descriminators which will fit our setup.
 
   >>> import zope.schema.interfaces
   >>> from zope.schema.vocabulary import SimpleVocabulary
@@ -213,6 +213,26 @@
   >>> widget.promptMessage
   u'please select a value'
 
+Display Widget
+--------------
+
+The select widget comes with a template for ``DISPLAY_MODE``.  Let's
+register it first:
+
+  >>> zope.component.provideAdapter(
+  ...     WidgetTemplateFactory(getPath('select_display.pt'), 'text/html'),
+  ...     (None, None, None, None, interfaces.ISelectWidget),
+  ...     IPageTemplate, name=interfaces.DISPLAY_MODE)
+
+  >>> widget.mode = interfaces.DISPLAY_MODE
+  >>> widget.value = ['b', 'c']
+  >>> widget.update()
+  >>> print widget.render() # doctest: +NORMALIZE_WHITESPACE
+  <span id="widget-id" class="select-widget required">
+    <span class="selected-option">b</span>,
+    <span class="selected-option">c</span>
+  </span>
+
 Hidden Widget
 -------------
 
@@ -224,7 +244,7 @@
   ...     (None, None, None, None, interfaces.ISelectWidget),
   ...     IPageTemplate, name=interfaces.HIDDEN_MODE)
 
-We ca now set our widget's mode to hidden and render it:
+We can now set our widget's mode to hidden and render it:
 
   >>> widget.mode = interfaces.HIDDEN_MODE
   >>> widget.value = ['b']

Modified: z3c.form/trunk/src/z3c/form/object.py
===================================================================
--- z3c.form/trunk/src/z3c/form/object.py	2008-12-23 15:55:35 UTC (rev 94289)
+++ z3c.form/trunk/src/z3c/form/object.py	2008-12-23 16:11:08 UTC (rev 94290)
@@ -227,6 +227,26 @@
         finally:
             self._updating = False
 
+    def applyValue(self, widget, value=interfaces.NOVALUE):
+        """Validate and apply value to given widget.
+        """
+        converter = interfaces.IDataConverter(widget)
+        try:
+            zope.component.getMultiAdapter(
+                (self.context,
+                 self.request,
+                 self.form,
+                 getattr(widget, 'field', None),
+                 widget),
+                interfaces.IValidator).validate(value)
+
+            widget.value = converter.toWidgetValue(value)
+        except (zope.schema.ValidationError, ValueError), error:
+            # on exception, setup the widget error message
+            # set the wrong value as value
+            # the widget itself ought to cry about the error
+            widget.value = value
+
     @apply
     def value():
         """This invokes updateWidgets on any value change e.g. update/extract."""
@@ -246,8 +266,8 @@
             # ensure that we apply our new values to the widgets
             if value is not interfaces.NOVALUE:
                 for name in zope.schema.getFieldNames(self.field.schema):
-                    self.subform.widgets[name].value = value.get(name,
-                                                                 interfaces.NOVALUE)
+                    self.applyValue(self.subform.widgets[name],
+                                    value.get(name, interfaces.NOVALUE))
 
         return property(get, set)
 



More information about the Checkins mailing list