[Checkins] SVN: z3ext.layout/trunk/ extend @@pagelet view

Nikolay Kim fafhrd91 at gmail.com
Thu Jun 18 03:00:47 EDT 2009


Log message for revision 101116:
  extend @@pagelet view

Changed:
  U   z3ext.layout/trunk/CHANGES.txt
  U   z3ext.layout/trunk/src/z3ext/layout/configure.zcml
  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
  U   z3ext.layout/trunk/src/z3ext/layout/zcml.py

-=-
Modified: z3ext.layout/trunk/CHANGES.txt
===================================================================
--- z3ext.layout/trunk/CHANGES.txt	2009-06-18 06:33:08 UTC (rev 101115)
+++ z3ext.layout/trunk/CHANGES.txt	2009-06-18 07:00:46 UTC (rev 101116)
@@ -2,6 +2,16 @@
 CHANGES
 =======
 
+2.1.0 (2009-06-18)
+------------------
+
+- Allow use interface as type for z3ext:pagelet directive
+
+- Allow use named typed pagelets with '@@pagelet' view and 'pagelet:' tales
+
+- Added 'pageletObject' view, it doesn't call pagelet render method
+
+
 2.0.8 (2009-06-03)
 ------------------
 

Modified: z3ext.layout/trunk/src/z3ext/layout/configure.zcml
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/configure.zcml	2009-06-18 06:33:08 UTC (rev 101115)
+++ z3ext.layout/trunk/src/z3ext/layout/configure.zcml	2009-06-18 07:00:46 UTC (rev 101116)
@@ -26,6 +26,10 @@
      name="pagelet"
      factory=".pagelet.PageletPublisher" />
 
+  <adapter
+     name="pageletObject"
+     factory=".pagelet.PageletObjectPublisher" />
+
   <class class=".pagelet.PageletPublisher">
     <allow
        attributes="__getitem__"

Modified: z3ext.layout/trunk/src/z3ext/layout/pagelet.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.py	2009-06-18 06:33:08 UTC (rev 101115)
+++ z3ext.layout/trunk/src/z3ext/layout/pagelet.py	2009-06-18 07:00:46 UTC (rev 101116)
@@ -108,6 +108,8 @@
     interface.implements(IBrowserPublisher)
     component.adapts(interface.Interface, interface.Interface)
 
+    render = True
+
     def __init__(self, context, request):
         self.context = context
         self.request = request
@@ -130,7 +132,13 @@
         return u''
 
     def __getitem__(self, name):
+        pageletName = u''
+
         if name:
+            splited = name.split(u'|', 1)
+            if len(splited) > 1:
+                name, pageletName = splited
+
             iface = queryUtility(IPageletType, name)
 
             if iface is None:
@@ -155,16 +163,18 @@
             else:
                 required.append(contexts)
             required.append(self.request)
-            view = queryMultiAdapter(required, iface)
+            view = queryMultiAdapter(required, iface, pageletName)
         else:
-            view = queryMultiAdapter((context, self.request), iface)
+            view = queryMultiAdapter((context, self.request), iface, pageletName)
 
         if view is not None:
             try:
                 view.update()
                 if view.isRedirected:
                     return u''
-                return view.render()
+                if self.render:
+                    return view.render()
+                return view
             except Exception, err:
                 log = logging.getLogger('z3ext.layout')
                 log.exception(err)
@@ -173,3 +183,8 @@
 
     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-06-18 06:33:08 UTC (rev 101115)
+++ z3ext.layout/trunk/src/z3ext/layout/pagelet.txt	2009-06-18 07:00:46 UTC (rev 101116)
@@ -578,7 +578,60 @@
   >>> print pagelet.publishTraverse(request, 'myPagelet5')
   <div>My pagelet5</div>
 
+We can use interface as pagelet 'type'
 
+  >>> class IMyPagelet6(interface.Interface):
+  ...     pass
+
+  >>> provideInterface('myPagelet6', IMyPagelet6, IPageletType)
+
+  >>> template6 = os.path.join(temp_dir, 'pagelet6.pt')
+  >>> open(template6, 'w').write('''<div>My pagelet6</div>''')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       for="*"
+  ...       template="%s"
+  ...       type="z3ext.layout.TESTS.IMyPagelet6"
+  ...       permission="zope.Public" />
+  ... </configure>"""%template6, context)
+
+  >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
+  >>> print pagelet.publishTraverse(request, 'myPagelet6')
+  <div>My pagelet6</div>
+
+
+we can call named pagelets
+
+  >>> template7 = os.path.join(temp_dir, 'pagelet7.pt')
+  >>> open(template7, 'w').write('''<div>My pagelet7</div>''')
+
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+  ...   <z3ext:pagelet
+  ...       name="named"
+  ...       for="*"
+  ...       template="%s"
+  ...       type="z3ext.layout.TESTS.IMyPagelet6"
+  ...       permission="zope.Public" />
+  ... </configure>"""%template7, context)
+
+  >>> pagelet = component.getMultiAdapter((Content(), request), name='pagelet')
+  >>> 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
+  <z3ext.layout.zcml.PageletClass from None object at ...>
+  >>> print pob.render()
+  <div>My pagelet7</div>
+
+
 We can't register nameless pagelet, we can register only typed pagelet
 without name
 

Modified: z3ext.layout/trunk/src/z3ext/layout/tales.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/tales.py	2009-06-18 06:33:08 UTC (rev 101115)
+++ z3ext.layout/trunk/src/z3ext/layout/tales.py	2009-06-18 07:00:46 UTC (rev 101116)
@@ -31,8 +31,14 @@
         request = econtext.vars['request']
         modules = econtext.vars['modules']
 
+        pageletName = u''
+
         # lookup pagelet
         if name:
+            splited = name.split('|', 1)
+            if len(splited) > 1:
+                name, pageletName = splited
+
             iface = queryUtility(IPageletType, name)
 
             if iface is None:
@@ -57,9 +63,9 @@
             else:
                 required.append(contexts)
             required.append(request)
-            view = queryMultiAdapter(required, iface)
+            view = queryMultiAdapter(required, iface, pageletName)
         else:
-            view = queryMultiAdapter((context, request), iface)
+            view = queryMultiAdapter((context, request), iface, pageletName)
 
         if view is not None:
             try:

Modified: z3ext.layout/trunk/src/z3ext/layout/tests.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/tests.py	2009-06-18 06:33:08 UTC (rev 101115)
+++ z3ext.layout/trunk/src/z3ext/layout/tests.py	2009-06-18 07:00:46 UTC (rev 101116)
@@ -52,6 +52,7 @@
     test.globs['root'] = root
     component.provideAdapter(pagelet.queryPagelet)
     component.provideAdapter(pagelet.PageletPublisher, name='pagelet')
+    component.provideAdapter(pagelet.PageletObjectPublisher,name='pageletObject')
     setup.setUpTestAsModule(test, 'z3ext.layout.TESTS')
 
 

Modified: z3ext.layout/trunk/src/z3ext/layout/zcml.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/zcml.py	2009-06-18 06:33:08 UTC (rev 101115)
+++ z3ext.layout/trunk/src/z3ext/layout/zcml.py	2009-06-18 07:00:46 UTC (rev 101116)
@@ -226,7 +226,7 @@
     cdict['description'] = description
 
     if template:
-        cdict['template'] = LayoutTemplateFile(template, content_type=contentType)
+        cdict['template'] = LayoutTemplateFile(template,content_type=contentType)
 
     cdict.update(kwargs)
 
@@ -296,10 +296,11 @@
 Type = type
 
 # pagelet directive
-def pageletDirective(_context, for_, name=u'', type=(),
-                     class_=None, layer=IDefaultBrowserLayer, provides=[],
-                     allowed_interface=[], allowed_attributes=[],
-                     template=u'', layout=u'', permission='zope.Public', **kwargs):
+def pageletDirective(
+    _context, for_, name=u'', type=(),
+    class_=None, layer=IDefaultBrowserLayer, provides=[],
+    allowed_interface=[], allowed_attributes=[],
+    template=u'', layout=u'', permission='zope.Public', **kwargs):
 
     # Check paeglet name
     if not name and not type:
@@ -338,9 +339,17 @@
     new_class = Type('PageletClass from %s'%class_, bases, cdict)
 
     # extend provides with type
+    tps = []
     for tp in type:
         iface = queryUtility(IPageletType, tp)
+        if iface is None:
+            try:
+                iface = _context.resolve(tp)
+            except Exception, err:
+                pass
+
         if iface is not None:
+            tps.append(iface)
             provides.append(iface)
 
     kwargs['type'] = type
@@ -403,12 +412,13 @@
 
     # register pagelet
     for_.append(layer)
-    if type:
+    if tps:
         _context.action(
             discriminator = (
-                'z3ext.layout:registerPagelets', tuple(type), tuple(for_), layer, name),
+                'z3ext.layout:registerPagelets', 
+                tuple(tps), tuple(for_), layer, name),
             callable = registerTypedPagelets,
-            args = (for_, new_class, type, name, _context.info))
+            args = (for_, new_class, tps, name, _context.info))
     else:
         _context.action(
             discriminator = (
@@ -429,8 +439,7 @@
 
 
 def registerTypedPagelets(required, newClass, type, name, info):
-    for tp in type:
-        iface = getUtility(IPageletType, tp)
+    for iface in type:
         handler('registerAdapter', newClass, required, iface, name, info)
 
 



More information about the Checkins mailing list