[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