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