Contact forms app.
[prawokultury.git] / migdal / admin.py
index 6d4baef..4043921 100644 (file)
@@ -2,17 +2,13 @@
 # This file is part of PrawoKultury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
+from django.conf import settings
 from django.contrib import admin
 from django.utils.translation import ugettext_lazy as _
-from migdal.models import Category, Entry, Attachment
-from migdal import settings
-
-
-def translated_fields(field_names, languages=settings.LANGUAGES):
-    return tuple("%s_%s" % (field_name, lang_code)
-                for field_name in field_names
-                for lang_code, lang_name in languages
-                )
+from migdal.models import Entry, Attachment
+from migdal import app_settings
+from migdal.helpers import translated_fields
+from prawokultury.model_helpers import filtered_model
 
 
 class AttachmentInline(admin.TabularInline):
@@ -20,51 +16,78 @@ class AttachmentInline(admin.TabularInline):
     readonly_fields = ['url']
 
 
-class EntryAdmin(admin.ModelAdmin):
-    fieldsets = (
-        (None, {'fields': (('type', 'promo'), 'author', 'author_email', 'image')}),
-    ) + tuple(
-        (ln, {'fields': (
-            ('published_%s' % lc),
-            'title_%s' % lc,
-            'slug_%s' % lc,
-            'lead_%s' % lc,
-            'body_%s' % lc,
-            )})
-        for lc, ln in settings.OBLIGATORY_LANGUAGES
-    ) + tuple(
-        (ln, {'fields': (
-            ('needed_%s' % lc, 'published_%s' % lc),
-            'title_%s' % lc,
-            'slug_%s' % lc,
-            'lead_%s' % lc,
-            'body_%s' % lc,
-            )})
-        for lc, ln in settings.OPTIONAL_LANGUAGES
-    ) + (
-        (_('Categories'), {'fields': ('categories',)}),
-    )
-    prepopulated_fields = dict([
-            ("slug_%s" % lang_code, ("title_%s" % lang_code,))
-            for lang_code, lang_name in settings.LANGUAGES
-        ]) 
+def filtered_entry_admin(typ):
+    class EntryAdmin(admin.ModelAdmin):
+        def queryset(self, request):
+            return self.model.objects.filter(type=typ)
+
+        date_hierarchy = 'date'
+        readonly_fields = ('date', 'changed_at') + \
+            translated_fields(('published_at',))
+        _promo_if_necessary = ('promo',) if typ.promotable else ()
+
+        fieldsets = (
+            (None, {
+                'fields': _promo_if_necessary + (
+                    'author', 'author_email', 'image', 'date', 'changed_at')
+                }),
+        ) + tuple(
+            (ln, {'fields': (
+                ('published_%s' % lc),
+                'published_at_%s' % lc,
+                'title_%s' % lc,
+                'slug_%s' % lc,
+                'lead_%s' % lc,
+                'body_%s' % lc,
+                )})
+            for lc, ln in app_settings.OBLIGATORY_LANGUAGES
+        ) + tuple(
+            (ln, {'fields': (
+                ('needed_%s' % lc, 'published_%s' % lc),
+                'published_at_%s' % lc,
+                'title_%s' % lc,
+                'slug_%s' % lc,
+                'lead_%s' % lc,
+                'body_%s' % lc,
+                )})
+            for lc, ln in app_settings.OPTIONAL_LANGUAGES
+        )
+
+        if typ.categorized:
+            fieldsets += (
+                (_('Categories'), {'fields': ('categories',)}),
+            )
+        prepopulated_fields = dict([
+                ("slug_%s" % lang_code, ("title_%s" % lang_code,))
+                for lang_code, lang_name in settings.LANGUAGES
+            ]) 
+
+        list_display = translated_fields(('title',),
+                            app_settings.OBLIGATORY_LANGUAGES) + \
+                ('date', 'author') + \
+                _promo_if_necessary + \
+                translated_fields(('published_at',)) + \
+                translated_fields(('needed',), app_settings.OPTIONAL_LANGUAGES)
+        list_filter = _promo_if_necessary + \
+                translated_fields(('published',)) + \
+                translated_fields(('needed',), app_settings.OPTIONAL_LANGUAGES)
+        inlines = (AttachmentInline,)
+        search_fields = ('title_pl', 'title_en')
+    return EntryAdmin
 
-    list_display = translated_fields(('title',), settings.OBLIGATORY_LANGUAGES
-            ) + ('type', 'date', 'author'
-            ) + translated_fields(('published',)
-            ) + translated_fields(('needed',), settings.OPTIONAL_LANGUAGES)
-    list_filter = ('type',) + translated_fields(('published',)
-            ) + translated_fields(('needed',), settings.OPTIONAL_LANGUAGES)
-    inlines = (AttachmentInline,)
 
+for typ in app_settings.TYPES:
+    newmodel = filtered_model("Entry_%s" % typ.db, Entry, 'type', typ.db, typ.slug)
+    admin.site.register(newmodel, filtered_entry_admin(typ))
 
-class CategoryAdmin(admin.ModelAdmin):
-    list_display = translated_fields(('title', 'slug'))
-    prepopulated_fields = dict([
-            ("slug_%s" % lang_code, ("title_%s" % lang_code,))
-            for lang_code, lang_name in settings.LANGUAGES
-        ]) 
 
+if app_settings.TAXONOMIES:
+    from migdal.models import Category
 
-admin.site.register(Entry, EntryAdmin)
-admin.site.register(Category, CategoryAdmin)
+    class CategoryAdmin(admin.ModelAdmin):
+        list_display = translated_fields(('title', 'slug')) + ('taxonomy',)
+        prepopulated_fields = dict([
+                ("slug_%s" % lang_code, ("title_%s" % lang_code,))
+                for lang_code, lang_name in settings.LANGUAGES
+            ]) 
+    admin.site.register(Category, CategoryAdmin)