diff --git a/aleksis/apps/alsijil/tasks.py b/aleksis/apps/alsijil/tasks.py index ad62bdf24d215e29acbc67099addea22733786f2..cb6c7c64e268920b88da380b94fa2894b1e2c360 100644 --- a/aleksis/apps/alsijil/tasks.py +++ b/aleksis/apps/alsijil/tasks.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Optional, List from copy import deepcopy from datetime import date, timedelta @@ -23,7 +23,7 @@ from .model_extensions import annotate_person_statistics_from_documentations @recorded_task def generate_full_register_printout( - group: int, + groups: List[int], file_object: int, recorder: ProgressRecorder, include_cover: Optional[bool] = True, @@ -61,14 +61,14 @@ def generate_full_register_printout( context = {} - _number_of_steps = 4 + _number_of_steps = 5 + len(groups) - recorder.set_progress(1, _number_of_steps, _("Load data ...")) + recorder.set_progress(1, _number_of_steps, _("Loading data ...")) - group = Group.objects.filter(pk=group) + groups = Group.objects.filter(pk__in=groups).order_by("name") if include_cover: - group = group.select_related("school_term") + groups = groups.select_related("school_term") if include_abbreviations or include_members_table: context["absence_reasons"] = AbsenceReason.objects.filter(tags__short_name="class_register", count_as_absent=True) @@ -76,10 +76,10 @@ def generate_full_register_printout( context["extra_marks"] = ExtraMark.objects.all() if include_members_table or include_person_overviews: - group = group.prefetch_related("members") + groups = groups.prefetch_related("members") if include_teachers_and_subjects_table: - group = group.prefetch_related( + groups = groups.prefetch_related( Prefetch("courses", queryset=Course.objects.select_related("subject")), "courses__teachers", "child_groups", @@ -87,58 +87,63 @@ def generate_full_register_printout( "child_groups__courses__teachers", ) - group = group[0] - context["group"] = group - - if include_members_table or include_person_overviews or include_coursebook: - documentations = Documentation.objects.filter( - Q(datetime_start__date__gte=group.school_term.date_start) - & Q(datetime_end__date__lte=group.school_term.date_end) - & (Q(course__groups=group) | Q(course__groups__parent_groups=group)) - ) - - if include_members_table or include_person_overviews: - context["members"] = annotate_person_statistics_from_documentations(group.members.all(), documentations) - - if include_person_overviews: - doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers"), - context["members"] = context["members"].prefetch_related( - prefetch_notable_participations( - prefetch_related=[ - Prefetch( - "related_documentation", - queryset=doc_query_set, - ) - ], - ), - prefetch_personal_notes( - "new_personal_notes", - prefetch_related=[ - Prefetch( - "documentation", - queryset=doc_query_set, - ) - ], - ), - ) - - if include_coursebook: - context["documentations_by_day"] = {} - documentations = documentations.order_by("datetime_start").prefetch_related( - prefetch_notable_participations(select_related=["person"]), - prefetch_personal_notes("personal_notes", select_related=["person"]) - ) - for doc in documentations: - context["documentations_by_day"].setdefault(doc.datetime_start.date(), []).append(doc) - - recorder.set_progress(2, _number_of_steps, _("Generate template ...")) + recorder.set_progress(2, _number_of_steps, _("Loading groups ...")) + + for i, group in enumerate(groups, start=1): + + recorder.set_progress(2 + i, _number_of_steps, _(f"Loading group {group.short_name or group.name} ...")) + + if include_members_table or include_person_overviews or include_coursebook: + documentations = Documentation.objects.filter( + Q(datetime_start__date__gte=group.school_term.date_start) + & Q(datetime_end__date__lte=group.school_term.date_end) + & (Q(course__groups=group) | Q(course__groups__parent_groups=group)) + ) + + if include_members_table or include_person_overviews: + group.members_with_stats = annotate_person_statistics_from_documentations(group.members.all(), documentations) + + if include_person_overviews: + doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers"), + group.members_with_stats = group.members_with_stats.prefetch_related( + prefetch_notable_participations( + prefetch_related=[ + Prefetch( + "related_documentation", + queryset=doc_query_set, + ) + ], + ), + prefetch_personal_notes( + "new_personal_notes", + prefetch_related=[ + Prefetch( + "documentation", + queryset=doc_query_set, + ) + ], + ), + ) + + if include_coursebook: + group.documentations_by_day = {} + documentations = documentations.order_by("datetime_start").prefetch_related( + prefetch_notable_participations(select_related=["person"]), + prefetch_personal_notes("personal_notes", select_related=["person"]) + ) + for doc in documentations: + group.documentations_by_day.setdefault(doc.datetime_start.date(), []).append(doc) + + context["groups"] = groups + + recorder.set_progress(3 + len(groups), _number_of_steps, _("Generating template ...")) # TODO: Use render pdf instead file_object, result = generate_pdf_from_template( "alsijil/print/register_for_group.html", context, file_object=file_object ) - recorder.set_progress(3, _number_of_steps, _("Generate PDF ...")) + recorder.set_progress(4 + len(groups), _number_of_steps, _("Generating PDF ...")) with allow_join_result(): result.wait() @@ -146,4 +151,4 @@ def generate_full_register_printout( if not result.status == SUCCESS and file_object.file: raise Exception(_("PDF generation failed")) - recorder.set_progress(4, _number_of_steps) + recorder.set_progress(5 + len(groups), _number_of_steps)