X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/2f7a76a00f2bcae2f67459b7fd86806278ef9b66..92e6313ae3fbcf8f7c381aa91d53f2e32714f2c3:/admin/pages.py diff --git a/admin/pages.py b/admin/pages.py index fc60ad1..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 @@ -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)