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:
parent
eb48c78b9d
commit
7520184e56
2 changed files with 19 additions and 3 deletions
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue