From b2f54874d8559c54f1b1d46b3989d8d1edc056ce Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Mon, 8 Apr 2024 17:04:13 +0200
Subject: [PATCH] Add proper handling of documentations of substitution lessons

---
 .../components/coursebook/coursebook.graphql  | 13 +++++++++
 .../documentation/LessonInformation.vue       | 27 +++++++++++++++--
 aleksis/apps/alsijil/models.py                | 17 +++++++++--
 aleksis/apps/alsijil/schema/documentation.py  | 29 +++++++++++++++++--
 4 files changed, 79 insertions(+), 7 deletions(-)

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
index c73f273af..5814088f6 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
@@ -41,6 +41,19 @@ query documentationsForCoursebook(
       id
       amends {
         id
+        teachers {
+          id
+          shortName
+          fullName
+          avatarContentUrl
+        }
+        subject {
+          id
+          name
+          shortName
+          colourFg
+          colourBg
+        }
       }
       cancelled
     }
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
index 6e709e244..470ec8004 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
@@ -31,7 +31,15 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue";
       :subject="documentation.subject"
       v-bind="compact ? dialogActivator.attrs : {}"
       v-on="compact ? dialogActivator.on : {}"
-    />
+      />
+    <subject-chip
+      v-if="documentation?.lessonEvent?.amends?.subject && documentation.lessonEvent.amends.subject.id !== documentation.subject.id"
+      :subject="documentation.lessonEvent.amends.subject"
+      v-bind="compact ? dialogActivator.attrs : {}"
+      v-on="compact ? dialogActivator.on : {}"
+      class="text-decoration-line-through"
+      disabled
+      />
     <div :class="{ 'd-flex align-center flex-wrap gap': true }">
       <person-chip
         v-for="teacher in documentation.teachers"
@@ -39,7 +47,16 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue";
         no-link
         v-bind="compact ? dialogActivator.attrs : {}"
         v-on="compact ? dialogActivator.on : {}"
-      />
+        />
+      <person-chip
+        v-for="teacher in amendedTeachers"
+        :person="teacher"
+        no-link
+        v-bind="compact ? dialogActivator.attrs : {}"
+        v-on="compact ? dialogActivator.on : {}"
+        class="text-decoration-line-through"
+        disabled
+        />
     </div>
   </div>
 </template>
@@ -64,6 +81,12 @@ export default {
     largeGrid() {
       return this.compact && !this.$vuetify.breakpoint.mobile;
     },
+    amendedTeachers() {
+      if (this.documentation?.lessonEvent?.amends?.teachers && this.documentation.lessonEvent.amends.teachers.length) {
+        return this.documentation.lessonEvent.amends.teachers.filter((at) => !this.documentation.teachers.includes((t) => t.id === at.id));
+      }
+      return [];
+    }
   },
 };
 </script>
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 067818d18..32cbe12f4 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -582,12 +582,25 @@ class Documentation(CalendarEvent):
                     continue
                 docs.append(doc)
             else:
+                if event_reference_obj.amends:
+                    if event_reference_obj.course:
+                        course = event_reference_obj.course
+                    else:
+                        course = event_reference_obj.amends.course
+
+                    if event_reference_obj.subject:
+                        subject = event_reference_obj.subject
+                    else:
+                        subject = event_reference_obj.amends.subject
+                else:
+                    course, subject = event_reference_obj.course, event_reference_obj.subject
+
                 docs.append(
                     cls(
                         pk=f"DUMMY;{event_reference_obj.id};{event['DTSTART'].dt.isoformat()};{event['DTEND'].dt.isoformat()}",
                         lesson_event=event_reference_obj,
-                        course=event_reference_obj.course,
-                        subject=event_reference_obj.subject,
+                        course=course,
+                        subject=subject,
                         datetime_start=event["DTSTART"].dt,
                         datetime_end=event["DTEND"].dt,
                     )
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index 442f2156a..3c67915f8 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -55,6 +55,11 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
     def resolve_teachers(root: Documentation, info, **kwargs):
         if not str(root.pk).startswith("DUMMY") and hasattr(root, "teachers"):
             return root.teachers
+        elif root.lesson_event.amends:
+            if root.lesson_event.teachers:
+                return root.lesson_event.teachers
+            else:
+                return root.lesson_event.amends.teachers
         return root.lesson_event.teachers
 
     @staticmethod
@@ -118,12 +123,30 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
                     and datetime_start <= localtime()
                 )
             ):
+                if lesson_event.amends:
+                    if lesson_event.course:
+                        course = lesson_event.course
+                    else:
+                        course = lesson_event.amends.course
+
+                    if lesson_event.subject:
+                        subject = lesson_event.subject
+                    else:
+                        subject = lesson_event.amends.subject
+
+                    if lesson_event.teachers:
+                        teachers = lesson_event.teachers
+                    else:
+                        teachers = lesson_event.amends.teachers
+                else:
+                    course, subject, teachers = lesson_event.course, lesson_event.subject, lesson_event.teachers
+
                 obj = Documentation.objects.create(
                     datetime_start=datetime_start,
                     datetime_end=datetime_end,
                     lesson_event=lesson_event,
-                    course=lesson_event.course,
-                    subject=lesson_event.subject,
+                    course=course,
+                    subject=subject,
                     topic=doc.topic or "",
                     homework=doc.homework or "",
                     group_note=doc.group_note or "",
@@ -131,7 +154,7 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
                 if doc.teachers is not None:
                     obj.teachers.add(*doc.teachers)
                 else:
-                    obj.teachers.set(lesson_event.teachers.all())
+                    obj.teachers.set(teachers.all())
                 obj.save()
                 return obj
             raise PermissionDenied()
-- 
GitLab