From 3e9310790407057c94bc53c86edaa346241f9840 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 4 Nov 2024 18:46:40 +0100
Subject: [PATCH] Fix queries for person statistics

---
 aleksis/apps/alsijil/model_extensions.py | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py
index 8270ddb91..5ee293aa1 100644
--- a/aleksis/apps/alsijil/model_extensions.py
+++ b/aleksis/apps/alsijil/model_extensions.py
@@ -1,7 +1,6 @@
-from django.utils.translation import gettext as _
-
 from django.db.models import FilteredRelation, Q, QuerySet
 from django.db.models.aggregates import Count, Sum
+from django.utils.translation import gettext as _
 
 from aleksis.apps.kolego.models import AbsenceReason
 from aleksis.core.models import Group, Person, SchoolTerm
@@ -34,7 +33,6 @@ Group.add_permission("assign_grouprole", _("Can assign a group role for this gro
 Person.add_permission("register_absence_person", _("Can register an absence for a person"))
 
 
-
 def annotate_person_statistics(
     persons: QuerySet[Person], participations_filter: Q, personal_notes_filter: Q
 ) -> QuerySet[Person]:
@@ -59,7 +57,7 @@ def annotate_person_statistics(
             filter=Q(filtered_participation_statuses__absence_reason__count_as_absent=True),
             distinct=True,
         ),
-        tardiness_sum=Sum("filtered_participation_statuses__tardiness"),
+        tardiness_sum=Sum("filtered_participation_statuses__tardiness", distinct=True),
         tardiness_count=Count(
             "filtered_participation_statuses",
             filter=Q(filtered_participation_statuses__tardiness__gt=0),
@@ -104,7 +102,11 @@ def annotate_person_statistics_for_school_term(
         datetime_end__date__lte=school_term.date_end,
     )
     if group:
-        documentations.filter(Q(course__groups=group) | Q(course__groups__parent_groups=group))
+        documentations.filter(
+            pk__in=Documentation.objects.filter(course__groups=group).union(
+                Documentation.objects.filter(course__groups__parent_groups=group)
+            )
+        )
     docs = list(documentations.values_list("pk", flat=True))
     return annotate_person_statistics(
         persons,
-- 
GitLab