From: melinath Date: Tue, 17 Aug 2010 16:16:20 +0000 (-0400) Subject: Added template code validation to the admin. This essentially addresses bug #14 by... X-Git-Tag: philo-0.9~35^2~4 X-Git-Url: http://git.ithinksw.org/philo.git/commitdiff_plain/92e6313ae3fbcf8f7c381aa91d53f2e32714f2c3?ds=inline Added template code validation to the admin. This essentially addresses bug #14 by catching errors with validation on templates instead of letting it show up as a server error later. (Note that there should still be better validation on Pages, as deletion of a template say on the filesystem could render a db-driven template invalid.) --- diff --git a/admin/pages.py b/admin/pages.py index ab89011..ede4a0d 100644 --- a/admin/pages.py +++ b/admin/pages.py @@ -1,5 +1,7 @@ from django.contrib import admin from django import forms +from django.core.exceptions import ValidationError +from django.template import Template as DjangoTemplate, loader, loader_tags, TemplateDoesNotExist, Context from philo.admin import widgets from philo.admin.base import COLLAPSE_CLASSES from philo.admin.nodes import ViewAdmin @@ -92,6 +94,33 @@ class PageAdmin(ViewAdmin): contentreference.save() +class TemplateForm(forms.ModelForm): + def clean_code(self): + code = self.cleaned_data['code'] + try: + t = DjangoTemplate(code) + except Exception, e: + raise ValidationError("Template code invalid. Error was: %s: %s" % (e.__class__.__name__, e)) + + # make sure all extended and included templates exist. + def validate_template(template): + for node in template.nodelist: + try: + if isinstance(node, loader_tags.ExtendsNode): + extended_template = node.get_parent(Context()) + validate_template(extended_template) + elif isinstance(node, loader_tags.IncludeNode): + included_template = loader.get_template(node.template_name.resolve(Context())) + validate_template(extended_template) + except Exception, e: + raise ValidationError("Template code invalid. Error was: %s: %s" % (e.__class__.__name__, e)) + validate_template(t) + return code + + class Meta: + model = Template + + class TemplateAdmin(admin.ModelAdmin): prepopulated_fields = {'slug': ('name',)} fieldsets = ( @@ -113,6 +142,7 @@ class TemplateAdmin(admin.ModelAdmin): save_on_top = True save_as = True list_display = ('__unicode__', 'slug', 'get_path',) + form = TemplateForm admin.site.register(Page, PageAdmin)