annotate roundup/cgi/engine_jinja2.py @ 4748:e339583eae8e

templating: rename precompileTemplates to precompile
author anatoly techtonik <techtonik@gmail.com>
date Mon, 21 Jan 2013 23:51:39 +0300
parents 2d6959f1d2df
children 12b029655c05
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4743
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
1 """
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
2 Experimental Jinja2 support for Roundup. It will become less
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
3 experimental when it is completely clear what information is
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
4 passed to template, and when the info is limited to the sane
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
5 minimal set (to avoid Roundup state changes from template).
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
6
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
7 [ ] fallback mechanizm to use multiple templating engines in
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
8 parallel and aid in incremental translation from one
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
9 engine to another
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
10
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
11 [ ] define a place for templates
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
12 probably
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
13 TRACKER_HOME/templates/jinja2
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
14 with
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
15 TRACKER_HOME/templates/INFO.txt
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
16 describing how the dir was created, for example
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
17 "This is a copy of 'classic' template from ..."
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
18 also template fallback mechanizm for multi-engine
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
19 configuration
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
20 [ ] backward compatibility - if no engine is explicitly
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
21 specified, use TRACKER_HOME/html directory
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
22 [ ] copy TEMPLATES-INFO.txt to INFO.txt
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
23 [ ] implement VERSION file in environment for auto
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
24 upgrade
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
25 [ ] figure out what to do with autoescaping - it is disabled
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
26 by default in Jinja2
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
27
4748
e339583eae8e templating: rename precompileTemplates to precompile
anatoly techtonik <techtonik@gmail.com>
parents: 4743
diff changeset
28 [ ] precompile() is a stub
4743
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
29
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
30 [ ] add {{ debug() }} dumper to inspect available variables
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
31 https://github.com/mitsuhiko/jinja2/issues/174
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
32 """
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
33
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
34 import jinja2
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
35
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
36 # http://jinja.pocoo.org/docs/api/#loaders
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
37
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
38 from roundup.cgi.templating import context, LoaderBase, TemplateBase
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
39
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
40 class Jinja2Loader(LoaderBase):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
41 def __init__(self, dir):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
42 jinjadir = dir + '/jinja2'
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
43 # [ ] separate configuration when multiple loaders are used
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
44 print "Jinja2 templates:", jinjadir
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
45 self._env = jinja2.Environment(
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
46 loader=jinja2.FileSystemLoader(jinjadir)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
47 )
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
48
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
49 def check(self, tplname):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
50 print tplname
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
51 try:
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
52 print self._env.get_template(tplname + '.html')
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
53 except jinja2.TemplateNotFound:
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
54 return
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
55 else:
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
56 return True
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
57
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
58 def load(self, tplname):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
59 #src, filename = self.check(tplname)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
60 return Jinja2ProxyPageTemplate(self._env.get_template(tplname + '.html'))
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
61
4748
e339583eae8e templating: rename precompileTemplates to precompile
anatoly techtonik <techtonik@gmail.com>
parents: 4743
diff changeset
62 def precompile(self):
4743
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
63 pass
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
64
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
65 class Jinja2ProxyPageTemplate(TemplateBase):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
66 def __init__(self, template):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
67 self._tpl = template
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
68
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
69 def render(self, client, classname, request, **options):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
70 # [ ] limit the information passed to the minimal necessary set
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
71 c = context(client, self, classname, request)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
72 '''c.update({'options': options})
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
73
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
74 def translate(msgid, domain=None, mapping=None, default=None):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
75 result = client.translator.translate(domain, msgid,
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
76 mapping=mapping, default=default)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
77 return unicode(result, client.translator.OUTPUT_ENCODING)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
78
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
79 output = self._pt.render(None, translate, **c)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
80 return output.encode(client.charset)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
81 '''
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
82 return self._tpl.render(c)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
83
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
84 def __getitem__(self, name):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
85 # [ ] figure out what are these for
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
86 raise NotImplemented
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
87 #return self._pt[name]
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
88
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
89 def __getattr__(self, name):
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
90 # [ ] figure out what are these for
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
91 raise NotImplemented
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
92 #return getattr(self._pt, name)
2d6959f1d2df templating: proof of concept for Jinja2 support. Select 'jinja2'
anatoly techtonik <techtonik@gmail.com>
parents:
diff changeset
93

Roundup Issue Tracker: http://roundup-tracker.org/