#!./env/bin/python import yaml, textwrap from prettytable import PrettyTable from datetime import datetime, timedelta with open("infos.yaml", "r") as f: i=yaml.safe_load(f) def parse_date(d): return datetime.strptime(d, "%d/%m/%Y") def getmonday(d): return d - timedelta(days=d.weekday()) def getnextmonday(d): return getmonday(d)+timedelta(days=7) def getnextdayn(d,n): return (d+timedelta(days=n)) def formatday(d): return d.strftime(i["output"]["date_format"]) def getweek(d): return d.isocalendar().week + i["output"]["week_drift"] def getgloballectureslot(d): dname=d.strftime("%A").lower() if dname in i["semester"]["lectures"]["slots"].keys(): start=datetime.strptime(i["semester"]["lectures"]["slots"][dname]["start"], "%I%p") end=datetime.strptime(i["semester"]["lectures"]["slots"][dname]["end"], "%I%p") (start,end) return None def getassign(d): val="" for a in i["assignments"]: start=parse_date(i["assignments"][a]["start"]) end=parse_date(i["assignments"][a]["end"]) if d>=start and d<=end: if len(val)>0: val+="/" val+=str(a) return val def getlecture(d): slot=getgloballectureslot(d) for l in i["lectures"]: date=parse_date(i["lectures"][l]["date"]) if d==date: # Time startT, endT = (None, None) if "slot" in i["lectures"][l]: startT=datetime.strptime(i["lectures"][l]["slot"]["start"], "%I%p") endT=datetime.strptime(i["lectures"][l]["slot"]["end"], "%I%p") elif slot is not None: startT, endT=slot # Content text=textwrap.fill(i["lectures"][l]["name"],o["text_wrap"]) if o["show_lecturers"]: text+="\n"+textwrap.fill("("+i["lectures"][l]["who"]+")",o["text_wrap"]) if (startT,endT) != (None, None): timeT=textwrap.fill(startT.strftime(i["output"]["time_format"])+"-"+endT.strftime(i["output"]["time_format"]),o["text_wrap"]) text=timeT+"\n"+text return text return "" def getevents(d): val="" for e in i["events"]: date=parse_date(i["events"][e]["date"]) if "hidden" in i["events"][e] and i["events"][e]["hidden"]: continue if d==date: if len(val)>0: val+="," val+=str(i["events"][e]["name"]) return textwrap.fill(val,o["text_wrap"]) def add_row(t,row): if not o["defrag"] or any(len(x) > 0 for x in row[1:]): t.add_row(row,divider=True) return 1 return 0 if not i["output"]["tables"]["calendar"]["hidden"]: sstart=parse_date(i["semester"]["start"]) send=parse_date(i["semester"]["end"]) d=sstart w=getweek(d) o=i["output"]["tables"]["calendar"] if o["semester_dates_as_events"]: i["events"]["sstart_098888986"]={} # Add random numbers to avoid clash with users entries i["events"]["sstart_098888986"]["name"]="Semester starts" i["events"]["sstart_098888986"]["date"]=i["semester"]["start"] i["events"]["send_098888986"]={} i["events"]["send_098888986"]["name"]="Semester ends" i["events"]["send_098888986"]["date"]=i["semester"]["end"] while d <= send: t = PrettyTable(min_width=o["min_col_width"]) week=o["labels"]["weeks"].format(w) if o["show_weeks"] else "" t.field_names = [week, "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] t.align[week]="l" rcount=0 if o["show_dates"]: add_row(t,[o["labels"]["dates"], formatday(getnextdayn(d, 0)), formatday(getnextdayn(d, 1)), formatday(getnextdayn(d, 2)), formatday(getnextdayn(d, 3)), formatday(getnextdayn(d, 4))]) if o["show_assignments"]: rcount+=add_row(t,[o["labels"]["assignments"], getassign(getnextdayn(d, 0)), getassign(getnextdayn(d, 1)), getassign(getnextdayn(d, 2)), getassign(getnextdayn(d, 3)), getassign(getnextdayn(d, 4))]) rcount+=add_row(t,[o["labels"]["lectures"], getlecture(getnextdayn(d, 0)), getlecture(getnextdayn(d, 1)), getlecture(getnextdayn(d, 2)), getlecture(getnextdayn(d, 3)), getlecture(getnextdayn(d, 4))]) if o["show_events"]: rcount+=add_row(t,[o["labels"]["events"], getevents(getnextdayn(d, 0)), getevents(getnextdayn(d, 1)), getevents(getnextdayn(d, 2)), getevents(getnextdayn(d, 3)), getevents(getnextdayn(d, 4))]) print(t.get_formatted_string(i["output"]["format"])) for j in range(0,o["week_line_skip"]): print("") d=getnextmonday(d) w+=1 if not i["output"]["tables"]["deadlines"]["hidden"]: # Count weeks days={} for a in i["assignments"]: start=parse_date(i["assignments"][a]["start"]) end=parse_date(i["assignments"][a]["end"]) if start not in days.keys(): days[start]=list() if end not in days.keys(): days[end]=list() days[start].append((a,"start")) days[end].append((a,"end")) # Build table t = PrettyTable() t.field_names = ["Week", "Date", "Assignment"] for d in sorted(days.keys()): for (a,b) in days[d]: if b=="start": msg=i["output"]["tables"]["deadlines"]["msg_handout"].format(a) else: msg=i["output"]["tables"]["deadlines"]["msg_deadline"].format(a) t.add_row([getweek(d),formatday(d),msg]) t.align["Assignment"] = "l" print(t.get_formatted_string(i["output"]["format"]))