from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from django.db.models import Subquery, Count, F, OuterRef, Q, Prefetch from rest_framework.generics import ListAPIView, RetrieveAPIView from django.shortcuts import get_object_or_404 from apps.hadis.models import * from apps.hadis.serializers import * from apps.hadis.doc import category_list_swagger, category_hadis_list_swagger, hadis_detail_swagger class CategoryHadisListView(ListAPIView): serializer_class = HadisSerializer permission_classes = (IsAuthenticated,) @category_hadis_list_swagger def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) def get_queryset(self): categories = HadisCategory.objects.filter(id=self.kwargs['pk']).order_by('-order') return Hadis.objects.filter( Q(category__in=categories), status=True, ).prefetch_related( 'category', ) class HadisDetailView(RetrieveAPIView): """ API endpoint to retrieve detailed information about a specific hadis. Returns: - Hadis details (number, title, text, translation) - HadisOverview information (status, tags, etc.) - First HadisReference with its ReferenceImages - List of Transmitters """ serializer_class = HadisDetailSerializer permission_classes = (IsAuthenticated,) @hadis_detail_swagger def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) def get_object(self): hadis_id = self.kwargs.get('pk') queryset = Hadis.objects.filter(id=hadis_id) # Prefetch related data to optimize queries queryset = queryset.prefetch_related( 'hadisoverview', 'hadisoverview__tags', Prefetch( 'references', queryset=HadisReference.objects.prefetch_related( 'referenceimage_set', 'book' ) ), Prefetch( 'transmitters', queryset=HadisTransmitter.objects.select_related('transmitter').order_by('order') ) ) return get_object_or_404(queryset, id=hadis_id) def get_serializer_context(self): context = super().get_serializer_context() context.update({'request': self.request}) return context