[Checkins] SVN: z3c.form/trunk/ Ensure at least min_length widgets are rendered for a MultiWidget in input mode.

Laurence Rowe l at lrowe.co.uk
Fri Apr 15 07:33:34 EDT 2011


Log message for revision 121437:
  Ensure at least min_length widgets are rendered for a MultiWidget in input mode.

Changed:
  U   z3c.form/trunk/CHANGES.txt
  U   z3c.form/trunk/src/z3c/form/widget.py
  U   z3c.form/trunk/src/z3c/form/widget.txt

-=-
Modified: z3c.form/trunk/CHANGES.txt
===================================================================
--- z3c.form/trunk/CHANGES.txt	2011-04-15 06:37:30 UTC (rev 121436)
+++ z3c.form/trunk/CHANGES.txt	2011-04-15 11:33:33 UTC (rev 121437)
@@ -5,6 +5,9 @@
 2.4.3 (unreleased)
 ------------------
 
+- Ensure at least min_length widgets are rendered for a MultiWidget in input
+  mode.
+
 - Added base of Czech translation.
 
 - Added Portuguese Brazilian translation.

Modified: z3c.form/trunk/src/z3c/form/widget.py
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.py	2011-04-15 06:37:30 UTC (rev 121436)
+++ z3c.form/trunk/src/z3c/form/widget.py	2011-04-15 11:33:33 UTC (rev 121437)
@@ -248,6 +248,7 @@
 
     widgets = None
     _value = None
+    _widgets_updated = False
 
     _mode = FieldProperty(interfaces.IWidget['mode'])
 
@@ -344,6 +345,11 @@
         """Setup internal widgets based on the value_type for each value item.
         """
         oldLen = len(self.widgets)
+        # Ensure at least min_length widgets are shown
+        if (zope.schema.interfaces.IMinMaxLen.providedBy(self.field) and
+            self.mode == interfaces.INPUT_MODE and self.allowAdding and
+            oldLen < self.field.min_length):
+            oldLen = self.field.min_length
         self.widgets = []
         idx = 0
         if self.value:
@@ -359,6 +365,7 @@
                 widget = self.getWidget(idx)
                 self.widgets.append(widget)
                 idx += 1
+        self._widgets_updated = True
 
     def updateAllowAddRemove(self):
         """Update the allowAdding/allowRemoving attributes
@@ -383,6 +390,13 @@
             self.updateWidgets()
         return property(get, set)
 
+    def update(self):
+        """See z3c.form.interfaces.IWidget."""
+        # Ensure that updateWidgets is called.
+        super(MultiWidget, self).update()
+        if not self._widgets_updated:
+            self.updateWidgets()
+
     def extract(self, default=interfaces.NO_VALUE):
         # This method is responsible to get the widgets value based on the
         # request and nothing else.

Modified: z3c.form/trunk/src/z3c/form/widget.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.txt	2011-04-15 06:37:30 UTC (rev 121436)
+++ z3c.form/trunk/src/z3c/form/widget.txt	2011-04-15 11:33:33 UTC (rev 121437)
@@ -642,6 +642,12 @@
   >>> request = TestRequest()
   >>> multiWidget = widget.FieldWidget(multiField, widget.MultiWidget(request))
 
+Lets ensure that the minimum number of widgets are created.
+
+  >>> multiWidget.update()
+  >>> len(multiWidget.widgets)
+  2
+
 Now, let's check if the function will do the right thing depending on
 the value:
 



More information about the checkins mailing list