From a54d91b4f3435265a58a622719935e77214d1b80 Mon Sep 17 00:00:00 2001 From: dymik739 Date: Wed, 3 Sep 2025 21:08:12 +0300 Subject: [PATCH] auto-schedule-pro-v2: add support for automatic attribute transfer from internal schedule --- .../lessons-to-schedule-v2.py | 68 ++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/modules/auto-schedule-pro-v2/lessons-to-schedule-v2.py b/modules/auto-schedule-pro-v2/lessons-to-schedule-v2.py index 21f2b71..e25a05f 100644 --- a/modules/auto-schedule-pro-v2/lessons-to-schedule-v2.py +++ b/modules/auto-schedule-pro-v2/lessons-to-schedule-v2.py @@ -1,9 +1,10 @@ import json import sys -if len(sys.argv) != 2: +if not (2 <= len(sys.argv) <= 3): sys.exit(1) +existing_lesson_pool = [] class Lesson: def __init__(self): @@ -19,6 +20,19 @@ class Lesson: self.link = "" self.nolink = True + return self + + def read_from_internal_schedule(self, time, p): + self.time = time + self.name = p["name"] + self.teacher = p["teacher"] + self.type = p["type"] + self.selectable = p["selectable"] + self.link = p["link"] + self.nolink = p["nolink"] + + return self + def get_packable_object(self): return { "name": self.name, @@ -30,12 +44,51 @@ class Lesson: } +def get_link_for_lesson_from_pool(pool, lesson): + return tuple(set([ + i.link for i in pool + if lesson.name == i.name + and lesson.teacher == i.teacher + and i.link + ])) + +def get_selectable_for_lesson_from_pool(pool, lesson): + return tuple(set([ + i.selectable for i in pool + if lesson.name == i.name + and lesson.teacher == i.teacher + ])) + def day_to_lesson_pool(pairs): pool = [] for p in pairs: l = Lesson() l.read_from_schedule_pair(p) + + existing_link = get_link_for_lesson_from_pool(existing_lesson_pool, l) + + if len(existing_link) == 0: + pass + elif len(existing_link) == 1: + l.link = existing_link[0] + l.nolink = False + print(f"Recovered link for {l.name} by {l.teacher}, link:\n{l.link}", file = sys.stderr) + else: + print(f"Recovered multiple links for {l.name} by {l.teacher}, listing:", file = sys.stderr) + for i, old_link in enumerate(existing_link): + print(f"({i}) {old_link}") + + existing_selectable = get_selectable_for_lesson_from_pool(existing_lesson_pool, l) + + if len(existing_selectable) == 0: + pass + elif len(existing_selectable) == 1: + l.selectable = existing_selectable[0] + print(f"Recovered selectable for {l.name} by {l.teacher}: {l.selectable}", file = sys.stderr) + else: + print(f"Recovered variating selectable for {l.name} by {l.teacher}", file = sys.stderr) + pool.append(l) return pool @@ -54,7 +107,7 @@ def lesson_pool_to_objs(pool): for i in times: lesson_timestamp = f"{i[0]:02}:{i[1]:02}" - required_timestamp = f"{i[0]}:{i[1]}" + required_timestamp = f"{i[0]}:{i[1]:02}" objs_dup = (j.get_packable_object() for j in pool if j.time == lesson_timestamp) objs = [] @@ -85,6 +138,17 @@ def process_week(week): return result +def global_lesson_pool_from_packed(p): + for i in p: + for k, v in i.items(): + if v.__class__ == list: + for j in v: + existing_lesson_pool.append(Lesson().read_from_internal_schedule(k, j)) + else: + existing_lesson_pool.append(Lesson().read_from_internal_schedule(k, v)) + +if len(sys.argv) == 3: + global_lesson_pool_from_packed(json.load(open(sys.argv[2], 'r'))) ext_schedule = json.load(open(sys.argv[1], 'r'))