~loggerhead-team/loggerhead/trunk-rich

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
"TurboGears support for Zope Page Templates"

import sys, os

from template import PageTemplate
import pkg_resources

import logging
log = logging.getLogger("turbogears.zptsupport")

def _recompile_template(package, basename, tfile, classname):
    log.debug("Recompiling template for %s" % classname)
    mod = PageTemplate(tfile)
    mtime = os.stat(tfile).st_mtime
    mod.__mtime__ = mtime
    return mod

class TurboZpt:
    extension = "pt"
    
    def __init__(self, extra_vars_func=None, options={}):
	self.options = options
	self.get_extra_vars = extra_vars_func
        self.compiledTemplates = {}
    
    def load_template(self, classname, loadingSite=False):
        """Searches for a template along the Python path.

        Template files must end in ".pt" and be in legitimate packages.
        U can set "zpt.cache_templates" option to cache a loaded template
	class and only check for updates. Templates are automatically
	checked for changes and reloaded as neccessary.
        """
        ct = self.compiledTemplates

        divider = classname.rfind(".")
        if divider > -1:
            package = classname[0:divider]
            basename = classname[divider+1:]
        else:
            raise ValueError, "All templates must be in a package"

        cache_templates = self.options.get("zpt.cache_templates", True)
        tfile = pkg_resources.resource_filename(package, 
                                                "%s.%s" % 
                                                (basename,
                                                self.extension))
						
        if cache_templates:
            if ct.has_key(classname):
                mtime = os.stat(tfile).st_mtime
		mod = ct[classname]
                if mod.__mtime__ != mtime:
		    # Recompile template
		    mod = _recompile_template(package, basename, tfile, classname)
                    ct[classname] = mod
                #else:
		    # use template from cache    
		    # pass 
            else:
		# First time compile template
		mod = PageTemplate(tfile)
                mod.__mtime__ = os.stat(tfile).st_mtime
		ct[classname] = mod
        else:
	    mod = PageTemplate(tfile)

        return mod

    def render(self, info, format="html", fragment=False, template=None):
	"""Renders data in the desired format.
	
	@param info: the data / context itself
	@type info: dict
	@para format: "html"
	@type format: "string"
	@para template: name of the template to use
	@type template: string
	"""
	#if isinstance(template, type):
	#    tclass = template
	#else:
	
	tinstance = self.load_template(template)
	log.debug("Applying template %s" % (tinstance.filename))
	data = dict()
	if self.get_extra_vars:
	    data.update(self.get_extra_vars())
	data.update(info)
        return tinstance(**data)

    def transform(self, info, template):
	"Render the output to Elements"
	pass