From c3d5160e614d9baae43da48df73220334f35c647 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 1 Jul 2025 15:20:46 +0300 Subject: [PATCH] Features: 1) Add `BaseAutocompleteFilter` and specialized filters (`BrandAdminFilter`, `CategoryAdminFilter`, `TagsAdminFilter`, `VendorAdminFilter`) for admin filtering; Fixes: 1) Replace hardcoded `AutocompleteListFilter` with newly created filters for better modularity; Extra: 1) Refactor queryset string handling and enhance readability in filter choices; 2) Update admin `list_filter` with new filter classes. --- core/admin.py | 10 +++++----- core/filters.py | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/core/admin.py b/core/admin.py index b4eef783..e5cddae3 100644 --- a/core/admin.py +++ b/core/admin.py @@ -13,7 +13,7 @@ from mptt.admin import DraggableMPTTAdmin from evibes.settings import CONSTANCE_CONFIG -from .filters import AutocompleteListFilter +from .filters import BrandAdminFilter, CategoryAdminFilter, TagsAdminFilter, VendorAdminFilter from .forms import OrderForm, OrderProductForm, VendorForm from .models import ( Address, @@ -251,10 +251,10 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, AutocompleteFilterMix list_filter = ( "is_active", "is_digital", - ("brand", AutocompleteListFilter), - ("category", AutocompleteListFilter), - ("tags", AutocompleteListFilter), - ("stocks__vendor", AutocompleteListFilter), + BrandAdminFilter, + CategoryAdminFilter, + TagsAdminFilter, + VendorAdminFilter, "created", "modified", ) diff --git a/core/filters.py b/core/filters.py index f8550786..5afc9c4c 100644 --- a/core/filters.py +++ b/core/filters.py @@ -508,20 +508,39 @@ class AddressFilter(FilterSet): fields = ["uuid", "user_uuid", "user_email", "order_by"] -class AutocompleteListFilter(SimpleListFilter): - title = "" - parameter_name = "" - +class BaseAutocompleteFilter(SimpleListFilter): def lookups(self, request, model_admin): return () def choices(self, changelist): - url = reverse(f"admin:{changelist.opts.app_label}_{self.parameter_name}_autocomplete") - val = changelist.get_query_string(remove=[self.parameter_name]) - current = changelist.params.get(self.parameter_name, "") + url = reverse( + f"admin:{changelist.opts.app_label}_{self.parameter_name}_autocomplete" + ) + qs = changelist.get_query_string(remove=[self.parameter_name]) + val = changelist.params.get(self.parameter_name, "") html = ( f'' + f'data-autocomplete-url="{url}" name="{self.parameter_name}" value="{val}"/>' ) # noinspection DjangoSafeString - yield {"query_string": val, "display": mark_safe(html)} + yield {"query_string": qs, "display": mark_safe(html)} + + +class BrandAdminFilter(BaseAutocompleteFilter): + title = _("By Brand") + parameter_name = _("brand") + + +class CategoryAdminFilter(BaseAutocompleteFilter): + title = _("By Category") + parameter_name = _("category") + + +class TagsAdminFilter(BaseAutocompleteFilter): + title = _("By Product tags") + parameter_name = _("tags") + + +class VendorAdminFilter(BaseAutocompleteFilter): + title = _("By Associated vendor") + parameter_name = _("stocks__vendor")