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 = 'id' lookup_url_kwarg = 'transmitters_id' @transmitter_detail_swagger def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) def get_queryset(self): input = self.kwargs['transmitters_id'] return Transmitters.objects.filter(id=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): transmitter_id = self.kwargs['transmitters_id'] return TransmitterOpinion.objects.filter(transmitter_id=transmitter_id) 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): transmitter_id = self.kwargs['transmitters_id'] return TransmitterOriginalText.objects.filter(transmitter_id=transmitter_id) 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_queryset(self): return Transmitters.objects.prefetch_related('opinions').order_by('id') def list(self, request, *args, **kwargs): queryset = self.get_queryset() serializer = self.get_serializer(queryset, many=True, context={'request': request}) # Group transmitters by ID for easy lookup grouped_data = {} for transmitter_data in serializer.data: transmitter_id = str(transmitter_data['id']) grouped_data[transmitter_id] = transmitter_data response_data = { 'count': queryset.count(), 'results': grouped_data } return Response(response_data)