Added template code validation to the admin. This essentially addresses bug #14 by...
[philo.git] / admin / pages.py
index f366cd1..ede4a0d 100644 (file)
@@ -1,5 +1,7 @@
 from django.contrib import admin
 from django import forms
 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
 from philo.admin import widgets
 from philo.admin.base import COLLAPSE_CLASSES
 from philo.admin.nodes import ViewAdmin
@@ -28,7 +30,8 @@ class PageAdmin(ViewAdmin):
                        contentlet_containers, contentreference_containers = template.containers
                        for container_name in contentlet_containers:
                                fieldsets.append((('Container: %s' % container_name), {
                        contentlet_containers, contentreference_containers = template.containers
                        for container_name in contentlet_containers:
                                fieldsets.append((('Container: %s' % container_name), {
-                                       'fields': (('contentlet_container_content_%s' % container_name), ('contentlet_container_dynamic_%s' % container_name))
+                                       'fields': (('contentlet_container_content_%s' % container_name), ('contentlet_container_dynamic_%s' % container_name)),
+                                       'classes': ['monospace']
                                }))
                        for container_name, container_content_type in contentreference_containers:
                                fieldsets.append((('Container: %s' % container_name), {
                                }))
                        for container_name, container_content_type in contentreference_containers:
                                fieldsets.append((('Container: %s' % container_name), {
@@ -91,6 +94,33 @@ class PageAdmin(ViewAdmin):
                                        contentreference.save()
 
 
                                        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 = (
 class TemplateAdmin(admin.ModelAdmin):
        prepopulated_fields = {'slug': ('name',)}
        fieldsets = (
@@ -112,6 +142,7 @@ class TemplateAdmin(admin.ModelAdmin):
        save_on_top = True
        save_as = True
        list_display = ('__unicode__', 'slug', 'get_path',)
        save_on_top = True
        save_as = True
        list_display = ('__unicode__', 'slug', 'get_path',)
+       form = TemplateForm
 
 
 admin.site.register(Page, PageAdmin)
 
 
 admin.site.register(Page, PageAdmin)