[Checkins] SVN: z3ext.layout/trunk/ - Register nameless pagelet only if provided interface is not

Nikolay Kim fafhrd at datacom.kz
Thu Nov 6 04:21:18 EST 2008


Log message for revision 92803:
  - Register nameless pagelet only if provided interface is not
  inherited from IBrowserPublisher
  
  

Changed:
  U   z3ext.layout/trunk/CHANGES.txt
  U   z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
  U   z3ext.layout/trunk/src/z3ext/layout/zcml.py

-=-
Modified: z3ext.layout/trunk/CHANGES.txt
===================================================================
--- z3ext.layout/trunk/CHANGES.txt	2008-11-05 21:48:13 UTC (rev 92802)
+++ z3ext.layout/trunk/CHANGES.txt	2008-11-06 09:21:16 UTC (rev 92803)
@@ -2,6 +2,13 @@
 CHANGES
 =======
 
+1.5.6 (2008-11-06)
+------------------
+
+- Register nameless pagelet only if provided interface is not
+inherited from IBrowserPublisher
+
+
 1.5.5 (2008-11-05)
 ------------------
 

Modified: z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.txt	2008-11-05 21:48:13 UTC (rev 92802)
+++ z3ext.layout/trunk/src/z3ext/layout/pagelet.txt	2008-11-06 09:21:16 UTC (rev 92803)
@@ -8,6 +8,7 @@
   >>> import os, tempfile
   >>> from zope import interface, component
   >>> from zope.configuration import xmlconfig
+  >>> from z3ext.layout.interfaces import IPagelet
   >>> import z3ext.layout
   >>> context = xmlconfig.file('meta.zcml', z3ext.layout)
 
@@ -100,7 +101,7 @@
   ...       name="new.html"
   ...       class="z3ext.layout.TESTS.NewPagelet"
   ...       permission="zope.Public"
-  ... provides="z3ext.layout.TESTS.INewPagelet" />
+  ...       provides="z3ext.layout.TESTS.INewPagelet" />
   ... </configure>
   ... """, context)
 
@@ -298,11 +299,66 @@
 
   >>> component.provideUtility(
   ...     ITestPagelet, z3ext.layout.interfaces.IPageletType, name='testPageletType')
+  >>> interface.alsoProvides(ITestPagelet, z3ext.layout.interfaces.IPageletType)
 
   >>> print pagelet.publishTraverse(request, 'testPageletType')
   <div>My pagelet</div>
 
+We can register nameless pagelet only if provided interface is not
+inherited from IBrowserPublisher, because we can override
+IBrowserPublisher for content.
 
+  >>> class IWrongPageletInterface(IPagelet):
+  ...     pass
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       template="%s"
+  ...       provides="z3ext.layout.TESTS.IWrongPageletInterface"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+  Traceback (most recent call last):
+  ...
+  ZopeXMLConfigurationError:...
+      ConfigurationError: You can't register nameless pagelet...
+
+If we still need nameless adapter we can use IPagelet interface
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="z3ext.layout.TESTS.IContent"
+  ...       template="%s"
+  ...       provides="z3ext.layout.interfaces.IPagelet"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+
+
+If we register named pagelet and provided interface provides IPageletType,
+also nameless adapter registered
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       name="test.html"
+  ...       for="z3ext.layout.TESTS.IContent"
+  ...       template="%s"
+  ...       provides="z3ext.layout.TESTS.ITestPagelet"
+  ...       permission="zope.Public" />
+  ... </configure>
+  ... """%template, context)
+
+  >>> content = Content()
+  >>> pagelet1 = component.getMultiAdapter((content, request), name='test.html')
+  >>> pagelet2 = component.getMultiAdapter((content, request), ITestPagelet)
+
+  >>> pagelet1.__class__ is pagelet2.__class__
+  True
+
+
 The TALES `pagelet` expression
 ==============================
 

Modified: z3ext.layout/trunk/src/z3ext/layout/zcml.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/zcml.py	2008-11-05 21:48:13 UTC (rev 92802)
+++ z3ext.layout/trunk/src/z3ext/layout/zcml.py	2008-11-06 09:21:16 UTC (rev 92803)
@@ -22,6 +22,7 @@
 from zope.security.checker import defineChecker, Checker, CheckerPublic
 from zope.configuration.fields import Path, Tokens, GlobalObject, GlobalInterface
 from zope.configuration.exceptions import ConfigurationError
+from zope.publisher.interfaces.browser import IBrowserPublisher
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 from zope.app.component.metadirectives import IBasicViewInformation
 from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
@@ -301,17 +302,33 @@
 
     new_class = type('PageletClass from %s'%class_, bases, cdict)
 
+    # check name
+    if not name:
+        for iface in provides:
+            # allow register nameless pagelet as IPagelet
+            if iface is IPagelet:
+                continue
+
+            if iface.isOrExtends(IBrowserPublisher):
+                raise ConfigurationError(
+                    "You can't register nameless pagelet, "\
+                    "interface '%s' is or extends IBrowserPublisher"%iface)
+
     # add IPagelet to provides
-    inProvides = False
-    for iface in provides:
-        if IPagelet.isOrExtends(iface) and not IPageletType.providedBy(iface):
-            inProvides = True
+    if name:
+        inProvides = False
+        for iface in provides:
+            if IPagelet.isOrExtends(iface) and not IPageletType.providedBy(iface):
+                inProvides = True
 
-    if not inProvides:
-        provides.append(IPagelet)
+        if not inProvides:
+            provides.append(IPagelet)
 
     # prepare allowed interfaces and attributes
     allowed_interface.extend(provides)
+    if IPagelet not in provides:
+        allowed_interface.append(IPagelet)
+
     allowed_attributes.extend(kwargs.keys())
     allowed_attributes.extend(('__call__', 'browserDefault',
                                'update', 'render', 'publishTraverse'))



More information about the Checkins mailing list