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 json
import logging import logging
import uuid
from django.db.models import Avg, FloatField, OuterRef, Q, Subquery, Value from django.db.models import Avg, FloatField, OuterRef, Q, Subquery, Value
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
@ -251,7 +252,7 @@ class WishlistFilter(FilterSet):
class CategoryFilter(FilterSet): class CategoryFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains") 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") slug = CharFilter(field_name="slug", lookup_expr="exact")
order_by = OrderingFilter( order_by = OrderingFilter(
@ -264,7 +265,22 @@ class CategoryFilter(FilterSet):
class Meta: class Meta:
model = Category 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): class BrandFilter(FilterSet):

View file

@ -184,7 +184,7 @@ class Query(ObjectType):
@staticmethod @staticmethod
def resolve_categories(_parent, info, **kwargs): 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"): if info.context.user.has_perm("core.view_category"):
return categories return categories
return categories.filter(is_active=True) return categories.filter(is_active=True)