[Checkins] SVN: z3ext.layoutform/tags/1.2.1/ release tag
Nikolay Kim
fafhrd at datacom.kz
Tue Oct 7 15:47:01 EDT 2008
Log message for revision 91881:
release tag
Changed:
A z3ext.layoutform/tags/1.2.1/
D z3ext.layoutform/tags/1.2.1/CHANGES.txt
A z3ext.layoutform/tags/1.2.1/CHANGES.txt
U z3ext.layoutform/tags/1.2.1/setup.py
D z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/add.py
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/add.py
D z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/configure.zcml
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/configure.zcml
D z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/form.css
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.pt
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.py
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/styles.css
D z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/configure.zcml
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/configure.zcml
D z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/edit.py
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/edit.py
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/error.py
D z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/interfaces.py
A z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/interfaces.py
-=-
Copied: z3ext.layoutform/tags/1.2.1 (from rev 91853, z3ext.layoutform/trunk)
Deleted: z3ext.layoutform/tags/1.2.1/CHANGES.txt
===================================================================
--- z3ext.layoutform/trunk/CHANGES.txt 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/CHANGES.txt 2008-10-07 19:46:59 UTC (rev 91881)
@@ -1,62 +0,0 @@
-=======
-CHANGES
-=======
-
-1.2.0 (2008-10-06)
-------------------
-
-- Added default css styles
-
-- Removed z3c packages dependencies
-
-- Use pagelets instead of macros
-
-
-1.1.2 (2008-09-26)
-------------------
-
-- Added group support
-
-- Return added object in createAndAdd method
-
-
-1.1.1 (2008-08-05)
-------------------
-
-- Fixed wrong `for` in label tag
-
-
-1.1.0 (2008-07-22)
-------------------
-
-- Remove cancel button from edit form
-
-
-1.0.1 (2008-06-02)
-------------------
-
-- Redirect to nextURL after success 'apply'
-
-
-1.0.0 (2008-05-13)
-------------------
-
-- Use `includeDependencies` instead `autoinclude`
-
-
-0.2.0 (2008-??-??)
-------------------
-
-- Use z3c.autoinclude
-
-
-0.1.1 (2008-01-22)
-------------------
-
-- Fixed missing import in add.py
-
-
-0.1 (2008-01-19)
-----------------
-
-- Initial release
Copied: z3ext.layoutform/tags/1.2.1/CHANGES.txt (from rev 91880, z3ext.layoutform/trunk/CHANGES.txt)
===================================================================
--- z3ext.layoutform/tags/1.2.1/CHANGES.txt (rev 0)
+++ z3ext.layoutform/tags/1.2.1/CHANGES.txt 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,68 @@
+=======
+CHANGES
+=======
+
+1.2.1 (2008-10-08)
+------------------
+
+- Show all form errors
+
+
+1.2.0 (2008-10-06)
+------------------
+
+- Added default css styles
+
+- Removed z3c packages dependencies
+
+- Use pagelets instead of macros
+
+
+1.1.2 (2008-09-26)
+------------------
+
+- Added group support
+
+- Return added object in createAndAdd method
+
+
+1.1.1 (2008-08-05)
+------------------
+
+- Fixed wrong `for` in label tag
+
+
+1.1.0 (2008-07-22)
+------------------
+
+- Remove cancel button from edit form
+
+
+1.0.1 (2008-06-02)
+------------------
+
+- Redirect to nextURL after success 'apply'
+
+
+1.0.0 (2008-05-13)
+------------------
+
+- Use `includeDependencies` instead `autoinclude`
+
+
+0.2.0 (2008-??-??)
+------------------
+
+- Use z3c.autoinclude
+
+
+0.1.1 (2008-01-22)
+------------------
+
+- Fixed missing import in add.py
+
+
+0.1 (2008-01-19)
+----------------
+
+- Initial release
Modified: z3ext.layoutform/tags/1.2.1/setup.py
===================================================================
--- z3ext.layoutform/trunk/setup.py 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/setup.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -21,7 +21,7 @@
def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
-version='1.2.1dev'
+version='1.2.1'
setup(name='z3ext.layoutform',
Deleted: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/add.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/add.py 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/add.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -1,93 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Support for Layout Templates
-
-$Id$
-"""
-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 z3c.form import form, button
-from z3ext.statusmessage.interfaces import IStatusMessage
-
-from form import PageletForm
-from interfaces import _, IPageletAddForm, IAddButton, ICancelButton
-
-
-class PageletAddForm(form.AddForm, PageletForm):
- interface.implements(IPageletAddForm)
-
- render = PageletForm.render
- __call__ = PageletForm.__call__
-
- _addedObject = None
-
- formCancelMessage = _(u'Action has been canceled.')
-
- @button.buttonAndHandler(_(u'Add'), name='add', provides=IAddButton)
- def handleAdd(self, action):
- data, errors = self.extractData()
-
- if errors:
- IStatusMessage(self.request).add(self.formErrorsMessage, 'warning')
- else:
- obj = self.createAndAdd(data)
-
- if obj is not None:
- self._addedObject = obj
- self._finishedAdd = True
- self.redirect(self.nextURL())
-
- @button.buttonAndHandler(_(u'Cancel'), name='cancel', provides=ICancelButton)
- def handleCancel(self, action):
- self._finishedAdd = True
- self.redirect(self.cancelURL())
- IStatusMessage(self.request).add(self.formCancelMessage)
-
- def createAndAdd(self, data):
- obj = self.create(data)
- addedObj = self.add(obj)
- if addedObj is not None:
- return addedObj
- return obj
-
- def nextURL(self):
- if self._addedObject is None:
- return '%s/@@SelectedManagementView.html'%\
- absoluteURL(self.context, self.request)
- else:
- return absoluteURL(self._addedObject, self.request) + '/'
-
- def cancelURL(self):
- context = self.context
-
- if IAdding.providedBy(context):
- return '%s/'%absoluteURL(context.context, self.request)
- else:
- return '%s/'%absoluteURL(context, self.request)
-
- def nameAllowed(self):
- """Return whether names can be input by the user."""
- context = self.context
-
- if IAdding.providedBy(context):
- context = context.context
-
- if IWriteContainer.providedBy(context):
- return not IContainerNamesContainer.providedBy(context)
- else:
- return False
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/add.py (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/add.py)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/add.py (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/add.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,97 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Support for Layout Templates
+
+$Id$
+"""
+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 z3c.form import form, button
+from z3ext.statusmessage.interfaces import IStatusMessage
+
+from form import PageletForm
+from interfaces import _, IPageletAddForm, IAddButton, ICancelButton
+
+from zope.proxy import removeAllProxies
+
+
+class PageletAddForm(form.AddForm, PageletForm):
+ interface.implements(IPageletAddForm)
+
+ render = PageletForm.render
+ __call__ = PageletForm.__call__
+
+ _addedObject = None
+
+ formCancelMessage = _(u'Action has been canceled.')
+
+ @button.buttonAndHandler(_(u'Add'), name='add', provides=IAddButton)
+ def handleAdd(self, action):
+ data, errors = self.extractData()
+
+ if errors:
+ IStatusMessage(self.request).add(
+ (self.formErrorsMessage,) + errors, 'formError')
+ else:
+ obj = self.createAndAdd(data)
+
+ if obj is not None:
+ self._addedObject = obj
+ self._finishedAdd = True
+ self.redirect(self.nextURL())
+
+ @button.buttonAndHandler(
+ _(u'Cancel'), name='cancel', provides=ICancelButton)
+ def handleCancel(self, action):
+ self._finishedAdd = True
+ self.redirect(self.cancelURL())
+ IStatusMessage(self.request).add(self.formCancelMessage)
+
+ def createAndAdd(self, data):
+ obj = self.create(data)
+ addedObj = self.add(obj)
+ if addedObj is not None:
+ return addedObj
+ return obj
+
+ def nextURL(self):
+ if self._addedObject is None:
+ return '%s/@@SelectedManagementView.html'%\
+ absoluteURL(self.context, self.request)
+ else:
+ return absoluteURL(self._addedObject, self.request) + '/'
+
+ def cancelURL(self):
+ context = self.context
+
+ if IAdding.providedBy(context):
+ return '%s/'%absoluteURL(context.context, self.request)
+ else:
+ return '%s/'%absoluteURL(context, self.request)
+
+ def nameAllowed(self):
+ """Return whether names can be input by the user."""
+ context = self.context
+
+ if IAdding.providedBy(context):
+ context = context.context
+
+ if IWriteContainer.providedBy(context):
+ return not IContainerNamesContainer.providedBy(context)
+ else:
+ return False
Deleted: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/configure.zcml
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/browser/configure.zcml 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/configure.zcml 2008-10-07 19:46:59 UTC (rev 91881)
@@ -1,136 +0,0 @@
-<configure
- xmlns="http://namespaces.zope.org/zope"
- xmlns:z3ext="http://namespaces.zope.org/z3ext">
-
- <!-- buttons -->
- <adapter
- provides="z3c.form.interfaces.IButtonAction"
- factory=".buttons.ButtonAction" />
-
- <adapter
- provides="z3c.form.interfaces.IButtonAction"
- factory=".buttons.AddButtonAction" />
-
- <adapter
- provides="z3c.form.interfaces.IButtonAction"
- factory=".buttons.SaveButtonAction" />
-
- <adapter
- provides="z3c.form.interfaces.IButtonAction"
- factory=".buttons.CancelButtonAction" />
-
- <!-- TextArea widget -->
- <class class=".textarea.TextAreaWidget">
- <require
- permission="zope.Public"
- interface="z3c.form.interfaces.ITextAreaWidget" />
- </class>
-
- <adapter
- for="zope.schema.interfaces.IText
- ..interfaces.ILayoutFormLayer"
- factory=".textarea.TextAreaFieldWidget" />
-
- <!-- templates -->
- <z3ext:pagelet
- template="form.pt"
- for="..interfaces.IPageletForm"
- layer="..interfaces.ILayoutFormLayer"
- provides="..interfaces.IPageletFormView"
- permission="zope.Public" />
-
- <z3ext:pagelet
- template="formadd.pt"
- for="..interfaces.IPageletAddForm"
- layer="..interfaces.ILayoutFormLayer"
- provides="..interfaces.IPageletFormView"
- permission="zope.Public" />
-
- <z3ext:pagelet
- template="formedit.pt"
- for="..interfaces.IPageletEditForm"
- layer="..interfaces.ILayoutFormLayer"
- provides="..interfaces.IPageletFormView"
- permission="zope.Public" />
-
- <z3ext:pagelet
- template="subform.pt"
- for="z3c.form.interfaces.ISubForm"
- layer="..interfaces.ILayoutFormLayer"
- provides="..interfaces.IPageletFormView"
- permission="zope.Public" />
-
- <z3ext:pagelet
- template="formgroup.pt"
- for="z3c.form.group.Group"
- layer="..interfaces.ILayoutFormLayer"
- provides="..interfaces.IPageletFormView"
- permission="zope.Public" />
-
- <!-- Error View -->
- <z3ext:pagelet
- for="z3c.form.interfaces.IErrorViewSnippet"
- template="error.pt"
- layer="..interfaces.ILayoutFormLayer"
- permission="zope.Public" />
-
- <!-- form view -->
- <z3ext:pagelet
- for="z3c.form.interfaces.IForm"
- template="formview.pt"
- provides="z3ext.layoutform.browser.interfaces.IForm"
- layer="..interfaces.ILayoutFormLayer"
- permission="zope.Public" />
-
- <!-- viewspace view -->
- <z3ext:pagelet
- for="..interfaces.IPageletForm"
- template="formviewspace.pt"
- provides="z3ext.layoutform.browser.interfaces.IViewspace"
- layer="..interfaces.ILayoutFormLayer"
- permission="zope.Public" />
-
- <!-- form buttons -->
- <z3ext:pagelet
- for="..interfaces.IPageletForm"
- template="formbuttons.pt"
- provides="z3ext.layoutform.browser.interfaces.IFormButtons"
- layer="..interfaces.ILayoutFormLayer"
- permission="zope.Public" />
-
- <!-- widget view -->
- <z3ext:pagelet
- for="z3c.form.interfaces.IWidget"
- template="widget.pt"
- provides="z3ext.layoutform.browser.interfaces.IWidget"
- layer="..interfaces.ILayoutFormLayer"
- permission="zope.Public" />
-
- <!-- add form buttons -->
- <z3ext:pagelet
- for="..interfaces.IPageletAddForm"
- template="formaddbuttons.pt"
- provides="z3ext.layoutform.browser.interfaces.IFormButtons"
- layer="..interfaces.ILayoutFormLayer"
- permission="zope.Public" />
-
- <!-- styles -->
- <z3ext:resourceinclude
- name="z3ext-layoutform.css"
- library="z3ext"
- type="stylesheet"
- file="form.css" filetype="zrt" />
-
- <z3ext:resource
- file="required.gif"
- name="z3ext-layoutform-required.gif" />
-
- <z3ext:resource
- file="linkOpaque.gif"
- name="z3ext-layoutform-linkOpaque.gif" />
-
- <z3ext:resource
- file="linkTransparent.gif"
- name="z3ext-layoutform-linkTransparent.gif" />
-
-</configure>
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/configure.zcml (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/browser/configure.zcml)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/configure.zcml (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/configure.zcml 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,139 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:z3ext="http://namespaces.zope.org/z3ext">
+
+ <!-- buttons -->
+ <adapter
+ provides="z3c.form.interfaces.IButtonAction"
+ factory=".buttons.ButtonAction" />
+
+ <adapter
+ provides="z3c.form.interfaces.IButtonAction"
+ factory=".buttons.AddButtonAction" />
+
+ <adapter
+ provides="z3c.form.interfaces.IButtonAction"
+ factory=".buttons.SaveButtonAction" />
+
+ <adapter
+ provides="z3c.form.interfaces.IButtonAction"
+ factory=".buttons.CancelButtonAction" />
+
+ <!-- TextArea widget -->
+ <class class=".textarea.TextAreaWidget">
+ <require
+ permission="zope.Public"
+ interface="z3c.form.interfaces.ITextAreaWidget" />
+ </class>
+
+ <adapter
+ for="zope.schema.interfaces.IText
+ ..interfaces.ILayoutFormLayer"
+ factory=".textarea.TextAreaFieldWidget" />
+
+ <!-- templates -->
+ <z3ext:pagelet
+ template="form.pt"
+ for="..interfaces.IPageletForm"
+ layer="..interfaces.ILayoutFormLayer"
+ provides="..interfaces.IPageletFormView"
+ permission="zope.Public" />
+
+ <z3ext:pagelet
+ template="formadd.pt"
+ for="..interfaces.IPageletAddForm"
+ layer="..interfaces.ILayoutFormLayer"
+ provides="..interfaces.IPageletFormView"
+ permission="zope.Public" />
+
+ <z3ext:pagelet
+ template="formedit.pt"
+ for="..interfaces.IPageletEditForm"
+ layer="..interfaces.ILayoutFormLayer"
+ provides="..interfaces.IPageletFormView"
+ permission="zope.Public" />
+
+ <z3ext:pagelet
+ template="subform.pt"
+ for="z3c.form.interfaces.ISubForm"
+ layer="..interfaces.ILayoutFormLayer"
+ provides="..interfaces.IPageletFormView"
+ permission="zope.Public" />
+
+ <z3ext:pagelet
+ template="formgroup.pt"
+ for="z3c.form.group.Group"
+ layer="..interfaces.ILayoutFormLayer"
+ provides="..interfaces.IPageletFormView"
+ permission="zope.Public" />
+
+ <!-- Error View -->
+ <z3ext:pagelet
+ for="z3c.form.interfaces.IErrorViewSnippet"
+ template="error.pt"
+ layer="..interfaces.ILayoutFormLayer"
+ permission="zope.Public" />
+
+ <!-- form view -->
+ <z3ext:pagelet
+ for="z3c.form.interfaces.IForm"
+ template="formview.pt"
+ provides="z3ext.layoutform.browser.interfaces.IForm"
+ layer="..interfaces.ILayoutFormLayer"
+ permission="zope.Public" />
+
+ <!-- viewspace view -->
+ <z3ext:pagelet
+ for="..interfaces.IPageletForm"
+ template="formviewspace.pt"
+ provides="z3ext.layoutform.browser.interfaces.IViewspace"
+ layer="..interfaces.ILayoutFormLayer"
+ permission="zope.Public" />
+
+ <!-- form buttons -->
+ <z3ext:pagelet
+ for="..interfaces.IPageletForm"
+ template="formbuttons.pt"
+ provides="z3ext.layoutform.browser.interfaces.IFormButtons"
+ layer="..interfaces.ILayoutFormLayer"
+ permission="zope.Public" />
+
+ <!-- widget view -->
+ <z3ext:pagelet
+ for="z3c.form.interfaces.IWidget"
+ template="widget.pt"
+ provides="z3ext.layoutform.browser.interfaces.IWidget"
+ layer="..interfaces.ILayoutFormLayer"
+ permission="zope.Public" />
+
+ <!-- add form buttons -->
+ <z3ext:pagelet
+ for="..interfaces.IPageletAddForm"
+ template="formaddbuttons.pt"
+ provides="z3ext.layoutform.browser.interfaces.IFormButtons"
+ layer="..interfaces.ILayoutFormLayer"
+ permission="zope.Public" />
+
+ <!-- status message -->
+ <adapter factory=".message.Message" />
+
+ <!-- styles -->
+ <z3ext:resourceinclude
+ name="z3ext-layoutform.css"
+ library="z3ext"
+ type="stylesheet"
+ file="styles.css" filetype="zrt" />
+
+ <z3ext:resource
+ file="required.gif"
+ name="z3ext-layoutform-required.gif" />
+
+ <z3ext:resource
+ file="linkOpaque.gif"
+ name="z3ext-layoutform-linkOpaque.gif" />
+
+ <z3ext:resource
+ file="linkTransparent.gif"
+ name="z3ext-layoutform-linkTransparent.gif" />
+
+</configure>
Deleted: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/form.css
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/browser/form.css 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/form.css 2008-10-07 19:46:59 UTC (rev 91881)
@@ -1,187 +0,0 @@
-/* zrt-cssregistry: */
-
- at media all {
-
- .z-form {
- }
-
- .z-page .z-form-add,
- .z-page .z-form-edit,
- .page .z-form-add,
- .page .z-form-edit {
- border: borderWidth borderStyle globalExtraBorderColor;
- margin-top: 0em;
- padding: 1em;
- background: contentBackgroundColor;
- }
-
- .z-frame .z-form-edit,
- .z-frame .z-form-standard,
- .z-topframe .z-form-standard,
- .frame .z-form-edit,
- .frame .z-form-standard,
- .topframe .z-form-standard,
- #z-context-view .z-form-edit,
- #z-context-view .z-form-standard {
- border: none;
- padding: 0em;
- }
-
- .z-add-form {
- padding: 1em;
- }
-
- .z-form-description {
- color: discreetColor;
- margin-bottom: 1.5em;
- font-size: 90%;
- }
-
- .z-form-field .z-form-description {
- color: discreetColor;
- font-size: fontSmallSize;
- font-weight: normal;
- margin-bottom: 1.5em;
- }
-
- .z-form-fieldset {
- margin-bottom: 1em;
- color: fontColor !important;
- background-color: backgroundColor;
- padding: 0.5em 1em 0.5em 1em;
- }
-
- .z-form-fieldset.last {
- margin-bottom: 0em;
- }
-
- .z-form form:first-child > .z-form-fieldset {
- margin-top: 0em;
- }
-
- .z-form-fieldset ul a {
- text-decoration: none;
- border-bottom: borderWidth dotted discreetColor;
- }
-
- .z-form-fieldset label {
- font-weight: normal;
- }
-
- .z-form-fieldset h2 {
- font-weight: bold;
- }
-
- .z-form-fieldset .header {
- border-bottom: borderWidth borderStyle globalBorderColor;
- }
-
- /* The edit form elements */
- .z-form-field {
- margin: 0 1em 1em 0;
- }
-
- .z-form-field .z-form-field {
- margin: 1em 0 0 0;
- }
-
- .z-form-field label {
- font-size: 100%;
- }
-
- .z-form-fieldRequired {
- background: url(z3ext-layoutform-required.gif) center left no-repeat;
- padding: 0 0 0 8px;
- color: backgroundColor;
- }
-
- .z-form-fieldUploadFile {
- text-align: right;
- margin-right: 0.75em;
- display: none;
- }
-
- .z-form-fieldTextFormat {
- text-align: right;
- margin-right: 0.75em
- }
-
- .z-form-help {
- font-size: fontSmallSize;
- color: discreetColor;
- margin: 0 0 0.2em 0;
- }
-
- .z-form-help:hover {
- color: fontColor;
- cursor: default;
- }
-
- .z-form-field.error {
- /* Class for error indication in forms */
- background-color: notifyBackgroundColor;
- border: borderWidth borderStyle notifyBorderColor;
- padding: 1em;
- margin: 0 0 1em 0;
- width: 95%;
- }
-
- .z-form-field.error .x-form-fieldRequired {
- color: notifyBackgroundColor;
- }
-
- .z-form-controls {
- clear: both;
- margin-top: 1em;
- }
-
-
- .z-form-button {
- background: transparent url(z3ext-layoutform-linkTransparent.gif) no-repeat;
- background-position: 5px center;
- cursor: pointer;
- font-size: fontSmallSize;
- padding: 1px 1px 1px 14px;
- }
-
- .z-form-standalonebtn {
- background: globalBackgroundColor url(z3ext-layoutform-linkOpaque.gif) no-repeat;
- background-position: 5px center;
- cursor: pointer;
- font-size: fontSmallSize;
- padding: 1px 1px 1px 14px;
- }
-
- .z-form-addbutton {
- background: transparent url(z3ext-layoutform-linkTransparent.gif) no-repeat;
- background-position: 5px center;
- cursor: pointer;
- font-size: fontSmallSize;
- padding: 1px 1px 1px 14px;
- }
-
- .z-form-savebutton {
- background: transparent url(z3ext-layoutform-linkTransparent.gif) no-repeat;
- background-position: 5px center;
- cursor: pointer;
- font-size: fontSmallSize;
- padding: 1px 1px 1px 14px;
- }
-
- .z-form-cancelbutton {
- background: globalBackgroundColor url(z3ext-layoutform-linkOpaque.gif) no-repeat;
- background-position: 5px center;
- cursor: pointer;
- font-size: fontSmallSize;
- padding: 1px 1px 1px 14px;
- }
-
- .z-form-removebutton {
- background: globalBackgroundColor url(z3ext-layoutform-linkOpaque.gif) no-repeat;
- background-position: 5px center;
- cursor: pointer;
- font-size: fontSmallSize;
- padding: 1px 1px 1px 14px;
- }
-
-}
\ No newline at end of file
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.pt (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/browser/message.pt)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.pt (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.pt 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,11 @@
+<div class="statusWarningMessage">
+ <tal:block content="context/message" />
+ <tal:block condition="context/errors">
+ <br />
+ <ul>
+ <li tal:repeat="err context/errors"
+ tal:content="structure err/render">
+ </li>
+ </ul>
+ </tal:block>
+</div>
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.py (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/browser/message.py)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.py (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/message.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,35 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id: 2007-12-12 12:27:02Z fafhrd $
+"""
+from zope import component, interface
+from zope.app.pagetemplate import ViewPageTemplateFile
+from z3ext.statusmessage.interfaces import IMessageView
+from z3ext.layoutform.interfaces import IFormErrorStatusMessage
+
+
+class Message(object):
+ interface.implements(IMessageView)
+ component.adapts(IFormErrorStatusMessage, interface.Interface)
+
+ index = ViewPageTemplateFile('message.pt')
+
+ def __init__(self, context, request):
+ self.context = context
+ self.request = request
+
+ def render(self):
+ return self.index()
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/styles.css (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/browser/styles.css)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/styles.css (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/browser/styles.css 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,187 @@
+/* zrt-cssregistry: */
+
+ at media all {
+
+ .z-form {
+ }
+
+ .z-page .z-form-add,
+ .z-page .z-form-edit,
+ .page .z-form-add,
+ .page .z-form-edit {
+ border: borderWidth borderStyle globalExtraBorderColor;
+ margin-top: 0em;
+ padding: 1em;
+ background: contentBackgroundColor;
+ }
+
+ .z-frame .z-form-edit,
+ .z-frame .z-form-standard,
+ .z-topframe .z-form-standard,
+ .frame .z-form-edit,
+ .frame .z-form-standard,
+ .topframe .z-form-standard,
+ #z-context-view .z-form-edit,
+ #z-context-view .z-form-standard {
+ border: none;
+ padding: 0em;
+ }
+
+ .z-add-form {
+ padding: 1em;
+ }
+
+ .z-form-description {
+ color: discreetColor;
+ margin-bottom: 1.5em;
+ font-size: 90%;
+ }
+
+ .z-form-field .z-form-description {
+ color: discreetColor;
+ font-size: fontSmallSize;
+ font-weight: normal;
+ margin-bottom: 1.5em;
+ }
+
+ .z-form-fieldset {
+ margin-bottom: 1em;
+ color: fontColor !important;
+ background-color: backgroundColor;
+ padding: 0.5em 1em 0.5em 1em;
+ }
+
+ .z-form-fieldset.last {
+ margin-bottom: 0em;
+ }
+
+ .z-form form:first-child > .z-form-fieldset {
+ margin-top: 0em;
+ }
+
+ .z-form-fieldset ul a {
+ text-decoration: none;
+ border-bottom: borderWidth dotted discreetColor;
+ }
+
+ .z-form-fieldset label {
+ font-weight: normal;
+ }
+
+ .z-form-fieldset h2 {
+ font-weight: bold;
+ }
+
+ .z-form-fieldset .header {
+ border-bottom: borderWidth borderStyle globalBorderColor;
+ }
+
+ /* The edit form elements */
+ .z-form-field {
+ margin: 0 1em 1em 0;
+ }
+
+ .z-form-field .z-form-field {
+ margin: 1em 0 0 0;
+ }
+
+ .z-form-field label {
+ font-size: 100%;
+ }
+
+ .z-form-fieldRequired {
+ background: url(z3ext-layoutform-required.gif) center left no-repeat;
+ padding: 0 0 0 8px;
+ color: backgroundColor;
+ }
+
+ .z-form-fieldUploadFile {
+ text-align: right;
+ margin-right: 0.75em;
+ display: none;
+ }
+
+ .z-form-fieldTextFormat {
+ text-align: right;
+ margin-right: 0.75em
+ }
+
+ .z-form-help {
+ font-size: fontSmallSize;
+ color: discreetColor;
+ margin: 0 0 0.2em 0;
+ }
+
+ .z-form-help:hover {
+ color: fontColor;
+ cursor: default;
+ }
+
+ .z-form-field.error {
+ /* Class for error indication in forms */
+ background-color: notifyBackgroundColor;
+ border: borderWidth borderStyle notifyBorderColor;
+ padding: 1em;
+ margin: 0 0 1em 0;
+ width: 95%;
+ }
+
+ .z-form-field.error .x-form-fieldRequired {
+ color: notifyBackgroundColor;
+ }
+
+ .z-form-controls {
+ clear: both;
+ margin-top: 1em;
+ }
+
+
+ .z-form-button {
+ background: transparent url(z3ext-layoutform-linkTransparent.gif) no-repeat;
+ background-position: 5px center;
+ cursor: pointer;
+ font-size: fontSmallSize;
+ padding: 1px 1px 1px 14px;
+ }
+
+ .z-form-standalonebtn {
+ background: globalBackgroundColor url(z3ext-layoutform-linkOpaque.gif) no-repeat;
+ background-position: 5px center;
+ cursor: pointer;
+ font-size: fontSmallSize;
+ padding: 1px 1px 1px 14px;
+ }
+
+ .z-form-addbutton {
+ background: transparent url(z3ext-layoutform-linkTransparent.gif) no-repeat;
+ background-position: 5px center;
+ cursor: pointer;
+ font-size: fontSmallSize;
+ padding: 1px 1px 1px 14px;
+ }
+
+ .z-form-savebutton {
+ background: transparent url(z3ext-layoutform-linkTransparent.gif) no-repeat;
+ background-position: 5px center;
+ cursor: pointer;
+ font-size: fontSmallSize;
+ padding: 1px 1px 1px 14px;
+ }
+
+ .z-form-cancelbutton {
+ background: globalBackgroundColor url(z3ext-layoutform-linkOpaque.gif) no-repeat;
+ background-position: 5px center;
+ cursor: pointer;
+ font-size: fontSmallSize;
+ padding: 1px 1px 1px 14px;
+ }
+
+ .z-form-removebutton {
+ background: globalBackgroundColor url(z3ext-layoutform-linkOpaque.gif) no-repeat;
+ background-position: 5px center;
+ cursor: pointer;
+ font-size: fontSmallSize;
+ padding: 1px 1px 1px 14px;
+ }
+
+}
\ No newline at end of file
Deleted: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/configure.zcml
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/configure.zcml 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/configure.zcml 2008-10-07 19:46:59 UTC (rev 91881)
@@ -1,9 +0,0 @@
-<configure
- xmlns="http://namespaces.zope.org/zope"
- xmlns:z3c="http://namespaces.zope.org/z3c">
-
- <includeDependencies package="z3ext.layoutform" />
-
- <include package=".browser" />
-
-</configure>
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/configure.zcml (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/configure.zcml)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/configure.zcml (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/configure.zcml 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,19 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:z3c="http://namespaces.zope.org/z3c">
+
+ <includeDependencies package="z3ext.layoutform" />
+
+ <!-- form error status message -->
+ <utility
+ name="formError"
+ provides="z3ext.statusmessage.interfaces.IMessageFactory"
+ component=".error.FormErrorStatusMessage" />
+
+ <class class=".error.FormErrorStatusMessage">
+ <allow interface=".interfaces.IFormErrorStatusMessage" />
+ </class>
+
+ <include package=".browser" />
+
+</configure>
Deleted: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/edit.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/edit.py 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/edit.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -1,55 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2008 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-
-$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 z3c.form import form, button
-from z3ext.statusmessage.interfaces import IStatusMessage
-
-from form import PageletForm
-from interfaces import _, IPageletEditForm, ISaveButton
-
-
-class PageletEditForm(form.EditForm, PageletForm):
- interface.implements(IPageletEditForm)
-
- render = PageletForm.render
- __call__ = PageletForm.__call__
-
- @button.buttonAndHandler(
- _(u'Save'), name='save', provides=ISaveButton)
- def handleApply(self, action):
- data, errors = self.extractData()
- if errors:
- IStatusMessage(self.request).add(self.formErrorsMessage, 'warning')
- else:
- changes = self.applyChanges(data)
- if changes:
- IStatusMessage(self.request).add(self.successMessage)
- else:
- IStatusMessage(self.request).add(self.noChangesMessage)
-
- nextURL = self.nextURL()
- if nextURL:
- self.redirect(nextURL)
-
- def nextURL(self):
- return ''
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/edit.py (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/edit.py)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/edit.py (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/edit.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,56 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$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 z3c.form import form, button
+from z3ext.statusmessage.interfaces import IStatusMessage
+
+from form import PageletForm
+from interfaces import _, IPageletEditForm, ISaveButton
+
+
+class PageletEditForm(form.EditForm, PageletForm):
+ interface.implements(IPageletEditForm)
+
+ render = PageletForm.render
+ __call__ = PageletForm.__call__
+
+ @button.buttonAndHandler(
+ _(u'Save'), name='save', provides=ISaveButton)
+ def handleApply(self, action):
+ data, errors = self.extractData()
+ if errors:
+ IStatusMessage(self.request).add(
+ (self.formErrorsMessage,) + errors, 'formError')
+ else:
+ changes = self.applyChanges(data)
+ if changes:
+ IStatusMessage(self.request).add(self.successMessage)
+ else:
+ IStatusMessage(self.request).add(self.noChangesMessage)
+
+ nextURL = self.nextURL()
+ if nextURL:
+ self.redirect(nextURL)
+
+ def nextURL(self):
+ return ''
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/error.py (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/error.py)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/error.py (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/error.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,29 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id: 2007-12-12 12:27:02Z fafhrd $
+"""
+from zope import interface
+from z3ext.statusmessage.message import Message
+
+from interfaces import IFormErrorStatusMessage
+
+
+class FormErrorStatusMessage(Message):
+ interface.implements(IFormErrorStatusMessage)
+
+ def __init__(self, message):
+ self.message = message[0]
+ self.errors = [err for err in message[1:] if err.widget is None]
Deleted: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/interfaces.py
===================================================================
--- z3ext.layoutform/trunk/src/z3ext/layoutform/interfaces.py 2008-10-07 15:26:40 UTC (rev 91853)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/interfaces.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -1,73 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2008 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" z3ext.layoutform interfaces
-
-$Id$
-"""
-from zope import interface
-from zope.i18nmessageid import MessageFactory
-from z3c.form.interfaces import IFormLayer
-from z3ext.layout.interfaces import IPagelet
-
-_ = MessageFactory('z3ext')
-
-
-class ILayoutFormLayer(IFormLayer):
- """ browser layer """
-
-
-class IPageletFormView(IPagelet):
- """ pagelet form view """
-
-
-class IPageletForm(IPagelet):
- """Form mixin for pagelet implementation."""
-
- label = interface.Attribute('Form label')
-
- description = interface.Attribute('Form label')
-
-
-class IPageletAddForm(IPageletForm):
- """Add form mixin for pagelet implementation."""
-
- formCancelMessage = interface.Attribute('Form cancel message')
-
- def nextURL():
- """ as next url use newly created content url """
-
- def cancelURL():
- """ cancel url """
-
- def nameAllowed():
- """Return whether names can be input by the user."""
-
-
-class IPageletEditForm(IPageletForm):
- """Edit form mixin for pagelet implementation."""
-
- def nextURL():
- """ as next url use newly created content url """
-
-
-class IAddButton(interface.Interface):
- """ add button """
-
-
-class ISaveButton(interface.Interface):
- """ save button """
-
-
-class ICancelButton(interface.Interface):
- """ cancel button """
Copied: z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/interfaces.py (from rev 91880, z3ext.layoutform/trunk/src/z3ext/layoutform/interfaces.py)
===================================================================
--- z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/interfaces.py (rev 0)
+++ z3ext.layoutform/tags/1.2.1/src/z3ext/layoutform/interfaces.py 2008-10-07 19:46:59 UTC (rev 91881)
@@ -0,0 +1,78 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" z3ext.layoutform interfaces
+
+$Id$
+"""
+from zope import interface
+from zope.i18nmessageid import MessageFactory
+from z3c.form.interfaces import IFormLayer
+from z3ext.layout.interfaces import IPagelet
+from z3ext.statusmessage.interfaces import IMessage
+
+_ = MessageFactory('z3ext')
+
+
+class ILayoutFormLayer(IFormLayer):
+ """ browser layer """
+
+
+class IPageletFormView(IPagelet):
+ """ pagelet form view """
+
+
+class IPageletForm(IPagelet):
+ """Form mixin for pagelet implementation."""
+
+ label = interface.Attribute('Form label')
+
+ description = interface.Attribute('Form label')
+
+
+class IPageletAddForm(IPageletForm):
+ """Add form mixin for pagelet implementation."""
+
+ formCancelMessage = interface.Attribute('Form cancel message')
+
+ def nextURL():
+ """ as next url use newly created content url """
+
+ def cancelURL():
+ """ cancel url """
+
+ def nameAllowed():
+ """Return whether names can be input by the user."""
+
+
+class IPageletEditForm(IPageletForm):
+ """Edit form mixin for pagelet implementation."""
+
+ def nextURL():
+ """ as next url use newly created content url """
+
+
+class IAddButton(interface.Interface):
+ """ add button """
+
+
+class ISaveButton(interface.Interface):
+ """ save button """
+
+
+class ICancelButton(interface.Interface):
+ """ cancel button """
+
+
+class IFormErrorStatusMessage(IMessage):
+ """ form error status message """
More information about the Checkins
mailing list