auto-schedule-pro-v2: add support for automatic attribute transfer from internal schedule
This commit is contained in:
@@ -1,9 +1,10 @@
|
|||||||
import json
|
import json
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
if len(sys.argv) != 2:
|
if not (2 <= len(sys.argv) <= 3):
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
existing_lesson_pool = []
|
||||||
|
|
||||||
class Lesson:
|
class Lesson:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -19,6 +20,19 @@ class Lesson:
|
|||||||
self.link = ""
|
self.link = ""
|
||||||
self.nolink = True
|
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):
|
def get_packable_object(self):
|
||||||
return {
|
return {
|
||||||
"name": self.name,
|
"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):
|
def day_to_lesson_pool(pairs):
|
||||||
pool = []
|
pool = []
|
||||||
|
|
||||||
for p in pairs:
|
for p in pairs:
|
||||||
l = Lesson()
|
l = Lesson()
|
||||||
l.read_from_schedule_pair(p)
|
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)
|
pool.append(l)
|
||||||
|
|
||||||
return pool
|
return pool
|
||||||
@@ -54,7 +107,7 @@ def lesson_pool_to_objs(pool):
|
|||||||
|
|
||||||
for i in times:
|
for i in times:
|
||||||
lesson_timestamp = f"{i[0]:02}:{i[1]:02}"
|
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_dup = (j.get_packable_object() for j in pool if j.time == lesson_timestamp)
|
||||||
objs = []
|
objs = []
|
||||||
@@ -85,6 +138,17 @@ def process_week(week):
|
|||||||
|
|
||||||
return result
|
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'))
|
ext_schedule = json.load(open(sys.argv[1], 'r'))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user