Browse Source

feat(references): add hadis_count and child_arguments to admin book reference serializers

master
Mohsen Taba 4 days ago
parent
commit
242ffe5488
  1. 52
      apps/hadis/serializers/serializers_admin.py
  2. 4
      apps/hadis/views_admin.py

52
apps/hadis/serializers/serializers_admin.py

@ -1503,6 +1503,7 @@ class AdminBookReferenceListSerializer(serializers.ModelSerializer):
volume = serializers.SerializerMethodField() volume = serializers.SerializerMethodField()
publisher = serializers.SerializerMethodField() publisher = serializers.SerializerMethodField()
year_of_publication = serializers.SerializerMethodField() year_of_publication = serializers.SerializerMethodField()
hadis_count = serializers.SerializerMethodField()
thumbnail = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField()
image = serializers.SerializerMethodField() image = serializers.SerializerMethodField()
@ -1521,11 +1522,19 @@ class AdminBookReferenceListSerializer(serializers.ModelSerializer):
"publisher", "publisher",
"year_of_publication", "year_of_publication",
"rate", "rate",
"hadis_count",
"thumbnail", "thumbnail",
"image", "image",
"created_at", "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): def get_thumbnail(self, obj):
first_img = obj.images.filter(book_volume__isnull=True).order_by("order", "id").first() first_img = obj.images.filter(book_volume__isnull=True).order_by("order", "id").first()
if first_img and first_img.image: if first_img and first_img.image:
@ -1593,6 +1602,8 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer):
city_of_publication = serializers.SerializerMethodField() city_of_publication = serializers.SerializerMethodField()
country_of_publication = serializers.SerializerMethodField() country_of_publication = serializers.SerializerMethodField()
edition_number = serializers.SerializerMethodField() edition_number = serializers.SerializerMethodField()
hadis_count = serializers.SerializerMethodField()
child_arguments = serializers.SerializerMethodField()
thumbnail = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField()
image = serializers.SerializerMethodField() image = serializers.SerializerMethodField()
@ -1653,6 +1664,41 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer):
ed = obj.editions.first() ed = obj.editions.first()
return ed.edition_number if ed else "" 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: class Meta:
model = BookReference model = BookReference
fields = [ fields = [
@ -1683,6 +1729,8 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer):
"rate", "rate",
"author", "author",
"author_detail", "author_detail",
"hadis_count",
"child_arguments",
"thumbnail", "thumbnail",
"image", "image",
"remove_thumbnail", "remove_thumbnail",
@ -1691,7 +1739,7 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer):
"updated_at", "updated_at",
"share_link", "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): def to_internal_value(self, data):
import json import json

4
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.authentication import TokenAuthentication
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.parsers import FormParser, JSONParser, MultiPartParser from rest_framework.parsers import FormParser, JSONParser, MultiPartParser
@ -714,7 +714,7 @@ class AdminBookReferenceViewSet(ModelViewSet):
return AdminBookReferenceDetailSerializer return AdminBookReferenceDetailSerializer
def get_queryset(self): 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") search_query = self.request.query_params.get("search")
if search_query: if search_query:

Loading…
Cancel
Save