From cb846ef41ad8ce15e60c9fafc33a259d69dd92a5 Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Mon, 14 Oct 2024 21:27:15 +0200
Subject: [PATCH] Improve teacher filtering mechanism when generating
 substitutions from absences

---
 aleksis/apps/chronos/managers.py | 7 +++++++
 aleksis/apps/chronos/models.py   | 6 ++++++
 2 files changed, 13 insertions(+)

diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py
index 600a20ca..2fb3c8e3 100644
--- a/aleksis/apps/chronos/managers.py
+++ b/aleksis/apps/chronos/managers.py
@@ -876,6 +876,13 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
         )
         return self.filter(Q(teachers=teacher) | Q(pk__in=amended)).distinct()
 
+    def for_teachers(self, teachers: list[Union[int, Person]]) -> "LessonEventQuerySet":
+        """Get all lesson events for a list of persons as teacher (including amends)."""
+        amended = self.filter(Q(amended_by__isnull=False) & (Q(teachers__in=teachers))).values_list(
+            "amended_by__pk", flat=True
+        )
+        return self.filter(Q(teachers__in=teachers) | Q(pk__in=amended)).distinct()
+
     def for_participant(self, person: Union[int, Person]) -> "LessonEventQuerySet":
         """Get all lesson events the person participates in (including amends)."""
         amended = self.filter(Q(amended_by__isnull=False) | Q(groups__members=person)).values_list(
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index 59f25388..11b57388 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -1664,6 +1664,12 @@ class LessonEvent(CalendarEvent):
 
         if teacher:
             event_queryset = event_queryset.for_teacher(teacher)
+        else:
+            affected_teachers = Person.objects.filter(
+                Q(kolego_absences__datetime_start__lte=date_end)
+                & Q(kolego_absences__datetime_end__gte=date_start)
+            )
+            event_queryset = event_queryset.for_teachers(affected_teachers)
 
         events = LessonEvent.get_single_events(
             start=date_start, end=date_end, request=request, with_reference_object=True, queryset=event_queryset
-- 
GitLab