Last random entry before more organized approach. Added documentation/admin display...
[philo.git] / admin.py
index f63b576..506267d 100644 (file)
--- a/admin.py
+++ b/admin.py
@@ -9,6 +9,7 @@ from django.utils.html import escape
 from django.utils.text import truncate_words
 from models import *
 from django.core.exceptions import ValidationError, ObjectDoesNotExist
 from django.utils.text import truncate_words
 from models import *
 from django.core.exceptions import ValidationError, ObjectDoesNotExist
+from validators import TreeParentValidator, TreePositionValidator
 
 
 class AttributeInline(generic.GenericTabularInline):
 
 
 class AttributeInline(generic.GenericTabularInline):
@@ -44,6 +45,42 @@ class CollectionMemberInline(admin.TabularInline):
 
 class CollectionAdmin(admin.ModelAdmin):
        inlines = [CollectionMemberInline]
 
 class CollectionAdmin(admin.ModelAdmin):
        inlines = [CollectionMemberInline]
+       list_display = ('name', 'description', 'get_count')
+
+
+class TreeForm(forms.ModelForm):
+       def __init__(self, *args, **kwargs):
+               super(TreeForm, self).__init__(*args, **kwargs)
+               instance = self.instance
+               instance_class=self.get_instance_class()
+               
+               if instance_class is not None:
+                       try:
+                               self.fields['parent'].queryset = instance_class.objects.exclude(id=instance.id)
+                       except ObjectDoesNotExist:
+                               pass
+                       
+               self.fields['parent'].validators = [TreeParentValidator(*self.get_validator_args())]
+       
+       def get_instance_class(self):
+               return self.instance.__class__
+               
+       def get_validator_args(self):
+               return [self.instance]
+       
+       def clean(self):
+               cleaned_data = self.cleaned_data
+               
+               try:
+                       parent = cleaned_data['parent']
+                       slug = cleaned_data['slug']
+                       obj_class = self.get_instance_class()
+                       tpv = TreePositionValidator(parent, slug, obj_class)
+                       tpv(self.instance)
+               except KeyError:
+                       pass
+               
+               return cleaned_data
 
 
 class TemplateAdmin(admin.ModelAdmin):
 
 
 class TemplateAdmin(admin.ModelAdmin):
@@ -67,6 +104,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 = TreeForm
 
 
 class ModelLookupWidget(forms.TextInput):
 
 
 class ModelLookupWidget(forms.TextInput):
@@ -95,41 +133,30 @@ class ModelLookupWidget(forms.TextInput):
                                pass
                return mark_safe(output)
 
                                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
+
+class NodeForm(TreeForm):
+       def get_instance_class(self):
+               return Node
                
                
-               return cleaned_data
+       def get_validator_args(self):
+               return [self.instance, 'instance']
+
 
 class PageAdminForm(NodeForm):
        class Meta:
                model=Page
 
 
 class PageAdminForm(NodeForm):
        class Meta:
                model=Page
 
+
 class RedirectAdminForm(NodeForm):
        class Meta:
                model=Redirect
 class RedirectAdminForm(NodeForm):
        class Meta:
                model=Redirect
-               
+
+
 class FileAdminForm(NodeForm):
        class Meta:
                model=File
 
 class FileAdminForm(NodeForm):
        class Meta:
                model=File
 
+
 class PageAdmin(EntityAdmin):
        prepopulated_fields = {'slug': ('title',)}
        fieldsets = (
 class PageAdmin(EntityAdmin):
        prepopulated_fields = {'slug': ('title',)}
        fieldsets = (
@@ -209,15 +236,18 @@ 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 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',)
 
 class FileAdmin(admin.ModelAdmin):
        form=FileAdminForm
        list_display=('slug', 'mimetype', 'path', 'file',)
 
+
 admin.site.register(Collection, CollectionAdmin)
 admin.site.register(Redirect, RedirectAdmin)
 admin.site.register(File, FileAdmin)
 admin.site.register(Collection, CollectionAdmin)
 admin.site.register(Redirect, RedirectAdmin)
 admin.site.register(File, FileAdmin)