From 1fb685a1d655e5b91e9443b1b1107057f59af8fe Mon Sep 17 00:00:00 2001
From: Michael Bauer <michael-bauer@posteo.de>
Date: Sun, 6 Oct 2024 16:57:10 +0200
Subject: [PATCH] Resolve substitutions partially via graphene-types

---
 .../frontend/components/substitutions.graphql | 19 +++++----
 aleksis/apps/chronos/schema/__init__.py       | 41 +++++++++++++++++--
 2 files changed, 49 insertions(+), 11 deletions(-)

diff --git a/aleksis/apps/chronos/frontend/components/substitutions.graphql b/aleksis/apps/chronos/frontend/components/substitutions.graphql
index 1c5ccd3c..e64ea23e 100644
--- a/aleksis/apps/chronos/frontend/components/substitutions.graphql
+++ b/aleksis/apps/chronos/frontend/components/substitutions.graphql
@@ -9,15 +9,18 @@ query substitutionsForDate ($date: Date!) {
     }
     substitutions {
       groups {
-        shortName
-      }
-      period {
-        startSlot
-        endSlot
-        startTime
-        endTime
-        wholeDay
+        old {
+          shortName
+        }
+        new {
+          shortName
+        }
       }
+      startSlot
+      endSlot
+      startTime
+      endTime
+      wholeDay
       teachers {
         shortName
         fullName
diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py
index acb8f791..2b902867 100644
--- a/aleksis/apps/chronos/schema/__init__.py
+++ b/aleksis/apps/chronos/schema/__init__.py
@@ -125,10 +125,45 @@ class TimetableObjectType(graphene.ObjectType):
         return f"{root.type.value}-{root.id}"
 
 
+class SubstitutionGroupsType(graphene.ObjectType):
+    old = graphene.List(GroupType)
+    new = graphene.List(GroupType)
+
+    def resolve_old(root, info):
+        if not root.cancelled and root.groups.all() and root.amends.groups.all():
+            return root.amends.groups.all()
+        else:
+            return []
+
+    def resolve_new(root, info):
+        if root cancelled:
+            return root.amends.groups.all()
+        else:
+            return root.groups.all() or root.amends.groups.all()
+
+
+class SubstitutionType(graphene.ObjectType):
+    """This type contains the logic also contained in the pdf templates."""
+    groups = graphene.List(SubstitutionGroupsType)
+    start_slot = graphene.Int()
+    end_slot = graphene.Int()
+    start_time = graphene.Time()
+    end_time = graphene.Time()
+    whole_day = graphene.Boolean()
+    teachers = graphene.List(PersonType)
+    subject = graphene.String()
+    rooms = graphene.List(RoomType)
+    cancelled = graphene.Boolean()
+    comment = graphene.String()
+
+    def resolve_groups(root, info):
+        return root['REFERENCE_OBJECT']
+
+
 class SubstitutionsForDateType(graphene.ObjectType):
     affected_teachers = graphene.List(PersonType)
     affected_groups = graphene.List(GroupType)
-    substitutions = graphene.List(LessonEventType)
+    substitutions = graphene.List(SubstitutionType)
 
 class Query(graphene.ObjectType):
     timetable_teachers = graphene.List(TimetablePersonType)
@@ -137,7 +172,7 @@ class Query(graphene.ObjectType):
     available_timetables = graphene.List(TimetableObjectType)
     substitutions_for_date = graphene.List(
         SubstitutionsForDateType,
-        date=graphene.Date,
+        date=graphene.Date(),
     )
 
     def resolve_timetable_teachers(self, info, **kwargs):
@@ -185,7 +220,7 @@ class Query(graphene.ObjectType):
         SubstitutionsForDateType(
             affected_teachers=affected_teachers,
             affected_groups=affected_groups,
-            substitutions=[sub['el']['REFERENCE_OBJECT'] for sub in substitutions]
+            substitutions=[sub['el'] for sub in substitutions]
         )
 
 class Mutation(graphene.ObjectType):
-- 
GitLab