Features: 1) Add autocomplete_list_filter support in Admin classes; 2) Introduce SkipVariableDoesNotExistFilter to suppress specific log warnings.
Fixes: 1) Clean up unused imports in `filters.py`. Extra: 1) Apply consistent string quoting across `admin.py` for formatting standardization; 2) Update logging configuration for `django.template` with new filter.
This commit is contained in:
parent
c5fe0cb6c6
commit
1024760c15
3 changed files with 48 additions and 23 deletions
|
|
@ -117,10 +117,10 @@ class ActivationActionsMixin:
|
|||
|
||||
class AjaxAutocompleteSelectWidget(AutocompleteSelect):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.qs_target_value = kwargs.pop('qs_target_value')
|
||||
self.model_admin = kwargs.pop('model_admin')
|
||||
self.model = kwargs.pop('model')
|
||||
self.field_name = kwargs.pop('field_name')
|
||||
self.qs_target_value = kwargs.pop("qs_target_value")
|
||||
self.model_admin = kwargs.pop("model_admin")
|
||||
self.model = kwargs.pop("model")
|
||||
self.field_name = kwargs.pop("field_name")
|
||||
kwargs.update(admin_site=self.model_admin.admin_site)
|
||||
kwargs.update(field=getattr(self.model, self.field_name).field)
|
||||
super().__init__(*args, **kwargs)
|
||||
|
|
@ -128,14 +128,16 @@ class AjaxAutocompleteSelectWidget(AutocompleteSelect):
|
|||
def render(self, name, value, attrs=None, renderer=None):
|
||||
rendered = super().render(name, value, attrs, renderer)
|
||||
|
||||
return (f'<div class="ajax-autocomplete-select-widget-wrapper" data-qs-target-value="{self.qs_target_value}">'
|
||||
f'{rendered}</div>')
|
||||
return (
|
||||
f'<div class="ajax-autocomplete-select-widget-wrapper" data-qs-target-value="{self.qs_target_value}">'
|
||||
f"{rendered}</div>"
|
||||
)
|
||||
|
||||
|
||||
class AjaxAutocompleteListFilter(RelatedFieldListFilter):
|
||||
title = _('list filter')
|
||||
parameter_name = '%s__%s__exact'
|
||||
template = 'djaa_list_filter/admin/filter/autocomplete_list_filter.html'
|
||||
title = _("list filter")
|
||||
parameter_name = "%s__%s__exact"
|
||||
template = "djaa_list_filter/admin/filter/autocomplete_list_filter.html"
|
||||
|
||||
def __init__(self, field, request, params, model, model_admin, field_path):
|
||||
super().__init__(field, request, params, model, model_admin, field_path)
|
||||
|
|
@ -177,22 +179,22 @@ class AjaxAutocompleteListFilterModelAdmin(ModelAdmin):
|
|||
return list_filter
|
||||
|
||||
def get_autocomplete_list_filter(self):
|
||||
return list(getattr(self, 'autocomplete_list_filter', []))
|
||||
return list(getattr(self, "autocomplete_list_filter", []))
|
||||
|
||||
class Media:
|
||||
js = [
|
||||
'admin/js/vendor/jquery/jquery.js',
|
||||
'admin/js/vendor/select2/select2.full.js',
|
||||
'admin/js/vendor/select2/i18n/tr.js',
|
||||
'admin/js/jquery.init.js',
|
||||
'admin/js/autocomplete.js',
|
||||
'djaa_list_filter/admin/js/autocomplete_list_filter.js',
|
||||
"admin/js/vendor/jquery/jquery.js",
|
||||
"admin/js/vendor/select2/select2.full.js",
|
||||
"admin/js/vendor/select2/i18n/tr.js",
|
||||
"admin/js/jquery.init.js",
|
||||
"admin/js/autocomplete.js",
|
||||
"djaa_list_filter/admin/js/autocomplete_list_filter.js",
|
||||
]
|
||||
css = {
|
||||
'screen': [
|
||||
'admin/css/vendor/select2/select2.css',
|
||||
'admin/css/autocomplete.css',
|
||||
'djaa_list_filter/admin/css/autocomplete_list_filter.css',
|
||||
"screen": [
|
||||
"admin/css/vendor/select2/select2.css",
|
||||
"admin/css/autocomplete.css",
|
||||
"djaa_list_filter/admin/css/autocomplete_list_filter.css",
|
||||
]
|
||||
}
|
||||
|
||||
|
|
@ -327,6 +329,10 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, AjaxAutocompleteListF
|
|||
"rating",
|
||||
"modified",
|
||||
)
|
||||
autocomplete_list_filter = (
|
||||
"category",
|
||||
"brand",
|
||||
)
|
||||
list_filter = (
|
||||
"is_active",
|
||||
"is_digital",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ import json
|
|||
import logging
|
||||
import uuid
|
||||
|
||||
from django.contrib.admin import SimpleListFilter
|
||||
from django.core.exceptions import BadRequest
|
||||
from django.db.models import (
|
||||
Avg,
|
||||
|
|
@ -17,9 +16,7 @@ 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,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,18 @@
|
|||
from evibes.settings.base import * # noqa: F403
|
||||
|
||||
|
||||
class SkipVariableDoesNotExistFilter(logging.Filter): # noqa: F405
|
||||
def filter(self, record: logging.LogRecord) -> bool: # noqa: F405
|
||||
if record.exc_info:
|
||||
exc_type, exc_instance, _ = record.exc_info
|
||||
try:
|
||||
if exc_type.__name__ == "VariableDoesNotExist": # type: ignore
|
||||
return False
|
||||
except AttributeError:
|
||||
return True
|
||||
return "VariableDoesNotExist" not in record.getMessage()
|
||||
|
||||
|
||||
LOGGING = {
|
||||
"version": 1,
|
||||
"disable_existing_loggers": False,
|
||||
|
|
@ -25,6 +38,9 @@ LOGGING = {
|
|||
"require_debug_true": {
|
||||
"()": "django.utils.log.RequireDebugTrue",
|
||||
},
|
||||
"skip_variable_doesnotexist": {
|
||||
"()": "evibes.settings.logconfig.SkipVariableDoesNotExistFilter",
|
||||
},
|
||||
},
|
||||
"handlers": {
|
||||
"console_debug": {
|
||||
|
|
@ -61,6 +77,12 @@ LOGGING = {
|
|||
"level": "WARNING",
|
||||
"propagate": False,
|
||||
},
|
||||
"django.template": {
|
||||
"handlers": ["console_debug", "console_production"],
|
||||
"level": "DEBUG" if DEBUG else "INFO", # noqa: F405
|
||||
"propagate": True,
|
||||
"filters": ["skip_variable_doesnotexist"],
|
||||
},
|
||||
"evibes": {
|
||||
"handlers": ["console_debug" if DEBUG else "console_production"], # noqa: F405
|
||||
"level": "DEBUG" if DEBUG else "WARNING", # noqa: F405
|
||||
|
|
|
|||
Loading…
Reference in a new issue