From a0197f834c6097bb591a9e01237c6b33ed6265f2 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Thu, 12 Sep 2024 17:18:12 -0400
Subject: [PATCH] =?UTF-8?q?fix:=20PATCH=20requests=20for=20schedules=20don?=
 =?UTF-8?q?=E2=80=99t=20have=20the=20schedule=20JSON=20object?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 program/views.py | 39 +++++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/program/views.py b/program/views.py
index ebc1038d..d6ac5b62 100644
--- a/program/views.py
+++ b/program/views.py
@@ -1186,22 +1186,17 @@ class APIScheduleViewSet(viewsets.ModelViewSet):
 
         return Response(resolution, status=status.HTTP_201_CREATED)
 
-    def validate_update_request(self):
-        """Validate that the request has the change_schedule permission and includes `schedule`."""
-
-        if not self.request.user.has_perm("program.change_schedule"):
-            return Response(status=status.HTTP_401_UNAUTHORIZED)
-
-        if "schedule" not in self.request.data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
     def update(self, request, *args, **kwargs):
         """
         Update a schedule, generate timeslots, test for collisions and resolve
         them including notes.
         """
 
-        self.validate_update_request()
+        if not self.request.user.has_perm("program.change_schedule"):
+            return Response(status=status.HTTP_401_UNAUTHORIZED)
+
+        if "schedule" not in self.request.data:
+            return Response(status=status.HTTP_400_BAD_REQUEST)
 
         schedule = self.get_object()
 
@@ -1217,20 +1212,21 @@ class APIScheduleViewSet(viewsets.ModelViewSet):
         Partial update a schedule without generating timeslots, testing or resolving collisions.
         """
 
-        self.validate_update_request()
+        if not self.request.user.has_perm("program.change_schedule"):
+            return Response(status=status.HTTP_401_UNAUTHORIZED)
 
         # only these fields can be updated without generating conflicts
         allowed = {"default_playlist_id", "is_repetition", "last_date"}
-        update_fields = set(request.data.get("schedule").keys())
+        update_fields = set(request.data.keys())
 
         if update_fields.issubset(allowed):
             schedule = self.get_object()
-            request_schedule = self.request.data.get("schedule")
+            request_data = self.request.data
 
-            if "default_playlist_id" in request_schedule:
-                default_playlist_id = request_schedule.get("default_playlist_id")
+            if "default_playlist_id" in request_data:
+                default_playlist_id = request_data.get("default_playlist_id")
 
-                if default_playlist_id == "":
+                if default_playlist_id == "" or default_playlist_id is None:
                     schedule.default_playlist_id = None
                 else:
                     try:
@@ -1240,11 +1236,14 @@ class APIScheduleViewSet(viewsets.ModelViewSet):
 
                         return Response(data, status=status.HTTP_400_BAD_REQUEST)
 
-            if "is_repetition" in request_schedule:
-                schedule.is_repetition = bool(request_schedule.get("is_repetition"))
+            if is_repetition := request_data.get("is_repetition"):
+                if is_repetition == "true" or is_repetition == "1":
+                    schedule.is_repetition = True
+                elif is_repetition == "false" or is_repetition == "0":
+                    schedule.is_repetition = False
 
-            if "last_date" in request_schedule:
-                last_date = request_schedule.get("last_date")
+            if "last_date" in request_data:
+                last_date = request_data.get("last_date")
 
                 if last_date == "":
                     schedule.last_date = None
-- 
GitLab