[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"> </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"> </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"> </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"> </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"> </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"> </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