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