From 700d80e065ff772e85ff90b8d36c36e236cb3a8d Mon Sep 17 00:00:00 2001 From: Ernesto Rico Schmidt <ernesto@helsinki.at> Date: Thu, 20 Apr 2023 18:54:59 -0400 Subject: [PATCH] Inject request in the context for the serializers The seralizers for Host, Note and Show require the request in the context, but only the `APINoteViewSet` calls `get_serializer_context`. The other two `APIHostViewSet` and `ShowSerializer` ingnore it, and the request needs to be added manually. --- program/views.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/program/views.py b/program/views.py index baa92773..25047f81 100644 --- a/program/views.py +++ b/program/views.py @@ -406,7 +406,10 @@ class APIShowViewSet(DisabledObjectPermissionCheckMixin, viewsets.ModelViewSet): if not request.user.is_superuser: return Response(status=status.HTTP_401_UNAUTHORIZED) - serializer = ShowSerializer(data=request.data) + serializer = ShowSerializer( + context={"request": request}, # the serializer needs the request in the context + data=request.data, + ) if serializer.is_valid(): serializer.save() @@ -428,7 +431,12 @@ class APIShowViewSet(DisabledObjectPermissionCheckMixin, viewsets.ModelViewSet): partial = kwargs.get("partial", False) show = self.get_object() - serializer = ShowSerializer(show, data=request.data, partial=partial) + serializer = ShowSerializer( + context={"request": request}, # the serializer needs the request in the context + data=request.data, + instance=show, + partial=partial, + ) if serializer.is_valid(): # Common users mustn't edit the show's name @@ -773,6 +781,13 @@ class APINoteViewSet( pagination_class = LimitOffsetPagination filterset_class = filters.NoteFilterSet + def get_serializer_context(self): + # the serializer needs the request in the context + context = super().get_serializer_context() + context.update({"request": self.request}) + + return context + def get_queryset(self): qs = super().get_queryset().order_by("slug") # Users should always be able to see notes @@ -899,9 +914,13 @@ class APIHostViewSet(ActiveFilterMixin, viewsets.ModelViewSet): queryset = Host.objects.all() serializer_class = HostSerializer pagination_class = LimitOffsetPagination + permission_classes = [permissions.DjangoModelPermissionsOrAnonReadOnly] def create(self, request, *args, **kwargs): - serializer = HostSerializer(data=request.data) + serializer = HostSerializer( + context={"request": request}, # the serializer needs the request in the context + data=request.data, + ) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) @@ -911,7 +930,14 @@ class APIHostViewSet(ActiveFilterMixin, viewsets.ModelViewSet): def update(self, request, *args, **kwargs): partial = kwargs.get("partial", False) host = self.get_object() - serializer = HostSerializer(host, data=request.data, partial=partial) + + serializer = HostSerializer( + context={"request": request}, # the serializer needs the request in the context + data=request.data, + instance=host, + partial=partial, + ) + if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) -- GitLab