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`.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-07-01 15:06:32 +03:00
parent 86406ac169
commit d0b4706c16
6 changed files with 30 additions and 18 deletions

View file

@ -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 = []

View file

@ -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'<input type="hidden" class="django-autocomplete admin-autocomplete-filter" '
f'data-autocomplete-url="{url}" name="{self.parameter_name}" value="{current}"/>'
)
# noinspection DjangoSafeString
yield {"query_string": val, "display": mark_safe(html)}

View file

@ -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",

View file

@ -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")

16
poetry.lock generated
View file

@ -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"

View file

@ -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 }