Skip to content
Snippets Groups Projects
build.py 2.25 KiB
Newer Older
from collections import OrderedDict

from calendarweek import CalendarWeek

from aleksis.apps.chronos.models import LessonPeriod, TimePeriod, Break


def build_timetable(type_: str, pk: int, week: CalendarWeek):
    needed_breaks = []

    # Get matching lesson periods
    lesson_periods = LessonPeriod.objects.in_week(week).filter_from_type(type_, pk)

    # Sort lesson periods in a dict
    lesson_periods_per_period = {}
    for lesson_period in lesson_periods:
        period = lesson_period.period.period
        weekday = lesson_period.period.weekday

        if period not in lesson_periods_per_period:
            lesson_periods_per_period[period] = {}

        if weekday not in lesson_periods_per_period[period]:
            lesson_periods_per_period[period][weekday] = []

        lesson_periods_per_period[period][weekday].append(lesson_period)

    # Get ordered breaks
    breaks = OrderedDict(sorted(Break.get_breaks_dict().items()))

    rows = []
    for period, break_ in breaks.items():  # period is period after break
        # Break
        if period in needed_breaks:
            row = {
                "type": "break",
                "after_period": break_.after_period_number,
                "before_period": break_.before_period_number,
                "time_start": break_.time_start,
                "time_end": break_.time_end,
            }

            cols = []

            # ...

            row["cols"] = cols
            rows.append(row)

        # Lesson
        if period <= TimePeriod.period_max:
            row = {
                "type": "period",
                "period": period,
                "time_start": break_.before_period.time_start,
                "time_end": break_.before_period.time_end,
            }
            cols = []
            for weekday in range(TimePeriod.weekday_min, TimePeriod.weekday_max + 1):
                col = []
                if row["type"] == "period":

                    # Add lesson periods
                    if period in lesson_periods_per_period:
                        if weekday in lesson_periods_per_period[period]:
                            col += lesson_periods_per_period[period][weekday]

                cols.append(col)

            row["cols"] = cols
            rows.append(row)

    return rows