From 703fdd628dec9ad0431667712eb9a7d5b7f0947a Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 29 Aug 2022 11:56:18 +0200
Subject: [PATCH] Add distinct to group-based statistic views

---
 CHANGELOG.rst                            | 1 +
 aleksis/apps/alsijil/model_extensions.py | 7 +++++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index a79287ec7..556b6f5b2 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -13,6 +13,7 @@ Fixed
 ~~~~~
 
 * Students were displayed multiple times in class register views.
+* Absences were counted multiple times in some class register views.
 
 `2.1`_ - 2022-06-25
 -------------------
diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py
index 5b0e5ac4b..b53f87f99 100644
--- a/aleksis/apps/alsijil/model_extensions.py
+++ b/aleksis/apps/alsijil/model_extensions.py
@@ -434,6 +434,7 @@ def generate_person_list_with_class_register_statistics(
             "filtered_personal_notes",
             filter=Q(filtered_personal_notes__absent=True)
             & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
+            distinct=True,
         ),
         excused=Count(
             "filtered_personal_notes",
@@ -442,6 +443,7 @@ def generate_person_list_with_class_register_statistics(
                 filtered_personal_notes__excused=True,
             )
             & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
+            distinct=True,
         ),
         excused_without_excuse_type=Count(
             "filtered_personal_notes",
@@ -450,15 +452,16 @@ def generate_person_list_with_class_register_statistics(
                 filtered_personal_notes__excused=True,
                 filtered_personal_notes__excuse_type__isnull=True,
             ),
+            distinct=True,
         ),
         unexcused=Count(
             "filtered_personal_notes",
             filter=Q(filtered_personal_notes__absent=True, filtered_personal_notes__excused=False),
+            distinct=True,
         ),
         tardiness=Sum("filtered_personal_notes__late"),
         tardiness_count=Count(
-            "filtered_personal_notes",
-            filter=Q(filtered_personal_notes__late__gt=0),
+            "filtered_personal_notes", filter=Q(filtered_personal_notes__late__gt=0), distinct=True
         ),
     )
 
-- 
GitLab