diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index ff37bc1..1d1f1f5 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -1503,6 +1503,7 @@ class AdminBookReferenceListSerializer(serializers.ModelSerializer): volume = serializers.SerializerMethodField() publisher = serializers.SerializerMethodField() year_of_publication = serializers.SerializerMethodField() + hadis_count = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField() image = serializers.SerializerMethodField() @@ -1521,11 +1522,19 @@ class AdminBookReferenceListSerializer(serializers.ModelSerializer): "publisher", "year_of_publication", "rate", + "hadis_count", "thumbnail", "image", "created_at", ] - + + def get_hadis_count(self, obj): + if hasattr(obj, "annotated_hadis_count"): + return obj.annotated_hadis_count + if not obj or not obj.pk: + return 0 + return Hadis.objects.filter(references__book_reference=obj).distinct().count() + def get_thumbnail(self, obj): first_img = obj.images.filter(book_volume__isnull=True).order_by("order", "id").first() if first_img and first_img.image: @@ -1593,6 +1602,8 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer): city_of_publication = serializers.SerializerMethodField() country_of_publication = serializers.SerializerMethodField() edition_number = serializers.SerializerMethodField() + hadis_count = serializers.SerializerMethodField() + child_arguments = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField() image = serializers.SerializerMethodField() @@ -1653,6 +1664,41 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer): ed = obj.editions.first() return ed.edition_number if ed else "" + def get_hadis_count(self, obj): + if hasattr(obj, "annotated_hadis_count"): + return obj.annotated_hadis_count + if not obj or not obj.pk: + return 0 + return Hadis.objects.filter(references__book_reference=obj).distinct().count() + + def get_child_arguments(self, obj): + if not obj or not obj.pk: + return [] + hadises = ( + Hadis.objects.filter(references__book_reference=obj) + .select_related("hadis_status", "category") + .distinct() + .order_by("number", "id") + ) + return [ + { + "id": h.id, + "number": h.number, + "title": h.title, + "title_narrator": h.title_narrator, + "slug": h.slug, + "status": h.status, + "source_type": h.category.source_type if h.category else "hadith", + "status_detail": { + "id": h.hadis_status.id, + "title": h.hadis_status.title, + "color": h.hadis_status.color, + "main_color_code": getattr(h.hadis_status, "main_color_code", None), + } if h.hadis_status else None, + } + for h in hadises + ] + class Meta: model = BookReference fields = [ @@ -1683,6 +1729,8 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer): "rate", "author", "author_detail", + "hadis_count", + "child_arguments", "thumbnail", "image", "remove_thumbnail", @@ -1691,7 +1739,7 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer): "updated_at", "share_link", ] - read_only_fields = ["id", "slug", "created_at", "updated_at", "share_link"] + read_only_fields = ["id", "slug", "hadis_count", "child_arguments", "created_at", "updated_at", "share_link"] def to_internal_value(self, data): import json diff --git a/apps/hadis/views_admin.py b/apps/hadis/views_admin.py index f4ae14a..6356335 100644 --- a/apps/hadis/views_admin.py +++ b/apps/hadis/views_admin.py @@ -1,4 +1,4 @@ -from django.db.models import Q, Exists, OuterRef +from django.db.models import Q, Exists, OuterRef, Count from rest_framework.authentication import TokenAuthentication from rest_framework.decorators import action from rest_framework.parsers import FormParser, JSONParser, MultiPartParser @@ -714,7 +714,7 @@ class AdminBookReferenceViewSet(ModelViewSet): return AdminBookReferenceDetailSerializer def get_queryset(self): - queryset = BookReference.objects.all().prefetch_related("subject_area", "volumes", "editions").select_related("type", "author") + queryset = BookReference.objects.all().annotate(annotated_hadis_count=Count("hadis_references__hadis", distinct=True)).prefetch_related("subject_area", "volumes", "editions").select_related("type", "author") search_query = self.request.query_params.get("search") if search_query: