Skip to content
Snippets Groups Projects
Commit da7365e9 authored by Julian's avatar Julian
Browse files

Fix amends for empty documentations

parent 15e96ddf
No related branches found
No related tags found
1 merge request!361Resolve "Add statistics page for absences"
Pipeline #193775 failed
from django.db.models import FilteredRelation, Q, QuerySet
from django.db.models import FilteredRelation, Q, QuerySet, Value
from django.db.models.aggregates import Count, Sum
from django.utils.translation import gettext as _
......@@ -34,36 +34,58 @@ Person.add_permission("register_absence_person", _("Can register an absence for
def annotate_person_statistics(
persons: QuerySet[Person], participations_filter: Q, personal_notes_filter: Q
persons: QuerySet[Person],
participations_filter: Q,
personal_notes_filter: Q,
*,
ignore_filters: bool = False,
) -> QuerySet[Person]:
"""Annotate a queryset of persons with class register statistics."""
persons = persons.annotate(
filtered_participation_statuses=FilteredRelation(
"participations",
condition=(participations_filter),
),
filtered_personal_notes=FilteredRelation(
"new_personal_notes",
condition=(personal_notes_filter),
),
).annotate(
participation_count=Count(
"filtered_participation_statuses",
filter=Q(filtered_participation_statuses__absence_reason__isnull=True),
distinct=True,
),
absence_count=Count(
"filtered_participation_statuses",
filter=Q(filtered_participation_statuses__absence_reason__count_as_absent=True),
distinct=True,
),
tardiness_sum=Sum("filtered_participation_statuses__tardiness", distinct=True),
tardiness_count=Count(
"filtered_participation_statuses",
filter=Q(filtered_participation_statuses__tardiness__gt=0),
distinct=True,
),
)
if ignore_filters:
persons = persons.annotate(
absence_count=Value(0),
filtered_participation_statuses=FilteredRelation(
"participations",
condition=Q(pk=None),
),
filtered_personal_notes=FilteredRelation(
"new_personal_notes",
condition=Q(pk=None),
),
participation_count=Value(0),
tardiness_count=Value(0),
tardiness_sum=Value(0),
)
else:
persons = persons.annotate(
filtered_participation_statuses=FilteredRelation(
"participations",
condition=(participations_filter),
),
filtered_personal_notes=FilteredRelation(
"new_personal_notes",
condition=(personal_notes_filter),
),
).annotate(
participation_count=Count(
"filtered_participation_statuses",
filter=Q(filtered_participation_statuses__absence_reason__isnull=True),
distinct=True,
),
absence_count=Count(
"filtered_participation_statuses",
filter=Q(filtered_participation_statuses__absence_reason__count_as_absent=True),
distinct=True,
),
tardiness_sum=Sum("filtered_participation_statuses__tardiness", distinct=True),
tardiness_count=Count(
"filtered_participation_statuses",
filter=Q(filtered_participation_statuses__tardiness__gt=0),
distinct=True,
),
)
persons = persons.order_by("last_name", "first_name")
for absence_reason in AbsenceReason.objects.all():
......@@ -116,4 +138,5 @@ def annotate_person_statistics_for_school_term(
persons,
Q(participations__related_documentation__in=docs),
Q(new_personal_notes__documentation__in=docs),
ignore_filters=len(docs) == 0,
)
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