X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/abb612415838c36da12f53560a2546ae8c43abdd..4d6de7cca540e95b4355cfbc14d068ee2e5b577b:/admin.py?ds=sidebyside diff --git a/admin.py b/admin.py index 12b9183..f63b576 100644 --- 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.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 django.core.exceptions import ValidationError, ObjectDoesNotExist class AttributeInline(generic.GenericTabularInline): @@ -60,8 +66,70 @@ class TemplateAdmin(admin.ModelAdmin): ) 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 += '' % (related_url, name) + output += '%s' % (settings.ADMIN_MEDIA_PREFIX, _('Lookup')) + output += '' + if value: + value_class = self.content_type.model_class() + try: + value_object = value_class.objects.get(pk=value) + output += ' %s' % 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 = ( @@ -76,6 +144,7 @@ class PageAdmin(EntityAdmin): 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) @@ -113,10 +182,10 @@ class PageAdmin(EntityAdmin): 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 - 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): @@ -140,9 +209,17 @@ class PageAdmin(EntityAdmin): 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(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)