author | Tero Marttila <terom@fixme.fi> |
Sun, 08 Feb 2009 00:29:36 +0200 | |
branch | sites |
changeset 41 | 9585441a4bfb |
parent 40 | 71ab68f31a1c |
child 42 | 5a72c00c4ae4 |
permissions | -rw-r--r-- |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
1 |
""" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
2 |
Template handler |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
3 |
""" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
4 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
5 |
# use Mako |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
6 |
from mako import exceptions |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
7 |
from mako.template import Template |
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
8 |
import mako.lookup |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
9 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
10 |
# for http.ResponseError |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
11 |
import http |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
12 |
|
26
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
13 |
import helpers |
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
14 |
|
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
15 |
# path to template files |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
16 |
TEMPLATE_DIR = "templates" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
17 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
18 |
# path to cached templates |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
19 |
CACHE_DIR = "cache/templates" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
20 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
21 |
# template file extension |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
22 |
TEMPLATE_EXT = "tmpl" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
23 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
24 |
class TemplateError (http.ResponseError) : |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
25 |
""" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
26 |
Raised by the template module functions |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
27 |
""" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
28 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
29 |
pass |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
30 |
|
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
31 |
def render (tpl, **params) : |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
32 |
""" |
21
b05979822dee
some unicode fixes, layout tweaks, a link icon
Tero Marttila <terom@fixme.fi>
parents:
11
diff
changeset
|
33 |
Render the given template, returning the output as a unicode string, or raising a TemplateError |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
34 |
""" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
35 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
36 |
try : |
26
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
37 |
return tpl.render_unicode( |
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
38 |
# global helper stuff |
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
39 |
h = helpers, |
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
40 |
|
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
41 |
# render-specific params |
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
42 |
**params |
9d3beac1b196
remove foo.html page, and rice up the footer a bit
Tero Marttila <terom@fixme.fi>
parents:
21
diff
changeset
|
43 |
) |
11 | 44 |
|
45 |
# a template may render other templates |
|
46 |
except TemplateError : |
|
47 |
raise |
|
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
48 |
|
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
49 |
except : |
11 | 50 |
details = exceptions.text_error_template().render() |
51 |
||
52 |
raise TemplateError("Template render failed", status='500 Internal Server Error', details=details) |
|
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
53 |
|
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
54 |
class TemplateLoader (mako.lookup.TemplateLookup) : |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
55 |
""" |
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
56 |
Our own specialization of mako's TemplateLookup |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
57 |
""" |
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
58 |
|
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
59 |
def __init__ (self, path, fileext=TEMPLATE_EXT) : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
60 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
61 |
Initialize to load templates located at path, with the given file extension |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
62 |
""" |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
63 |
|
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
64 |
# store |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
65 |
self.path = path |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
66 |
self.fileext = fileext |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
67 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
68 |
# XXX: separate cache? |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
69 |
super(TemplateLoader, self).__init__(directories=[path], module_directory=CACHE_DIR) |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
70 |
|
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
71 |
def lookup (self, name) : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
72 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
73 |
Looks up a template based on the bare "name", which does not include the path or file extension |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
74 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
75 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
76 |
try : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
77 |
return self.get_template("%s.%s" % (name, self.fileext)) |
8
0ce1f471e9d7
and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
78 |
|
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
79 |
except : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
80 |
raise TemplateError("Template broken: %r" % (name, ), status='500 Internal Server Error', details=exceptions.text_error_template().render()) |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
81 |
|
40 | 82 |
def render (self, name, **params) : |
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
83 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
84 |
Render a template, using lookup() on the given name |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
85 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
86 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
87 |
return render(self.lookup(name), **params) |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
88 |
|
40 | 89 |
def render_to_response (self, name, **params) : |
90 |
""" |
|
91 |
Render a template, returning a http.Response object |
|
92 |
""" |
|
93 |
||
94 |
return http.Response(self.render(name, **params)) |
|
95 |
||
32
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
96 |
@classmethod |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
97 |
def load (cls, path) : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
98 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
99 |
Loads a template from a specific file |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
100 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
101 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
102 |
try : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
103 |
return Template(filename=path, module_directory=CACHE_DIR) |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
104 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
105 |
except : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
106 |
raise TemplateError("Template broken: %r" % (path, ), status='500 Internal Server Error', details=exceptions.text_error_template().render()) |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
107 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
108 |
@classmethod |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
109 |
def render_file (cls, path, **params) : |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
110 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
111 |
Render a template, using load() on the given path |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
112 |
""" |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
113 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
114 |
return render(cls.load(path), **params) |
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
115 |
|
be954df4f0e8
move layout.tmpl to sites/www.qmsk.net
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
116 |