diff --git a/browser/renderer.pt b/browser/renderer.pt new file mode 100644 index 0000000..9cb14f3 --- /dev/null +++ b/browser/renderer.pt @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/browser/renderer.py b/browser/renderer.py index d07ef71..3ef8d98 100644 --- a/browser/renderer.py +++ b/browser/renderer.py @@ -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) + + diff --git a/browser/view.py b/browser/view.py index dff2b22..b1adce8 100644 --- a/browser/view.py +++ b/browser/view.py @@ -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)