From 765fc1bc06a25ca984dad1aaf7923811d2d85522 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 22 Sep 2024 15:59:15 +0200
Subject: [PATCH] Improve statistic queries, fix some bugs, include tardiness

---
 .../statistics/StatisticsForGroupTab.vue       |  3 +--
 aleksis/apps/alsijil/model_extensions.py       | 18 +++++++++---------
 aleksis/apps/alsijil/schema/__init__.py        |  2 +-
 aleksis/apps/alsijil/schema/statistics.py      |  6 +++---
 4 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForGroupTab.vue b/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForGroupTab.vue
index e4be1ec19..4d9611c24 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForGroupTab.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/statistics/StatisticsForGroupTab.vue
@@ -10,7 +10,6 @@
     :show-select="false"
     @items="items = $event"
   >
-
     <!--    <template #header.person="header">-->
     <!--      Hello world-->
     <!--      {{ header }}-->
@@ -83,7 +82,7 @@ import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.
 import ExtraMarkChip from "aleksis.apps.alsijil/components/extra_marks/ExtraMarkChip.vue";
 
 import { statisticsByGroup } from "./statistics.graphql";
-import { absenceReasons } from "aleksis.apps.kolego/components/absenceReasons.graphql";
+import { absenceReasons } from "../absences/absenceReasons.graphql";
 import { extraMarks } from "../../extra_marks/extra_marks.graphql";
 
 export default {
diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py
index 14b135321..33b3a1500 100644
--- a/aleksis/apps/alsijil/model_extensions.py
+++ b/aleksis/apps/alsijil/model_extensions.py
@@ -520,12 +520,12 @@ def annotate_person_statistics(
             filter=Q(filtered_participation_statuses__absence_reason__count_as_absent=True),
             distinct=True,
         ),
-        # tardiness=Sum("filtered_participation_statuses__tardiness"),
-        # tardiness_count=Count(
-        #     "filtered_personal_notes",
-        #     filter=Q(filtered_personal_notes__tardiness__gt=0),
-        #     distinct=True,
-        # ),
+        tardiness_sum=Sum("filtered_participation_statuses__tardiness"),
+        tardiness_count=Count(
+            "filtered_participation_statuses",
+            filter=Q(filtered_participation_statuses__tardiness__gt=0),
+            distinct=True,
+        ),
     )
     persons = persons.order_by("last_name", "first_name")
 
@@ -557,16 +557,16 @@ def annotate_person_statistics(
 
 
 def annotate_person_statistics_for_school_term(
-    persons: QuerySet[Person], school_term: SchoolTerm
+    persons: QuerySet[Person], school_term: SchoolTerm, group: Group | None = None
 ) -> QuerySet[Person]:
     """Annotate a queryset of persons with class register statistics for a school term."""
     documentations = Documentation.objects.filter(
-        participations__person__in=persons,
         datetime_start__date__gte=school_term.date_start,
         datetime_end__date__lte=school_term.date_end,
     )
+    if group:
+        documentations.filter(Q(course__groups=group) | Q(course__groups__parent_groups=group))
     docs = list(documentations.values_list("pk", flat=True))
-
     return annotate_person_statistics(
         persons,
         Q(participations__related_documentation__in=docs),
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index b8fe2fcc3..9e6ec22b5 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -272,7 +272,7 @@ class Query(graphene.ObjectType):
         )
 
         members = Group.objects.get(id=group).members.all()
-        return annotate_person_statistics_for_school_term(members, school_term)
+        return annotate_person_statistics_for_school_term(members, school_term, group=group)
 
 
 class Mutation(graphene.ObjectType):
diff --git a/aleksis/apps/alsijil/schema/statistics.py b/aleksis/apps/alsijil/schema/statistics.py
index 2788fcfeb..a6292433a 100644
--- a/aleksis/apps/alsijil/schema/statistics.py
+++ b/aleksis/apps/alsijil/schema/statistics.py
@@ -49,14 +49,14 @@ class StatisticsByPersonType(graphene.ObjectType):
     def resolve_absence_reasons(root, info):
         return [
             dict(absence_reason=reason, count=getattr(root, reason.count_label))
-            for reason in AbsenceReason.objects.all()
+            for reason in AbsenceReason.objects.filter(tags__short_name="class_register")
         ]
 
     def resolve_tardiness_sum(root, info):
-        return 17
+        return root.tardiness_sum
 
     def resolve_tardiness_count(root, info):
-        return 5
+        return root.tardiness_count
 
     def resolve_extra_marks(root, info):
         return [
-- 
GitLab