[Checkins] SVN: grok/trunk/src/grok/ grok.ViewletManager now accepts templates

Michael Haubenwallner michael at d2m.at
Mon Mar 17 03:11:30 EDT 2008


Log message for revision 84728:
  grok.ViewletManager now accepts templates
  

Changed:
  U   grok/trunk/src/grok/components.py
  A   grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py
  A   grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/
  A   grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/barneyviewlet.pt
  A   grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/cavemanager.pt
  A   grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/orderview.pt
  U   grok/trunk/src/grok/meta.py

-=-
Modified: grok/trunk/src/grok/components.py
===================================================================
--- grok/trunk/src/grok/components.py	2008-03-17 06:50:46 UTC (rev 84727)
+++ grok/trunk/src/grok/components.py	2008-03-17 07:11:29 UTC (rev 84728)
@@ -625,32 +625,22 @@
             name=self.module_info.package_dotted_name
             )
 
-
     def render(self):
         """See zope.contentprovider.interfaces.IContentProvider"""
         # Now render the view
         if self.template:
-            #return self.template(viewlets=self.viewlets)
-            return self._render_template()
+            return self.template.render(self) 
         else:
             viewlets = util.sort_components(self.viewlets)
             return u'\n'.join([viewlet.render() for viewlet in viewlets])
 
+    def namespace(self):
+        return {}
 
     @property
     def response(self):
         return self.request.response
 
-    def _render_template(self):
-        namespace = self.template.pt_getContext()
-        namespace['request'] = self.request
-        namespace['view'] = self
-        namespace['viewlets'] = self.viewlets
-        namespace['static'] = self.static
-        namespace['context'] = self.context
-        # XXX need to check whether we really want to put None here if missing
-        return self.template.pt_render(namespace)
-
     def url(self, obj=None, name=None):
         # if the first argument is a string, that's the name. There should
         # be no second argument

Added: grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py	                        (rev 0)
+++ grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py	2008-03-17 07:11:29 UTC (rev 84728)
@@ -0,0 +1,100 @@
+"""
+=============================
+Test viewletmanager templates
+=============================
+
+We want to show the usage of a template provided to the ViewletManager itself.
+This ViewletManager also makes its viewlets accessible by their name.
+Viewlets have a render method or a template attached.
+The grok.order() directive is ignored in this context.
+
+Set up a content object in the application root::
+
+  >>> root = getRootFolder()
+  >>> root['fred'] = Fred()
+
+Traverse to the view on the model object. We get the viewlets
+registered for the default layer, with the anybody permission::
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/fred/@@orderview")
+  >>> print browser.contents
+  <ul>
+   <li>Barney</li>
+   <li>Bone</li>
+   <li>Cave</li>
+   <li>Fred</li>
+   <li>Gold</li>
+   <li>Wilma</li>
+  </ul>
+  <BLANKLINE>
+"""
+
+import grok
+
+class Fred(grok.Model):
+    pass
+
+class OrderView(grok.View):
+    pass
+
+class CaveManager(grok.ViewletManager):
+    grok.name('cave')
+
+    def viewlet_dict(self):
+        v_dict={}
+        for v in self.viewlets:
+            v_dict[v.__name__]=v
+        return v_dict
+
+    def viewlet_keys_sorted(self):
+        k=self.viewlet_dict().keys()
+        k.sort()
+        return k
+
+class CaveViewlet(grok.Viewlet):
+    grok.order(30)
+    grok.viewletmanager(CaveManager)
+    grok.name('Cave')
+
+    def render(self):
+        return "Cave"
+
+class BarneyViewlet(grok.Viewlet):
+    grok.order(60)
+    grok.viewletmanager(CaveManager)
+    grok.name('Barney')
+
+class BoneViewlet(grok.Viewlet):
+    grok.order(10)
+    grok.viewletmanager(CaveManager)
+    grok.name('Bone')
+
+    def render(self):
+        return "Bone"
+
+class WilmaViewlet(grok.Viewlet):
+    grok.order(50)
+    grok.viewletmanager(CaveManager)
+    grok.name('Wilma')
+
+    def render(self):
+        return "Wilma"
+
+class GoldViewlet(grok.Viewlet):
+    grok.order(1)
+    grok.viewletmanager(CaveManager)
+    grok.name('Gold')
+
+    def render(self):
+        return "Gold"
+
+class FredViewlet(grok.Viewlet):
+    grok.order(20)
+    grok.viewletmanager(CaveManager)
+    grok.name('Fred')
+
+    def render(self):
+        return "Fred"

Added: grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/barneyviewlet.pt
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/barneyviewlet.pt	                        (rev 0)
+++ grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/barneyviewlet.pt	2008-03-17 07:11:29 UTC (rev 84728)
@@ -0,0 +1 @@
+Barney

Added: grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/cavemanager.pt
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/cavemanager.pt	                        (rev 0)
+++ grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/cavemanager.pt	2008-03-17 07:11:29 UTC (rev 84728)
@@ -0,0 +1,3 @@
+<ul tal:define="v_dict view/viewlet_dict; v_keys view/viewlet_keys_sorted;">
+ <li tal:repeat="k v_keys" tal:content="python:v_dict[k].render().strip()" />
+</ul>

Added: grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/orderview.pt
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/orderview.pt	                        (rev 0)
+++ grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/orderview.pt	2008-03-17 07:11:29 UTC (rev 84728)
@@ -0,0 +1 @@
+<div tal:replace="structure provider:cave" />

Modified: grok/trunk/src/grok/meta.py
===================================================================
--- grok/trunk/src/grok/meta.py	2008-03-17 06:50:46 UTC (rev 84727)
+++ grok/trunk/src/grok/meta.py	2008-03-17 07:11:29 UTC (rev 84728)
@@ -902,7 +902,16 @@
 
     def grok(self, name, factory, module_info, config, **kw):
         factory.module_info = module_info
-        
+
+        # find templates
+        templates = module_info.getAnnotation('grok.templates', None)
+        if templates is not None:
+            config.action(
+                discriminator=None,
+                callable=self.checkTemplates,
+                args=(templates, module_info, factory)
+                )
+
         name = get_name(factory)
         view_context = get_context(module_info, factory)
 
@@ -922,6 +931,15 @@
 
         return True
 
+    def checkTemplates(self, templates, module_info, factory):
+        def has_render(factory):
+            return factory.render != grok.components.ViewletManager.render
+        def has_no_render(factory):
+            # always has a render method
+            return False
+        templates.checkTemplates(module_info, factory, 'viewlet manager',
+                                 has_render, has_no_render)
+
 class ViewletGrokker(martian.ClassGrokker):
     component_class = grok.Viewlet
 
@@ -939,14 +957,14 @@
                 callable=self.checkTemplates,
                 args=(templates, module_info, factory)
                 )
-    
+
         view = determine_class_directive('grok.view', factory,
                                          module_info, default=IBrowserView)
         viewlet_layer = determine_class_directive('grok.layer', factory,
                                                   module_info,
                                                   default=IDefaultBrowserLayer)
         viewletmanager = get_viewletmanager(module_info, factory)
-    
+
         config.action(
             discriminator = ('viewlet', viewlet_context, viewlet_layer,
                              view, viewletmanager, viewlet_name),
@@ -961,7 +979,7 @@
             callable=make_checker,
             args=(factory, factory, permission, ['update', 'render']),
             )
-        
+
         return True
 
     def checkTemplates(self, templates, module_info, factory):



More information about the Checkins mailing list