[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