Skip to content
Snippets Groups Projects

Resolve "Add export functionality to course book"

Merged permcu requested to merge 258-add-export-functionality-to-course-book into master
1 file
+ 60
55
Compare changes
  • Side-by-side
  • Inline
from typing import Optional
from typing import Optional, List
from copy import deepcopy
from copy import deepcopy
from datetime import date, timedelta
from datetime import date, timedelta
@@ -23,7 +23,7 @@ from .model_extensions import annotate_person_statistics_from_documentations
@@ -23,7 +23,7 @@ from .model_extensions import annotate_person_statistics_from_documentations
@recorded_task
@recorded_task
def generate_full_register_printout(
def generate_full_register_printout(
group: int,
groups: List[int],
file_object: int,
file_object: int,
recorder: ProgressRecorder,
recorder: ProgressRecorder,
include_cover: Optional[bool] = True,
include_cover: Optional[bool] = True,
@@ -61,14 +61,14 @@ def generate_full_register_printout(
@@ -61,14 +61,14 @@ def generate_full_register_printout(
context = {}
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:
if include_cover:
group = group.select_related("school_term")
groups = groups.select_related("school_term")
if include_abbreviations or include_members_table:
if include_abbreviations or include_members_table:
context["absence_reasons"] = AbsenceReason.objects.filter(tags__short_name="class_register", count_as_absent=True)
context["absence_reasons"] = AbsenceReason.objects.filter(tags__short_name="class_register", count_as_absent=True)
@@ -76,10 +76,10 @@ def generate_full_register_printout(
@@ -76,10 +76,10 @@ def generate_full_register_printout(
context["extra_marks"] = ExtraMark.objects.all()
context["extra_marks"] = ExtraMark.objects.all()
if include_members_table or include_person_overviews:
if include_members_table or include_person_overviews:
group = group.prefetch_related("members")
groups = groups.prefetch_related("members")
if include_teachers_and_subjects_table:
if include_teachers_and_subjects_table:
group = group.prefetch_related(
groups = groups.prefetch_related(
Prefetch("courses", queryset=Course.objects.select_related("subject")),
Prefetch("courses", queryset=Course.objects.select_related("subject")),
"courses__teachers",
"courses__teachers",
"child_groups",
"child_groups",
@@ -87,58 +87,63 @@ def generate_full_register_printout(
@@ -87,58 +87,63 @@ def generate_full_register_printout(
"child_groups__courses__teachers",
"child_groups__courses__teachers",
)
)
group = group[0]
recorder.set_progress(2, _number_of_steps, _("Loading groups ..."))
context["group"] = group
for i, group in enumerate(groups, start=1):
if include_members_table or include_person_overviews or include_coursebook:
documentations = Documentation.objects.filter(
recorder.set_progress(2 + i, _number_of_steps, _(f"Loading group {group.short_name or group.name} ..."))
Q(datetime_start__date__gte=group.school_term.date_start)
& Q(datetime_end__date__lte=group.school_term.date_end)
if include_members_table or include_person_overviews or include_coursebook:
& (Q(course__groups=group) | Q(course__groups__parent_groups=group))
documentations = Documentation.objects.filter(
)
Q(datetime_start__date__gte=group.school_term.date_start)
& Q(datetime_end__date__lte=group.school_term.date_end)
if include_members_table or include_person_overviews:
& (Q(course__groups=group) | Q(course__groups__parent_groups=group))
context["members"] = annotate_person_statistics_from_documentations(group.members.all(), documentations)
)
if include_person_overviews:
if include_members_table or include_person_overviews:
doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers"),
group.members_with_stats = annotate_person_statistics_from_documentations(group.members.all(), documentations)
context["members"] = context["members"].prefetch_related(
prefetch_notable_participations(
if include_person_overviews:
prefetch_related=[
doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers"),
Prefetch(
group.members_with_stats = group.members_with_stats.prefetch_related(
"related_documentation",
prefetch_notable_participations(
queryset=doc_query_set,
prefetch_related=[
)
Prefetch(
],
"related_documentation",
),
queryset=doc_query_set,
prefetch_personal_notes(
)
"new_personal_notes",
],
prefetch_related=[
),
Prefetch(
prefetch_personal_notes(
"documentation",
"new_personal_notes",
queryset=doc_query_set,
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"]),
if include_coursebook:
prefetch_personal_notes("personal_notes", select_related=["person"])
group.documentations_by_day = {}
)
documentations = documentations.order_by("datetime_start").prefetch_related(
for doc in documentations:
prefetch_notable_participations(select_related=["person"]),
context["documentations_by_day"].setdefault(doc.datetime_start.date(), []).append(doc)
prefetch_personal_notes("personal_notes", select_related=["person"])
)
recorder.set_progress(2, _number_of_steps, _("Generate template ..."))
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
# TODO: Use render pdf instead
file_object, result = generate_pdf_from_template(
file_object, result = generate_pdf_from_template(
"alsijil/print/register_for_group.html", context, file_object=file_object
"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():
with allow_join_result():
result.wait()
result.wait()
@@ -146,4 +151,4 @@ def generate_full_register_printout(
@@ -146,4 +151,4 @@ def generate_full_register_printout(
if not result.status == SUCCESS and file_object.file:
if not result.status == SUCCESS and file_object.file:
raise Exception(_("PDF generation failed"))
raise Exception(_("PDF generation failed"))
recorder.set_progress(4, _number_of_steps)
recorder.set_progress(5 + len(groups), _number_of_steps)
Loading