[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