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