show schedule context by target type

This commit is contained in:
Server 2026-08-30 14:21:42 +00:00
parent 1003afd6e8
commit b33256c63e

View file

@ -184,14 +184,20 @@ def _minutes_to_time(value: int | None) -> list[int]:
class Lesson:
def __init__(self, data: dict[str, Any], subgroup_names: list[str]) -> None:
def __init__(
self,
data: dict[str, Any],
target_kind: TargetKind,
group_names: list[str],
) -> None:
self.start = _minutes_to_time(data.get("time_start"))
self.end = _minutes_to_time(data.get("time_end"))
self.name = str(data.get("name") or "Без названия")
self.type = str(data.get("type") or "пара")
self.teacher_ids = [str(value) for value in data.get("teacher_ids", [])]
self.room_ids = [str(value) for value in data.get("room_ids", [])]
self.subgroup_names = subgroup_names
self.target_kind = target_kind
self.group_names = group_names
self.info = self.teacher_ids + [f"ауд. {room}" for room in self.room_ids]
self.is_odd_week = bool(data.get("is_odd_week"))
self.is_even_week = bool(data.get("is_even_week"))
@ -211,13 +217,19 @@ class Lesson:
minutes = int((lesson_end - now).total_seconds() // 60)
date_text = f"<i>Сейчас идет</i> {lesson_type}, закончится через {max(minutes, 1)} мин."
details = [html.escape(teacher) for teacher in self.teacher_ids]
details.extend(
teachers = [html.escape(teacher) for teacher in self.teacher_ids]
rooms = [
f'<a href="https://rasp.pgups.ru/schedule/room?room={quote(room)}">ауд. {html.escape(room)}</a>'
for room in self.room_ids
)
if self.subgroup_names:
details.append(html.escape(", ".join(self.subgroup_names)))
]
groups = [f"гр. {html.escape(group)}" for group in self.group_names]
if self.target_kind == "teacher":
details = rooms + groups
elif self.target_kind == "room":
details = groups + teachers
else:
details = teachers + rooms + groups
info = ", ".join(details) if details else "Дополнительная информация отсутствует"
return f"<blockquote><b>{html.escape(self.name)}</b>\n{date_text}\n{info}</blockquote>"
@ -236,6 +248,10 @@ class Schedule:
self.weekDay = current.weekday()
self.days: list[list[Lesson]] = [[] for _ in range(5)]
groups_by_id = {
str(group["id"]): str(group["name"])
for group in groups
}
target_ids = {target["id"]}
child_names: dict[str, str] = {}
field = {"group": "group_ids", "room": "room_ids", "teacher": "teacher_ids"}[target["kind"]]
@ -254,8 +270,16 @@ class Schedule:
matched_ids = target_ids.intersection(map(str, raw_lesson.get(field, [])))
if not matched_ids:
continue
subgroup_names = sorted(child_names[item] for item in matched_ids if item in child_names)
self.days[weekday - 1].append(Lesson(raw_lesson, subgroup_names))
if target["kind"] == "group":
group_names = sorted(child_names[item] for item in matched_ids if item in child_names)
else:
group_names = sorted(
{
groups_by_id.get(str(group_id), str(group_id))
for group_id in raw_lesson.get("group_ids", [])
}
)
self.days[weekday - 1].append(Lesson(raw_lesson, target["kind"], group_names))
for day in self.days:
day.sort(key=lambda lesson: (lesson.start, lesson.name.casefold()))