[Checkins] SVN: z3c.form/trunk/src/z3c/form/ multiwidget: on item removal it left holes in the sequence of widgets

Adam Groszer agroszer at gmail.com
Mon Dec 15 03:40:11 EST 2008


Log message for revision 94068:
  multiwidget: on item removal it left holes in the sequence of widgets
  objectwidget: did not apply values on widget.value=newvalue
  

Changed:
  U   z3c.form/trunk/src/z3c/form/browser/multi.py
  U   z3c.form/trunk/src/z3c/form/browser/multi.txt
  U   z3c.form/trunk/src/z3c/form/browser/objectmulti.txt
  U   z3c.form/trunk/src/z3c/form/object.py
  U   z3c.form/trunk/src/z3c/form/widget.py

-=-
Modified: z3c.form/trunk/src/z3c/form/browser/multi.py
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/multi.py	2008-12-15 01:26:42 UTC (rev 94067)
+++ z3c.form/trunk/src/z3c/form/browser/multi.py	2008-12-15 08:40:10 UTC (rev 94068)
@@ -64,6 +64,7 @@
     def handleRemove(self, action):
         self.widgets = [widget for widget in self.widgets
                         if ('%s.remove' % (widget.name)) not in self.request]
+        self.value = [widget.value for widget in self.widgets]
 
 @zope.interface.implementer(interfaces.IFieldWidget)
 def multiFieldWidgetFactory(field, request):

Modified: z3c.form/trunk/src/z3c/form/browser/multi.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/multi.txt	2008-12-15 01:26:42 UTC (rev 94067)
+++ z3c.form/trunk/src/z3c/form/browser/multi.txt	2008-12-15 08:40:10 UTC (rev 94068)
@@ -394,9 +394,9 @@
           </div>
         </div>
       </div>
-      <div id="widget-id-2-row" class="row">
+      <div id="widget-id-1-row" class="row">
           <div class="label">
-            <label for="widget-id-2">
+            <label for="widget-id-1">
               <span>Number</span>
               <span class="required">*</span>
             </label>
@@ -405,11 +405,11 @@
             <div class="multi-widget-checkbox">
               <input type="checkbox" value="1"
                      class="multi-widget-checkbox checkbox-widget"
-                     id="widget-id-2-remove"
-                     name="widget.name.2.remove" />
+                     id="widget-id-1-remove"
+                     name="widget.name.1.remove" />
             </div>
             <div class="multi-widget-input"><input
-                 type="text" id="widget-id-2" name="widget.name.2"
+                 type="text" id="widget-id-1" name="widget.name.1"
                  class="text-widget required int-field" value="44" />
           </div>
         </div>
@@ -425,7 +425,63 @@
   </div>
   <input type="hidden" name="widget.name.count" value="2" />
 
-Error handling is next. Let's use teh value "bad" (an invlaid integer literal)
+Change again a value after delete:
+
+  >>> widget.request = TestRequest(form={'widget.name.count':u'2',
+  ...                                    'widget.name.0':u'42',
+  ...                                    'widget.name.1':u'45'})
+  >>> widget.update()
+
+  >>> print widget.render()
+  <div class="multi-widget">
+      <div id="widget-id-0-row" class="row">
+          <div class="label">
+            <label for="widget-id-0">
+              <span>Number</span>
+              <span class="required">*</span>
+            </label>
+          </div>
+          <div class="widget">
+            <div class="multi-widget-checkbox">
+              <input id="widget-id-0-remove" name="widget.name.0.remove"
+              class="multi-widget-checkbox checkbox-widget"
+              type="checkbox" value="1" />
+            </div>
+            <div class="multi-widget-input">
+                <input id="widget-id-0" name="widget.name.0"
+                class="text-widget required int-field" value="42" type="text" />
+            </div>
+          </div>
+      </div>
+      <div id="widget-id-1-row" class="row">
+          <div class="label">
+            <label for="widget-id-1">
+              <span>Number</span>
+              <span class="required">*</span>
+            </label>
+          </div>
+          <div class="widget">
+            <div class="multi-widget-checkbox">
+              <input id="widget-id-1-remove" name="widget.name.1.remove"
+              class="multi-widget-checkbox checkbox-widget"
+              type="checkbox" value="1" />
+            </div>
+            <div class="multi-widget-input">
+                <input id="widget-id-1" name="widget.name.1"
+                class="text-widget required int-field" value="45" type="text" />
+            </div>
+          </div>
+      </div>
+    <div class="buttons">
+      <input id="widget-name-buttons-add" name="widget.name.buttons.add"
+      class="submit-widget button-field" value="Add" type="submit" />
+      <input id="widget-name-buttons-remove" name="widget.name.buttons.remove"
+      class="submit-widget button-field" value="Remove" type="submit" />
+     </div>
+  </div>
+  <input type="hidden" name="widget.name.count" value="2" />
+
+Error handling is next. Let's use teh value "bad" (an invalid integer literal)
 as input for our internal (sub) widget.
 
   >>> from z3c.form.error import ErrorViewSnippet

Modified: z3c.form/trunk/src/z3c/form/browser/objectmulti.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/objectmulti.txt	2008-12-15 01:26:42 UTC (rev 94067)
+++ z3c.form/trunk/src/z3c/form/browser/objectmulti.txt	2008-12-15 08:40:10 UTC (rev 94068)
@@ -496,7 +496,8 @@
       </div>
       <div class="widget">
         <div class="multi-widget-checkbox">
-          <input class="multi-widget-checkbox checkbox-widget" id="foo-0-remove" name="foo.0.remove" type="checkbox" value="1">
+          <input class="multi-widget-checkbox checkbox-widget" id="foo-0-remove"
+                 name="foo.0.remove" type="checkbox" value="1">
         </div>
         <div class="multi-widget-input">
           <div class="object-widget required">
@@ -507,7 +508,9 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget required int-field" id="foo-0-widgets-foofield" name="foo.0.widgets.foofield" type="text" value="42">
+              <input class="text-widget required int-field"
+                     id="foo-0-widgets-foofield" name="foo.0.widgets.foofield"
+                     type="text" value="42">
             </div>
             <div class="label">
               <label for="foo-0-widgets-barfield">
@@ -515,7 +518,8 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget int-field" id="foo-0-widgets-barfield" name="foo.0.widgets.barfield" type="text" value="666">
+              <input class="text-widget int-field" id="foo-0-widgets-barfield"
+                     name="foo.0.widgets.barfield" type="text" value="666">
             </div>
             <input name="foo.0-empty-marker" type="hidden" value="1">
           </div>
@@ -531,7 +535,8 @@
       </div>
       <div class="widget">
         <div class="multi-widget-checkbox">
-          <input class="multi-widget-checkbox checkbox-widget" id="foo-1-remove" name="foo.1.remove" type="checkbox" value="1">
+          <input class="multi-widget-checkbox checkbox-widget" id="foo-1-remove"
+                 name="foo.1.remove" type="checkbox" value="1">
         </div>
         <div class="multi-widget-input">
           <div class="object-widget required">
@@ -542,7 +547,9 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget required int-field" id="foo-1-widgets-foofield" name="foo.1.widgets.foofield" type="text" value="789">
+              <input class="text-widget required int-field"
+                     id="foo-1-widgets-foofield" name="foo.1.widgets.foofield"
+                     type="text" value="789">
             </div>
             <div class="label">
               <label for="foo-1-widgets-barfield">
@@ -550,7 +557,8 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget int-field" id="foo-1-widgets-barfield" name="foo.1.widgets.barfield" type="text" value="321">
+              <input class="text-widget int-field" id="foo-1-widgets-barfield"
+                     name="foo.1.widgets.barfield" type="text" value="321">
             </div>
             <input name="foo.1-empty-marker" type="hidden" value="1">
           </div>
@@ -566,7 +574,8 @@
       </div>
       <div class="widget">
         <div class="multi-widget-checkbox">
-          <input class="multi-widget-checkbox checkbox-widget" id="foo-2-remove" name="foo.2.remove" type="checkbox" value="1">
+          <input class="multi-widget-checkbox checkbox-widget" id="foo-2-remove"
+                 name="foo.2.remove" type="checkbox" value="1">
         </div>
         <div class="multi-widget-input">
           <div class="object-widget required">
@@ -577,7 +586,9 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget required int-field" id="foo-2-widgets-foofield" name="foo.2.widgets.foofield" type="text" value="46">
+              <input class="text-widget required int-field"
+                     id="foo-2-widgets-foofield" name="foo.2.widgets.foofield"
+                     type="text" value="46">
             </div>
             <div class="label">
               <label for="foo-2-widgets-barfield">
@@ -585,7 +596,8 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget int-field" id="foo-2-widgets-barfield" name="foo.2.widgets.barfield" type="text" value="98">
+              <input class="text-widget int-field" id="foo-2-widgets-barfield"
+                     name="foo.2.widgets.barfield" type="text" value="98">
             </div>
             <input name="foo.2-empty-marker" type="hidden" value="1">
           </div>
@@ -593,8 +605,10 @@
       </div>
     </div>
     <div class="buttons">
-      <input class="submit-widget button-field" id="foo-buttons-add" name="foo.buttons.add" type="submit" value="Add">
-      <input class="submit-widget button-field" id="foo-buttons-remove" name="foo.buttons.remove" type="submit" value="Remove">
+      <input class="submit-widget button-field" id="foo-buttons-add"
+             name="foo.buttons.add" type="submit" value="Add">
+      <input class="submit-widget button-field" id="foo-buttons-remove"
+             name="foo.buttons.remove" type="submit" value="Remove">
     </div>
   </div>
   <input name="foo.count" type="hidden" value="3">
@@ -647,7 +661,8 @@
       </div>
       <div class="widget">
         <div class="multi-widget-checkbox">
-          <input class="multi-widget-checkbox checkbox-widget" id="foo-0-remove" name="foo.0.remove" type="checkbox" value="1">
+          <input class="multi-widget-checkbox checkbox-widget" id="foo-0-remove"
+                 name="foo.0.remove" type="checkbox" value="1">
         </div>
         <div class="multi-widget-input">
           <div class="object-widget required">
@@ -658,7 +673,9 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget required int-field" id="foo-0-widgets-foofield" name="foo.0.widgets.foofield" type="text" value="42">
+              <input class="text-widget required int-field"
+                     id="foo-0-widgets-foofield" name="foo.0.widgets.foofield"
+                     type="text" value="42">
             </div>
             <div class="label">
               <label for="foo-0-widgets-barfield">
@@ -666,51 +683,58 @@
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget int-field" id="foo-0-widgets-barfield" name="foo.0.widgets.barfield" type="text" value="666">
+              <input class="text-widget int-field" id="foo-0-widgets-barfield"
+                     name="foo.0.widgets.barfield" type="text" value="666">
             </div>
             <input name="foo.0-empty-marker" type="hidden" value="1">
           </div>
         </div>
       </div>
     </div>
-    <div class="row" id="foo-2-row">
+    <div class="row" id="foo-1-row">
       <div class="label">
-        <label for="foo-2">
+        <label for="foo-1">
           <span>my object widget</span>
           <span class="required">*</span>
         </label>
       </div>
       <div class="widget">
         <div class="multi-widget-checkbox">
-          <input class="multi-widget-checkbox checkbox-widget" id="foo-2-remove" name="foo.2.remove" type="checkbox" value="1">
+          <input class="multi-widget-checkbox checkbox-widget" id="foo-1-remove"
+                 name="foo.1.remove" type="checkbox" value="1">
         </div>
         <div class="multi-widget-input">
           <div class="object-widget required">
             <div class="label">
-              <label for="foo-2-widgets-foofield">
+              <label for="foo-1-widgets-foofield">
                 <span>My foo field</span>
                 <span class="required">*</span>
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget required int-field" id="foo-2-widgets-foofield" name="foo.2.widgets.foofield" type="text" value="46">
+              <input class="text-widget required int-field"
+                     id="foo-1-widgets-foofield" name="foo.1.widgets.foofield"
+                     type="text" value="46">
             </div>
             <div class="label">
-              <label for="foo-2-widgets-barfield">
+              <label for="foo-1-widgets-barfield">
                 <span>My dear bar</span>
               </label>
             </div>
             <div class="widget">
-              <input class="text-widget int-field" id="foo-2-widgets-barfield" name="foo.2.widgets.barfield" type="text" value="98">
+              <input class="text-widget int-field" id="foo-1-widgets-barfield"
+                     name="foo.1.widgets.barfield" type="text" value="98">
             </div>
-            <input name="foo.2-empty-marker" type="hidden" value="1">
+            <input name="foo.1-empty-marker" type="hidden" value="1">
           </div>
         </div>
       </div>
     </div>
     <div class="buttons">
-      <input class="submit-widget button-field" id="foo-buttons-add" name="foo.buttons.add" type="submit" value="Add">
-      <input class="submit-widget button-field" id="foo-buttons-remove" name="foo.buttons.remove" type="submit" value="Remove">
+      <input class="submit-widget button-field" id="foo-buttons-add"
+             name="foo.buttons.add" type="submit" value="Add">
+      <input class="submit-widget button-field" id="foo-buttons-remove"
+             name="foo.buttons.remove" type="submit" value="Remove">
     </div>
   </div>
   <input name="foo.count" type="hidden" value="2">

Modified: z3c.form/trunk/src/z3c/form/object.py
===================================================================
--- z3c.form/trunk/src/z3c/form/object.py	2008-12-15 01:26:42 UTC (rev 94067)
+++ z3c.form/trunk/src/z3c/form/object.py	2008-12-15 08:40:10 UTC (rev 94068)
@@ -241,8 +241,14 @@
                 return value
         def set(self, value):
             self._value = value
+            self.updateWidgets()
+
             # ensure that we apply our new values to the widgets
-            self.updateWidgets()
+            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)
+
         return property(get, set)
 
 

Modified: z3c.form/trunk/src/z3c/form/widget.py
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.py	2008-12-15 01:26:42 UTC (rev 94067)
+++ z3c.form/trunk/src/z3c/form/widget.py	2008-12-15 08:40:10 UTC (rev 94068)
@@ -265,13 +265,10 @@
 
     def getWidget(self, idx):
         """Setup widget based on index id with or without value."""
-        id = '%s-%i' % (self.id, idx)
-        name = '%s.%i' % (self.name, idx)
         valueType = self.field.value_type
         widget = zope.component.getMultiAdapter((valueType, self.request),
             interfaces.IFieldWidget)
-        widget.name = name
-        widget.id = id
+        self.setName(widget, idx)
         widget.mode = self.mode
         #set widget.form (objectwidget needs this)
         if interfaces.IFormAware.providedBy(self):
@@ -281,6 +278,10 @@
         widget.update()
         return widget
 
+    def setName(self, widget, idx):
+        widget.name = '%s.%i' % (self.name, idx)
+        widget.id = '%s-%i' % (self.id, idx)
+
     def appendAddingWidget(self):
         """Simply append a new empty widget with correct (counter) name."""
         # since we start with idx 0 (zero) we can use the len as next idx



More information about the Checkins mailing list