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 from ..serializers import TransmitterSerializer , TransmitterDetailSerializer, TransmitterSyncSerializer from ..docs import transmitter_list_swagger, transmitter_detail_swagger, transmitter_sync_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: # try: # generation_num = int(generation_filter) # # Filter transmitters who have hadis transmissions in the specified generation/layer # queryset = queryset.filter( # hadi=generation_num # ).distinct() # except (ValueError, TypeError): # pass # Invalid generation number, ignore 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 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)