905a36df8fb920048f239fd0c299cca98805fde2
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 from babel
.localedata
import exists
20 from mediagoblin
import mg_globals
21 from mediagoblin
import messages
22 from mediagoblin
.tools
import common
23 from mediagoblin
.tools
.translate
import setup_gettext
24 from mediagoblin
.middleware
.csrf
import render_csrf_form_token
30 def get_jinja_env(template_loader
, locale
):
32 Set up the Jinja environment,
34 (In the future we may have another system for providing theming;
35 for now this is good enough.)
39 # If we have a jinja environment set up with this locale, just
41 if SETUP_JINJA_ENVS
.has_key(locale
):
42 return SETUP_JINJA_ENVS
[locale
]
44 template_env
= jinja2
.Environment(
45 loader
=template_loader
, autoescape
=True,
46 extensions
=['jinja2.ext.i18n', 'jinja2.ext.autoescape'])
48 template_env
.install_gettext_callables(
49 mg_globals
.translations
.ugettext
,
50 mg_globals
.translations
.ungettext
)
52 # All templates will know how to ...
53 # ... fetch all waiting messages and remove them from the queue
54 # ... construct a grid of thumbnails or other media
55 template_env
.globals['fetch_messages'] = messages
.fetch_messages
56 template_env
.globals['gridify_list'] = gridify_list
57 template_env
.globals['gridify_cursor'] = gridify_cursor
60 SETUP_JINJA_ENVS
[locale
] = template_env
65 # We'll store context information here when doing unit tests
66 TEMPLATE_TEST_CONTEXT
= {}
69 def render_template(request
, template_path
, context
):
71 Render a template with context.
73 Always inserts the request into the context, so you don't have to.
74 Also stores the context if we're doing unit tests. Helpful!
76 template
= request
.template_env
.get_template(
78 context
['request'] = request
79 context
['csrf_token'] = render_csrf_form_token(request
)
80 rendered
= template
.render(context
)
82 if common
.TESTS_ENABLED
:
83 TEMPLATE_TEST_CONTEXT
[template_path
] = context
88 def clear_test_template_context():
89 global TEMPLATE_TEST_CONTEXT
90 TEMPLATE_TEST_CONTEXT
= {}
93 def gridify_list(this_list
, num_cols
=5):
95 Generates a list of lists where each sub-list's length depends on
96 the number of columns in the list
100 # Figure out how many rows we should have
101 num_rows
= int(ceil(float(len(this_list
)) / num_cols
))
103 for row_num
in range(num_rows
):
104 slice_min
= row_num
* num_cols
105 slice_max
= (row_num
+ 1) * num_cols
107 row
= this_list
[slice_min
:slice_max
]
114 def gridify_cursor(this_cursor
, num_cols
=5):
116 Generates a list of lists where each sub-list's length depends on
117 the number of columns in the list
119 return gridify_list(list(this_cursor
), num_cols
)