[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