From 9c106a54669dbe44d5504c56e7082c9f9ae8f504 Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Tue, 13 Feb 2024 11:28:26 +0000 Subject: [PATCH] Different serializers for channel Get & Post --- apps/api/serializers.py | 19 ++++++++++++++++--- apps/api/views.py | 22 +++++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/apps/api/serializers.py b/apps/api/serializers.py index d39ec78..4f77bec 100644 --- a/apps/api/serializers.py +++ b/apps/api/serializers.py @@ -117,13 +117,26 @@ class SubscriptionSerializer(DynamicModelSerializer): fields = ("uuid", "name", "rss_url", "image", "server", "creation_datetime") -class SubscriptionChannelSerializer(DynamicModelSerializer): +class SubscriptionChannelSerializerGET(DynamicModelSerializer): """ Serializer for the SubscriptionChannel Model. + This serializer should be used with GET requests. """ - # subscription = serializers.PrimaryKeyRelatedField(queryset=Subscription.objects.all()) - subscription = SubscriptionSerializer(read_only=True) + subscription = SubscriptionSerializer() + + class Meta: + model = SubscriptionChannel + fields = ("uuid", "id", "subscription", "creation_datetime") + + +class SubscriptionChannelSerializerPOST(DynamicModelSerializer): + """ + Serializer for the SubscriptionChannel Model. + This serializer should be used with POST requests. + """ + + subscription = serializers.PrimaryKeyRelatedField(queryset=Subscription.objects.all()) class Meta: model = SubscriptionChannel diff --git a/apps/api/views.py b/apps/api/views.py index f7fb21d..c8d647e 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -11,7 +11,12 @@ from rest_framework.authentication import SessionAuthentication, TokenAuthentica from rest_framework.parsers import MultiPartParser, FormParser from apps.home.models import Subscription, SubscriptionChannel, TrackedContent -from .serializers import SubscriptionSerializer, SubscriptionChannelSerializer, TrackedContentSerializer +from .serializers import ( + SubscriptionSerializer, + SubscriptionChannelSerializerGET, + SubscriptionChannelSerializerPOST, + TrackedContentSerializer + ) log = logging.getLogger(__name__) @@ -95,13 +100,19 @@ class SubscriptionChannel_ListView(generics.ListCreateAPIView): permission_classes = [permissions.IsAuthenticated] pagination_class = DefaultPagination - serializer_class = SubscriptionChannelSerializer + # serializer_class = SubscriptionChannelSerializer queryset = SubscriptionChannel.objects.all().order_by("-creation_datetime") filter_backends = [rest_filters.DjangoFilterBackend, filters.OrderingFilter] filterset_fields = ["uuid", "id", "subscription", "subscription__server"] ordering_fields = ["creation_datetime"] + def get_serializer(self, *args, **kwargs): + if self.request.method == "POST": + return SubscriptionChannelSerializerPOST(*args, **kwargs) + else: + return SubscriptionChannelSerializerGET(*args, **kwargs) + def post(self, request): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) @@ -116,6 +127,11 @@ class SubscriptionChannel_ListView(generics.ListCreateAPIView): exception=True ) + # Switch to the GET serializer for return data, as it contains more data on the subscription. + # We can't modify the POST serializer to contain this data, otherwise it expects it in POST. + self.request.method = "GET" + serializer = self.get_serializer(serializer.instance) + headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) @@ -131,7 +147,7 @@ class SubscriptionChannel_DetailView(generics.RetrieveDestroyAPIView): permission_classes = [permissions.IsAuthenticated] parser_classes = [MultiPartParser, FormParser] - serializer_class = SubscriptionChannelSerializer + serializer_class = SubscriptionChannelSerializerGET queryset = SubscriptionChannel.objects.all().order_by("-creation_datetime") def post(self, request):