~canonical-django/canonical-django/project-template

« back to all changes in this revision

Viewing changes to trunk/python-packages/django/contrib/admin/views/template.py

  • Committer: Matthew Nuzum
  • Date: 2008-11-13 05:46:03 UTC
  • Revision ID: matthew.nuzum@canonical.com-20081113054603-v0kvr6z6xyexvqt3
adding to version control

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 _
 
8
 
 
9
 
 
10
def template_validator(request):
 
11
    """
 
12
    Displays the template validator form, which finds and displays template
 
13
    syntax errors.
 
14
    """
 
15
    # get a dict of {site_id : settings_module} for the validator
 
16
    settings_modules = {}
 
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()
 
21
    if request.POST:
 
22
        form = TemplateValidatorForm(settings_modules, site_list,
 
23
                                     data=request.POST)
 
24
        if form.is_valid():
 
25
            request.user.message_set.create(message='The template is valid.')
 
26
    else:
 
27
        form = TemplateValidatorForm(settings_modules, site_list)
 
28
    return render_to_response('admin/template_validator.html', {
 
29
        'title': 'Template validator',
 
30
        'form': form,
 
31
    }, context_instance=template.RequestContext(request))
 
32
template_validator = staff_member_required(template_validator)
 
33
 
 
34
 
 
35
class TemplateValidatorForm(forms.Form):
 
36
    site = forms.ChoiceField(_('site'))
 
37
    template = forms.CharField(
 
38
        _('template'), widget=forms.Textarea({'rows': 25, 'cols': 80}))
 
39
 
 
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]
 
44
 
 
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.
 
48
        try:
 
49
            site_id = int(self.cleaned_data.get('site', None))
 
50
        except (ValueError, TypeError):
 
51
            return
 
52
        settings_module = self.settings_modules.get(site_id, None)
 
53
        if settings_module is None:
 
54
            return
 
55
 
 
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
 
61
            return node
 
62
        register = template.Library()
 
63
        register.tag('extends', new_do_extends)
 
64
        template.builtins.append(register)
 
65
 
 
66
        # Now validate the template using the new TEMPLATE_DIRS, making sure to
 
67
        # reset the extends function in any case.
 
68
        error = None
 
69
        template_string = self.cleaned_data['template']
 
70
        try:
 
71
            tmpl = loader.get_template_from_string(template_string)
 
72
            tmpl.render(template.Context({}))
 
73
        except template.TemplateSyntaxError, e:
 
74
            error = e
 
75
        template.builtins.remove(register)
 
76
        if error:
 
77
            raise forms.ValidationError, e.args