""" 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) ]