[Checkins] SVN: z3ext.layout/trunk/ Use '+' for named pagelet instead of '; '
Nikolay Kim
fafhrd91 at gmail.com
Thu Jul 9 04:40:33 EDT 2009
Log message for revision 101761:
Use '+' for named pagelet instead of ';'
Changed:
U z3ext.layout/trunk/CHANGES.txt
U z3ext.layout/trunk/src/z3ext/layout/configure.zcml
U z3ext.layout/trunk/src/z3ext/layout/expressions.py
U z3ext.layout/trunk/src/z3ext/layout/interfaces.py
U z3ext.layout/trunk/src/z3ext/layout/pagelet.py
U z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
U z3ext.layout/trunk/src/z3ext/layout/tales.py
U z3ext.layout/trunk/src/z3ext/layout/tests.py
-=-
Modified: z3ext.layout/trunk/CHANGES.txt
===================================================================
--- z3ext.layout/trunk/CHANGES.txt 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/CHANGES.txt 2009-07-09 08:40:33 UTC (rev 101761)
@@ -9,7 +9,9 @@
- Do not use metal in default layouts
+- Use '+' for named pagelet instead of ';'
+
2.1.0 (2009-06-20)
------------------
Modified: z3ext.layout/trunk/src/z3ext/layout/configure.zcml
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/configure.zcml 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/src/z3ext/layout/configure.zcml 2009-07-09 08:40:33 UTC (rev 101761)
@@ -14,8 +14,13 @@
interface="z3ext.layout.interfaces.ILayoutView" />
<!-- adapter provides IPagelet for (context, request) -->
- <adapter factory=".pagelet.queryPagelet" />
+ <adapter factory=".pagelet.queryDefaultView" />
+ <!-- pagelet: chameleon expression -->
+ <utility
+ name="pagelet"
+ factory=".expressions.PageletTranslator" />
+
<!-- pagelet: tales expression -->
<tales:expressiontype
name="pagelet"
@@ -70,11 +75,6 @@
class=".layoutportal.DefaultLayoutPortal"
template="layoutportal.pt" />
- <!-- pagelet: expression for chameleon -->
- <utility
- name="pagelet"
- factory=".expressions.PageletTranslator" />
-
<!-- Registering documentation with API doc -->
<configure
xmlns:zcml="http://namespaces.zope.org/zcml"
Modified: z3ext.layout/trunk/src/z3ext/layout/expressions.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/expressions.py 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/src/z3ext/layout/expressions.py 2009-07-09 08:40:33 UTC (rev 101761)
@@ -28,16 +28,11 @@
class PageletTranslator(expressions.ExpressionTranslator):
- provider_regex = re.compile(r'^[A-Za-z][A-Za-z0-9_\.-;:]*$')
symbol = '_get_z3ext_pagelet'
pagelet_traverser = PageletTraverser()
def translate(self, string, escape=None):
- if self.provider_regex.match(string) is None:
- raise SyntaxError(
- "%s is not a valid content provider name." % string)
-
value = types.value("%s(context, request, view, '%s')" % \
(self.symbol, string))
value.symbol_mapping[self.symbol] = self.pagelet_traverser
Modified: z3ext.layout/trunk/src/z3ext/layout/interfaces.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/interfaces.py 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/src/z3ext/layout/interfaces.py 2009-07-09 08:40:33 UTC (rev 101761)
@@ -43,7 +43,13 @@
def render():
"""Render the pagelet content w/o o-wrap."""
+ def updateAndRender():
+ """Update pagelet and render. Prefered way to render pagelet."""
+ def isAvailable():
+ """Is available"""
+
+
class IPageletType(interface.interfaces.IInterface):
""" pagelet interface type """
Modified: z3ext.layout/trunk/src/z3ext/layout/pagelet.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.py 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/src/z3ext/layout/pagelet.py 2009-07-09 08:40:33 UTC (rev 101761)
@@ -15,6 +15,8 @@
$Id$
"""
+from datetime import datetime
+
import logging, sys
from zope import interface, component
from zope.component import queryUtility, queryAdapter, queryMultiAdapter
@@ -27,16 +29,6 @@
from interfaces import ILayout, IPagelet, IPageletType, IPageletContext
- at interface.implementer(IPagelet)
- at component.adapter(interface.Interface, interface.Interface)
-def queryPagelet(context, request):
- name = queryDefaultViewName(context, request, None)
- if name:
- view = queryMultiAdapter((context, request), name=name)
- if IPagelet.providedBy(view):
- return view
-
-
def queryLayout(view, request, context=None, iface=ILayout, name=''):
if context is None:
context = view.context
@@ -51,11 +43,60 @@
return None
+def queryPagelet(context, request, name, modules=SimpleModuleImporter()):
+ pageletName = u''
+
+ if name:
+ splited = name.split(u'+', 1)
+ if len(splited) > 1:
+ name, pageletName = splited
+
+ if name:
+ iface = queryUtility(IPageletType, name)
+ else:
+ iface = IPagelet
+
+ if iface is None:
+ try:
+ iface, iname = name.rsplit('.', 1)
+ iface = getattr(modules[iface], iname)
+ except:
+ raise KeyError(name)
+ else:
+ iface = IPagelet
+
+ if iface.providedBy(context):
+ return context
+
+ contexts = queryAdapter(context, IPageletContext, name)
+ if contexts is not None:
+ required = [context]
+ if type(contexts) in (list, tuple):
+ required.extend(contexts)
+ else:
+ required.append(contexts)
+ required.append(request)
+ return queryMultiAdapter(required, iface, pageletName)
+ else:
+ return queryMultiAdapter((context, request), iface, pageletName)
+
+
+ at interface.implementer(IPagelet)
+ at component.adapter(interface.Interface, interface.Interface)
+def queryDefaultView(context, request):
+ name = queryDefaultViewName(context, request, None)
+ if name:
+ view = queryMultiAdapter((context, request), name=name)
+ if IPagelet.providedBy(view):
+ return view
+
+
class BrowserPagelet(BrowserPage):
interface.implements(IPagelet)
template = None
layoutname = u''
+ isRedirected = False
def __init__(self, context, *args):
request = args[-1]
@@ -82,6 +123,22 @@
return template.render()
raise LookupError("Can't find IPagelet for this pagelet.")
+ def updateAndRender(self):
+ self.update()
+ if self.isRedirected or not self.isAvailable():
+ return u''
+
+ return self.render()
+
+ def isAvailable(self):
+ return True
+
+ def redirect(self, url=''):
+ if url:
+ self.request.response.redirect(url)
+
+ self.isRedirected = True
+
def __call__(self, *args, **kw):
self.update()
@@ -95,15 +152,7 @@
else:
return layout()
- isRedirected = False
- def redirect(self, url=''):
- if url:
- self.request.response.redirect(url)
-
- self.isRedirected = True
-
-
class PageletPublisher(object):
interface.implements(IBrowserPublisher)
component.adapts(interface.Interface, interface.Interface)
@@ -113,7 +162,6 @@
def __init__(self, context, request):
self.context = context
self.request = request
- self.modules = SimpleModuleImporter()
def publishTraverse(self, request, name):
try:
@@ -132,59 +180,38 @@
return u''
def __getitem__(self, name):
- pageletName = u''
+ view = queryPagelet(self.context, self.request, name)
- if name:
- splited = name.split(u';', 1)
- if len(splited) > 1:
- name, pageletName = splited
+ if view is not None:
+ try:
+ dt = datetime.now()
+ rendered = view.updateAndRender()
- iface = queryUtility(IPageletType, name)
+ td = datetime.now() - dt
+ secs = (td.days*86400+td.seconds) + (0.000001*td.microseconds)
+ print >>sys.stderr, 'pagelet: ', secs, name
+ return rendered
+ except Exception, err:
+ log = logging.getLogger('z3ext.layout')
+ log.exception(err)
- if iface is None:
- try:
- iface, iname = name.rsplit('.', 1)
- iface = getattr(self.modules[iface], iname)
- except:
- raise KeyError(name)
- else:
- iface = IPagelet
+ raise KeyError(name)
- context = self.context
+ def browserDefault(self, request):
+ return self.context, ('',)
- if iface.providedBy(context):
- return context.render()
- contexts = queryAdapter(context, IPageletContext, name)
- if contexts is not None:
- required = [context]
- if type(contexts) in (list, tuple):
- required.extend(contexts)
- else:
- required.append(contexts)
- required.append(self.request)
- view = queryMultiAdapter(required, iface, pageletName)
- else:
- view = queryMultiAdapter((context, self.request), iface, pageletName)
+class PageletObjectPublisher(PageletPublisher):
+ def __getitem__(self, name):
+ view = queryPagelet(self.context, self.request, name)
+
if view is not None:
try:
view.update()
- if view.isRedirected:
- return u''
- if self.render:
- return view.render()
return view
except Exception, err:
log = logging.getLogger('z3ext.layout')
log.exception(err)
raise KeyError(name)
-
- def browserDefault(self, request):
- return self.context, ('',)
-
-
-class PageletObjectPublisher(PageletPublisher):
-
- render = False
Modified: z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.txt 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/src/z3ext/layout/pagelet.txt 2009-07-09 08:40:33 UTC (rev 101761)
@@ -487,26 +487,26 @@
Access typed pagelet from view
- >>> pagelet = component.getMultiAdapter((object(), request), name='pagelet')
+ >>> publisher = component.getMultiAdapter((object(), request), name='pagelet')
- >>> print pagelet.publishTraverse(
+ >>> print publisher.publishTraverse(
... request, 'test.unknown')
Traceback (most recent call last):
...
NotFound: Object: ..., name: 'test.unknown'
- >>> pagelet.browserDefault(request)
+ >>> publisher.browserDefault(request)
(..., ('',))
by default IPagelet
- >>> print pagelet()
+ >>> print publisher()
<div>My pagelet - default</div>
- >>> print pagelet.publishTraverse(request, '')
+ >>> print publisher.publishTraverse(request, '')
<div>My pagelet - default</div>
- >>> print pagelet.publishTraverse(
+ >>> print publisher.publishTraverse(
... request, 'z3ext.layout.tests.ITestPagelet')
<div>My pagelet</div>
@@ -517,7 +517,7 @@
... ITestPagelet, z3ext.layout.interfaces.IPageletType, name='testPageletType')
>>> interface.alsoProvides(ITestPagelet, z3ext.layout.interfaces.IPageletType)
- >>> print pagelet.publishTraverse(request, 'testPageletType')
+ >>> print publisher.publishTraverse(request, 'testPageletType')
<div>My pagelet</div>
We can provide additional context for pagelet
@@ -545,8 +545,8 @@
... permission="zope.Public" />
... </configure>"""%template41, context)
- >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
- >>> print pagelet.publishTraverse(request, 'myPagelet4')
+ >>> publisher = component.getMultiAdapter((Content(),request), name='pagelet')
+ >>> print publisher.publishTraverse(request, 'myPagelet4')
<div>My pagelet4</div>
Or multiple contexts
@@ -574,8 +574,8 @@
... permission="zope.Public" />
... </configure>"""%template5, context)
- >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
- >>> print pagelet.publishTraverse(request, 'myPagelet5')
+ >>> publisher = component.getMultiAdapter((Content(),request), name='pagelet')
+ >>> print publisher.publishTraverse(request, 'myPagelet5')
<div>My pagelet5</div>
We can use interface as pagelet 'type'
@@ -618,14 +618,14 @@
... </configure>"""%template7, context)
>>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
- >>> print pagelet.publishTraverse(request, 'myPagelet6;named')
+ >>> print pagelet.publishTraverse(request, 'myPagelet6+named')
<div>My pagelet7</div>
'pageletObject' - same as 'pagelet' but it doesnt call pagelet render
>>> pagelet=component.getMultiAdapter((Content(),request),name='pageletObject')
- >>> pob = pagelet.publishTraverse(request, 'myPagelet6;named')
+ >>> pob = pagelet.publishTraverse(request, 'myPagelet6+named')
>>> pob
<z3ext.layout.zcml.PageletClass from None object at ...>
>>> print pob.render()
@@ -684,7 +684,7 @@
Pagelets with errors
>>> class PageletWithError(object):
- ... def render(self):
+ ... def update(self):
... raise Exception('Error')
>>> context = xmlconfig.string("""
@@ -710,7 +710,14 @@
...
KeyError: 'myPagelet2'
+ >>> pagelet = component.getMultiAdapter(
+ ... (content, request), name='pageletObject')
+ >>> pagelet.publishTraverse(request, 'myPagelet2')
+ Traceback (most recent call last):
+ ...
+ NotFound: ...
+
The TALES `pagelet` expression
==============================
Modified: z3ext.layout/trunk/src/z3ext/layout/tales.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/tales.py 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/src/z3ext/layout/tales.py 2009-07-09 08:40:33 UTC (rev 101761)
@@ -15,64 +15,33 @@
$Id: tales.py 2720 2008-08-25 11:15:10Z fafhrd91 $
"""
+from datetime import datetime
import logging, sys
from zope.tales.expressions import StringExpr, SimpleModuleImporter
from zope.component import queryUtility, queryAdapter, queryMultiAdapter
+from pagelet import queryPagelet
from interfaces import IPagelet, IPageletType, IPageletContext
class PageletExpression(object):
def render(self, context, request, view, name):
- modules = SimpleModuleImporter()
-
- pageletName = u''
+ try:
+ pagelet = queryPagelet(context, request, name)
+ if pagelet is not None:
+ dt = datetime.now()
+ rendered = pagelet.updateAndRender()
- # lookup pagelet
- if name:
- splited = name.split(';', 1)
- if len(splited) > 1:
- name, pageletName = splited
+ td = datetime.now() - dt
+ secs = (td.days*86400+td.seconds) + (0.000001*td.microseconds)
+ print >>sys.stderr, 'pagelet: ', secs, name
+
+ return rendered
+ except Exception, err:
+ log = logging.getLogger('z3ext.layout')
+ log.exception(err)
- iface = queryUtility(IPageletType, name)
-
- if iface is None:
- try:
- iface, iname = name.rsplit('.', 1)
- iface = getattr(modules[iface], iname)
- except Exception, err:
- log = logging.getLogger('z3ext.layout')
- log.exception(err)
- return u''
- else:
- iface = IPagelet
-
- if iface.providedBy(context):
- return context.render()
-
- contexts = queryAdapter(context, IPageletContext, name)
- if contexts is not None:
- required = [context]
- if type(contexts) in (list, tuple):
- required.extend(contexts)
- else:
- required.append(contexts)
- required.append(request)
- view = queryMultiAdapter(required, iface, pageletName)
- else:
- view = queryMultiAdapter((context, request), iface, pageletName)
-
- if view is not None:
- try:
- view.update()
- if view.isRedirected:
- return u''
- return view.render()
- except Exception, err:
- log = logging.getLogger('z3ext.layout')
- log.exception(err)
-
return u''
Modified: z3ext.layout/trunk/src/z3ext/layout/tests.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/tests.py 2009-07-09 08:36:55 UTC (rev 101760)
+++ z3ext.layout/trunk/src/z3ext/layout/tests.py 2009-07-09 08:40:33 UTC (rev 101761)
@@ -51,7 +51,7 @@
root = setup.placefulSetUp(site=True)
root.__name__ = 'root'
test.globs['root'] = root
- component.provideAdapter(pagelet.queryPagelet)
+ component.provideAdapter(pagelet.queryDefaultView)
component.provideAdapter(pagelet.PageletPublisher, name='pagelet')
component.provideAdapter(pagelet.PageletObjectPublisher,name='pageletObject')
component.provideUtility(expressions.path_translator, name='path')
More information about the Checkins
mailing list