~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to turbozpt/zptsupport.py

add a '-C' option for ensuring loggerhead is running (from a cron job, for
example), and clean up the main() code a bit in the process.  also added
log rolling (daily, weekly, or none).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
"TurboGears support for Zope Page Templates"
2
 
 
3
 
import sys, os
4
 
 
5
 
from template import PageTemplate
6
 
import pkg_resources
7
 
 
8
 
import logging
9
 
log = logging.getLogger("turbogears.zptsupport")
10
 
 
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
15
 
    mod.__mtime__ = mtime
16
 
    return mod
17
 
 
18
 
class TurboZpt:
19
 
    extension = "pt"
20
 
    
21
 
    def __init__(self, extra_vars_func=None, options={}):
22
 
        self.options = options
23
 
        self.get_extra_vars = extra_vars_func
24
 
        self.compiledTemplates = {}
25
 
    
26
 
    def load_template(self, classname, loadingSite=False):
27
 
        """Searches for a template along the Python path.
28
 
 
29
 
        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.
33
 
        """
34
 
        ct = self.compiledTemplates
35
 
 
36
 
        divider = classname.rfind(".")
37
 
        if divider > -1:
38
 
            package = classname[0:divider]
39
 
            basename = classname[divider+1:]
40
 
        else:
41
 
            raise ValueError, "All templates must be in a package"
42
 
 
43
 
        cache_templates = self.options.get("zpt.cache_templates", True)
44
 
        tfile = pkg_resources.resource_filename(package, 
45
 
                                                "%s.%s" % 
46
 
                                                (basename,
47
 
                                                self.extension))
48
 
                                                
49
 
        if cache_templates:
50
 
            if ct.has_key(classname):
51
 
                mtime = os.stat(tfile).st_mtime
52
 
                mod = ct[classname]
53
 
                if mod.__mtime__ != mtime:
54
 
                    # Recompile template
55
 
                    mod = _recompile_template(package, basename, tfile, classname)
56
 
                    ct[classname] = mod
57
 
                #else:
58
 
                    # use template from cache    
59
 
                    # pass 
60
 
            else:
61
 
                # First time compile template
62
 
                mod = PageTemplate(tfile)
63
 
                mod.__mtime__ = os.stat(tfile).st_mtime
64
 
                ct[classname] = mod
65
 
        else:
66
 
            mod = PageTemplate(tfile)
67
 
 
68
 
        return mod
69
 
 
70
 
    def render(self, info, format="html", fragment=False, template=None):
71
 
        """Renders data in the desired format.
72
 
        
73
 
        @param info: the data / context itself
74
 
        @type info: dict
75
 
        @para format: "html"
76
 
        @type format: "string"
77
 
        @para template: name of the template to use
78
 
        @type template: string
79
 
        """
80
 
        #if isinstance(template, type):
81
 
        #    tclass = template
82
 
        #else:
83
 
        
84
 
        tinstance = self.load_template(template)
85
 
        log.debug("Applying template %s" % (tinstance.filename))
86
 
        data = dict()
87
 
        if self.get_extra_vars:
88
 
            data.update(self.get_extra_vars())
89
 
        data.update(info)
90
 
        
91
 
        return str(tinstance(**data))
92
 
 
93
 
    def transform(self, info, template):
94
 
        "Render the output to Elements"
95
 
        pass