[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