Skip to content
Snippets Groups Projects
Verified Commit 07dce848 authored by Ernesto Rico Schmidt's avatar Ernesto Rico Schmidt
Browse files

refactor: move handling of PATCH request into partial_update

parent 9a84273e
No related branches found
No related tags found
No related merge requests found
......@@ -1112,61 +1112,6 @@ class APIScheduleViewSet(viewsets.ModelViewSet):
if not self.request.user.has_perm("program.change_schedule"):
return Response(status=status.HTTP_401_UNAUTHORIZED)
if request.method == "PATCH":
# 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())
if update_fields.issubset(allowed):
schedule = self.get_object()
default_playlist_id = request.data.get("schedule").get("default_playlist_id")
if default_playlist_id == "" or default_playlist_id is None:
# "clear" the default_playlist_id if the field has no value
schedule.default_playlist_id = None
else:
schedule.default_playlist_id = int(default_playlist_id)
is_repetition = request.data.get("schedule").get("is_repetition")
if is_repetition == "true" or is_repetition == "1":
schedule.is_repetition = True
if is_repetition == "false" or is_repetition == "0":
schedule.is_repetition = False
last_date = request.data.get("schedule").get("last_date")
if last_date == "" or last_date is None:
# "clear" the last_date if the field has no value
schedule.last_date = None
else:
try:
last_date = date.fromisoformat(last_date)
except ValueError as e:
data = {"last_date": e.args[0]}
return Response(data, status=status.HTTP_400_BAD_REQUEST)
if schedule.last_date is None or schedule.last_date > last_date:
schedule.last_date = last_date
last_end = timezone.make_aware(
datetime.combine(last_date, schedule.end_time)
)
TimeSlot.objects.filter(schedule=schedule, start__gt=last_end).delete()
else:
data = {"last_date": "This field cannot be updated to this date"}
return Response(data, status=status.HTTP_400_BAD_REQUEST)
schedule.save()
serializer = ScheduleSerializer(schedule)
return Response(serializer.data)
else:
bad_fields = update_fields.difference(allowed)
data = {field: "This field cannot be updated with PATCH" for field in bad_fields}
return Response(data, status=status.HTTP_400_BAD_REQUEST)
# Only allow updating when with the `schedule` JSON object
if "schedule" not in request.data:
return Response(status=status.HTTP_400_BAD_REQUEST)
......@@ -1196,6 +1141,63 @@ class APIScheduleViewSet(viewsets.ModelViewSet):
return Response(resolution)
def partial_update(self, request, *args, **kwargs):
"""
Partial update a schedule without generating timeslots, testing or resolving collisions.
"""
# 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())
if update_fields.issubset(allowed):
schedule = self.get_object()
default_playlist_id = request.data.get("schedule").get("default_playlist_id")
if default_playlist_id == "" or default_playlist_id is None:
# "clear" the default_playlist_id if the field has no value
schedule.default_playlist_id = None
else:
schedule.default_playlist_id = int(default_playlist_id)
is_repetition = request.data.get("schedule").get("is_repetition")
if is_repetition == "true" or is_repetition == "1":
schedule.is_repetition = True
if is_repetition == "false" or is_repetition == "0":
schedule.is_repetition = False
last_date = request.data.get("schedule").get("last_date")
if last_date == "" or last_date is None:
# "clear" the last_date if the field has no value
schedule.last_date = None
else:
try:
last_date = date.fromisoformat(last_date)
except ValueError as e:
data = {"last_date": e.args[0]}
return Response(data, status=status.HTTP_400_BAD_REQUEST)
if schedule.last_date is None or schedule.last_date > last_date:
schedule.last_date = last_date
last_end = timezone.make_aware(datetime.combine(last_date, schedule.end_time))
TimeSlot.objects.filter(schedule=schedule, start__gt=last_end).delete()
else:
data = {"last_date": "This field cannot be updated to this date"}
return Response(data, status=status.HTTP_400_BAD_REQUEST)
schedule.save()
serializer = ScheduleSerializer(schedule)
return Response(serializer.data)
else:
bad_fields = update_fields.difference(allowed)
data = {field: "This field cannot be updated with PATCH" for field in bad_fields}
return Response(data, status=status.HTTP_400_BAD_REQUEST)
# TODO: Create is currently not implemented because timeslots are supposed to be inserted
# by creating or updating a schedule.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment