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)