from rest_framework.generics import ListAPIView, RetrieveAPIView from django.shortcuts import get_object_or_404 from utils.pagination import NoPagination from rest_framework.response import Response from ..models import HadisCategory, Hadis, HadisCollection from ..serializers import HadisListSerializer, HadisDetailSerializer, HadisCollectionListSerializer, HadisSyncSerializer from ..docs import hadis_list_swagger, hadis_detail_swagger, hadis_collections_swagger, hadis_sync_swagger class HadisCollectionListView(ListAPIView): """ API view to list all hadis collections """ queryset = HadisCollection.objects.filter(status=True).order_by('order') serializer_class = HadisCollectionListSerializer pagination_class = NoPagination @hadis_collections_swagger def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) class HadisSyncView(ListAPIView): """ API view to sync all hadis data for offline mode """ serializer_class = HadisSyncSerializer pagination_class = NoPagination @hadis_sync_swagger def get_queryset(self): return Hadis.objects.filter(status=True).select_related( 'category', 'hadis_status' ).prefetch_related( 'tags', 'transmitters__transmitter', 'references__book_reference__images', 'references__book_reference__authors', 'hadiscorrection_set' ).order_by('id') def list(self, request, *args, **kwargs): queryset = self.get_queryset() serializer = self.get_serializer(queryset, many=True) grouped_data = {} for hadis_data in serializer.data: hadis_id = str(hadis_data['id']) grouped_data[hadis_id] = hadis_data response_data = { 'count': queryset.count(), 'results': grouped_data } return Response(response_data) class HadisListView(ListAPIView): """ API view to list Hadis by category_id """ serializer_class = HadisListSerializer @hadis_list_swagger def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def get_queryset(self): category_id = self.kwargs.get('category_id') if not HadisCategory.objects.filter(id=category_id).exists(): return Hadis.objects.none() return Hadis.objects.filter( category_id=category_id, status=True ).order_by('number') class HadisDetailView(RetrieveAPIView): """ API view to retrieve detailed Hadis information by hadis_id """ serializer_class = HadisDetailSerializer lookup_field = 'id' lookup_url_kwarg = 'hadis_id' @hadis_detail_swagger def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def get_queryset(self): return Hadis.objects.filter(status=True).select_related( 'category', 'hadis_status' ).prefetch_related( 'tags', 'transmitters__transmitter', 'references__book_reference__title', 'references__book_reference__images', 'references__book_reference__authors', 'references__book_reference__id', 'references__book_reference__description', 'hadiscorrection_set', )