From fd036dc11d8e66a0aa7215c818e537045c01a3ae Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Wed, 13 Sep 2023 21:04:37 +0200
Subject: [PATCH] Convert datetimes on substitution creation to UTC to transfer
 data correctly

---
 .../calendar_feeds/details/LessonDetails.vue  |  4 +--
 aleksis/apps/chronos/schema/__init__.py       | 29 +++++++++++++++++--
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
index a6ae5cfa..3bdd8ab8 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
@@ -237,8 +237,8 @@ export default {
       return {
         ...item,
         amends: this.selectedEvent.meta.id,
-        datetimeStart: this.selectedEvent.startDateTime.toISO(),
-        datetimeEnd: this.selectedEvent.endDateTime.toISO(),
+        datetimeStart: this.selectedEvent.startDateTime.toUTC().toISO(),
+        datetimeEnd: this.selectedEvent.endDateTime.toUTC().toISO(),
       };
     },
     transformPatchData(item) {
diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py
index 86c32376..bdfe3ded 100644
--- a/aleksis/apps/chronos/schema/__init__.py
+++ b/aleksis/apps/chronos/schema/__init__.py
@@ -57,7 +57,31 @@ class LessonEventType(DjangoObjectType):
         )
 
 
-class AmendLessonCreateMutation(DjangoCreateMutation):
+class DatetimeTimezoneMixin:
+    """Handle datetimes for mutations with CalendarEvent objects.
+
+    Since the client sends timezone information as ISO string
+    which only includes an offset (+00:00 UTC). Because an offset
+    is no valid timezone, we set UTC as timezone directly.
+    """
+
+    @classmethod
+    def handle_datetime_start(cls, value, name, info) -> int:
+        value = value.replace(tzinfo=timezone.utc)
+        return value
+
+    @classmethod
+    def handle_datetime_end(cls, value, name, info) -> int:
+        value = value.replace(tzinfo=timezone.utc)
+        return value
+
+    @classmethod
+    def before_save(cls, root, info, input, obj):
+        obj.timezone = obj.amends.timezone
+        return obj
+
+
+class AmendLessonCreateMutation(DatetimeTimezoneMixin, DjangoCreateMutation):
     class Meta:
         model = LessonEvent
         permissions = ("chronos.edit_substitution_rule",)
@@ -74,14 +98,13 @@ class AmendLessonCreateMutation(DjangoCreateMutation):
         )
 
 
-class AmendLessonPatchMutation(DjangoPatchMutation):
+class AmendLessonPatchMutation(DatetimeTimezoneMixin, DjangoPatchMutation):
     class Meta:
         model = LessonEvent
         permissions = ("chronos.edit_substitution_rule",)
         only_fields = ("subject", "teachers", "groups", "rooms", "cancelled", "comment")
 
 
-
 class TimetableType(graphene.Enum):
     TEACHER = "teacher"
     GROUP = "group"
-- 
GitLab