[Checkins] SVN: z3ext.layoutform/trunk/ update tests

Nikolay Kim fafhrd91 at gmail.com
Tue Dec 22 18:47:11 EST 2009


Log message for revision 106971:
  update tests

Changed:
  U   z3ext.layoutform/trunk/CHANGES.txt
  U   z3ext.layoutform/trunk/setup.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/add.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/browser/configure.zcml
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/browser/widget.pt
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/edit.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/error.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/form.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/interfaces.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/subform.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/tests/addedit.txt
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/tests/form.txt
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/tests/ftesting.zcml
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.py
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.txt
  U   z3ext.layoutform/trunk/src/z3ext/layoutform/utils.py

-=-
Modified: z3ext.layoutform/trunk/CHANGES.txt
===================================================================
--- z3ext.layoutform/trunk/CHANGES.txt	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/CHANGES.txt	2009-12-22 23:47:11 UTC (rev 106971)
@@ -2,6 +2,14 @@
 CHANGES
 =======
 
+1.8.0 (Unreleased)
+------------------
+
+- ZTK support
+
+- Applay all changes in parent form's applyChanges method
+
+
 1.7.0 (2009-11-04)
 ------------------
 

Modified: z3ext.layoutform/trunk/setup.py
===================================================================
--- z3ext.layoutform/trunk/setup.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/setup.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -45,28 +45,30 @@
         'Framework :: Zope3'],
       author='Nikolay Kim',
       author_email='fafhrd91 at gmail.com',
-      url='http://z3ext.net/',
+      url='http://pypi.python.org/pypi/z3ext.layoutform/',
       license='ZPL 2.1',
       packages=find_packages('src'),
       package_dir = {'':'src'},
       namespace_packages=['z3ext'],
       install_requires = ['setuptools',
+                          'zope.browser',
+                          'zope.interface',
                           'zope.publisher',
                           'zope.component',
+                          'zope.container',
                           'zope.pagetemplate',
-                          'zope.app.pagetemplate',
                           'zope.i18n',
                           'zope.i18nmessageid',
                           'z3c.form',
+                          'z3c.pt',
                           'z3ext.layout',
-                          'z3ext.resource',
                           'z3ext.resourcepackage',
                           'z3ext.statusmessage',
                           ],
       extras_require = dict(test=['zope.testing',
                                   'zope.testbrowser',
                                   'zope.app.testing',
-                                  'zope.app.zcmlfiles',
+                                  'zope.principalregistry',
                                   'z3ext.security',
                                   'z3ext.autoinclude',]),
       include_package_data = True,

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/add.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/add.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/add.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -17,9 +17,9 @@
 """
 from zope import interface
 from zope.traversing.browser import absoluteURL
-from zope.app.container.interfaces import IAdding
-from zope.app.container.interfaces import IWriteContainer
-from zope.app.container.interfaces import IContainerNamesContainer
+from zope.browser.interfaces import IAdding
+from zope.container.interfaces import IWriteContainer
+from zope.container.interfaces import IContainerNamesContainer
 
 from z3c.form import form, button
 from z3ext.statusmessage.interfaces import IStatusMessage
@@ -75,7 +75,7 @@
         else:
             url = absoluteURL(self._addedObject, self.request)
 
-        return '%s/@@SelectedManagementView.html'%url
+        return '%s/'%url
 
     def cancelURL(self):
         context = self.context
@@ -85,7 +85,7 @@
         else:
             url = absoluteURL(context, self.request)
 
-        return '%s/@@SelectedManagementView.html'%url
+        return '%s/'%url
 
     def nameAllowed(self):
         """Return whether names can be input by the user."""

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/browser/configure.zcml
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/browser/configure.zcml	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/browser/configure.zcml	2009-12-22 23:47:11 UTC (rev 106971)
@@ -1,5 +1,6 @@
 <configure
    xmlns="http://namespaces.zope.org/zope"
+   xmlns:browser="http://namespaces.zope.org/browser"
    xmlns:z3ext="http://namespaces.zope.org/z3ext">
 
   <include file="buttons.zcml" />
@@ -163,15 +164,15 @@
      library="z3ext" type="stylesheet"
      file="styles.css" filetype="zrt" />
   
-  <z3ext:resource
+  <browser:resource
      file="required.gif"
      name="z3ext-layoutform-required.gif" />
   
-  <z3ext:resource
+  <browser:resource
      file="linkOpaque.gif"
      name="z3ext-layoutform-linkOpaque.gif" />
 
-  <z3ext:resource
+  <browser:resource
      file="linkTransparent.gif"
      name="z3ext-layoutform-linkTransparent.gif" />
 

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/browser/widget.pt
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/browser/widget.pt	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/browser/widget.pt	2009-12-22 23:47:11 UTC (rev 106971)
@@ -10,6 +10,7 @@
     The Error
   </div>
   <div class="z-form-help" 
+       tal:condition="context/field/description"
        tal:content="structure context/field/description"></div>
   <div tal:content="structure context/render">
     <input type="text" style="width:100%" />

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/edit.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/edit.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/edit.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -15,12 +15,7 @@
 
 $Id$
 """
-from zope import interface, event
-from zope.traversing.browser import absoluteURL
-from zope.app.container.interfaces import IAdding
-from zope.app.container.interfaces import IWriteContainer
-from zope.app.container.interfaces import IContainerNamesContainer
-
+from zope import interface
 from z3c.form import form, button
 from z3ext.statusmessage.interfaces import IStatusMessage
 
@@ -42,16 +37,8 @@
             if changes:
                 IStatusMessage(self.request).add(self.successMessage)
             else:
-                changed = False
-                for subform in self.subforms:
-                    if subform.changesApplied:
-                        IStatusMessage(self.request).add(self.successMessage)
-                        self.changed = True
-                        break
+                IStatusMessage(self.request).add(self.noChangesMessage)
 
-                if not changed:
-                    IStatusMessage(self.request).add(self.noChangesMessage)
-
             nextURL = self.nextURL()
             if nextURL:
                 self.redirect(nextURL)

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/error.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/error.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/error.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -16,8 +16,8 @@
 $Id:  2007-12-12 12:27:02Z fafhrd $
 """
 from zope import interface
-from zope.app.pagetemplate import ViewPageTemplateFile
 from z3ext.statusmessage.message import Message
+from z3c.pt.pagetemplate import ViewPageTemplateFile
 from z3c.form.interfaces import IErrorViewSnippet
 
 

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/form.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/form.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/form.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -15,9 +15,10 @@
 
 $Id$
 """
-from zope import interface
+from zope import interface, event
 from zope.component import getAdapters
 from zope.component import getMultiAdapter, queryMultiAdapter
+from zope.lifecycleevent import Attributes, ObjectModifiedEvent
 from zope.pagetemplate.interfaces import IPageTemplate
 
 from z3c.form import form, util
@@ -31,7 +32,9 @@
 from interfaces import IPageletForm, IPageletSubform
 from interfaces import IPageletDisplayForm, IPageletFormView
 
+from utils import applyChanges
 
+
 class Views(util.SelectionManager):
     """Forms manager."""
     interface.implements(IForms)
@@ -91,15 +94,37 @@
                 errors += formErrors
 
         for form in self.subforms:
-            try:
-                formData, formErrors = form.extractData(setErrors=setErrors)
-            except:
-                raise 'Error', (form,)
+            formData, formErrors = form.extractData(setErrors=setErrors)
+            data.update(formData)
             if formErrors:
                 errors += formErrors
 
         return data, errors
 
+    def applyChanges(self, data):
+        content = self.getContent()
+
+        changes = applyChanges(self, content, data)
+
+        for form in self.subforms:
+            data, errors = form.extractData(setErrors=False)
+            for iface, names in form.applyChanges(data).items():
+                changes[iface] = changes.get(iface, []) + names
+
+        for group in self.groups:
+            data, errors = group.extractData(setErrors=False)
+            for iface, names in group.applyChanges(data).items():
+                changes[iface] = changes.get(iface, []) + names
+
+        if changes:
+            descriptions = []
+            for iface, names in changes.items():
+                descriptions.append(Attributes(iface, *names))
+
+            event.notify(ObjectModifiedEvent(content, *descriptions))
+
+        return changes
+
     def _loadSubforms(self):
         return [(name, form) for name, form in
                 getAdapters((self.context,self,self.request), IPageletSubform)]

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/interfaces.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/interfaces.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/interfaces.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -95,8 +95,6 @@
 class IPageletEditSubForm(IPageletBaseForm):
     """ Sub form mixin for pagelet implementation."""
 
-    changesApplied = interface.Attribute('Changes applied')
-
     def executeActions(form):
         """Execute form actions."""
 

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/subform.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/subform.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/subform.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -20,14 +20,14 @@
 from zope.traversing.browser import absoluteURL
 from zope.lifecycleevent import Attributes, ObjectModifiedEvent
 
-from z3c.form import subform, button
+from z3c.form import subform
 from z3c.form.interfaces import ISubForm, IActionHandler
 
 from z3ext.statusmessage.interfaces import IStatusMessage
 
 from utils import applyChanges
 from form import PageletBaseForm
-from interfaces import _, IPageletEditSubForm, IPageletSubform, ISaveAction
+from interfaces import _, IPageletEditSubForm, IPageletSubform
 
 
 class PageletEditSubForm(subform.EditSubForm, PageletBaseForm):
@@ -35,7 +35,6 @@
 
     label = u''
     description = u''
-    changesApplied = False
 
     render = PageletBaseForm.render
     __call__ = PageletBaseForm.__call__
@@ -46,21 +45,6 @@
     def applyChanges(self, data):
         return applyChanges(self, self.getContent(), data)
 
-    @button.handler(ISaveAction)
-    def handleApply(self, action):
-        data, errors = self.extractData()
-
-        if not errors:
-            changes = self.applyChanges(data)
-            if changes:
-                descriptions = []
-                for interface, names in changes.items():
-                    descriptions.append(Attributes(interface, *names))
-
-                self.changesApplied = True
-                event.notify(
-                    ObjectModifiedEvent(self.getContent(), *descriptions))
-
     def executeActions(self, form):
         request = self.request
         content = self.getContent()

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/tests/addedit.txt
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/tests/addedit.txt	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/tests/addedit.txt	2009-12-22 23:47:11 UTC (rev 106971)
@@ -12,6 +12,7 @@
   >>> from z3ext.layoutform import Fields
   >>> from z3ext.layoutform.add import PageletAddForm
   >>> from z3ext.layoutform.edit import PageletEditForm
+  >>> from z3ext.layoutform import subform, interfaces
 
   >>> root = getRootFolder()
 
@@ -34,11 +35,13 @@
   >>> interface.classImplements(Person, IPerson)
 
   >>> required = {'name': CheckerPublic,
-  ...             'age': CheckerPublic}
+  ...             'age': CheckerPublic,
+  ...             'info': CheckerPublic}
   >>> defineChecker(Person, Checker(required))
 
   >>> protectSetAttribute(Person, 'name', CheckerPublic)
   >>> protectSetAttribute(Person, 'age', CheckerPublic)
+  >>> protectSetAttribute(Person, 'info', CheckerPublic)
 
 implmenent and register person add form
 
@@ -72,7 +75,7 @@
   >>> actor.open('http://localhost/addperson.html')
   >>> actor.getControl('Cancel').click()
   >>> actor.url
-  'http://localhost/@@contents.html'
+  'http://localhost/'
 
   >>> actor.open('http://localhost/addperson.html')
   >>> actor.getControl('Add').click()
@@ -90,6 +93,10 @@
   >>> class EditPersonForm(PageletEditForm):
   ...
   ...     fields = Fields(IPerson)
+  ...     
+  ...     def nextURL(self):
+  ...         assert super(EditPersonForm, self).nextURL() == ''
+  ...         return './edit.html'
 
   >>> required = {'__call__': CheckerPublic,
   ...             'browserDefault': CheckerPublic,
@@ -102,14 +109,81 @@
 
   >>> actor.open('http://localhost/person/edit.html')
 
-  >>> actor.getControl('Name').value = 'Nikolay Kim'
+  >>> actor.getControl('Name').value = ''
   >>> actor.getControl('Age').value = ''
   >>> actor.getControl('Save').click()
 
+  >>> print actor.contents
+  <html>
+  ...
+  ...Please fix indicated errors...
+  ...
+  <div class="z-form-fieldset">
+    <div class="z-form-field error">
+    <label for="form-widgets-name" title="">Name</label>
+    <span class="z-form-fieldRequired">&nbsp;</span>
+    <div class="error">Required input is missing.</div>
+    <div>
+       <input id="form-widgets-name" name="form.widgets.name"
+              class="text-widget required textline-field"
+              value="" type="text" />
+    </div>
+  </div>
+  ...
+  </html>
+
   >>> actor.getControl('Name').value = 'Nikolay Kim'
   >>> actor.getControl('Age').value = '25'
   >>> actor.getControl('Save').click()
 
+  >>> 'Data successfully updated.' in actor.contents
+  True
+
   >>> root['person'].name, root['person'].age
   (u'Nikolay Kim', 25)
 
+
+  >>> class IPersonInfo(interface.Interface):
+  ...
+  ...     info = schema.Datetime(
+  ...         title=u'Information',
+  ...         required=False)
+
+  >>> interface.classImplements(Person, IPersonInfo)
+
+  >>> class PersonInfo(subform.PageletEditSubForm):
+  ...     interface.implements(interfaces.IPageletSubform)
+  ...
+  ...     weight = 10
+  ...     fields = Fields(IPersonInfo)
+
+  >>> component.getSiteManager().registerAdapter(
+  ...     PersonInfo, (interface.Interface,EditPersonForm,interface.Interface),
+  ...     interfaces.IPageletSubform, name='info')
+
+  >>> from pytz import utc
+  >>> from datetime import datetime
+  >>> root['person'].info = datetime.now(utc)
+
+  >>> actor.open('http://localhost/person/edit.html')
+
+  >>> actor.getControl('Information').value = "09/12/01 10:00"
+  >>> actor.getControl('Save').click()
+
+  >>> 'Data successfully updated.' in actor.contents
+  True
+
+  >>> del root['person'].info
+
+  >>> actor.getControl('Information').value = "09/12/01 10:00"
+  >>> actor.getControl('Save').click()
+
+  >>> 'Data successfully updated.' in actor.contents
+  True
+
+  >>> actor.getControl('Save').click()
+  >>> 'No changes were applied.' in actor.contents
+  True
+
+  >>> root['person'].name, root['person'].age, root['person'].info
+  (u'Nikolay Kim', 25, datetime.datetime(...))

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/tests/form.txt
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/tests/form.txt	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/tests/form.txt	2009-12-22 23:47:11 UTC (rev 106971)
@@ -58,7 +58,6 @@
       <div class="z-form-field">
         <label for="form-widgets-name" title="">Name</label>
         <span class="z-form-fieldRequired">&nbsp;</span>
-        <div class="z-form-help"></div>
         <div>
            <input id="form-widgets-name" name="form.widgets.name"
               class="text-widget required textline-field"
@@ -130,7 +129,6 @@
       <div class="z-form-field">
         <label for="form-widgets-name" title="">Name</label>
         <span class="z-form-fieldRequired">&nbsp;</span>
-        <div class="z-form-help"></div>
         <div>
           <input id="form-widgets-name" name="form.widgets.name"
             class="text-widget required textline-field"
@@ -149,7 +147,6 @@
         <div class="z-form-fieldset">
           <div class="z-form-field">
             <label for="form-widgets-education" title="">Education</label>
-            <div class="z-form-help"></div>
             <div>
                <input id="form-widgets-education"
                  name="form.widgets.education"
@@ -204,7 +201,6 @@
   <div class="z-form z-form-standard">...
   ...
   <label for="form-widgets-info" title="">Information</label>
-  <div class="z-form-help"></div>
   <div>
     <textarea id="form-widgets-info" name="form.widgets.info"
               class="textarea-widget text-field" rows="5"></textarea>
@@ -243,7 +239,6 @@
      <label for="form-widgets-name" title="">Name</label>
      <span class="z-form-fieldRequired">&nbsp;</span>
      <div class="error">Required input is missing.</div>
-     <div class="z-form-help"></div>
      <div>
         <input id="form-widgets-name" name="form.widgets.name"
            class="text-widget required textline-field"
@@ -263,8 +258,10 @@
   >>> form = PersonForm(root, request)
   >>> form.update()
   >>> form.extractData()
-  ({'age': 50, 'education': u'University', 'name': u'Nikolay'}, ())
+  ({'info': u'info', 'age': 50, 'education': u'University', 'name': u'Nikolay'}, ())
 
+  >>> list(form.groups)[0].extractData()
+  ({'education': u'University'}, ())
 
   >>> class IItem(interface.Interface):
   ...

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/tests/ftesting.zcml
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/tests/ftesting.zcml	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/tests/ftesting.zcml	2009-12-22 23:47:11 UTC (rev 106971)
@@ -4,6 +4,8 @@
    xmlns:browser="http://namespaces.zope.org/browser"
    i18n_domain="zope">
 
+  <exclude package="zope.dublincore.browser" />
+
   <include package="z3ext.autoinclude" file="meta.zcml" />
   <includeAllDependencies package="z3ext.layoutform" extras="test" />
 

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -15,11 +15,10 @@
 
 $Id:  2007-12-12 12:27:02Z fafhrd $
 """
-import unittest, os
+import unittest, doctest, os
 from persistent import Persistent
-from zope.testing import doctest
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 from zope.app.testing.functional import ZCMLLayer, FunctionalDocFileSuite
-from zope.app.rotterdam import Rotterdam
 from z3ext.layoutform.interfaces import ILayoutFormLayer
 
 
@@ -28,7 +27,7 @@
     __name__, 'layoutformLayer', allow_teardown=True)
 
 
-class IDefaultSkin(ILayoutFormLayer, Rotterdam):
+class IDefaultSkin(ILayoutFormLayer, IDefaultBrowserLayer):
     """ skin """
 
 

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.txt
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.txt	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/tests/tests.txt	2009-12-22 23:47:11 UTC (rev 106971)
@@ -45,10 +45,10 @@
 
 
   >>> from z3c.form import field
-  >>> from z3ext.layoutform import PageletAddForm
+  >>> from z3ext.layoutform import Fields, PageletAddForm
   >>> class PersonAddForm(PageletAddForm):
   ...
-  ...     fields = field.Fields(IPerson)
+  ...     fields = Fields(IPerson)
   ...
   ...     def create(self, data):
   ...         return Person(**data)
@@ -82,7 +82,6 @@
       <div class="z-form-field">
         <label for="form-widgets-name" title="">Name</label>
         <span class="z-form-fieldRequired">&nbsp;</span>
-        <div class="z-form-help"></div>
         <div>
            <input id="form-widgets-name" name="form.widgets.name"
                   class="text-widget required textline-field"
@@ -133,7 +132,6 @@
       <div class="z-form-field">
         <label for="form-widgets-name" title="">Name</label>
         <span class="z-form-fieldRequired">&nbsp;</span>
-        <div class="z-form-help"></div>
         <div>
           <input id="form-widgets-name" name="form.widgets.name"
              class="text-widget required textline-field"

Modified: z3ext.layoutform/trunk/src/z3ext/layoutform/utils.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/utils.py	2009-12-22 23:46:21 UTC (rev 106970)
+++ z3ext.layoutform/trunk/src/z3ext/layoutform/utils.py	2009-12-22 23:47:11 UTC (rev 106971)
@@ -16,14 +16,14 @@
 $Id:  2007-12-12 12:27:02Z fafhrd $
 """
 from zope.component import getMultiAdapter
-from z3c.form.interfaces import IDataManager
+from z3c.form.interfaces import NOT_CHANGED, IDataManager
 
 
 def applyChanges(form, content, data):
     changes = {}
     for name, field in form.fields.items():
         # If the field is not in the data, then go on to the next one
-        if name not in data:
+        if name not in data or data[name] is NOT_CHANGED:
             continue
 
         # Get the datamanager and get the original value



More information about the checkins mailing list