[Checkins] SVN: z3c.ptcompat/trunk/ - Added support for browser:addform, browser:editform, browser:form,

Sidnei da Silva sidnei at enfoldsystems.com
Mon Mar 9 13:08:07 EDT 2009


Log message for revision 97710:
  - Added support for browser:addform, browser:editform, browser:form,
    and browser:schemadisplay directives.
  
  

Changed:
  U   z3c.ptcompat/trunk/CHANGES.txt
  U   z3c.ptcompat/trunk/src/z3c/ptcompat/meta.zcml
  U   z3c.ptcompat/trunk/src/z3c/ptcompat/tests/test_doctests.py
  U   z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.py
  U   z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.txt

-=-
Modified: z3c.ptcompat/trunk/CHANGES.txt
===================================================================
--- z3c.ptcompat/trunk/CHANGES.txt	2009-03-09 16:19:10 UTC (rev 97709)
+++ z3c.ptcompat/trunk/CHANGES.txt	2009-03-09 17:08:06 UTC (rev 97710)
@@ -6,6 +6,8 @@
 
 - Nothing changed yet.
 
+- Added support for browser:addform, browser:editform, browser:form,
+  and browser:schemadisplay directives.
 
 0.5.2 (2009-03-09)
 ------------------

Modified: z3c.ptcompat/trunk/src/z3c/ptcompat/meta.zcml
===================================================================
--- z3c.ptcompat/trunk/src/z3c/ptcompat/meta.zcml	2009-03-09 16:19:10 UTC (rev 97709)
+++ z3c.ptcompat/trunk/src/z3c/ptcompat/meta.zcml	2009-03-09 17:08:06 UTC (rev 97710)
@@ -18,13 +18,82 @@
        schema="zope.viewlet.metadirectives.IViewletDirective"
        handler=".zcml.viewlet_directive"
        />
-    
+
     <meta:directive
        name="viewletManager"
        schema="zope.viewlet.metadirectives.IViewletManagerDirective"
        handler=".zcml.viewlet_manager_directive"
        />
 
+
+    <meta:complexDirective
+        name="form"
+        schema="zope.app.form.browser.metadirectives.IFormDirective"
+        handler=".zcml.FormDirective"
+        >
+
+      <meta:subdirective
+          name="widget"
+          schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
+          />
+
+    </meta:complexDirective>
+
+
+    <meta:complexDirective
+        name="editform"
+        schema="zope.app.form.browser.metadirectives.IEditFormDirective"
+        handler=".zcml.EditFormDirective"
+        >
+
+      <meta:subdirective
+          name="widget"
+          schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
+          />
+
+    </meta:complexDirective>
+
+
+    <meta:complexDirective
+        name="subeditform"
+        schema="zope.app.form.browser.metadirectives.ISubeditFormDirective"
+        handler=".zcml.SubeditFormDirective"
+        >
+
+      <meta:subdirective
+          name="widget"
+          schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
+          />
+
+    </meta:complexDirective>
+
+
+    <meta:complexDirective
+        name="addform"
+        schema="zope.app.form.browser.metadirectives.IAddFormDirective"
+        handler=".zcml.AddFormDirective"
+        >
+
+      <meta:subdirective
+          name="widget"
+          schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
+          />
+
+    </meta:complexDirective>
+
+
+    <meta:complexDirective
+        name="schemadisplay"
+        schema="zope.app.form.browser.metadirectives.ISchemaDisplayDirective"
+        handler=".zcml.SchemaDisplayDirective">
+
+      <meta:subdirective
+          name="widget"
+          schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
+          />
+
+    </meta:complexDirective>
+
   </meta:directives>
 
 </configure>

Modified: z3c.ptcompat/trunk/src/z3c/ptcompat/tests/test_doctests.py
===================================================================
--- z3c.ptcompat/trunk/src/z3c/ptcompat/tests/test_doctests.py	2009-03-09 16:19:10 UTC (rev 97709)
+++ z3c.ptcompat/trunk/src/z3c/ptcompat/tests/test_doctests.py	2009-03-09 17:08:06 UTC (rev 97710)
@@ -11,6 +11,7 @@
 import zope.component.testing
 import zope.configuration.xmlconfig
 
+import z3c.pt
 import z3c.ptcompat
 
 class TestParticipation(object):
@@ -21,7 +22,7 @@
     zope.component.testing.setUp(test)
     zope.configuration.xmlconfig.XMLConfig('meta.zcml', z3c.ptcompat)()
     zope.configuration.xmlconfig.XMLConfig('configure.zcml', z3c.pt)()
-    
+
 def tearDown(test):
     zope.component.testing.tearDown(test)
 

Modified: z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.py
===================================================================
--- z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.py	2009-03-09 16:19:10 UTC (rev 97709)
+++ z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.py	2009-03-09 17:08:06 UTC (rev 97710)
@@ -1,4 +1,5 @@
 import sys
+from new import function
 
 from zope.interface import classImplements
 from zope.viewlet import viewlet
@@ -7,9 +8,22 @@
 from zope.viewlet.interfaces import IViewletManager
 from zope.app.publisher.browser import viewmeta
 from zope.app.pagetemplate import simpleviewclass
+from zope.app.form.browser import metaconfigure as formmeta
 
 from z3c.ptcompat import ViewPageTemplateFile
 
+def clone_and_replace_globals(func, new_globals):
+    func_globals = func.func_globals.copy()
+    func_globals.update(new_globals)
+    func_defaults = func.func_defaults or ()
+    new_func = function(func.func_code, func_globals,
+                        func.func_name, func_defaults)
+    new_func.__doc__ = getattr(func, '__doc__', '')
+    func_dict = getattr(func, '__dict__', None)
+    if func_dict is not None:
+        new_func.__dict__ = func_dict.copy()
+    return new_func
+
 def SimpleViewClass(src, offering=None, used_for=None, bases=(), name=u''):
     if offering is None:
         offering = sys._getframe(1).f_globals
@@ -25,7 +39,8 @@
 
     return class_
 
-def SimpleViewletClass(src, offering=None, bases=(), attributes=None, name=u''):
+def SimpleViewletClass(src, offering=None, bases=(),
+                       attributes=None, name=u''):
     if offering is None:
         offering = sys._getframe(1).f_globals
 
@@ -65,9 +80,10 @@
 
     if template:
         bases = class_ and (class_,) or ()
-        kwargs['class_'] = SimpleViewClass(str(template), bases=bases, name=name)
+        kwargs['class_'] = SimpleViewClass(str(template), bases=bases,
+                                           name=name)
         del kwargs['template']
-        
+
     return viewmeta.page(_context, name, *args, **kwargs)
 
 def viewlet_directive(_context, name, *args, **kwargs):
@@ -76,20 +92,64 @@
 
     if template:
         bases = class_ and (class_,) or ()
-        kwargs['class_'] = SimpleViewletClass(str(template), bases=bases, name=name)
+        kwargs['class_'] = SimpleViewletClass(str(template),
+                                              bases=bases, name=name)
         del kwargs['template']
-        
+
     return viewletmeta.viewletDirective(_context, name, *args, **kwargs)
 
 def viewlet_manager_directive(_context, name, *args, **kwargs):
     class_ = kwargs.get('class_')
     template = kwargs.get('template')
     provides = kwargs.setdefault('provides', IViewletManager)
-    
+
     if template:
         bases = class_ and (class_,) or ()
         kwargs['class_'] = ViewletManager(
             name, provides, template=str(template), bases=bases)
         del kwargs['template']
-        
+
     return viewletmeta.viewletManagerDirective(_context, name, *args, **kwargs)
+
+# Replace globals in *Factory by the ones from our package, cloning
+# the existing functions so we don't have to re-define them.
+new_factory_globals = dict(ViewPageTemplateFile=ViewPageTemplateFile,
+                           SimpleViewClass=SimpleViewClass)
+
+AddViewFactory = clone_and_replace_globals(formmeta.AddViewFactory,
+                                           new_factory_globals)
+EditViewFactory = clone_and_replace_globals(formmeta.EditViewFactory,
+                                            new_factory_globals)
+DisplayViewFactory = clone_and_replace_globals(formmeta.DisplayViewFactory,
+                                               new_factory_globals)
+
+# Now, replace globals in the directive handlers' __call__ by our own
+# factories that were cloned right above.
+new_form_globals = dict(AddViewFactory=AddViewFactory,
+                        EditViewFactory=EditViewFactory,
+                        DisplayViewFactory=DisplayViewFactory)
+
+class AddFormDirective(formmeta.AddFormDirective):
+    __call__ = clone_and_replace_globals(
+        formmeta.AddFormDirective.__call__.im_func,
+        new_form_globals)
+
+class EditFormDirective(formmeta.EditFormDirective):
+    __call__ = clone_and_replace_globals(
+        formmeta.EditFormDirective.__call__.im_func,
+        new_form_globals)
+
+class FormDirective(formmeta.FormDirective):
+    __call__ = clone_and_replace_globals(
+        formmeta.FormDirective.__call__.im_func,
+        new_form_globals)
+
+class SubeditFormDirective(formmeta.SubeditFormDirective):
+    __call__ = clone_and_replace_globals(
+        formmeta.SubeditFormDirective.__call__.im_func,
+        new_form_globals)
+
+class SchemaDisplayDirective(formmeta.SchemaDisplayDirective):
+    __call__ = clone_and_replace_globals(
+        formmeta.SchemaDisplayDirective.__call__.im_func,
+        new_form_globals)

Modified: z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.txt
===================================================================
--- z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.txt	2009-03-09 16:19:10 UTC (rev 97709)
+++ z3c.ptcompat/trunk/src/z3c/ptcompat/zcml.txt	2009-03-09 17:08:06 UTC (rev 97710)
@@ -48,6 +48,215 @@
   >>> issubclass(factory, View)
   True
 
+Forms
+=====
+
+Define a simple schema that we will use for those directives:
+
+  >>> from zope.interface import Interface
+  >>> from zope.schema import TextLine
+
+  >>> class Schema(Interface):
+  ...     title = TextLine(title=u'Some Title')
+
+
+Add Form
+--------
+
+  >>> from z3c.ptcompat import zcml
+  >>> zcml.AddFormDirective(
+  ...    context, name="add-test1", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+
+  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="add-test1")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+We can base the view on an existing class.
+
+  >>> class View(object):
+  ...     pass
+
+  >>> zcml.AddFormDirective(
+  ...    context, name="add-test2", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    class_=View, template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="add-test2")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+  >>> issubclass(factory, View)
+  True
+
+Edit Form
+---------
+
+  >>> from z3c.ptcompat import zcml
+  >>> zcml.EditFormDirective(
+  ...    context, name="edit-test1", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+
+  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="edit-test1")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+We can base the view on an existing class.
+
+  >>> class View(object):
+  ...     pass
+
+  >>> zcml.EditFormDirective(
+  ...    context, name="edit-test2", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    class_=View, template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="edit-test2")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+  >>> issubclass(factory, View)
+  True
+
+Subedit Form
+------------
+
+  >>> from z3c.ptcompat import zcml
+  >>> zcml.SubeditFormDirective(
+  ...    context, name="subedit-test1", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+
+  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="subedit-test1")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+We can base the view on an existing class.
+
+  >>> class View(object):
+  ...     pass
+
+  >>> zcml.SubeditFormDirective(
+  ...    context, name="subedit-test2", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    class_=View, template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="subedit-test2")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+  >>> issubclass(factory, View)
+  True
+
+Form
+----
+
+We can base the view on an existing class.
+
+  >>> class View(object):
+  ...     pass
+
+  >>> zcml.FormDirective(
+  ...    context, name="form-test2", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    class_=View, template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="form-test2")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+  >>> issubclass(factory, View)
+  True
+
+Schema Display
+--------------
+
+  >>> from z3c.ptcompat import zcml
+  >>> zcml.SchemaDisplayDirective(
+  ...    context, name="schema-display-test1", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+
+  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="schema-display-test1")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+We can base the view on an existing class.
+
+  >>> class View(object):
+  ...     pass
+
+  >>> zcml.SchemaDisplayDirective(
+  ...    context, name="schema-display-test2", permission="zope.View",
+  ...    schema=Schema, for_=Schema,
+  ...    class_=View, template=os.path.join(path, "test.pt"))()
+
+  >>> context.execute_actions()
+
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (Schema, IDefaultBrowserLayer),
+  ...     interface.Interface, name="schema-display-test2")
+
+  >>> factory.index
+  <ViewPageTemplateFile .../z3c.ptcompat/src/z3c/ptcompat/tests/test.pt>
+
+  >>> issubclass(factory, View)
+  True
+
 Viewlet managers
 ----------------
 



More information about the Checkins mailing list