81 lines
2.1 KiB
Python
81 lines
2.1 KiB
Python
|
from ics import Calendar, Event
|
||
|
import arrow
|
||
|
import datetime
|
||
|
import yaml
|
||
|
|
||
|
with open("config.yml") as f:
|
||
|
conf = yaml.safe_load(f.read())
|
||
|
|
||
|
subjects = conf["subjects"]
|
||
|
vacation_days = conf["vacation_days"]
|
||
|
start_date = conf["start_date"]
|
||
|
end_date = conf["end_date"]
|
||
|
schedule_slots = conf["schedule_slots"]
|
||
|
schedule = conf["schedule"]
|
||
|
|
||
|
step = datetime.timedelta(days = 1)
|
||
|
# cycle-day (e.g. 1-6)
|
||
|
day = 1
|
||
|
|
||
|
cal = Calendar()
|
||
|
|
||
|
current_date = start_date
|
||
|
|
||
|
while current_date <= end_date:
|
||
|
have_school = True
|
||
|
# Vacations
|
||
|
for vacation in vacation_days:
|
||
|
if(not vacation.get("single")):
|
||
|
if current_date >= vacation["start"] and current_date <= vacation["end"]:
|
||
|
have_school = False
|
||
|
break
|
||
|
else:
|
||
|
if current_date == vacation["single"]:
|
||
|
have_school = False
|
||
|
break
|
||
|
# Weekends
|
||
|
if current_date.weekday() == 5 or current_date.weekday() == 6:
|
||
|
have_school = False
|
||
|
|
||
|
if not have_school:
|
||
|
current_date += step
|
||
|
continue
|
||
|
|
||
|
day_classes = schedule[day]["classes"]
|
||
|
|
||
|
slot_idx = 0
|
||
|
for subject_idx, sched_subject in enumerate(day_classes):
|
||
|
subject_id = sched_subject["id"]
|
||
|
subject_loc = sched_subject["loc"]
|
||
|
is_short = sched_subject.get("short", False)
|
||
|
|
||
|
subject = subjects[subject_id]
|
||
|
|
||
|
start_time = schedule_slots[slot_idx]["start"]
|
||
|
end_time = schedule_slots[slot_idx]["end"]
|
||
|
|
||
|
slot_idx += 1
|
||
|
if slot_idx >= len(schedule_slots):
|
||
|
slot_idx = len(schedule_slots) - 1
|
||
|
|
||
|
if not is_short:
|
||
|
end_time = schedule_slots[slot_idx]["end"]
|
||
|
slot_idx += 1
|
||
|
|
||
|
ev = Event()
|
||
|
ev.begin = arrow.get(f"{current_date} {start_time}", tzinfo="local")
|
||
|
ev.end = arrow.get(f"{current_date} {end_time}", tzinfo="local")
|
||
|
ev.location = str(subject_loc)
|
||
|
ev.description = f"Day {day}, {subject_loc}"
|
||
|
ev.name = subjects[subject_id]["name"]
|
||
|
cal.events.add(ev)
|
||
|
|
||
|
day += 1
|
||
|
if day > len(schedule):
|
||
|
day = 1
|
||
|
|
||
|
current_date += step
|
||
|
|
||
|
with open("cal.ics", "w") as f:
|
||
|
f.writelines(cal.serialize_iter())
|