104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
from rest_framework.generics import ListAPIView, RetrieveAPIView
|
|
from rest_framework.response import Response
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from drf_spectacular.utils import extend_schema
|
|
|
|
from apps.archive.models import PostModel
|
|
|
|
from .serializers import PostPreviewSerializer, PostSerializer
|
|
|
|
from rest_framework.pagination import PageNumberPagination
|
|
|
|
|
|
class PostListPagination(PageNumberPagination):
|
|
page_size = 10 # number of items per page
|
|
page_size_query_param = "page_size" # allows clients to specify page size
|
|
max_page_size = 100 # maximum page size allowed
|
|
|
|
def get_paginated_response(self, data):
|
|
return Response(
|
|
{
|
|
"count": self.page.paginator.count,
|
|
"totalPages": self.page.paginator.num_pages, # total number of pages
|
|
"next": self.get_next_link(),
|
|
"previous": self.get_previous_link(),
|
|
"results": data,
|
|
}
|
|
)
|
|
|
|
|
|
class PostListView(ListAPIView):
|
|
permission_classes = [IsAuthenticated]
|
|
serializer_class = (
|
|
PostPreviewSerializer # Each post will be serialized using this serializer
|
|
)
|
|
pagination_class = PostListPagination
|
|
|
|
def get_queryset(self):
|
|
user = self.request.user.userprofile
|
|
queryset = PostModel.objects.all()
|
|
|
|
# Apply mature filtering
|
|
if not user.show_mature:
|
|
queryset = queryset.filter(mature=False)
|
|
|
|
# Extract optional parameters
|
|
source_site = self.kwargs.get("source_site")
|
|
creator_slug_or_id = self.kwargs.get("creator_slug_or_id")
|
|
category = self.kwargs.get("category")
|
|
|
|
# Filter by source_site if provided
|
|
if source_site:
|
|
queryset = queryset.filter(source_site__slug=source_site)
|
|
|
|
# Filter by creator (either by slug or id)
|
|
if creator_slug_or_id:
|
|
queryset = queryset.filter(
|
|
creator__slug=creator_slug_or_id
|
|
) | queryset.filter(creator__creator_id=creator_slug_or_id)
|
|
|
|
if category:
|
|
queryset = queryset.filter(category__slug=category)
|
|
|
|
return queryset.order_by("-date_created")
|
|
|
|
@extend_schema(operation_id="posts_list_all")
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
|
|
class PostListSourceView(PostListView):
|
|
@extend_schema(operation_id="posts_list_by_source")
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
|
|
class PostListSourceCreatorView(PostListView):
|
|
@extend_schema(operation_id="posts_list_by_source_and_creator")
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
|
|
class PostListSourceCategoryView(PostListView):
|
|
@extend_schema(operation_id="posts_list_by_source_creator_and_category")
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
|
|
class PostDetailView(RetrieveAPIView):
|
|
permission_classes = [IsAuthenticated]
|
|
serializer_class = PostSerializer
|
|
lookup_field = (
|
|
"post_id" # This tells DRF to use the "post_id" URL kwarg for lookups.
|
|
)
|
|
queryset = PostModel.objects.all()
|
|
|
|
@extend_schema(operation_id="posts_retrieve_by_id")
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
|
|
class PostDetailSiteCreatorView(PostDetailView):
|
|
@extend_schema(operation_id="posts_retrieve_by_site_creator_id")
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|