Added template code validation to the admin. This essentially addresses bug #14 by...
[philo.git] / admin / pages.py
index fc60ad1..ede4a0d 100644 (file)
@@ -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
@@ -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), {
-                                       '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), {
@@ -82,13 +85,40 @@ class PageAdmin(ViewAdmin):
                                        contentreference = page.contentreferences.get(name=container_name)
                                except ContentReference.DoesNotExist:
                                        contentreference = ContentReference(name=container_name, page=page, content_type=container_content_type)
-                               
-                               if content == None:
-                                       contentreference.content_id = None
                                else:
-                                       contentreference.content_id = content.id
+                                       if content == None:
+                                               contentreference.delete()
                                
-                               contentreference.save()
+                               if content is not None:
+                                       contentreference.content_id = content.id
+                                       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):
@@ -112,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)