[Checkins] SVN: z3c.form/branches/adamg-objectwidget/src/z3c/form/ forms can use dicts as context

Adam Groszer agroszer at gmail.com
Mon Oct 13 10:16:49 EDT 2008


Log message for revision 92121:
  forms can use dicts as context
  

Changed:
  U   z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt
  U   z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py

-=-
Modified: z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt
===================================================================
--- z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt	2008-10-13 14:07:06 UTC (rev 92120)
+++ z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt	2008-10-13 14:16:48 UTC (rev 92121)
@@ -932,12 +932,109 @@
 
 
 
+Editforms might use dicts as context:
 
+  >>> newsub = MySubObject()
+  >>> newsub.foofield = 78
+  >>> newsub.barfield = 87
 
+  >>> class MyEditFormDict(form.EditForm):
+  ...     fields = field.Fields(IMyObject)
+  ...     def getContent(self):
+  ...         return {'subobject': newsub, 'name': u'blooki'}
 
+  >>> editform = MyEditFormDict(None, TestRequest())
+  >>> addTemplate(editform)
+  >>> editform.update()
 
+Watch for the widget values in the HTML:
 
+  >>> print editform.render()
+  <html xmlns="http://www.w3.org/1999/xhtml">
+    <body>
+      <form action=".">
+        <div class="row">
+          <label for="form-widgets-subobject">my object</label>
+          <div class="object-widget required">
+            <div class="label">
+              <label for="form-widgets-subobject-widgets-foofield">
+                <span>My foo field</span>
+                <span class="required">*</span>
+              </label>
+            </div>
+            <div class="widget">
+              <input class="text-widget required int-field"
+              id="form-widgets-subobject-widgets-foofield"
+              name="form.widgets.subobject.widgets.foofield"
+              type="text" value="78">
+            </div>
+            <div class="label">
+              <label for="form-widgets-subobject-widgets-barfield">
+                <span>My dear bar</span>
+              </label>
+            </div>
+            <div class="widget">
+              <input class="text-widget int-field"
+              id="form-widgets-subobject-widgets-barfield"
+              name="form.widgets.subobject.widgets.barfield"
+              type="text" value="87">
+            </div>
+            <input name="form.widgets.subobject-empty-marker" type="hidden"
+            value="1">
+          </div>
+        </div>
+        <div class="row">
+          <label for="form-widgets-name">name</label>
+          <input class="text-widget required textline-field" id="form-widgets-name"
+          name="form.widgets.name" type="text" value="blooki">
+        </div>
+        <div class="action">
+          <input class="submit-widget button-field" id="form-buttons-apply"
+          name="form.buttons.apply" type="submit" value="Apply">
+        </div>
+      </form>
+    </body>
+  </html>
 
+Let's modify the values:
+
+  >>> request = TestRequest(form={
+  ...     'form.widgets.subobject.widgets.foofield':u'43',
+  ...     'form.widgets.subobject.widgets.barfield':u'55',
+  ...     'form.widgets.name':u'first',
+  ...     'form.widgets.subobject-empty-marker':u'1',
+  ...     'form.buttons.apply':'Apply'})
+
+They are still the same:
+
+  >>> newsub.foofield
+  78
+  >>> newsub.barfield
+  87
+
+Until updating the form:
+
+  >>> editform.request = request
+  >>> eventlog=[]
+  >>> editform.update()
+
+  >>> newsub.foofield
+  43
+  >>> newsub.barfield
+  55
+
+  >>> len(eventlog)
+  2
+  >>> printEvents()
+  <zope.app.event.objectevent.ObjectModifiedEvent object at ...>
+  <InterfaceClass z3c.form.testing.IMySubObject>
+  ('foofield', 'barfield')
+  <zope.app.event.objectevent.ObjectModifiedEvent object at ...>
+  <InterfaceClass z3c.form.testing.IMyObject>
+  ('subobject', 'name')
+
+
+
 #Object in an Object situation
 #=============================
 #

Modified: z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py
===================================================================
--- z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py	2008-10-13 14:07:06 UTC (rev 92120)
+++ z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py	2008-10-13 14:16:48 UTC (rev 92121)
@@ -102,7 +102,9 @@
 
         retval = {}
         for name in zope.schema.getFieldNames(self.field.schema):
-            retval[name] = getattr(value, name, interfaces.NOVALUE)
+            dm = zope.component.getMultiAdapter(
+                (value, self.field.schema[name]), interfaces.IDataManager)
+            retval[name] = dm.query()
 
         return retval
 
@@ -133,19 +135,23 @@
         if self.widget.subform.ignoreContext:
             obj = self.createObject(value)
         else:
-            obj = getattr(self.widget.context, self.field.__name__)
+            dm = zope.component.getMultiAdapter(
+                (self.widget.context, self.field), interfaces.IDataManager)
+            obj = dm.get()
 
         obj = self.field.schema(obj)
 
         names = []
         for name in zope.schema.getFieldNames(self.field.schema):
             try:
-                oldval = getattr(obj, name, interfaces.NOVALUE)
+                dm = zope.component.getMultiAdapter(
+                    (obj, self.field.schema[name]), interfaces.IDataManager)
+                oldval = dm.query()
                 if (oldval != value[name]
                     or zope.schema.interfaces.IObject.providedBy(
                         self.field.schema[name])
                     ):
-                    setattr(obj, name, value[name])
+                    dm.set(value[name])
                     names.append(name)
             except KeyError:
                 pass



More information about the Checkins mailing list