Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
AlekSIS-App-Alsijil
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
AlekSIS®
Official
AlekSIS-App-Alsijil
Commits
9af9c13c
Commit
9af9c13c
authored
7 months ago
by
permcu
Browse files
Options
Downloads
Patches
Plain Diff
Revert "Comment out task"
This reverts commit
b3c63074
.
parent
733b485e
No related branches found
No related tags found
1 merge request
!422
Resolve "Add export functionality to course book"
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
aleksis/apps/alsijil/tasks.py
+186
-186
186 additions, 186 deletions
aleksis/apps/alsijil/tasks.py
with
186 additions
and
186 deletions
aleksis/apps/alsijil/tasks.py
+
186
−
186
View file @
9af9c13c
#
from copy import deepcopy
from
copy
import
deepcopy
#
from datetime import date, timedelta
from
datetime
import
date
,
timedelta
#
from django.db.models import Q
from
django.db.models
import
Q
#
from django.utils.translation import gettext as _
from
django.utils.translation
import
gettext
as
_
#
from calendarweek import CalendarWeek
from
calendarweek
import
CalendarWeek
#
from celery.result import allow_join_result
from
celery.result
import
allow_join_result
#
from celery.states import SUCCESS
from
celery.states
import
SUCCESS
#
from aleksis.core.models import Group, PDFFile
from
aleksis.core.models
import
Group
,
PDFFile
#
from aleksis.core.util.celery_progress import ProgressRecorder, recorded_task
from
aleksis.core.util.celery_progress
import
ProgressRecorder
,
recorded_task
#
from aleksis.core.util.pdf import generate_pdf_from_template
from
aleksis.core.util.pdf
import
generate_pdf_from_template
#
from .models import ExtraMark
from
.models
import
ExtraMark
#
@recorded_task
@recorded_task
#
def generate_full_register_printout(group: int, file_object: int, recorder: ProgressRecorder):
def
generate_full_register_printout
(
group
:
int
,
file_object
:
int
,
recorder
:
ProgressRecorder
):
#
"""Generate a full register printout as PDF for a group."""
"""
Generate a full register printout as PDF for a group.
"""
#
context = {}
context
=
{}
#
_number_of_steps = 8
_number_of_steps
=
8
#
recorder.set_progress(1, _number_of_steps, _("Load data ..."))
recorder
.
set_progress
(
1
,
_number_of_steps
,
_
(
"
Load data ...
"
))
#
group = Group.objects.get(pk=group)
group
=
Group
.
objects
.
get
(
pk
=
group
)
#
file_object = PDFFile.objects.get(pk=file_object)
file_object
=
PDFFile
.
objects
.
get
(
pk
=
file_object
)
#
groups_q = (
groups_q
=
(
#
Q(lesson_period__lesson__groups=group)
Q
(
lesson_period__lesson__groups
=
group
)
#
| Q(lesson_period__lesson__groups__parent_groups=group)
|
Q
(
lesson_period__lesson__groups__parent_groups
=
group
)
#
| Q(extra_lesson__groups=group)
|
Q
(
extra_lesson__groups
=
group
)
#
| Q(extra_lesson__groups__parent_groups=group)
|
Q
(
extra_lesson__groups__parent_groups
=
group
)
#
| Q(event__groups=group)
|
Q
(
event__groups
=
group
)
#
| Q(event__groups__parent_groups=group)
|
Q
(
event__groups__parent_groups
=
group
)
#
)
)
#
personal_notes = (
personal_notes
=
(
#
PersonalNote.objects.prefetch_related(
PersonalNote
.
objects
.
prefetch_related
(
#
"lesson_period__substitutions", "lesson_period__lesson__teachers"
"
lesson_period__substitutions
"
,
"
lesson_period__lesson__teachers
"
#
)
)
#
.not_empty()
.
not_empty
()
#
.filter(groups_q)
.
filter
(
groups_q
)
#
.filter(groups_of_person=group)
.
filter
(
groups_of_person
=
group
)
#
)
)
#
documentations = LessonDocumentation.objects.not_empty().filter(groups_q)
documentations
=
LessonDocumentation
.
objects
.
not_empty
().
filter
(
groups_q
)
#
recorder.set_progress(2, _number_of_steps, _("Sort data ..."))
recorder
.
set_progress
(
2
,
_number_of_steps
,
_
(
"
Sort data ...
"
))
#
sorted_documentations = {"extra_lesson": {}, "event": {}, "lesson_period": {}}
sorted_documentations
=
{
"
extra_lesson
"
:
{},
"
event
"
:
{},
"
lesson_period
"
:
{}}
#
sorted_personal_notes = {"extra_lesson": {}, "event": {}, "lesson_period": {}, "person": {}}
sorted_personal_notes
=
{
"
extra_lesson
"
:
{},
"
event
"
:
{},
"
lesson_period
"
:
{},
"
person
"
:
{}}
#
for documentation in documentations:
for
documentation
in
documentations
:
#
key = documentation.register_object.label_
key
=
documentation
.
register_object
.
label_
#
sorted_documentations[key][documentation.register_object_key] = documentation
sorted_documentations
[
key
][
documentation
.
register_object_key
]
=
documentation
#
for note in personal_notes:
for
note
in
personal_notes
:
#
key = note.register_object.label_
key
=
note
.
register_object
.
label_
#
sorted_personal_notes[key].setdefault(note.register_object_key, [])
sorted_personal_notes
[
key
].
setdefault
(
note
.
register_object_key
,
[])
#
sorted_personal_notes[key][note.register_object_key].append(note)
sorted_personal_notes
[
key
][
note
.
register_object_key
].
append
(
note
)
#
sorted_personal_notes["person"].setdefault(note.person.pk, [])
sorted_personal_notes
[
"
person
"
].
setdefault
(
note
.
person
.
pk
,
[])
#
sorted_personal_notes["person"][note.person.pk].append(note)
sorted_personal_notes
[
"
person
"
][
note
.
person
.
pk
].
append
(
note
)
#
recorder.set_progress(3, _number_of_steps, _("Load lesson data ..."))
recorder
.
set_progress
(
3
,
_number_of_steps
,
_
(
"
Load lesson data ...
"
))
#
# Get all lesson periods for the selected group
# Get all lesson periods for the selected group
#
lesson_periods = LessonPeriod.objects.filter_group(group).distinct()
lesson_periods
=
LessonPeriod
.
objects
.
filter_group
(
group
).
distinct
()
#
events = Event.objects.filter_group(group).distinct()
events
=
Event
.
objects
.
filter_group
(
group
).
distinct
()
#
extra_lessons = ExtraLesson.objects.filter_group(group).distinct()
extra_lessons
=
ExtraLesson
.
objects
.
filter_group
(
group
).
distinct
()
#
weeks = CalendarWeek.weeks_within(group.school_term.date_start, group.school_term.date_end)
weeks
=
CalendarWeek
.
weeks_within
(
group
.
school_term
.
date_start
,
group
.
school_term
.
date_end
)
#
register_objects_by_day = {}
register_objects_by_day
=
{}
#
for extra_lesson in extra_lessons:
for
extra_lesson
in
extra_lessons
:
#
day = extra_lesson.date
day
=
extra_lesson
.
date
#
register_objects_by_day.setdefault(day, []).append(
register_objects_by_day
.
setdefault
(
day
,
[]).
append
(
#
(
(
#
extra_lesson,
extra_lesson
,
#
sorted_documentations["extra_lesson"].get(extra_lesson.pk),
sorted_documentations
[
"
extra_lesson
"
].
get
(
extra_lesson
.
pk
),
#
sorted_personal_notes["extra_lesson"].get(extra_lesson.pk, []),
sorted_personal_notes
[
"
extra_lesson
"
].
get
(
extra_lesson
.
pk
,
[]),
#
None,
None
,
#
)
)
#
)
)
#
for event in events:
for
event
in
events
:
#
day_number = (event.date_end - event.date_start).days + 1
day_number
=
(
event
.
date_end
-
event
.
date_start
).
days
+
1
#
for i in range(day_number):
for
i
in
range
(
day_number
):
#
day = event.date_start + timedelta(days=i)
day
=
event
.
date_start
+
timedelta
(
days
=
i
)
#
event_copy = deepcopy(event)
event_copy
=
deepcopy
(
event
)
#
event_copy.annotate_day(day)
event_copy
.
annotate_day
(
day
)
#
# Skip event days if it isn't inside the timetable schema
# Skip event days if it isn't inside the timetable schema
#
if not (event_copy.raw_period_from_on_day and event_copy.raw_period_to_on_day):
if
not
(
event_copy
.
raw_period_from_on_day
and
event_copy
.
raw_period_to_on_day
):
#
continue
continue
#
register_objects_by_day.setdefault(day, []).append(
register_objects_by_day
.
setdefault
(
day
,
[]).
append
(
#
(
(
#
event_copy,
event_copy
,
#
sorted_documentations["event"].get(event.pk),
sorted_documentations
[
"
event
"
].
get
(
event
.
pk
),
#
sorted_personal_notes["event"].get(event.pk, []),
sorted_personal_notes
[
"
event
"
].
get
(
event
.
pk
,
[]),
#
None,
None
,
#
)
)
#
)
)
#
recorder.set_progress(4, _number_of_steps, _("Sort lesson data ..."))
recorder
.
set_progress
(
4
,
_number_of_steps
,
_
(
"
Sort lesson data ...
"
))
#
weeks = CalendarWeek.weeks_within(
weeks
=
CalendarWeek
.
weeks_within
(
#
group.school_term.date_start,
group
.
school_term
.
date_start
,
#
group.school_term.date_end,
group
.
school_term
.
date_end
,
#
)
)
#
for lesson_period in lesson_periods:
for
lesson_period
in
lesson_periods
:
#
for week in weeks:
for
week
in
weeks
:
#
day = week[lesson_period.period.weekday]
day
=
week
[
lesson_period
.
period
.
weekday
]
#
if (
if
(
#
lesson_period.lesson.validity.date_start
lesson_period
.
lesson
.
validity
.
date_start
#
<= day
<=
day
#
<= lesson_period.lesson.validity.date_end
<=
lesson_period
.
lesson
.
validity
.
date_end
#
):
):
#
filtered_documentation = sorted_documentations["lesson_period"].get(
filtered_documentation
=
sorted_documentations
[
"
lesson_period
"
].
get
(
#
f"{lesson_period.pk}_{week.week}_{week.year}"
f
"
{
lesson_period
.
pk
}
_
{
week
.
week
}
_
{
week
.
year
}
"
#
)
)
#
filtered_personal_notes = sorted_personal_notes["lesson_period"].get(
filtered_personal_notes
=
sorted_personal_notes
[
"
lesson_period
"
].
get
(
#
f"{lesson_period.pk}_{week.week}_{week.year}", []
f
"
{
lesson_period
.
pk
}
_
{
week
.
week
}
_
{
week
.
year
}
"
,
[]
#
)
)
#
substitution = lesson_period.get_substitution(week)
substitution
=
lesson_period
.
get_substitution
(
week
)
#
register_objects_by_day.setdefault(day, []).append(
register_objects_by_day
.
setdefault
(
day
,
[]).
append
(
#
(lesson_period, filtered_documentation, filtered_personal_notes, substitution)
(
lesson_period
,
filtered_documentation
,
filtered_personal_notes
,
substitution
)
#
)
)
#
recorder.set_progress(5, _number_of_steps, _("Load statistics ..."))
recorder
.
set_progress
(
5
,
_number_of_steps
,
_
(
"
Load statistics ...
"
))
#
persons = group.members.prefetch_related(None).select_related(None)
persons
=
group
.
members
.
prefetch_related
(
None
).
select_related
(
None
)
#
persons = group.generate_person_list_with_class_register_statistics(persons)
persons
=
group
.
generate_person_list_with_class_register_statistics
(
persons
)
#
prefetched_persons = []
prefetched_persons
=
[]
#
for person in persons:
for
person
in
persons
:
#
person.filtered_notes = sorted_personal_notes["person"].get(person.pk, [])
person
.
filtered_notes
=
sorted_personal_notes
[
"
person
"
].
get
(
person
.
pk
,
[])
#
prefetched_persons.append(person)
prefetched_persons
.
append
(
person
)
#
context["school_term"] = group.school_term
context
[
"
school_term
"
]
=
group
.
school_term
#
context["persons"] = prefetched_persons
context
[
"
persons
"
]
=
prefetched_persons
#
context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True)
context
[
"
excuse_types
"
]
=
ExcuseType
.
objects
.
filter
(
count_as_absent
=
True
)
#
context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False)
context
[
"
excuse_types_not_absent
"
]
=
ExcuseType
.
objects
.
filter
(
count_as_absent
=
False
)
#
context["extra_marks"] = ExtraMark.objects.all()
context
[
"
extra_marks
"
]
=
ExtraMark
.
objects
.
all
()
#
context["group"] = group
context
[
"
group
"
]
=
group
#
context["weeks"] = weeks
context
[
"
weeks
"
]
=
weeks
#
context["register_objects_by_day"] = register_objects_by_day
context
[
"
register_objects_by_day
"
]
=
register_objects_by_day
#
context["register_objects"] = list(lesson_periods) + list(events) + list(extra_lessons)
context
[
"
register_objects
"
]
=
list
(
lesson_periods
)
+
list
(
events
)
+
list
(
extra_lessons
)
#
context["today"] = date.today()
context
[
"
today
"
]
=
date
.
today
()
#
context["lessons"] = (
context
[
"
lessons
"
]
=
(
#
group.lessons.all()
group
.
lessons
.
all
()
#
.select_related(None)
.
select_related
(
None
)
#
.prefetch_related(None)
.
prefetch_related
(
None
)
#
.select_related("validity", "subject")
.
select_related
(
"
validity
"
,
"
subject
"
)
#
.prefetch_related("teachers", "lesson_periods")
.
prefetch_related
(
"
teachers
"
,
"
lesson_periods
"
)
#
)
)
#
context["child_groups"] = (
context
[
"
child_groups
"
]
=
(
#
group.child_groups.all()
group
.
child_groups
.
all
()
#
.select_related(None)
.
select_related
(
None
)
#
.prefetch_related(None)
.
prefetch_related
(
None
)
#
.prefetch_related(
.
prefetch_related
(
#
"lessons",
"
lessons
"
,
#
"lessons__validity",
"
lessons__validity
"
,
#
"lessons__subject",
"
lessons__subject
"
,
#
"lessons__teachers",
"
lessons__teachers
"
,
#
"lessons__lesson_periods",
"
lessons__lesson_periods
"
,
#
)
)
#
)
)
#
recorder.set_progress(6, _number_of_steps, _("Generate template ..."))
recorder
.
set_progress
(
6
,
_number_of_steps
,
_
(
"
Generate template ...
"
))
#
file_object, result = generate_pdf_from_template(
file_object
,
result
=
generate_pdf_from_template
(
#
"alsijil/print/full_register.html", context, file_object=file_object
"
alsijil/print/full_register.html
"
,
context
,
file_object
=
file_object
#
)
)
#
recorder.set_progress(7, _number_of_steps, _("Generate PDF ..."))
recorder
.
set_progress
(
7
,
_number_of_steps
,
_
(
"
Generate PDF ...
"
))
#
with allow_join_result():
with
allow_join_result
():
#
result.wait()
result
.
wait
()
#
file_object.refresh_from_db()
file_object
.
refresh_from_db
()
#
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(8, _number_of_steps)
recorder
.
set_progress
(
8
,
_number_of_steps
)
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment