Pagination and Exception catch for RSSFeed API

This commit is contained in:
Corban-Lee Jones 2024-01-31 11:52:02 +00:00
parent 7dd8b8f6e8
commit c8097b6107

View File

@ -11,6 +11,7 @@ from django.utils.decorators import method_decorator
from django.core.files import File from django.core.files import File
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.files.temp import NamedTemporaryFile from django.core.files.temp import NamedTemporaryFile
from django.db.utils import IntegrityError
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status, permissions, filters, generics from rest_framework import status, permissions, filters, generics
@ -25,18 +26,37 @@ from .serializers import RssFeedSerializer, FeedChannelSerializer
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class RSSFeedPagination(PageNumberPagination):
page_size = 10
page_size_query_param = "page_size"
max_page_size = 25
class RSSFeedList(generics.ListAPIView, generics.CreateAPIView): class RSSFeedList(generics.ListAPIView, generics.CreateAPIView):
authentication_classes = [SessionAuthentication, TokenAuthentication] authentication_classes = [SessionAuthentication, TokenAuthentication]
permission_classes = [permissions.IsAuthenticated] permission_classes = [permissions.IsAuthenticated]
pagination_class = RSSFeedPagination
serializer_class = RssFeedSerializer serializer_class = RssFeedSerializer
queryset = RSSFeed.objects.all().order_by("-created_at") queryset = RSSFeed.objects.all().order_by("created_at")
filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter] filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter]
filterset_fields = ["uuid", "name", "url", "created_at"] filterset_fields = ["uuid", "name", "url", "discord_server_id", "created_at"]
search_fields = ["name"] search_fields = ["name"]
ordering_fields = ["created_at"] ordering_fields = ["created_at"]
def post(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
self.perform_create(serializer)
except IntegrityError:
return Response({"detail": "RSS Feed name must be unique"}, status=status.HTTP_409_CONFLICT, exception=True)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
class RSSFeedDetail(generics.RetrieveUpdateDestroyAPIView): class RSSFeedDetail(generics.RetrieveUpdateDestroyAPIView):
authentication_classes = [SessionAuthentication, TokenAuthentication] authentication_classes = [SessionAuthentication, TokenAuthentication]
@ -46,14 +66,6 @@ class RSSFeedDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = RssFeedSerializer serializer_class = RssFeedSerializer
queryset = RSSFeed.objects.all().order_by("-created_at") queryset = RSSFeed.objects.all().order_by("-created_at")
# def delete(self, request, uuid: str):
# try:
# rss_feed = RSSFeed.objects.get(uuid=uuid)
# rss_feed.delete()
# return Response(status=status.HTTP_204_NO_CONTENT)
# except RSSFeed.DoesNotExist:
# return Response({"detail": "RSSFeed Not Found"}, status.HTTP_404_NOT_FOUND)
class FeedChannelListApiView(generics.ListAPIView): class FeedChannelListApiView(generics.ListAPIView):
authentication_classes = [SessionAuthentication, TokenAuthentication] authentication_classes = [SessionAuthentication, TokenAuthentication]