55 lines
2.7 KiB
Python
55 lines
2.7 KiB
Python
"""
|
|
Time-grid constants: days, slot definitions, lab double-slot pairs, and
|
|
the special long-lecture slot. Pure data — no scheduling logic lives here.
|
|
"""
|
|
|
|
DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
|
|
|
|
# Normal theory grid: 5 x 90-minute slots, 09:00-16:30, no lunch break.
|
|
# Every placeable session (normal lecture, lab, or the special long
|
|
# lecture) is expressed as one or more of these slot indices (0-4) for
|
|
# clash-tracking purposes — see LONG_LECTURE_SLOT_INDEX below for why the
|
|
# long lecture also uses index 0 despite rendering at a different clock time.
|
|
TIME_SLOTS = [
|
|
{"label": "S1", "start": "09:00", "end": "10:30", "is_lunch": False},
|
|
{"label": "S2", "start": "10:30", "end": "12:00", "is_lunch": False},
|
|
{"label": "S3", "start": "12:00", "end": "13:30", "is_lunch": False},
|
|
{"label": "S4", "start": "13:30", "end": "15:00", "is_lunch": False},
|
|
{"label": "S5", "start": "15:00", "end": "16:30", "is_lunch": False},
|
|
]
|
|
|
|
# Indices into TIME_SLOTS that are real teaching slots (no lunch to skip
|
|
# anymore, but kept for readability at call sites)
|
|
TEACHING_SLOT_INDICES = [i for i, s in enumerate(TIME_SLOTS) if not s["is_lunch"]]
|
|
|
|
# Consecutive pairs of normal slots usable as a 180-minute lab double-slot:
|
|
# 10:30-13:30 (S2+S3) and 13:30-16:30 (S4+S5). Deliberately starts at slot
|
|
# 1, not slot 0 — slot 0 (09:00-10:30) is left free for normal lectures and
|
|
# the special long-lecture slot (see LONG_LECTURE_SLOT_INDEX below), so
|
|
# labs never crowd out a batch's only long-lecture opportunity for the day.
|
|
LAB_SLOT_PAIRS = [(1, 2), (3, 4)]
|
|
|
|
# The special fixed slot for courses whose lecture is "2 hours once a
|
|
# week": 08:30-10:30. This overlaps 09:00-10:30 (normal slot index 0) in
|
|
# wall-clock time, so a long-lecture session is tracked as occupying slot
|
|
# index 0 too (same key _is_free/_mark_busy use) — that's what makes it
|
|
# correctly clash with anything else placed in normal slot 0 that day for
|
|
# the same room/instructor/batch. duration_minutes on the session dict is
|
|
# what distinguishes it from a normal 90-minute slot-0 session at render time.
|
|
LONG_LECTURE_SLOT_INDEX = 0
|
|
LONG_LECTURE_START = "08:30"
|
|
LONG_LECTURE_END = "10:30"
|
|
|
|
# Rows to render on every generated timetable grid: the special long-lecture
|
|
# row first (it starts earliest, 08:30), then the 5 normal 90-minute rows.
|
|
# Templates/xlsx_grid_helper key session lookups on (day, slot_index,
|
|
# duration_minutes) using these rows' slot_index/duration_minutes pairs.
|
|
DISPLAY_ROWS = [
|
|
{"label": "Long", "start": LONG_LECTURE_START, "end": LONG_LECTURE_END,
|
|
"slot_index": LONG_LECTURE_SLOT_INDEX, "duration_minutes": 120},
|
|
] + [
|
|
{"label": s["label"], "start": s["start"], "end": s["end"],
|
|
"slot_index": i, "duration_minutes": 90}
|
|
for i, s in enumerate(TIME_SLOTS)
|
|
]
|