Added admin form validation to prevent:
[philo.git] / admin.py
index 12b9183..f63b576 100644 (file)
--- a/admin.py
+++ b/admin.py
@@ -2,7 +2,13 @@ from django.contrib import admin
 from django.contrib.contenttypes import generic
 from django.contrib.contenttypes.models import ContentType
 from django import forms
 from django.contrib.contenttypes import generic
 from django.contrib.contenttypes.models import ContentType
 from django import forms
+from django.conf import settings
+from django.utils.translation import ugettext as _
+from django.utils.safestring import mark_safe
+from django.utils.html import escape
+from django.utils.text import truncate_words
 from models import *
 from models import *
+from django.core.exceptions import ValidationError, ObjectDoesNotExist
 
 
 class AttributeInline(generic.GenericTabularInline):
 
 
 class AttributeInline(generic.GenericTabularInline):
@@ -60,8 +66,70 @@ class TemplateAdmin(admin.ModelAdmin):
        )
        save_on_top = True
        save_as = True
        )
        save_on_top = True
        save_as = True
+       list_display = ('__unicode__', 'slug', 'get_path',)
 
 
 
 
+class ModelLookupWidget(forms.TextInput):
+       # is_hidden = False
+       
+       def __init__(self, content_type, attrs=None):
+               self.content_type = content_type
+               super(ModelLookupWidget, self).__init__(attrs)
+       
+       def render(self, name, value, attrs=None):
+               related_url = '../../../%s/%s/' % (self.content_type.app_label, self.content_type.model)
+               if attrs is None:
+                       attrs = {}
+               if not attrs.has_key('class'):
+                       attrs['class'] = 'vForeignKeyRawIdAdminField'
+               output = super(ModelLookupWidget, self).render(name, value, attrs)
+               output += '<a href="%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);">' % (related_url, name)
+               output += '<img src="%simg/admin/selector-search.gif" width="16" height="16" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, _('Lookup'))
+               output += '</a>'
+               if value:
+                       value_class = self.content_type.model_class()
+                       try:
+                               value_object = value_class.objects.get(pk=value)
+                               output += '&nbsp;<strong>%s</strong>' % escape(truncate_words(value_object, 14))
+                       except value_class.DoesNotExist:
+                               pass
+               return mark_safe(output)
+
+class NodeForm(forms.ModelForm):
+       
+       def __init__(self, *args, **kwargs):
+               super(NodeForm, self).__init__(*args, **kwargs)
+               instance = self.instance
+               try:
+                       self.fields['parent'].queryset = instance.node_ptr.__class__.objects.exclude(id=instance.id)
+               except ObjectDoesNotExist:
+                       pass
+       
+       def clean(self):
+               cleaned_data = self.cleaned_data
+               parent = self.cleaned_data['parent']
+               self.instance.validate_parents(parent)
+                       
+               try:
+                       Node.objects.get(slug=self.cleaned_data['slug'], parent=parent)
+                       raise ValidationError("A node with that path (parent and slug) already exists.")
+               except ObjectDoesNotExist:
+                       pass
+               
+               return cleaned_data
+
+class PageAdminForm(NodeForm):
+       class Meta:
+               model=Page
+
+class RedirectAdminForm(NodeForm):
+       class Meta:
+               model=Redirect
+               
+class FileAdminForm(NodeForm):
+       class Meta:
+               model=File
+
 class PageAdmin(EntityAdmin):
        prepopulated_fields = {'slug': ('title',)}
        fieldsets = (
 class PageAdmin(EntityAdmin):
        prepopulated_fields = {'slug': ('title',)}
        fieldsets = (
@@ -76,6 +144,7 @@ class PageAdmin(EntityAdmin):
        list_display = ('title', 'path', 'template')
        list_filter = ('template',)
        search_fields = ['title', 'slug', 'contentlets__content']
        list_display = ('title', 'path', 'template')
        list_filter = ('template',)
        search_fields = ['title', 'slug', 'contentlets__content']
+       form = PageAdminForm
        
        def get_fieldsets(self, request, obj=None, **kwargs):
                fieldsets = list(self.fieldsets)
        
        def get_fieldsets(self, request, obj=None, **kwargs):
                fieldsets = list(self.fieldsets)
@@ -113,10 +182,10 @@ class PageAdmin(EntityAdmin):
                        for container_name, container_content_type in contentreference_containers:
                                initial_content = None
                                try:
                        for container_name, container_content_type in contentreference_containers:
                                initial_content = None
                                try:
-                                       initial_content = page.contentreferences.get(name__exact=container_name, content_type=container_content_type)
+                                       initial_content = page.contentreferences.get(name__exact=container_name, content_type=container_content_type).content.pk
                                except ContentReference.DoesNotExist:
                                        pass
                                except ContentReference.DoesNotExist:
                                        pass
-                               form.base_fields[('contentreference_container_%s' % container_name)] = forms.ModelChoiceField(label='References', initial=initial_content, required=False, queryset=container_content_type.model_class().objects.all())
+                               form.base_fields[('contentreference_container_%s' % container_name)] = forms.ModelChoiceField(label='References', widget=ModelLookupWidget(container_content_type), initial=initial_content, required=False, queryset=container_content_type.model_class().objects.all())
                return form
        
        def save_model(self, request, page, form, change):
                return form
        
        def save_model(self, request, page, form, change):
@@ -140,9 +209,17 @@ class PageAdmin(EntityAdmin):
                                        contentreference.content = content
                                        contentreference.save()
 
                                        contentreference.content = content
                                        contentreference.save()
 
+class RedirectAdmin(admin.ModelAdmin):
+       list_display=('slug', 'target', 'path', 'status_code',)
+       list_filter=('status_code',)
+       form = RedirectAdminForm
+
+class FileAdmin(admin.ModelAdmin):
+       form=FileAdminForm
+       list_display=('slug', 'mimetype', 'path', 'file',)
 
 admin.site.register(Collection, CollectionAdmin)
 
 admin.site.register(Collection, CollectionAdmin)
-admin.site.register(Redirect)
-admin.site.register(File)
+admin.site.register(Redirect, RedirectAdmin)
+admin.site.register(File, FileAdmin)
 admin.site.register(Page, PageAdmin)
 admin.site.register(Template, TemplateAdmin)
 admin.site.register(Page, PageAdmin)
 admin.site.register(Template, TemplateAdmin)