1
1
"TurboGears support for Zope Page Templates"
5
from template import PageTemplate
3
from template import zpt
9
7
log = logging.getLogger("turbogears.zptsupport")
11
def _recompile_template(package, basename, tfile, classname):
12
log.debug("Recompiling template for %s" % classname)
13
mod = PageTemplate(tfile)
14
mtime = os.stat(tfile).st_mtime
9
class TurboZpt(object):
21
def __init__(self, extra_vars_func=None, options={}):
22
self.options = options
23
self.get_extra_vars = extra_vars_func
24
self.compiledTemplates = {}
12
def __init__(self, extra_vars_func=None):
13
self.get_extra_vars = extra_vars_func
26
15
def load_template(self, classname, loadingSite=False):
27
16
"""Searches for a template along the Python path.
29
18
Template files must end in ".pt" and be in legitimate packages.
30
U can set "zpt.cache_templates" option to cache a loaded template
31
class and only check for updates. Templates are automatically
32
checked for changes and reloaded as neccessary.
19
Templates are automatically checked for changes and reloaded as
34
ct = self.compiledTemplates
36
22
divider = classname.rfind(".")
38
24
package = classname[0:divider]
41
27
raise ValueError, "All templates must be in a package"
43
cache_templates = self.options.get("zpt.cache_templates", True)
44
tfile = pkg_resources.resource_filename(package,
50
if ct.has_key(classname):
51
mtime = os.stat(tfile).st_mtime
53
if mod.__mtime__ != mtime:
55
mod = _recompile_template(package, basename, tfile, classname)
58
# use template from cache
61
# First time compile template
62
mod = PageTemplate(tfile)
63
mod.__mtime__ = os.stat(tfile).st_mtime
66
mod = PageTemplate(tfile)
29
tfile = pkg_resources.resource_filename(
30
package, "%s.%s" % (basename, self.extension))
70
33
def render(self, info, format="html", fragment=False, template=None):
71
"""Renders data in the desired format.
73
@param info: the data / context itself
76
@type format: "string"
77
@para template: name of the template to use
78
@type template: string
80
#if isinstance(template, type):
84
tinstance = self.load_template(template)
85
log.debug("Applying template %s" % (tinstance.filename))
87
if self.get_extra_vars:
88
data.update(self.get_extra_vars())
34
"""Renders data in the desired format.
36
@param info: the data / context itself
39
@type format: "string"
40
@para template: name of the template to use
41
@type template: string
43
tinstance = self.load_template(template)
44
log.debug("Applying template %s" % (tinstance.filename))
46
if self.get_extra_vars:
47
data.update(self.get_extra_vars())
90
49
return tinstance(**data).encode('utf-8')
92
def transform(self, info, template):
93
"Render the output to Elements"