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.
80 lines
3.0 KiB
80 lines
3.0 KiB
from django.db.models import 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 Book, BookCollection, Category
|
|
from .serializers_admin import (
|
|
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 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().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__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)
|
|
|
|
return queryset.distinct().order_by("-created_at")
|