summaryrefslogtreecommitdiff
path: root/repoze/bfg/chameleon_zpt.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/chameleon_zpt.py')
-rw-r--r--repoze/bfg/chameleon_zpt.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/repoze/bfg/chameleon_zpt.py b/repoze/bfg/chameleon_zpt.py
new file mode 100644
index 000000000..80669c009
--- /dev/null
+++ b/repoze/bfg/chameleon_zpt.py
@@ -0,0 +1,81 @@
+import os
+
+from webob import Response
+
+from zope.component import queryUtility
+from zope.component.interfaces import ComponentLookupError
+from zope.component import getSiteManager
+
+from zope.interface import classProvides
+from zope.interface import implements
+
+from repoze.bfg.path import caller_path
+from repoze.bfg.interfaces import ITemplateFactory
+from repoze.bfg.interfaces import ITemplate
+from repoze.bfg.interfaces import ISettings
+
+from chameleon.zpt.template import PageTemplateFile
+
+class ZPTTemplateFactory(object):
+ classProvides(ITemplateFactory)
+ implements(ITemplate)
+
+ def __init__(self, path, auto_reload=False):
+ try:
+ self.template = PageTemplateFile(path, auto_reload=auto_reload)
+ except ImportError, why:
+ why = str(why)
+ if 'z3c.pt' in why:
+ # unpickling error due to move from z3c.pt -> chameleon
+ cachefile = '%s.cache' % path
+ if os.path.isfile(cachefile):
+ os.remove(cachefile)
+ self.template = PageTemplateFile(path, auto_reload=auto_reload)
+ else:
+ raise
+
+ def __call__(self, **kw):
+ result = self.template.render(**kw)
+ return result
+
+def _get_template(path, **kw):
+ # XXX use pkg_resources
+ template = queryUtility(ITemplate, path)
+
+ if template is None:
+ if not os.path.exists(path):
+ raise ValueError('Missing template file: %s' % path)
+ settings = queryUtility(ISettings)
+ auto_reload = settings and settings.reload_templates
+ template = ZPTTemplateFactory(path, auto_reload)
+ try:
+ sm = getSiteManager()
+ except ComponentLookupError:
+ pass
+ else:
+ sm.registerUtility(template, ITemplate, name=path)
+
+ return template
+
+def get_template(path):
+ """ Return a ``chameleon.zpt`` template object at the
+ package-relative path (may also be absolute)"""
+ path = caller_path(path)
+ return _get_template(path).template
+
+def render_template(path, **kw):
+ """ Render a ``chameleon.zpt`` template at the package-relative
+ path (may also be absolute) using the kwargs in ``*kw`` as
+ top-level names and return a string."""
+ path = caller_path(path)
+ template = get_template(path)
+ return template(**kw)
+
+def render_template_to_response(path, **kw):
+ """ Render a ``chameleon.zpt`` template at the package-relative
+ path (may also be absolute) using the kwargs in ``*kw`` as
+ top-level names and return a Response object."""
+ path = caller_path(path)
+ result = render_template(path, **kw)
+ return Response(result)
+