provide macro caching for standard views (was implemented for composer.layout only)

This commit is contained in:
Helmut Merz 2011-06-25 17:55:11 +02:00
parent 383ea58e2f
commit 0118ea71d8
3 changed files with 37 additions and 0 deletions

6
browser/renderer.pt Normal file
View file

@ -0,0 +1,6 @@
<!-- $Id$ -->
<tal:renderer define="view nocall:options/view;
macro options/macro">
<metal:content use-macro="macro" />
</tal:renderer>

View file

@ -22,6 +22,10 @@ Use ZPT macros as layout renderers.
$Id$
"""
from zope.app.pagetemplate import ViewPageTemplateFile
from cybertools.util.cache import cache
class RendererFactory(object):
""" Provider for ZPT macros.
@ -58,3 +62,23 @@ class Renderer(object):
def __call__(self):
return self.template.macros[self.name]
rendererTemplate = ViewPageTemplateFile('renderer.pt')
class CachableRenderer(object):
lifetime = 3 * 3600
#lifetime = 24 * 3600
def __init__(self, view, renderer):
self.view = view
self.renderer = renderer
def getRenderMacroId(self, *args):
return 'renderer.' + '.'.join(args)
@cache(getRenderMacroId, lifetime=lifetime)
def renderMacro(self, *args):
return rendererTemplate(self.view, view=self.view, macro=self.renderer)

View file

@ -30,6 +30,8 @@ from zope import component
from zope.event import notify
from zope.publisher.interfaces.browser import IBrowserSkinType
from cybertools.browser.renderer import CachableRenderer
mainTemplate = ViewPageTemplateFile('main.pt')
popupTemplate = ViewPageTemplateFile('liquid/popup.pt')
@ -67,6 +69,8 @@ class GenericView(object):
template = macro = menu = skin = None
cachableRendererFactory = CachableRenderer
_updated = False
def setController(self, controller):
@ -145,3 +149,6 @@ class GenericView(object):
applySkin(self.request, skin)
self.skin = skin
def cachedRenderer(self, baseRenderer, *args):
cr = self.cachableRendererFactory(self, baseRenderer)
return cr.renderMacro(*args)