From d0b4706c162eaeeb3917551d91e6787b14aebef7 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 1 Jul 2025 15:06:32 +0300 Subject: [PATCH] Features: 1) Implement `AutocompleteListFilter` class enhancing admin filter customization; 2) Add `AutocompleteFilterMixin` for simplified admin filter inclusion functionality; Fixes: 1) Remove unused `django-autocompletefilter` package and adjust imports; 2) Clean up related settings and dependency references; Extra: Minor formatting adjustments in `payments/admin.py`. --- core/admin.py | 6 +++++- core/filters.py | 22 ++++++++++++++++++++++ evibes/settings/base.py | 1 - payments/admin.py | 2 ++ poetry.lock | 16 +--------------- pyproject.toml | 1 - 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/core/admin.py b/core/admin.py index 6a6433ee..aa621089 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,6 +1,5 @@ from contextlib import suppress -from autocompletefilter.admin import AutocompleteFilterMixin from autocompletefilter.filters import AutocompleteListFilter from constance.admin import Config from constance.admin import ConstanceAdmin as BaseConstanceAdmin @@ -38,6 +37,11 @@ from .models import ( ) +class AutocompleteFilterMixin: + class Media: + js = ("admin/js/autocomplete.js",) + + class FieldsetsMixin: general_fields: list = [] relation_fields: list = [] diff --git a/core/filters.py b/core/filters.py index 609aee41..f8550786 100644 --- a/core/filters.py +++ b/core/filters.py @@ -2,6 +2,7 @@ import json import logging import uuid +from django.contrib.admin import SimpleListFilter from django.core.exceptions import BadRequest from django.db.models import ( Avg, @@ -16,7 +17,9 @@ from django.db.models import ( When, ) from django.db.models.functions import Coalesce +from django.urls import reverse from django.utils.http import urlsafe_base64_decode +from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django_filters import ( BaseInFilter, @@ -503,3 +506,22 @@ class AddressFilter(FilterSet): class Meta: model = Address fields = ["uuid", "user_uuid", "user_email", "order_by"] + + +class AutocompleteListFilter(SimpleListFilter): + title = "" + parameter_name = "" + + 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, "") + html = ( + f'' + ) + # noinspection DjangoSafeString + yield {"query_string": val, "display": mark_safe(html)} diff --git a/evibes/settings/base.py b/evibes/settings/base.py index 91f1085e..d03f904c 100644 --- a/evibes/settings/base.py +++ b/evibes/settings/base.py @@ -116,7 +116,6 @@ INSTALLED_APPS: list[str] = [ "health_check.contrib.psutil", "health_check.contrib.db_heartbeat", "cacheops", - "autocompletefilter", "django_hosts", "django_celery_beat", "django_celery_results", diff --git a/payments/admin.py b/payments/admin.py index b5ac1c9b..35c193d4 100644 --- a/payments/admin.py +++ b/payments/admin.py @@ -19,6 +19,7 @@ class TransactionInline(admin.TabularInline): qs = super().get_queryset(request) return qs.select_related("order") + @register(Balance) class BalanceAdmin(ActivationActionsMixin, ModelAdmin): inlines = (TransactionInline,) @@ -30,6 +31,7 @@ class BalanceAdmin(ActivationActionsMixin, ModelAdmin): qs = super().get_queryset(request) return qs.prefetch_related("transactions", "user") + @register(Transaction) class TransactionAdmin(ActivationActionsMixin, ModelAdmin): list_display = ("balance", "amount", "currency", "payment_method", "order") diff --git a/poetry.lock b/poetry.lock index 5738d3a6..556e591b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1056,20 +1056,6 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""} argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] -[[package]] -name = "django-autocompletefilter" -version = "0.0.9" -description = "Django ModelAdmin list_filter with autocomplete widget." -optional = false -python-versions = ">=3.4" -files = [ - {file = "django_autocompletefilter-0.0.9-py3-none-any.whl", hash = "sha256:2225053538a3621260016c228d439aa5fcf37eacc8c17a7de9bed85393a255b3"}, - {file = "django_autocompletefilter-0.0.9.tar.gz", hash = "sha256:d1d43c2c5cabcf0b657ab03dcde6773ad1bb045dec6ea90164394b5198e7ff5c"}, -] - -[package.dependencies] -Django = ">=2.0" - [[package]] name = "django-cacheops" version = "7.2" @@ -5150,4 +5136,4 @@ worker = ["celery", "celery-prometheus-exporter", "django-celery-beat", "django- [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "15df12af385d77de2231923d73a8eff5c67d0f88657efec5ebc53741fbe8e4e7" +content-hash = "58d67f7b6c2313bdb117965a9c9555319bbb059db043e5723d39a27c36695939" diff --git a/pyproject.toml b/pyproject.toml index 37e34033..1d362f5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,6 @@ colorlog = "6.9.0" click = "8.2.1" cryptography = "45.0.4" django = "5.2" -django-autocompletefilter = "0.0.9" django-cacheops = "7.2" django-celery-beat = { version = "2.8.1", optional = true } django-celery-results = { version = "2.6.0", optional = true }