Skip to content
Snippets Groups Projects
Commit d1465a0c authored by permcu's avatar permcu
Browse files

Change generate_full_register_printout to list of groups

parent 8d89bf54
No related branches found
No related tags found
1 merge request!422Resolve "Add export functionality to course book"
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)
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