import json import sys if not (2 <= len(sys.argv) <= 3): sys.exit(1) existing_lesson_pool = [] class Lesson: def __init__(self): pass def read_from_schedule_pair(self, p): self.time = p["time"].rsplit(':', 1)[0] self.name = p["name"] self.teacher = p["teacherName"] self.type = p["tag"] self.selectable = False 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, "teacher": self.teacher, "link": self.link, "type": self.type, "selectable": self.selectable, "nolink": self.nolink } 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 def lesson_pool_to_objs(pool): times = [] for i in (list(map(int, (i.time.split(':')))) for i in pool): if i not in times: times.append(i) times.sort(key = lambda x: x[0] * 60 + x[1]) result = {} for i in times: lesson_timestamp = f"{i[0]:02}:{i[1]:02}" required_timestamp = f"{i[0]}:{i[1]:02}" objs_dup = (j.get_packable_object() for j in pool if j.time == lesson_timestamp) objs = [] for i in objs_dup: if i not in objs: objs.append(i) if len(objs) == 0: continue elif len(objs) == 1: result[required_timestamp] = list(objs)[0] else: result[required_timestamp] = list(objs) return result def process_week(week): result = [] for weekday in ["Пн", "Вв", "Ср", "Чт", "Пт"]: day_pool = day_to_lesson_pool(next(filter(lambda l: l['day'] == weekday, week))['pairs']) result.append(lesson_pool_to_objs(day_pool)) result.append({}) result.append({}) 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')) int_schedule = [] int_schedule += process_week(ext_schedule["scheduleFirstWeek"]) int_schedule += process_week(ext_schedule["scheduleSecondWeek"]) print(json.dumps(int_schedule, ensure_ascii = False, indent = 4))