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

Fix PDF export

parent 668c111b
No related branches found
No related tags found
1 merge request!36Draft: Resolve "[New data model] PDF export for "regular" timetable"
Pipeline #194805 failed
......@@ -127,7 +127,7 @@ class LessonQuerySet(QuerySet):
self,
type_: TimetableType,
obj: Union[Person, Group, Room, int],
) -> Optional["LessonQuerySet"]:
) -> "LessonQuerySet":
"""Filter lessons for a group, teacher or room by provided type."""
if type_ == TimetableType.GROUP:
return self.filter_group(obj)
......@@ -136,9 +136,9 @@ class LessonQuerySet(QuerySet):
elif type_ == TimetableType.ROOM:
return self.filter_room(obj)
else:
return None
return self.none()
def filter_from_person(self, person: Person) -> Optional["LessonQuerySet"]:
def filter_from_person(self, person: Person) -> "LessonQuerySet":
"""Filter lessons for a person."""
type_ = person.timetable_type
......@@ -147,7 +147,7 @@ class LessonQuerySet(QuerySet):
elif type_ == TimetableType.GROUP:
return self.filter_participant(person)
else:
return None
return self.none()
class LessonManager(AlekSISBaseManagerWithoutMigrations):
......@@ -167,14 +167,14 @@ class SupervisionQuerySet(QuerySet):
self,
type_: TimetableType,
obj: Union[Person, Group, Room, int],
) -> Optional["SupervisionQuerySet"]:
) -> "SupervisionQuerySet":
"""Filter supervisions for a eacher or room by provided type."""
if type_ == TimetableType.TEACHER:
return self.filter_teacher(obj)
elif type_ == TimetableType.ROOM:
return self.filter_room(obj)
else:
return None
return self.none()
def filter_from_person(self, person: Person) -> Optional["SupervisionQuerySet"]:
"""Filter supervisions for a person."""
......
......@@ -8,18 +8,10 @@ from aleksis.core.models import Group, Person, Room
def build_timetable(
time_grid: TimeGrid,
type_: Union[TimetableType, str],
type_: TimetableType,
obj: Union[Group, Room, Person],
) -> list | None:
"""Build regular timetable for the given time grid."""
is_person = False
if type_ == "person":
is_person = True
type_ = obj.timetable_type
if type_ is None:
return None
slots = Slot.objects.filter(time_grid=time_grid).order_by("weekday", "time_start")
lesson_periods_per_slot = OrderedDict()
supervisions_per_slot = OrderedDict()
......@@ -33,37 +25,19 @@ def build_timetable(
max_slots = len(max_slots)
# Get matching lessons
lessons = Lesson.objects.filter(slot_start__time_grid=time_grid)
lessons = (
lessons.filter_from_person(obj) if is_person else lessons.filter_from_group(type_, obj)
)
lessons = Lesson.objects.filter(slot_start__time_grid=time_grid).filter_from_type(type_, obj)
# Sort lesson periods in a dict
for lesson in lessons:
for slot in Slot.objects.filter(
time_grid=time_grid,
weekday=lesson.slot_start.weekday,
time_start__gte=lesson.slot_start.time_start,
time_end__lte=lesson.slot_end.time_end,
).not_instance_of(BreakSlot):
lesson_periods_per_slot[slot].append(lesson)
lesson_periods_per_slot[lesson.slot_start].append(lesson)
# Get matching supervisions
needed_break_slots = []
supervisions = Supervision.objects.filter(break_slot__time_grid=time_grid).all()
if is_person:
supervisions = supervisions.filter_from_person(obj)
else:
supervisions = supervisions.filter_from_type(type_, obj)
if supervisions:
for supervision in supervisions:
if supervision.break_slot not in needed_break_slots:
needed_break_slots.append(supervision.break_slot)
supervisions = Supervision.objects.filter(break_slot__time_grid=time_grid).filter_from_type(
type_, obj
)
supervisions_per_slot[supervision.break_slot] = supervision
for supervision in supervisions:
supervisions_per_slot[supervision.break_slot] = supervision
rows = []
for slot_idx in range(max_slots): # period is period after break
......@@ -100,7 +74,6 @@ def build_timetable(
cols.append(col)
row["cols"] = cols
rows.append(row)
return rows
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