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() # Filter by status (reliability) status_filter = self.request.query_params.get('status', None) if status_filter: queryset = queryset.filter(reliability=status_filter) # Filter by madhhab madhhab_filter = self.request.query_params.get('madhhab', None) if madhhab_filter: queryset = queryset.filter(madhhab=madhhab_filter) # Filter by generation (narrator layer) 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): return Transmitters.objects.prefetch_related('opinions', 'originaltexts').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': queryset.count(), 'results': serializer.data } return Response(response_data)