1
from django import template, forms
2
from django.contrib.admin.views.decorators import staff_member_required
3
from django.template import loader
4
from django.shortcuts import render_to_response
5
from django.contrib.sites.models import Site
6
from django.conf import settings
7
from django.utils.translation import ugettext_lazy as _
10
def template_validator(request):
12
Displays the template validator form, which finds and displays template
15
# get a dict of {site_id : settings_module} for the validator
17
for mod in settings.ADMIN_FOR:
18
settings_module = __import__(mod, {}, {}, [''])
19
settings_modules[settings_module.SITE_ID] = settings_module
20
site_list = Site.objects.in_bulk(settings_modules.keys()).values()
22
form = TemplateValidatorForm(settings_modules, site_list,
25
request.user.message_set.create(message='The template is valid.')
27
form = TemplateValidatorForm(settings_modules, site_list)
28
return render_to_response('admin/template_validator.html', {
29
'title': 'Template validator',
31
}, context_instance=template.RequestContext(request))
32
template_validator = staff_member_required(template_validator)
35
class TemplateValidatorForm(forms.Form):
36
site = forms.ChoiceField(_('site'))
37
template = forms.CharField(
38
_('template'), widget=forms.Textarea({'rows': 25, 'cols': 80}))
40
def __init__(self, settings_modules, site_list, *args, **kwargs):
41
self.settings_modules = settings_modules
42
super(TemplateValidatorForm, self).__init__(*args, **kwargs)
43
self.fields['site'].choices = [(s.id, s.name) for s in site_list]
45
def clean_template(self):
46
# Get the settings module. If the site isn't set, we don't raise an
47
# error since the site field will.
49
site_id = int(self.cleaned_data.get('site', None))
50
except (ValueError, TypeError):
52
settings_module = self.settings_modules.get(site_id, None)
53
if settings_module is None:
56
# So that inheritance works in the site's context, register a new
57
# function for "extends" that uses the site's TEMPLATE_DIRS instead.
58
def new_do_extends(parser, token):
59
node = loader.do_extends(parser, token)
60
node.template_dirs = settings_module.TEMPLATE_DIRS
62
register = template.Library()
63
register.tag('extends', new_do_extends)
64
template.builtins.append(register)
66
# Now validate the template using the new TEMPLATE_DIRS, making sure to
67
# reset the extends function in any case.
69
template_string = self.cleaned_data['template']
71
tmpl = loader.get_template_from_string(template_string)
72
tmpl.render(template.Context({}))
73
except template.TemplateSyntaxError, e:
75
template.builtins.remove(register)
77
raise forms.ValidationError, e.args