From daeafeb02aa7e6e48ff1a3ddb51e6630412edd8e Mon Sep 17 00:00:00 2001
From: Michael Bauer <michael-bauer@posteo.de>
Date: Thu, 24 Aug 2023 18:51:49 +0200
Subject: [PATCH] Implement graphql amend lesson mutation

---
 .../frontend/components/amendLesson.graphql   | 16 +++++++++
 .../calendar_feeds/details/LessonDetails.vue  |  6 +++-
 aleksis/apps/chronos/schema/__init__.py       | 35 +++++++++++++++++++
 3 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 aleksis/apps/chronos/frontend/components/amendLesson.graphql

diff --git a/aleksis/apps/chronos/frontend/components/amendLesson.graphql b/aleksis/apps/chronos/frontend/components/amendLesson.graphql
new file mode 100644
index 00000000..40e30db9
--- /dev/null
+++ b/aleksis/apps/chronos/frontend/components/amendLesson.graphql
@@ -0,0 +1,16 @@
+mutation gqlAmendLesson($input: LessonEventInput!) {
+  amendLesson(input: $input) {
+    lessonEvent {
+      id
+      amends
+      datetimeStart
+      datetimeEnd
+      subject
+      teachers
+      groups
+      rooms
+      cancelled
+      comment
+    }
+  }
+}
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 6fe52197..e0dc9147 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
@@ -106,7 +106,7 @@
         :default-item="amendEvent.default"
         :is-create="true"
         createItemI18nKey="chronos.event.amend.title"
-        :gql-create-mutation="gqlCreateAmend"
+        :gql-create-mutation="gqlAmendLesson"
         @cancel="amendEvent.open = false"
       />
       </v-card-actions>
@@ -123,8 +123,11 @@ import EditButton from "aleksis.core/components/generic/buttons/EditButton.vue";
 import DialogObjectForm from "aleksis.core/components/generic/dialogs/DialogObjectForm.vue";
 
 import LessonRelatedObjectChip from "../../LessonRelatedObjectChip.vue";
+
 import lessonEvent from "../mixins/lessonEvent";
 import LessonEventSubject from "../../LessonEventSubject.vue";
+import gqlAmendLesson from "../../amendLesson.graphql";
+
 export default {
   name: "LessonDetails",
   components: {
@@ -135,6 +138,7 @@ export default {
     CancelledCalendarStatusChip,
     EditButton,
     DialogObjectForm,
+    gqlAmendLesson,
   },
   mixins: [calendarFeedDetailsMixin, lessonEvent],
   data() {
diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py
index e5c7d4e8..4c8f3313 100644
--- a/aleksis/apps/chronos/schema/__init__.py
+++ b/aleksis/apps/chronos/schema/__init__.py
@@ -1,7 +1,9 @@
 import graphene
 from graphene_django import DjangoObjectType
+from graphene_django_cud.mutations import DjangoCreateMutation
 
 from aleksis.core.models import Group, Person, Room
+from ..models import LessonEvent
 
 from ..util.chronos_helpers import get_classes, get_rooms, get_teachers
 
@@ -26,6 +28,35 @@ class TimetableRoomType(DjangoObjectType):
         fields = ("id", "name", "short_name")
         skip_registry = True
 
+class LessonEventType(DjangoObjectType):
+    class Meta:
+        model = LessonEvent
+        fields = ("id",
+                  "amends",
+                  "datetime_start",
+                  "datetime_end",
+                  "subject",
+                  "teachers",
+                  "groups",
+                  "rooms",
+                  "cancelled",
+                  "comment")
+
+
+class AmendLessonMutation(DjangoCreateMutation):
+    class Meta:
+        model = LessonEvent
+        permissions = ("chronos.edit_substitution_rule",)
+        only_fields = ("amends",
+                       "datetime_start",
+                       "datetime_end",
+                       "subject",
+                       "teachers",
+                       "groups",
+                       "rooms",
+                       "cancelled",
+                       "comment")
+
 
 class TimetableType(graphene.Enum):
     TEACHER = "teacher"
@@ -93,3 +124,7 @@ class Query(graphene.ObjectType):
             )
 
         return all_timetables
+
+
+class Mutation(graphene.ObjectType):
+    amend_lesson = AmendLessonMutation.Field()
-- 
GitLab