From 1b612a4aa69d5838434319f6a881b815197fc6c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sun, 22 May 2022 11:35:58 +0200
Subject: [PATCH] Improve filters in admin views to restrict options when event
 filter is active

For admin views of AK (category, requirements), Room (properties), AKSlot (room) the mentioned filters now only show choices related to the current event if such a filter is active at the same time.
This implements #128
Additionally, the filter ordering was adapted for all admin views (event now always shows up first)
---
 AKModel/admin.py | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/AKModel/admin.py b/AKModel/admin.py
index 60e38891..9c7a410a 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -1,7 +1,7 @@
 from django import forms
 from django.apps import apps
 from django.contrib import admin
-from django.contrib.admin import SimpleListFilter
+from django.contrib.admin import SimpleListFilter, RelatedFieldListFilter
 from django.db.models import Count, F
 from django.shortcuts import render, redirect
 from django.urls import reverse_lazy
@@ -19,6 +19,15 @@ from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequire
 from AKModel.urls import get_admin_urls_event_wizard, get_admin_urls_event
 
 
+class EventRelatedFieldListFilter(RelatedFieldListFilter):
+    def field_choices(self, field, request, model_admin):
+        ordering = self.field_admin_ordering(field, request, model_admin)
+        limit_choices = {}
+        if "event__id__exact" in request.GET:
+            limit_choices['event__id__exact'] = request.GET["event__id__exact"]
+        return field.get_choices(include_blank=False, limit_choices_to=limit_choices, ordering=ordering)
+
+
 @admin.register(Event)
 class EventAdmin(admin.ModelAdmin):
     model = Event
@@ -57,7 +66,7 @@ class EventAdmin(admin.ModelAdmin):
 class AKOwnerAdmin(admin.ModelAdmin):
     model = AKOwner
     list_display = ['name', 'institution', 'event']
-    list_filter = ['institution', 'event']
+    list_filter = ['event', 'institution']
     list_editable = []
     ordering = ['name']
 
@@ -160,7 +169,7 @@ class AKAdminForm(forms.ModelForm):
 class AKAdmin(SimpleHistoryAdmin):
     model = AK
     list_display = ['name', 'short_name', 'category', 'track', 'is_wish', 'interest', 'interest_counter', 'event']
-    list_filter = ['category', WishFilter, 'event']
+    list_filter = ['event', WishFilter, ('category', EventRelatedFieldListFilter), ('requirements', EventRelatedFieldListFilter)]
     list_editable = ['short_name', 'track', 'interest', 'interest_counter']
     ordering = ['pk']
     actions = ['wiki_export']
@@ -210,7 +219,7 @@ class RoomForm(AvailabilitiesFormMixin, forms.ModelForm):
 class RoomAdmin(admin.ModelAdmin):
     model = Room
     list_display = ['name', 'location', 'capacity', 'event']
-    list_filter = ['location', 'properties', 'event']
+    list_filter = ['event', ('properties', EventRelatedFieldListFilter), 'location']
     list_editable = []
     ordering = ['location', 'name']
     change_form_template = "admin/AKModel/room_change_form.html"
@@ -241,7 +250,7 @@ class AKSlotAdminForm(forms.ModelForm):
 class AKSlotAdmin(admin.ModelAdmin):
     model = AKSlot
     list_display = ['id', 'ak', 'room', 'start', 'duration', 'event']
-    list_filter = ['room', 'event']
+    list_filter = ['event', ('room', EventRelatedFieldListFilter)]
     ordering = ['start']
     readonly_fields = ['ak_details_link', 'updated']
     form = AKSlotAdminForm
-- 
GitLab