web/lib/django/contrib/admin/views/template.py
changeset 0 0d40e90630ef
child 29 cc9b7e14412b
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     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.importlib import import_module
       
     8 from django.utils.translation import ugettext_lazy as _
       
     9 
       
    10 
       
    11 def template_validator(request):
       
    12     """
       
    13     Displays the template validator form, which finds and displays template
       
    14     syntax errors.
       
    15     """
       
    16     # get a dict of {site_id : settings_module} for the validator
       
    17     settings_modules = {}
       
    18     for mod in settings.ADMIN_FOR:
       
    19         settings_module = import_module(mod)
       
    20         settings_modules[settings_module.SITE_ID] = settings_module
       
    21     site_list = Site.objects.in_bulk(settings_modules.keys()).values()
       
    22     if request.POST:
       
    23         form = TemplateValidatorForm(settings_modules, site_list,
       
    24                                      data=request.POST)
       
    25         if form.is_valid():
       
    26             request.user.message_set.create(message='The template is valid.')
       
    27     else:
       
    28         form = TemplateValidatorForm(settings_modules, site_list)
       
    29     return render_to_response('admin/template_validator.html', {
       
    30         'title': 'Template validator',
       
    31         'form': form,
       
    32     }, context_instance=template.RequestContext(request))
       
    33 template_validator = staff_member_required(template_validator)
       
    34 
       
    35 
       
    36 class TemplateValidatorForm(forms.Form):
       
    37     site = forms.ChoiceField(_('site'))
       
    38     template = forms.CharField(
       
    39         _('template'), widget=forms.Textarea({'rows': 25, 'cols': 80}))
       
    40 
       
    41     def __init__(self, settings_modules, site_list, *args, **kwargs):
       
    42         self.settings_modules = settings_modules
       
    43         super(TemplateValidatorForm, self).__init__(*args, **kwargs)
       
    44         self.fields['site'].choices = [(s.id, s.name) for s in site_list]
       
    45 
       
    46     def clean_template(self):
       
    47         # Get the settings module. If the site isn't set, we don't raise an
       
    48         # error since the site field will.
       
    49         try:
       
    50             site_id = int(self.cleaned_data.get('site', None))
       
    51         except (ValueError, TypeError):
       
    52             return
       
    53         settings_module = self.settings_modules.get(site_id, None)
       
    54         if settings_module is None:
       
    55             return
       
    56 
       
    57         # So that inheritance works in the site's context, register a new
       
    58         # function for "extends" that uses the site's TEMPLATE_DIRS instead.
       
    59         def new_do_extends(parser, token):
       
    60             node = loader.do_extends(parser, token)
       
    61             node.template_dirs = settings_module.TEMPLATE_DIRS
       
    62             return node
       
    63         register = template.Library()
       
    64         register.tag('extends', new_do_extends)
       
    65         template.builtins.append(register)
       
    66 
       
    67         # Now validate the template using the new TEMPLATE_DIRS, making sure to
       
    68         # reset the extends function in any case.
       
    69         error = None
       
    70         template_string = self.cleaned_data['template']
       
    71         try:
       
    72             tmpl = loader.get_template_from_string(template_string)
       
    73             tmpl.render(template.Context({}))
       
    74         except template.TemplateSyntaxError, e:
       
    75             error = e
       
    76         template.builtins.remove(register)
       
    77         if error:
       
    78             raise forms.ValidationError, e.args