from django.contrib.admin.utils import lookup_field from rest_framework.generics import ListAPIView , RetrieveAPIView from rest_framework.response import Response from ..models import Transmitters , TransmitterOpinion, TransmitterOriginalText from ..serializers import TransmitterSerializer , TransmitterDetailSerializer, TransmitterSyncSerializer,TransmitterOpinionSerializer, TransmitterOriginalTextSerializer from ..docs import transmitter_list_swagger, transmitter_detail_swagger, transmitter_sync_swagger, transmitter_opinion_swagger, transmitter_original_text_swagger from utils.pagination import NoPagination class TransmitterView(ListAPIView): queryset = Transmitters.objects.all() serializer_class = TransmitterSerializer @transmitter_list_swagger def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) def get_queryset(self): queryset = Transmitters.objects.all() status_filter = self.request.query_params.get('status', None) if status_filter: queryset = queryset.filter(reliability=status_filter) madhhab_filter = self.request.query_params.get('madhhab', None) if madhhab_filter: queryset = queryset.filter(madhhab=madhhab_filter) generation_filter = self.request.query_params.get('generation', None) if generation_filter: queryset = queryset.filter(generation=generation_filter) return queryset class TransmitterDetailView(RetrieveAPIView): serializer_class = TransmitterDetailSerializer lookup_field = 'slug' lookup_url_kwarg = 'narrator_slug' @transmitter_detail_swagger def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) def get_queryset(self): input = self.kwargs.get('narrator_slug') return Transmitters.objects.filter(slug=input) class TransmitterOpinionView(ListAPIView): serializer_class = TransmitterOpinionSerializer @transmitter_opinion_swagger def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def get_queryset(self): narrator_slug = self.kwargs.get('narrator_slug') return TransmitterOpinion.objects.filter( transmitter__slug=narrator_slug ).select_related( 'transmitter' # Essential if serializer includes transmitter data ).prefetch_related( # Add any nested relations from TransmitterOriginalTextSerializer # 'translations', # 'manuscript_references', ) class TransmitterOriginalTextView(ListAPIView): serializer_class = TransmitterOriginalTextSerializer @transmitter_original_text_swagger def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def get_queryset(self): narrator_slug = self.kwargs.get('narrator_slug') return TransmitterOriginalText.objects.filter( transmitter__slug=narrator_slug ).select_related( 'transmitter' # Essential if serializer includes transmitter data ).prefetch_related( # Add any nested relations from TransmitterOriginalTextSerializer # 'translations', # 'manuscript_references', ) class TransmitterSyncView(ListAPIView): """ API view to sync all transmitter data for offline mode Returns all transmitters with biographical data and scholarly opinions """ serializer_class = TransmitterSyncSerializer pagination_class = NoPagination @transmitter_sync_swagger def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def get_queryset(self): """ Prefetch ALL related data at once """ return ( Transmitters.objects .prefetch_related( 'opinions', # Already prefetched 'originaltexts' # Already prefetched ) .order_by('id') ) def list(self, request, *args, **kwargs): queryset = self.get_queryset() serializer = self.get_serializer(queryset, many=True, context={'request': request}) response_data = { 'count': len(serializer.data), # ← No extra query! 'results': serializer.data } return Response(response_data)