From b840e1f6848a4a1c8c77be7c36744f4dbf75ea69 Mon Sep 17 00:00:00 2001 From: test test Date: Thu, 1 Jul 2021 17:43:45 +0200 Subject: [PATCH] Add new filter to filter student based on multiple trainings --- teleforma/admin.py | 8 ++++- teleforma/admin_filter.py | 41 ++++++++++++++++++++++ teleforma/templates/admin/multiselect.html | 23 ++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 teleforma/admin_filter.py create mode 100644 teleforma/templates/admin/multiselect.html diff --git a/teleforma/admin.py b/teleforma/admin.py index 8d01b57b..e3dbbc3c 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import csv import datetime +from teleforma.admin_filter import MultipleChoiceListFilter from teleforma.models.chat import ChatMessage from django.contrib import admin @@ -121,7 +122,12 @@ class BalanceFilter(admin.SimpleListFilter): return queryset.filter(balance__gt=0) else: return queryset +class TrainingsFilter(MultipleChoiceListFilter): + title = 'Formations' + parameter_name = 'trainings__in' + def lookups(self, request, model_admin): + return [(training.id, str(training)) for training in Training.objects.all()] class StudentAdmin(admin.ModelAdmin): model = Student @@ -131,7 +137,7 @@ class StudentAdmin(admin.ModelAdmin): inlines = [PaymentInline, OptionalFeeInline, DiscountInline, PaybackInline] search_fields = ['user__first_name', 'user__last_name', 'user__username'] list_filter = ['user__is_active', 'restricted', 'is_subscribed', 'platform_only', PeriodListFilter, - 'trainings', 'iej', 'procedure', 'written_speciality', 'oral_speciality', + TrainingsFilter, 'iej', 'procedure', 'written_speciality', 'oral_speciality', 'oral_1', 'oral_2', 'fascicule', BalanceFilter] list_display = ['student_name', 'restricted', 'get_trainings', 'platform_only', 'total_payments', 'total_fees', 'balance', 'balance_intermediary'] diff --git a/teleforma/admin_filter.py b/teleforma/admin_filter.py new file mode 100644 index 00000000..41918841 --- /dev/null +++ b/teleforma/admin_filter.py @@ -0,0 +1,41 @@ + +from django.contrib import admin + + +class MultipleChoiceListFilter(admin.SimpleListFilter): + template = 'admin/multiselect.html' + + + def __init__(self, request, params, model, model_admin): + super().__init__(request, params, model, model_admin) + self.used_parameters[self.parameter_name] = request.GET.getlist(self.parameter_name) or [] + lookup_choices = self.lookups(request, model_admin) + if lookup_choices is None: + lookup_choices = () + self.lookup_choices = list(lookup_choices) + + + def lookups(self, request, model_admin): + """ + Must be overridden to return a list of tuples (value, verbose value) + """ + raise NotImplementedError( + 'The MultipleChoiceListFilter.lookups() method must be overridden to ' + 'return a list of tuples (value, verbose value).' + ) + + def queryset(self, request, queryset): + if request.GET.get(self.parameter_name): + kwargs = {self.parameter_name: request.GET.getlist(self.parameter_name)} + queryset = queryset.filter(**kwargs) + return queryset + + + def choices(self, changelist): + + for lookup, title in self.lookup_choices: + yield { + 'selected': self.value() and str(lookup) in self.value(), + 'query_string': changelist.get_query_string({self.parameter_name: lookup}), + 'display': title, + } \ No newline at end of file diff --git a/teleforma/templates/admin/multiselect.html b/teleforma/templates/admin/multiselect.html new file mode 100644 index 00000000..cd4a6794 --- /dev/null +++ b/teleforma/templates/admin/multiselect.html @@ -0,0 +1,23 @@ + +{% comment %} {{ choices }} {% endcomment %} + +
+ + + + +
\ No newline at end of file -- 2.39.5