Features: 1) Added filter_name method with Elasticsearch-based query processing for ProductFilter, CategoryFilter, and BrandFilter.

Fixes: 1) Replaced direct `name` filtering with `filter_name` method in `ProductFilter`, `CategoryFilter`, and `BrandFilter`.

Extra: 1) Imported `process_query` from `core.elasticsearch`; 2) Cleaned up unused imports and adjusted formatting.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-06-19 10:33:34 +03:00
parent 0a2ef68912
commit faaf226c8a

View file

@ -18,6 +18,7 @@ from django_filters import (
UUIDFilter,
)
from core.elasticsearch import process_query
from core.models import Address, Brand, Category, Feedback, Order, Product, Wishlist
logger = logging.getLogger(__name__)
@ -47,7 +48,7 @@ class CaseInsensitiveListFilter(BaseInFilter, CharFilter):
class ProductFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
name = CharFilter(field_name="name", lookup_expr="icontains", label=_("Name"))
name = CharFilter(method="filter_name", label=_("Name"))
categories = CaseInsensitiveListFilter(
field_name="category__name", label=_("Categories")
)
@ -128,6 +129,18 @@ class ProductFilter(FilterSet):
)
)
def filter_name(self, queryset, _name, value):
search_results = process_query(query=value, request=self.request)["products"]
if search_results:
queryset = queryset.filter(
uuid__in=[
result.get("uuid")
for result in search_results
if result.get("uuid") is not None
]
)
return queryset
def filter_include_flag(self, queryset, **_kwargs):
if not self.data.get("category_uuid"):
raise BadRequest(
@ -350,7 +363,7 @@ class WishlistFilter(FilterSet):
class CategoryFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains", label=_("Name"))
name = CharFilter(method="filter_name", label=_("Name"))
parent_uuid = CharFilter(method="filter_parent_uuid", label=_("Parent"))
slug = CharFilter(field_name="slug", lookup_expr="exact", label=_("Slug"))
whole = BooleanFilter(
@ -382,6 +395,18 @@ class CategoryFilter(FilterSet):
"whole",
]
def filter_name(self, queryset, _name, value):
search_results = process_query(query=value, request=self.request)["categories"]
if search_results:
queryset = queryset.filter(
uuid__in=[
result.get("uuid")
for result in search_results
if result.get("uuid") is not None
]
)
return queryset
def filter_whole_categories(self, queryset, _name, value):
has_own_products = Exists(Product.objects.filter(category=OuterRef("pk")))
has_desc_products = Exists(
@ -411,7 +436,7 @@ class CategoryFilter(FilterSet):
class BrandFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains", label=_("Name"))
name = CharFilter(method="filter_name", label=_("Name"))
categories = CaseInsensitiveListFilter(
field_name="categories__uuid", lookup_expr="exact", label=_("Categories")
)
@ -428,6 +453,18 @@ class BrandFilter(FilterSet):
model = Brand
fields = ["uuid", "name"]
def filter_name(self, queryset, _name, value):
search_results = process_query(query=value, request=self.request)["brands"]
if search_results:
queryset = queryset.filter(
uuid__in=[
result.get("uuid")
for result in search_results
if result.get("uuid") is not None
]
)
return queryset
class FeedbackFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))