55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
"""Renders one timetable grid per student (same grid as their batch, labeled per student)."""
|
|
|
|
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 TIME_SLOTS as GRID_TIME_SLOTS # noqa: E402
|
|
|
|
|
|
def _sessions_for_batch(sessions, batch_code):
|
|
return [s for s in sessions if batch_code in s["batch_codes"]]
|
|
|
|
|
|
def generate_student_wise_templates(sessions, data, output_dir):
|
|
written = []
|
|
for student in data["students"]:
|
|
roll_no = student["roll_no"]
|
|
batch_code = student["batch_code"]
|
|
batch = data["batches_by_code"].get(batch_code)
|
|
student_sessions = _sessions_for_batch(sessions, batch_code)
|
|
|
|
by_day_slot = {}
|
|
for s in student_sessions:
|
|
for slot_index in s["slot_indices"]:
|
|
by_day_slot[(s["day"], slot_index)] = s
|
|
|
|
def cell_text(day, slot_index, by_day_slot=by_day_slot):
|
|
s = by_day_slot.get((day, slot_index))
|
|
if not s:
|
|
return ""
|
|
tag = " (Lab)" if s["course_type"] == "lab" else (" (General)" if s["is_general"] else "")
|
|
return f'{s["course_name"]}{tag}\n{s["instructor_name"]}\n{s["room_id"]}'
|
|
|
|
subtitle = f'{student["student_name"]} - Batch {batch_code}'
|
|
if batch:
|
|
subtitle += f' ({batch["department"]} - {batch["program"]})'
|
|
|
|
wb = new_workbook()
|
|
ws = wb.active
|
|
build_grid_sheet(
|
|
ws,
|
|
title=f"Roll No: {roll_no}",
|
|
subtitle=subtitle,
|
|
time_slots=GRID_TIME_SLOTS,
|
|
sessions_by_day_slot=by_day_slot,
|
|
cell_text_fn=cell_text,
|
|
)
|
|
path = save_workbook(wb, output_dir, f"{roll_no}.xlsx")
|
|
written.append(path)
|
|
return written
|