diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index f04bb70da..80b3549b2 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -21,6 +21,7 @@ from django.core.validators import MaxLengthValidator from django.core.validators import RegexValidator from django.core.validators import integer_validator from django.db.models import Count +from django.db.models.functions import Lower from django.utils.crypto import get_random_string from django.utils.dateparse import parse_datetime from django.utils.text import slugify @@ -38,6 +39,7 @@ from guardian.utils import get_user_obj_perms_model from rest_framework import fields from rest_framework import serializers from rest_framework.fields import SerializerMethodField +from rest_framework.filters import OrderingFilter if settings.AUDIT_LOG_ENABLED: from auditlog.context import set_actor @@ -575,18 +577,28 @@ class TagSerializer(MatchingModelSerializer, OwnedObjectSerializer): ) def get_children(self, obj): filter_q = self.context.get("document_count_filter") + request = self.context.get("request") if filter_q is None: - request = self.context.get("request") user = getattr(request, "user", None) if request else None filter_q = get_document_count_filter_for_user(user) self.context["document_count_filter"] = filter_q - serializer = TagSerializer( + + children_queryset = ( obj.get_children_queryset() .select_related("owner") - .annotate(document_count=Count("documents", filter=filter_q)), - many=True, - context=self.context, + .annotate(document_count=Count("documents", filter=filter_q)) ) + + view = self.context.get("view") + ordering = ( + OrderingFilter().get_ordering(request, children_queryset, view) + if request and view + else None + ) + ordering = ordering or (Lower("name"),) + children_queryset = children_queryset.order_by(*ordering) + + serializer = TagSerializer(children_queryset, many=True, context=self.context) return serializer.data # children as nested Tag objects