From a0fb80130ff4f1fdd9e75c89e8b93b49d34ee797 Mon Sep 17 00:00:00 2001
From: Tomas Gavenciak <gavento@ucw.cz>
Date: Thu, 21 May 2015 17:44:51 +0200
Subject: [PATCH] Boost admin to the stars!!!

---
 seminar/admin.py | 135 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 86 insertions(+), 49 deletions(-)

diff --git a/seminar/admin.py b/seminar/admin.py
index 3a0b2e1f..a2a594f7 100644
--- a/seminar/admin.py
+++ b/seminar/admin.py
@@ -5,25 +5,61 @@ import reversion
 from solo.admin import SingletonModelAdmin
 from ckeditor.widgets import CKEditorWidget
 
-from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni
+from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici
 import autocomplete_light
-### Nastaveni
+
+
+### Globální nastavení
 
 admin.site.register(Nastaveni, SingletonModelAdmin)
 
-### Skola
 
-class SkolaAdmin(reversion.VersionAdmin):
-    fieldsets = [
-        (None,              {'fields': ['nazev', 'kratky_nazev', 'je_zs', 'je_ss']}),
-        (u'Interní ID',     {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}),
-        (u'Adresa',         {'fields': ['ulice', 'mesto', 'psc', 'stat']}),
-        ]
-    list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat', 'je_zs', 'je_ss']
-    list_filter = ['stat', 'je_zs', 'je_ss']
-    search_fields = ['nazev', 'mesto', 'ulice']
+### INLINES
 
-admin.site.register(Skola, SkolaAdmin)
+class ResitelInline(admin.TabularInline):
+    model = Resitel
+    fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ]
+    readonly_fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ]
+    extra = 0
+    def has_add_permission(self, req): return False
+
+
+class CisloInline(admin.TabularInline):
+    model = Cislo
+    fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne_db', 'poznamka']
+    readonly_fields = ['cislo']
+    extra = 0
+    def has_add_permission(self, req): return False
+
+
+class PrilohaReseniInline(admin.StackedInline):
+    model = PrilohaReseni
+    fields = ['timestamp', 'soubor', 'poznamka']
+    readonly_fields = ['timestamp']
+    extra = 0
+
+
+class ReseniKProblemuInline(admin.TabularInline):
+    form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['resitel'], fields=['resitel'])
+    model = Reseni
+    fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka']
+    readonly_fields = ['timestamp']
+    extra = 0
+
+
+class ReseniKResiteliInline(admin.TabularInline):
+    model = Reseni
+    fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka']
+    readonly_fields = ['timestamp', 'problem']
+    extra = 0
+    def has_add_permission(self, req): return False
+
+
+class Soustredeni_UcastniciInline(admin.TabularInline):
+    form = autocomplete_light.modelform_factory(Soustredeni_Ucastnici, autocomplete_fields=['resitel'], fields=['resitel'])
+    model = Soustredeni_Ucastnici
+    fields = ['resitel', 'poznamka', ]
+    extra = 0
 
 
 ### Resitel
@@ -40,15 +76,33 @@ class ResitelAdmin(reversion.VersionAdmin):
     list_display = ['jmeno', 'prijmeni', 'user', 'pohlavi_muz', 'skola', 'rok_maturity']
     list_filter = ['pohlavi_muz', 'rok_maturity', 'zasilat']
     search_fields = ['jmeno', 'prijmeni', 'ulice', 'user', 'mesto', 'email']
+    inlines = [ReseniKResiteliInline]
 
 admin.site.register(Resitel, ResitelAdmin)
 
 
+### Skola
+
+class SkolaAdmin(reversion.VersionAdmin):
+    fieldsets = [
+        (None,              {'fields': ['nazev', 'kratky_nazev', 'je_zs', 'je_ss']}),
+        (u'Interní ID',     {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}),
+        (u'Adresa',         {'fields': ['ulice', 'mesto', 'psc', 'stat']}),
+        (None,              {'fields': ['poznamka']}),
+        ]
+    list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat', 'je_zs', 'je_ss']
+    list_filter = ['stat', 'je_zs', 'je_ss']
+    search_fields = ['nazev', 'mesto', 'ulice']
+    inlines = [ResitelInline]
+
+admin.site.register(Skola, SkolaAdmin)
+
+
 ### Cislo
 
 class CisloAdmin(reversion.VersionAdmin):
     fieldsets = [
-        (None,              {'fields': ['cislo', 'rocnik', 'verejne_db']}),
+        (None,              {'fields': ['cislo', 'rocnik', 'verejne_db', 'poznamka']}),
         (u'Data',           {'fields': ['datum_vydani', 'datum_deadline']}),
         ]
     list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne']
@@ -57,12 +111,6 @@ class CisloAdmin(reversion.VersionAdmin):
 
 admin.site.register(Cislo, CisloAdmin)
 
-class CisloInline(admin.StackedInline):
-    model = Cislo
-    fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne']
-    readonly_fields = ['cislo']
-    extra = 0
-
 
 ### Rocnik
 
@@ -78,30 +126,24 @@ admin.site.register(Rocnik, RocnikAdmin)
 
 
 ### PrilohaReseni
-
-class PrilohaReseniAdmin(reversion.VersionAdmin):
-    readonly_fields = ['timestamp', 'reseni']
-    fieldsets = [
-        (None,              {'fields': ['reseni', 'soubor', 'timestamp']}),
-        (u'Poznámky',       {'fields': ['poznamka']}),
-        ]
-    list_display = ['reseni', 'soubor', 'timestamp']
-    list_filter = ['reseni', 'timestamp']
-    search_fields = []
-
-admin.site.register(PrilohaReseni, PrilohaReseniAdmin)
-
-class PrilohaReseniInline(admin.StackedInline):
-    model = PrilohaReseni
-    fields = ['timestamp', 'soubor', 'poznamka']
-    readonly_fields = ['timestamp']
-    extra = 1
+# NOTE: Nemá pravděpodobně smysl používat
+# class PrilohaReseniAdmin(reversion.VersionAdmin):
+#     readonly_fields = ['timestamp', 'reseni']
+#     fieldsets = [
+#         (None,              {'fields': ['reseni', 'soubor', 'timestamp']}),
+#         (u'Poznámky',       {'fields': ['poznamka']}),
+#         ]
+#     list_display = ['reseni', 'soubor', 'timestamp']
+#     list_filter = ['reseni', 'timestamp']
+#     search_fields = []
+# 
+# admin.site.register(PrilohaReseni, PrilohaReseniAdmin)
 
 
 ### Reseni
 
 class ReseniAdmin(reversion.VersionAdmin):
-    form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem'], fields=['problem'])
+    form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem', 'resitel'], fields=['problem', 'resitel'])
     fieldsets = [
         (None,              {'fields': ['problem', 'resitel', 'forma', 'body', 'cislo_body', 'timestamp']}),
         (u'Poznámky',       {'fields': ['poznamka']}),
@@ -114,12 +156,6 @@ class ReseniAdmin(reversion.VersionAdmin):
 
 admin.site.register(Reseni, ReseniAdmin)
 
-class ReseniInline(admin.TabularInline):
-    model = Reseni
-    fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka']
-    readonly_fields = ['poznamka', 'resitel', 'timestamp', 'cislo_body', 'resitel', 'forma']
-    extra = 0
-
 
 ### Problem
 
@@ -135,15 +171,15 @@ class ProblemAdmin(reversion.VersionAdmin):
     form = ProblemAdminForm
     fieldsets = [
         (None,              {'fields': ['nazev', 'typ', 'stav', 'autor', 'zamereni', 'body', 'timestamp']}),
-        (u'Vydání',         {'fields': ['cislo_zadani', 'kod', 'cislo_reseni', 'opravovatel']}),
-        (u'Texty',          {'fields': ['text_problemu', 'text_problemu_org']}),
+        (u'Vydání',         {'fields': ['cislo_zadani', 'kod', 'cislo_reseni', 'opravovatel', 'text_problemu']}),
+        (None,              {'fields': ['text_problemu_org']}),
         ]
     readonly_fields = ['timestamp']
     list_display = ['nazev', 'typ', 'kod', 'stav', 'autor', 'opravovatel', 'verejne', 'cislo_zadani']
     list_select_related = True
     list_filter = ['typ', 'stav', 'timestamp']
     search_fields = ['nazev', 'kod', 'text_problemu_org', 'text_problemu']
-    inlines = [ReseniInline]
+    inlines = [ReseniKProblemuInline]
     view_on_site = Problem.verejne_url
 
 admin.site.register(Problem, ProblemAdmin)
@@ -157,8 +193,9 @@ class SoustredeniAdmin(reversion.VersionAdmin):
         (u'Data',           {'fields': ['datum_zacatku', 'datum_konce']}),
         ]
     list_display = ['rocnik', 'misto', 'datum_zacatku', 'verejne']
+    inlines = [Soustredeni_UcastniciInline]
     list_filter = ['rocnik']
     view_on_site = Soustredeni.verejne_url
-    # TODO: UcastNaSoustredeni jako inline
 
 admin.site.register(Soustredeni, SoustredeniAdmin)
+