From 36da1d5cd25477135cc76957690265846d798b7f Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Wed, 19 Apr 2023 18:57:52 -0400
Subject: [PATCH] Unified the getting user from request

- The user or username is no longer "injected" in the view sets
- The user and username are obtained in the serializers from requests
---
 program/serializers.py | 25 +++++++++++++++----------
 program/views.py       | 27 +++++----------------------
 2 files changed, 20 insertions(+), 32 deletions(-)

diff --git a/program/serializers.py b/program/serializers.py
index 93369397..f46a5749 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -135,10 +135,10 @@ class UserSerializer(serializers.ModelSerializer):
 
         if profile_data:
             profile = UserProfile(
-                user=user,
                 cba_username=profile_data.get("cba_username").strip(),
                 cba_user_token=profile_data.get("cba_user_token").strip(),
-                created_by=self.context["user"],
+                created_by=self.context.get("request").user.username,
+                user=user,
             )
             profile.save()
 
@@ -167,7 +167,7 @@ class UserSerializer(serializers.ModelSerializer):
 
             profile.cba_username = profile_data.get("cba_username")
             profile.cba_user_token = profile_data.get("cba_user_token")
-            profile.updated_by = self.context["user"]
+            profile.updated_by = self.context.get("request").user.username
             profile.save()
 
         instance.save()
@@ -260,7 +260,7 @@ class ImageSerializer(serializers.ModelSerializer):
     def create(self, validated_data):
         """Create and return a new Image instance, given the validated data."""
 
-        image = Image.objects.create(**validated_data | self.context)
+        image = Image.objects.create(owner=self.context.get("request").user, **validated_data)
         image.save()
 
         return image
@@ -311,7 +311,9 @@ class HostSerializer(serializers.ModelSerializer):
 
         links_data = validated_data.pop("links", [])
 
-        host = Host.objects.create(**validated_data | self.context)  # created_by
+        host = Host.objects.create(
+            created_by=self.context.get("request").user.username, **validated_data
+        )
 
         for link_data in links_data:
             HostLink.objects.create(host=host, **link_data)
@@ -337,7 +339,7 @@ class HostSerializer(serializers.ModelSerializer):
             for link_data in links_data:
                 HostLink.objects.create(host=instance, **link_data)
 
-        instance.updated_by = self.context.get("updated_by")
+        instance.updated_by = self.context.get("request").user.username
 
         instance.save()
 
@@ -451,7 +453,9 @@ class ShowSerializer(serializers.HyperlinkedModelSerializer):
         music_focus = validated_data.pop("music_focus")
         links_data = validated_data.pop("links", [])
 
-        show = Show.objects.create(**validated_data | self.context)  # created_by
+        show = Show.objects.create(
+            created_by=self.context.get("request").user.username, **validated_data
+        )
 
         # Save many-to-many relationships
         show.owners.set(owners)
@@ -508,7 +512,7 @@ class ShowSerializer(serializers.HyperlinkedModelSerializer):
             for link_data in links_data:
                 ShowLink.objects.create(show=instance, **link_data)
 
-        instance.updated_by = self.context.get("updated_by")
+        instance.updated_by = self.context.get("request").user.username
 
         instance.save()
 
@@ -753,9 +757,10 @@ class NoteSerializer(serializers.ModelSerializer):
         contributors = validated_data.pop("contributors", [])
 
         # the creator of the note is the owner
-        validated_data["owner"] = self.context["request"].user
         note = Note.objects.create(
-            created_by=self.context["request"].user.username, **validated_data
+            created_by=self.context.get("request").user.username,
+            owner=self.context.get("request").user,
+            **validated_data,
         )
 
         note.contributors.set(contributors)
diff --git a/program/views.py b/program/views.py
index c4ece009..baa92773 100644
--- a/program/views.py
+++ b/program/views.py
@@ -313,10 +313,7 @@ class APIImageViewSet(viewsets.ModelViewSet):
     def create(self, request, *args, **kwargs):
         """Create an Image instance. Any user can create an image."""
 
-        serializer = ImageSerializer(
-            data=request.data,
-            context={"owner": request.user.username},
-        )
+        serializer = ImageSerializer(data=request.data)
 
         if serializer.is_valid():
             serializer.save()
@@ -409,9 +406,7 @@ class APIShowViewSet(DisabledObjectPermissionCheckMixin, viewsets.ModelViewSet):
         if not request.user.is_superuser:
             return Response(status=status.HTTP_401_UNAUTHORIZED)
 
-        serializer = ShowSerializer(
-            data=request.data, context={"created_by": request.user.username}
-        )
+        serializer = ShowSerializer(data=request.data)
 
         if serializer.is_valid():
             serializer.save()
@@ -433,12 +428,7 @@ class APIShowViewSet(DisabledObjectPermissionCheckMixin, viewsets.ModelViewSet):
 
         partial = kwargs.get("partial", False)
         show = self.get_object()
-        serializer = ShowSerializer(
-            show,
-            data=request.data,
-            context={"updated_by": request.user.username},
-            partial=partial,
-        )
+        serializer = ShowSerializer(show, data=request.data, partial=partial)
 
         if serializer.is_valid():
             # Common users mustn't edit the show's name
@@ -911,9 +901,7 @@ class APIHostViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     pagination_class = LimitOffsetPagination
 
     def create(self, request, *args, **kwargs):
-        serializer = HostSerializer(
-            data=request.data, context={"created_by": request.user.username}
-        )
+        serializer = HostSerializer(data=request.data)
         if serializer.is_valid():
             serializer.save()
             return Response(serializer.data, status=status.HTTP_201_CREATED)
@@ -923,12 +911,7 @@ 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,
-            context={"updated_by": request.user.username},
-            partial=partial,
-        )
+        serializer = HostSerializer(host, data=request.data, partial=partial)
         if serializer.is_valid():
             serializer.save()
             return Response(serializer.data, status=status.HTTP_200_OK)
-- 
GitLab