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.
 
 
 
 

270 lines
10 KiB

from django.db.models import Q
from rest_framework.authentication import TokenAuthentication
from rest_framework.decorators import action
from rest_framework.parsers import FormParser, JSONParser, MultiPartParser
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
from apps.account.permissions import IsSuperAdmin
from utils.pagination import StandardResultsSetPagination
from .models import (
Hadis, HadisCategory, HadisCorrection, HadisInterpretation, HadisStatus, HadisTag,
BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType
)
from .serializers.serializers_admin import (
AdminHadisCategorySerializer,
AdminHadisCorrectionSerializer,
AdminHadisDetailSerializer,
AdminHadisInterpretationSerializer,
AdminHadisListSerializer,
AdminHadisStatusSerializer,
AdminHadisTagSerializer,
AdminBookSubjectAreaSerializer,
AdminBookTypeSerializer,
AdminBookAuthorSerializer,
AdminBookAttributeSerializer,
AdminBookReferenceImageSerializer,
AdminBookReferenceDocumentSerializer,
AdminBookReferenceListSerializer,
AdminBookReferenceDetailSerializer,
)
class AdminHadisCategoryViewSet(ReadOnlyModelViewSet):
serializer_class = AdminHadisCategorySerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = None
def get_queryset(self):
return HadisCategory.objects.all().order_by("order", "id")
class AdminHadisStatusViewSet(ReadOnlyModelViewSet):
serializer_class = AdminHadisStatusSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = None
def get_queryset(self):
return HadisStatus.objects.all().order_by("order", "id")
class AdminHadisTagViewSet(ReadOnlyModelViewSet):
serializer_class = AdminHadisTagSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = None
def get_queryset(self):
return HadisTag.objects.all().order_by("id")
class AdminHadisViewSet(ModelViewSet):
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = StandardResultsSetPagination
parser_classes = (MultiPartParser, FormParser, JSONParser)
def get_serializer_class(self):
if self.action == "list":
return AdminHadisListSerializer
return AdminHadisDetailSerializer
def get_queryset(self):
queryset = Hadis.objects.all().select_related("category", "hadis_status")
search_query = self.request.query_params.get("search")
if search_query:
q_filter = (
Q(title__icontains=search_query)
| Q(title_narrator__icontains=search_query)
| Q(text__icontains=search_query)
| Q(translation__icontains=search_query)
| Q(slug__icontains=search_query)
)
if search_query.isdigit():
q_filter |= Q(number=int(search_query))
queryset = queryset.filter(q_filter)
category_id = self.request.query_params.get("category")
if category_id and category_id != "all":
queryset = queryset.filter(category_id=category_id)
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset.distinct().order_by("-id")
class AdminHadisCorrectionViewSet(ModelViewSet):
serializer_class = AdminHadisCorrectionSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
parser_classes = (JSONParser, MultiPartParser, FormParser)
def get_queryset(self):
queryset = HadisCorrection.objects.all()
hadis_id = self.request.query_params.get("hadis_id")
if hadis_id:
queryset = queryset.filter(hadis_id=hadis_id)
return queryset.order_by("priority", "created_at")
@action(detail=False, methods=["post"])
def reorder(self, request):
correction_ids = request.data.get("correction_ids", [])
if not correction_ids:
return Response({"error": "correction_ids list is required"}, status=400)
for index, correction_id in enumerate(correction_ids, start=1):
HadisCorrection.objects.filter(id=correction_id).update(priority=index)
return Response({"status": "success"})
class AdminHadisInterpretationViewSet(ModelViewSet):
serializer_class = AdminHadisInterpretationSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
parser_classes = (JSONParser, MultiPartParser, FormParser)
def get_queryset(self):
queryset = HadisInterpretation.objects.all()
category_id = self.request.query_params.get("category_id")
if category_id:
queryset = queryset.filter(category_id=category_id)
return queryset.order_by("priority", "created_at")
@action(detail=False, methods=["post"])
def reorder(self, request):
interpretation_ids = request.data.get("interpretation_ids", [])
if not interpretation_ids:
return Response({"error": "interpretation_ids list is required"}, status=400)
for index, interpretation_id in enumerate(interpretation_ids, start=1):
HadisInterpretation.objects.filter(id=interpretation_id).update(priority=index)
return Response({"status": "success"})
class AdminBookSubjectAreaViewSet(ReadOnlyModelViewSet):
serializer_class = AdminBookSubjectAreaSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = None
def get_queryset(self):
return BookSubjectArea.objects.all().order_by("id")
class AdminBookTypeViewSet(ReadOnlyModelViewSet):
serializer_class = AdminBookTypeSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = None
def get_queryset(self):
return BookType.objects.all().order_by("id")
class AdminBookAuthorViewSet(ModelViewSet):
serializer_class = AdminBookAuthorSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = None
def get_queryset(self):
queryset = BookAuthor.objects.all()
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(name__icontains=search_query)
return queryset.order_by("id")
class AdminBookAttributeViewSet(ModelViewSet):
serializer_class = AdminBookAttributeSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = None
def get_queryset(self):
queryset = BookAttribute.objects.all()
book_reference_id = self.request.query_params.get("book_reference_id")
if book_reference_id:
queryset = queryset.filter(book_reference_id=book_reference_id)
return queryset.order_by("id")
class AdminBookReferenceImageViewSet(ModelViewSet):
serializer_class = AdminBookReferenceImageSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
parser_classes = (MultiPartParser, FormParser, JSONParser)
pagination_class = None
def get_queryset(self):
queryset = BookReferenceImage.objects.all()
book_reference_id = self.request.query_params.get("book_reference_id")
if book_reference_id:
queryset = queryset.filter(book_reference_id=book_reference_id)
return queryset.order_by("order", "id")
class AdminBookReferenceDocumentViewSet(ModelViewSet):
serializer_class = AdminBookReferenceDocumentSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
parser_classes = (MultiPartParser, FormParser, JSONParser)
pagination_class = None
def get_queryset(self):
queryset = BookReferenceDocument.objects.all()
book_reference_id = self.request.query_params.get("book_reference_id")
if book_reference_id:
queryset = queryset.filter(book_reference_id=book_reference_id)
return queryset.order_by("order", "id")
class AdminBookReferenceViewSet(ModelViewSet):
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = StandardResultsSetPagination
parser_classes = (MultiPartParser, FormParser, JSONParser)
def get_serializer_class(self):
if self.action == "list":
return AdminBookReferenceListSerializer
return AdminBookReferenceDetailSerializer
def get_queryset(self):
queryset = BookReference.objects.all().prefetch_related("subject_area", "authors").select_related("type")
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(
Q(title__icontains=search_query)
| Q(slug__icontains=search_query)
| Q(isbn__icontains=search_query)
| Q(publisher__icontains=search_query)
| Q(description__icontains=search_query)
| Q(researcher__icontains=search_query)
)
type_id = self.request.query_params.get("type")
if type_id and type_id != "all":
queryset = queryset.filter(type_id=type_id)
subject_area_id = self.request.query_params.get("subject_area")
if subject_area_id and subject_area_id != "all":
queryset = queryset.filter(subject_area__id=subject_area_id)
author_id = self.request.query_params.get("author")
if author_id and author_id != "all":
queryset = queryset.filter(authors__id=author_id)
return queryset.distinct().order_by("-created_at")