From 7520184e5622ffb40afda52daa2f59a593aa3eb5 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Thu, 29 May 2025 17:48:19 +0300 Subject: [PATCH] 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`. --- core/filters.py | 20 ++++++++++++++++++-- core/graphene/schema.py | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/core/filters.py b/core/filters.py index 8f250640..044eb905 100644 --- a/core/filters.py +++ b/core/filters.py @@ -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): diff --git a/core/graphene/schema.py b/core/graphene/schema.py index 223731fc..9dad47f4 100644 --- a/core/graphene/schema.py +++ b/core/graphene/schema.py @@ -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)