Skip to content
Snippets Groups Projects
Verified Commit d9e3d6db authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Take over absences from Kolego

parent 1f163e24
No related branches found
No related tags found
1 merge request!360Resolve "Add absence management to course book student dialog"
...@@ -11,7 +11,7 @@ from django.db.models.query_utils import Q ...@@ -11,7 +11,7 @@ from django.db.models.query_utils import Q
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.formats import date_format 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 django.utils.translation import gettext_lazy as _
from calendarweek import CalendarWeek from calendarweek import CalendarWeek
...@@ -691,28 +691,47 @@ class Documentation(CalendarEvent): ...@@ -691,28 +691,47 @@ class Documentation(CalendarEvent):
def touch(self): def touch(self):
"""Ensure that participation statuses are created for this documentation.""" """Ensure that participation statuses are created for this documentation."""
# TODO: Check for preexisting absences in kolego if (
self.participation_touched_at
if self.participation_touched_at or not self.amends or self.datetime_start > localtime(): or not self.amends
or self.value_start_datetime(self) > now()
):
# There is no source to update from or it's too early # There is no source to update from or it's too early
return return
lesson_event: LessonEvent = self.amends lesson_event: LessonEvent = self.amends
all_members = lesson_event.all_members 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( new_persons = Person.objects.filter(Q(pk__in=member_pks)).prefetch_related("member_of")
"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_participations = []
new_groups_of_person = [] new_groups_of_person = []
for person in new_persons: for person in new_persons:
participation_status = ParticipationStatus.objects.create( participation_status = ParticipationStatus(
person=person, person=person,
related_documentation=self, related_documentation=self,
datetime_start=self.datetime_start, datetime_start=self.datetime_start,
datetime_end=self.datetime_end, datetime_end=self.datetime_end,
timezone=self.timezone, 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 += [ new_groups_of_person += [
ParticipationStatus.groups_of_person.through( ParticipationStatus.groups_of_person.through(
group=group, participationstatus=participation_status group=group, participationstatus=participation_status
...@@ -771,6 +790,11 @@ class ParticipationStatus(CalendarEvent): ...@@ -771,6 +790,11 @@ class ParticipationStatus(CalendarEvent):
verbose_name=_("Base Absence"), 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: def __str__(self) -> str:
return f"{self.related_documentation.id}, {self.person}" return f"{self.related_documentation.id}, {self.person}"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment