Skip to content
Snippets Groups Projects
Verified Commit a4b9dfea authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Improve statistics builder

parent 6978f1c5
No related branches found
No related tags found
1 merge request!477Resolve "Add export functionality to absence statistics page"
Pipeline #195684 failed
...@@ -163,11 +163,9 @@ def generate_person_register_printout( ...@@ -163,11 +163,9 @@ def generate_person_register_printout(
doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers") doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers")
statistics = ( statistics = (
( StatisticsBuilder(Person.objects.filter(id=person.id))
StatisticsBuilder(Person.objects.filter(id=person.id)) .use_from_school_term(school_term)
.use_from_school_term(school_term) .annotate_statistics()
.annotate_statistics()
)
.prefetch_relevant_participations(documentation_with_details=doc_query_set) .prefetch_relevant_participations(documentation_with_details=doc_query_set)
.prefetch_relevant_personal_notes(documentation_with_details=doc_query_set) .prefetch_relevant_personal_notes(documentation_with_details=doc_query_set)
.build() .build()
......
...@@ -17,7 +17,7 @@ class BuilderError(Exception): ...@@ -17,7 +17,7 @@ class BuilderError(Exception):
class StatisticsBuilder: class StatisticsBuilder:
"""Builder class for building queries with annotated statistics on persons. """Builder class for building queries with annotated statistics on persons.
To build queries, you can combine one `use_` with multiple `annotate` or `prefetch` To build queries, you can combine `use_` with multiple `annotate` or `prefetch`
methods. At the end, call `build` to get the actual queryset. methods. At the end, call `build` to get the actual queryset.
>>> StatisticsBuilder(person_qs).use_from_school_term(school_term).annotate_statistics().build() >>> StatisticsBuilder(person_qs).use_from_school_term(school_term).annotate_statistics().build()
...@@ -87,7 +87,7 @@ class StatisticsBuilder: ...@@ -87,7 +87,7 @@ class StatisticsBuilder:
def _annotate_filtered_participations(self, condition: Q | None = None) -> "StatisticsBuilder": def _annotate_filtered_participations(self, condition: Q | None = None) -> "StatisticsBuilder":
"""Annotate a filtered relation for participations.""" """Annotate a filtered relation for participations."""
if not self.participations_filter and not condition: if not self.participations_filter and not condition:
raise BuilderError raise BuilderError("Annotation of participations needs a participation filter.")
self.qs = self.qs.annotate( self.qs = self.qs.annotate(
filtered_participation_statuses=FilteredRelation( filtered_participation_statuses=FilteredRelation(
"participations", "participations",
...@@ -99,7 +99,7 @@ class StatisticsBuilder: ...@@ -99,7 +99,7 @@ class StatisticsBuilder:
def _annotate_filtered_personal_notes(self, condition: Q | None = None) -> "StatisticsBuilder": def _annotate_filtered_personal_notes(self, condition: Q | None = None) -> "StatisticsBuilder":
"""Annotate a filtered relation for personal notes.""" """Annotate a filtered relation for personal notes."""
if not self.personal_notes_filter and not condition: if not self.personal_notes_filter and not condition:
raise BuilderError raise BuilderError("Annotation of personal notes needs a participation filter.")
self.qs = self.qs.annotate( self.qs = self.qs.annotate(
filtered_personal_notes=FilteredRelation( filtered_personal_notes=FilteredRelation(
"new_personal_notes", "new_personal_notes",
......
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