from django.db.models import Count, Q from rest_framework.authentication import TokenAuthentication from rest_framework.parsers import FormParser, JSONParser, MultiPartParser from rest_framework.permissions import IsAuthenticated from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from apps.account.permissions import IsSuperAdmin from utils.pagination import StandardResultsSetPagination from .models import Author, Book, BookCollection, Category from .serializers_admin import ( AdminAuthorSerializer, AdminBookDetailSerializer, AdminBookListSerializer, AdminLibraryCategorySerializer, AdminLibraryCollectionSerializer, ) class AdminLibraryCategoryViewSet(ReadOnlyModelViewSet): serializer_class = AdminLibraryCategorySerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = None def get_queryset(self): return Category.objects.all().order_by("title") class AdminLibraryCollectionViewSet(ReadOnlyModelViewSet): serializer_class = AdminLibraryCollectionSerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = None def get_queryset(self): return BookCollection.objects.all().order_by("display_position", "order", "title") class AdminAuthorViewSet(ModelViewSet): serializer_class = AdminAuthorSerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = StandardResultsSetPagination parser_classes = (MultiPartParser, FormParser, JSONParser) def get_queryset(self): queryset = Author.objects.annotate(books_count_annotation=Count('books')).all() search_query = self.request.query_params.get("search") if search_query: queryset = queryset.filter( Q(full_name__icontains=search_query) | Q(slug__icontains=search_query) ) return queryset.order_by("full_name", "id") class AdminBookViewSet(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 AdminBookListSerializer return AdminBookDetailSerializer def get_queryset(self): queryset = Book.objects.all().select_related("author").prefetch_related("categories", "collections") 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(author__full_name__icontains=search_query) | Q(publisher__icontains=search_query) | Q(isbn__icontains=search_query) | Q(summary__icontains=search_query) ) status_filter = self.request.query_params.get("status") if status_filter in {"true", "false"}: queryset = queryset.filter(status=status_filter == "true") file_type = self.request.query_params.get("file_type") if file_type and file_type != "all": queryset = queryset.filter(file_type=file_type) category_id = self.request.query_params.get("category") if category_id and category_id != "all": queryset = queryset.filter(categories__id=category_id) collection_id = self.request.query_params.get("collection") if collection_id and collection_id != "all": queryset = queryset.filter(collections__id=collection_id) author_id = self.request.query_params.get("author") if author_id and author_id != "all": queryset = queryset.filter(author_id=author_id) return queryset.distinct().order_by("-created_at")