54 lines
2.1 KiB
Python
54 lines
2.1 KiB
Python
"""Renders one timetable grid per room."""
|
|
|
|
import sys
|
|
import os
|
|
|
|
_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")
|
|
sys.path.insert(0, os.path.join(_ROOT, "app"))
|
|
sys.path.insert(0, os.path.join(_ROOT, "controller"))
|
|
|
|
from xlsx_grid_helper import build_grid_sheet, new_workbook, save_workbook # noqa: E402
|
|
from template_controller import DISPLAY_ROWS # noqa: E402
|
|
|
|
|
|
def generate_room_wise_templates(sessions, data, output_dir):
|
|
written = []
|
|
for room in data["rooms"]:
|
|
room_id = room["room_id"]
|
|
room_sessions = [s for s in sessions if s["room_id"] == room_id]
|
|
|
|
# A room-wise view can legitimately show more than one lecture in
|
|
# the same slot (e.g. a large room split/shared), so every session
|
|
# landing on a cell is kept and rendered — none are dropped.
|
|
by_day_slot = {}
|
|
for s in room_sessions:
|
|
for slot_index in s["slot_indices"]:
|
|
by_day_slot.setdefault((s["day"], slot_index, s["duration_minutes"]), []).append(s)
|
|
|
|
def cell_text(day, slot_index, duration_minutes, by_day_slot=by_day_slot):
|
|
entries = by_day_slot.get((day, slot_index, duration_minutes))
|
|
if not entries:
|
|
return ""
|
|
lines = []
|
|
for s in entries:
|
|
tag = " (Lab)" if s["course_type"] == "lab" else (" (General)" if s["is_general"] else "")
|
|
batches = "+".join(s["batch_codes"])
|
|
lines.append(f'{s["course_name"]}{tag} [Sec {s["section_id"]}]\n{batches}\n{s["instructor_name"]}')
|
|
return "\n---\n".join(lines)
|
|
|
|
first_by_day_slot = {k: v[0] for k, v in by_day_slot.items()}
|
|
|
|
wb = new_workbook()
|
|
ws = wb.active
|
|
build_grid_sheet(
|
|
ws,
|
|
title=f'{room["room_name"]} ({room_id})',
|
|
subtitle=f'Block {room["block_id"]} - {room["room_type"].title()} - Capacity {room["capacity"]}',
|
|
display_rows=DISPLAY_ROWS,
|
|
sessions_by_cell=first_by_day_slot,
|
|
cell_text_fn=cell_text,
|
|
)
|
|
path = save_workbook(wb, output_dir, f"{room_id}.xlsx")
|
|
written.append(path)
|
|
return written
|