Features: 1) Add filter_parent_uuid method in CategoryFilter to handle parent UUID filtering; 2) Expand CategoryFilter fields to include parent_uuid and slug.

Fixes: 1) Update `resolve_categories` in schema to include all categories in query.

Extra: 1) Add missing `uuid` import in `filters.py`; 2) Improve handling for null and invalid parent UUID values in `filter_parent_uuid`.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-05-29 17:48:19 +03:00
parent eb48c78b9d
commit 7520184e56
2 changed files with 19 additions and 3 deletions

View file

@ -1,5 +1,6 @@
import json
import logging
import uuid
from django.db.models import Avg, FloatField, OuterRef, Q, Subquery, Value
from django.db.models.functions import Coalesce
@ -251,7 +252,7 @@ class WishlistFilter(FilterSet):
class CategoryFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains")
parent_uuid = UUIDFilter(field_name="parent__uuid", lookup_expr="exact")
parent_uuid = CharFilter(method="filter_parent_uuid")
slug = CharFilter(field_name="slug", lookup_expr="exact")
order_by = OrderingFilter(
@ -264,7 +265,22 @@ class CategoryFilter(FilterSet):
class Meta:
model = Category
fields = ["uuid", "name"]
fields = ["uuid", "name", "parent_uuid", "slug"]
def filter_parent_uuid(self, queryset, name, value):
"""
If ?parent_uuid= or ?parent_uuid=null, return items with parent=None.
Otherwise treat `value` as a real UUID and filter parent__uuid=value.
"""
if value in ("", "null", "None"):
return queryset.filter(parent=None)
try:
uuid_val = uuid.UUID(value)
except (ValueError, TypeError):
return queryset
return queryset.filter(parent__uuid=uuid_val)
class BrandFilter(FilterSet):

View file

@ -184,7 +184,7 @@ class Query(ObjectType):
@staticmethod
def resolve_categories(_parent, info, **kwargs):
categories = Category.objects.filter(parent=None)
categories = Category.objects.all()
if info.context.user.has_perm("core.view_category"):
return categories
return categories.filter(is_active=True)