X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/e18b86f47054850e9f49c1cb7aaecd8fdf753e4d..f9377788444b280c32dc7004f0a04b131bb74e14:/admin.py diff --git a/admin.py b/admin.py index 178a904..61a1fb8 100644 --- a/admin.py +++ b/admin.py @@ -8,6 +8,8 @@ from django.utils.safestring import mark_safe from django.utils.html import escape from django.utils.text import truncate_words from philo.models import * +from django.core.exceptions import ValidationError, ObjectDoesNotExist +from validators import TreeParentValidator, TreePositionValidator class AttributeInline(generic.GenericTabularInline): @@ -39,14 +41,71 @@ class CollectionMemberInline(admin.TabularInline): extra = 1 classes = ('collapse-closed',) allow_add = True + fields = ('member_content_type', 'member_object_id', 'index',) class CollectionAdmin(admin.ModelAdmin): inlines = [CollectionMemberInline] + list_display = ('name', 'description', 'get_count') -class NodeAdmin(EntityAdmin): - pass +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): + prepopulated_fields = {'slug': ('name',)} + fieldsets = ( + (None, { + 'fields': ('parent', 'name', 'slug') + }), + ('Documentation', { + 'classes': ('collapse', 'collapse-closed'), + 'fields': ('documentation',) + }), + (None, { + 'fields': ('code',) + }), + ('Advanced', { + 'classes': ('collapse','collapse-closed'), + 'fields': ('mimetype',) + }), + ) + save_on_top = True + save_as = True + list_display = ('__unicode__', 'slug', 'get_path',) + form = TreeForm class ModelLookupWidget(forms.TextInput): @@ -76,6 +135,33 @@ class ModelLookupWidget(forms.TextInput): return mark_safe(output) +class NodeForm(TreeForm): + def get_instance_class(self): + return Node + + def get_validator_args(self): + return [self.instance, 'instance'] + + +class PageAdminForm(NodeForm): + class Meta: + model=Page + + +class RedirectAdminForm(NodeForm): + class Meta: + model=Redirect + + +class FileAdminForm(NodeForm): + class Meta: + model=File + + +class NodeAdmin(EntityAdmin): + pass + + class RedirectAdmin(NodeAdmin): fieldsets = ( (None, { @@ -86,6 +172,9 @@ class RedirectAdmin(NodeAdmin): 'fields': ('parent',) }), ) + list_display=('slug', 'target', 'path', 'status_code',) + list_filter=('status_code',) + form = RedirectAdminForm class FileAdmin(NodeAdmin): @@ -99,6 +188,8 @@ class FileAdmin(NodeAdmin): 'fields': ('parent',) }), ) + form=FileAdminForm + list_display=('slug', 'mimetype', 'path', 'file',) class PageAdmin(NodeAdmin): @@ -116,6 +207,7 @@ class PageAdmin(NodeAdmin): 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) @@ -178,34 +270,14 @@ class PageAdmin(NodeAdmin): for container_name, container_content_type in contentreference_containers: if ('contentreference_container_%s' % container_name) in form.cleaned_data: content = form.cleaned_data[('contentreference_container_%s' % container_name)] + if content == None: + continue contentreference, created = page.contentreferences.get_or_create(name=container_name, defaults={'content': content}) if not created: contentreference.content = content contentreference.save() -class TemplateAdmin(admin.ModelAdmin): - prepopulated_fields = {'slug': ('name',)} - fieldsets = ( - (None, { - 'fields': ('parent', 'name', 'slug') - }), - ('Documentation', { - 'classes': ('collapse', 'collapse-closed'), - 'fields': ('documentation',) - }), - (None, { - 'fields': ('code',) - }), - ('Advanced', { - 'classes': ('collapse','collapse-closed'), - 'fields': ('mimetype',) - }), - ) - save_on_top = True - save_as = True - - admin.site.register(Collection, CollectionAdmin) admin.site.register(Redirect, RedirectAdmin) admin.site.register(File, FileAdmin)