diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql index c73f273af1451a5f102d3b91dc66dadce57901ee..5814088f6211ae52373776001ad52749e9452696 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 6e709e24493049028ecc99ea55b874bab417da26..470ec80049edf8190d00e307b6f0f59a8827fee0 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 067818d1857c3a4054f9fbb0cc141c0fb0eae1a5..32cbe12f4971b2676e119807367bc718504d0524 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 442f2156a92778861d5d5a7584e34a12ddae9767..3c67915f8887ccfbe84a5d3817503136f92b7b39 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()