[Checkins] SVN: megrok.z3cform.base/trunk/src/megrok/z3cform/base/ Added a nice way for working with cancel buttons
Christian Klinger
cklinger at novareto.de
Tue Sep 15 06:12:26 EDT 2009
Log message for revision 104026:
Added a nice way for working with cancel buttons
Changed:
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/handlers.py
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/ftesting.zcml
U megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_button.py
-=-
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py 2009-09-15 10:12:25 UTC (rev 104026)
@@ -9,7 +9,7 @@
# Public interface
from utils import apply_data_event
-from interfaces import IGrokForm
+from interfaces import IGrokForm, ICancelButton
from directives import field, cancellable
from components import Form, AddForm, EditForm, DisplayForm, WidgetTemplate
from components import PageForm, PageAddForm, PageEditForm, PageDisplayForm
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py 2009-09-15 10:12:25 UTC (rev 104026)
@@ -7,21 +7,21 @@
scope = martian.CLASS
store = martian.ONCE
default = None
- validate = validateInterfaceOrClass
+ validate = martian.validateInterfaceOrClass
class mode(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
default = interfaces.INPUT_MODE
- validate = validateText
+ validate = martian.validateText
class widget(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
default = None
- validate = validateInterfaceOrClass
+ validate = martian.validateInterfaceOrClass
class cancellable(martian.Directive):
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/handlers.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/handlers.py 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/handlers.py 2009-09-15 10:12:25 UTC (rev 104026)
@@ -11,9 +11,9 @@
from zope.traversing.browser import AbsoluteURL
from megrok.z3cform.base import button, IGrokForm
-from megrok.z3cform.layout import cancellable, ICancelButton
+from megrok.z3cform.base import cancellable, ICancelButton
-_ = MessageFactory("dolmen")
+_ = MessageFactory("megrok.z3cform")
class CancelButton(button.Button):
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py 2009-09-15 10:12:25 UTC (rev 104026)
@@ -1,9 +1,14 @@
# -*- coding: utf-8 -*-
-from z3c.form.interfaces import IButtonForm, IHandlerForm
+from z3c.form.interfaces import IButtonForm, IHandlerForm, IButton
class IGrokForm(IButtonForm, IHandlerForm):
"""A grok z3c form. This marker interface is used to have a
different default template.
"""
+
+
+class ICancelButton(IButton):
+ """A button to cancel a form.
+ """
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml 2009-09-15 10:12:25 UTC (rev 104026)
@@ -7,6 +7,7 @@
<include package="megrok.layout" file="meta.zcml" />
<grok:grok package=".meta" />
+ <grok:grok package=".handlers" />
</configure>
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py 2009-09-15 10:12:25 UTC (rev 104026)
@@ -3,7 +3,7 @@
from zope.app.testing.functional import ZCMLLayer
ftesting_zcml = os.path.join(
- os.path.dirname(megrok.z3cform.base.tests.__file__),
+ os.path.dirname(__file__),
'ftesting.zcml'
)
FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__, 'FunctionalLayer',
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/ftesting.zcml
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/ftesting.zcml 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/ftesting.zcml 2009-09-15 10:12:25 UTC (rev 104026)
@@ -13,6 +13,7 @@
<include package="megrok.z3cform.base" file="default_form_layer.zcml" />
<grok:grok package="megrok.z3cform.base.tests" />
+ <grok:grok package="megrok.z3cform.base.ftests" />
<securityPolicy
component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy"
Modified: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_button.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_button.py 2009-09-15 09:54:27 UTC (rev 104025)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_button.py 2009-09-15 10:12:25 UTC (rev 104026)
@@ -1,31 +1,95 @@
"""
-As it's a martian directive, it's inherited :
+The Cancel Button
+=================
- >>> class AnotherForm(Add):
- ... context(Interface)
+We include with megrok.z3cform per default a Cancel Button.
+This test will demonstrate that we will get a this Cancel
+Button on our Form and how we can get rid of it.
+
+
+Setup
+-----
+
+Let's start with a simple example. We create a person object:
+
+ >>> from zope.interface import Interface, implements
+ >>> from zope.schema import TextLine
+
+The Interface of our Object:
+
+ >>> class IPerson(Interface):
+ ... name = TextLine(title = u'Name')
+ ... age = TextLine(title = u'Age')
+
+The class of our Object:
+
+ >>> class Person(object):
+ ... implements(IPerson)
+ ... name = u""
+ ... age = u""
+
+Now we create an Edit Form for the Person
+-----------------------------------------
+
+ >>> from megrok.z3cform.base import EditForm, Fields, cancellable
+ >>> from grokcore.component.testing import grok_component
+ >>> from zope.component import getMultiAdapter
+ >>> from zope.publisher.browser import TestRequest
+ >>> import grokcore.component
+
+ >>> peter = Person()
+ >>> request = TestRequest()
+
+ >>> class PersonEditForm(EditForm):
+ ... grokcore.component.context(Interface)
... fields = Fields(IPerson)
- >>> grok_component('anotherform', AnotherForm)
+ >>> grok_component('personeditform', PersonEditForm)
True
- >>> anotherform = getMultiAdapter((peter, request), name="anotherform")
- >>> "form.buttons.cancel" in anotherform()
- True
+Let's call the view and look on the buttons,
+we should get two buttons.
+ >>> personeditform = getMultiAdapter((peter, request), name="personeditform")
+ >>> personeditform.update()
+ >>> personeditform.updateForm()
+ >>> cancel = personeditform.buttons.get('cancel')
+ >>> cancel.condition(personeditform)
+ False
+ >>> personeditform.buttons.keys()
+ ['apply', 'cancel']
+
+
If you need to explicitly remove the use of a Cancel button from a
form, you can remove it by declaring the cancellable directive set to False:
- >>> class YetAnotherForm(Add):
- ... context(Interface)
- ... cancellable(False)
+ >>> class YetAnotherForm(EditForm):
+ ... grokcore.component.context(Interface)
+ ... cancellable(True)
... fields = Fields(IPerson)
>>> grok_component('yetanotherform', YetAnotherForm)
True
+Again call the form and look on the buttons.
+There should be no Cancel button in it.
+
>>> yetanotherform = getMultiAdapter((peter, request),
... name="yetanotherform")
- >>> "form.buttons.cancel" in yetanotherform()
- False
+ >>> yetanotherform.update()
+ >>> yetanotherform.updateForm()
+ >>> cancel = yetanotherform.buttons.get('cancel')
+ >>> cancel.condition(yetanotherform)
+ True
+
"""
+
+
+def test_suite():
+ from zope.testing import doctest
+ from megrok.z3cform.base.tests import FunctionalLayer
+ suite = doctest.DocTestSuite(optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+ suite.layer = FunctionalLayer
+ return suite
+
More information about the checkins
mailing list