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.
 
 
 
 

153 lines
5.8 KiB

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 DovodiAdminLibraryCategoryViewSet(ModelViewSet):
serializer_class = AdminLibraryCategorySerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = StandardResultsSetPagination
def get_queryset(self):
queryset = Category.objects.annotate(books_count_annotation=Count("related_categories")).all()
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(
Q(title__icontains=search_query)
| Q(slug__icontains=search_query)
)
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset.order_by("title", "id")
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 DovodiAdminLibraryCollectionViewSet(ModelViewSet):
serializer_class = AdminLibraryCollectionSerializer
permission_classes = [IsAuthenticated, IsSuperAdmin]
authentication_classes = [TokenAuthentication]
pagination_class = StandardResultsSetPagination
parser_classes = (MultiPartParser, FormParser, JSONParser)
def get_queryset(self):
queryset = BookCollection.objects.all()
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(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")
return queryset.order_by("display_position", "order", "title", "id")
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")