You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

106 lines
3.3 KiB

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',
)