diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index a429fa2832523cfe152e8d9d5deda18d0a1a9de5..9e68ccd06773dc8b0f6ee65ccd16c81319b94a8b 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -11,7 +11,7 @@ from django.db.models.query_utils import Q from django.urls import reverse from django.utils import timezone from django.utils.formats import date_format -from django.utils.timezone import localdate, localtime +from django.utils.timezone import localdate, localtime, now from django.utils.translation import gettext_lazy as _ from calendarweek import CalendarWeek @@ -691,28 +691,47 @@ class Documentation(CalendarEvent): def touch(self): """Ensure that participation statuses are created for this documentation.""" - # TODO: Check for preexisting absences in kolego - - if self.participation_touched_at or not self.amends or self.datetime_start > localtime(): + if ( + self.participation_touched_at + or not self.amends + or self.value_start_datetime(self) > now() + ): # There is no source to update from or it's too early return lesson_event: LessonEvent = self.amends all_members = lesson_event.all_members + member_pks = [p.pk for p in all_members] - new_persons = Person.objects.filter(Q(pk__in=[p.pk for p in all_members])).prefetch_related( - "member_of" + new_persons = Person.objects.filter(Q(pk__in=member_pks)).prefetch_related("member_of") + + # Get absences from Kolego + events = KolegoAbsence.get_single_events( + self.value_start_datetime(self), + self.value_end_datetime(self), + None, + {"persons": member_pks}, + with_reference_object=True, ) + kolego_absences_map = {a["REFERENCE_OBJECT"].person: a["REFERENCE_OBJECT"] for a in events} + new_participations = [] new_groups_of_person = [] for person in new_persons: - participation_status = ParticipationStatus.objects.create( + participation_status = ParticipationStatus( person=person, related_documentation=self, datetime_start=self.datetime_start, datetime_end=self.datetime_end, timezone=self.timezone, ) + + # Take over data from Kolego absence + if person in kolego_absences_map: + participation_status.fill_from_kolego(kolego_absences_map[person]) + + participation_status.save() + new_groups_of_person += [ ParticipationStatus.groups_of_person.through( group=group, participationstatus=participation_status @@ -771,6 +790,11 @@ class ParticipationStatus(CalendarEvent): verbose_name=_("Base Absence"), ) + def fill_from_kolego(self, kolego_absence: KolegoAbsence): + """Take over data from a Kolego absence.""" + self.base_absence = kolego_absence + self.absence_reason = kolego_absence.reason + def __str__(self) -> str: return f"{self.related_documentation.id}, {self.person}"