#!./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) _c=_i["config"] _ccal=_c["calendar"] _cslot=_c["slots"] _cproj=_c["projects"] #### Parsing def parse_date(s): return datetime.strptime(s, "%d/%m/%Y") def parse_time(s): return datetime.strptime(s, "%H:%M") #### Dates 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 getweek(d): return d.isocalendar().week def getdayname(d): return d.strftime("%A").lower() #### Formatting def gettime(d): return d.strftime("%H:%M") def matchrepeat(d,e): _r=events[e]["repeat"] if _r["every"] <= 0: return False delta=timedelta(days=_r["every"]) current=events[e]["date"] while current.date() <= sem["end"].date(): if _r["until"] is not None and _r["until"].date()= p["start"].date() and d.date() <= p["end"].date(): if len(output)>0: output+="," output+=p["name"] return output #### Other help functions def add_row(t,row,div): total=0 for e in row[1:]: total+=len(e) if total > 0 or not _ccal["defrag"]: t.add_row(row,divider=div) #### Load semester sem={ "start": parse_date(_i["semester"]["start"]), "end": parse_date(_i["semester"]["end"]), "slots": {}, "projects": {} } for e in _i["semester"]["slots"]: _e=_i["semester"]["slots"][e] sem["slots"][e]={} for dayname in ["monday","tuesday","wednesday","thursday","friday"]: sem["slots"][e][dayname]={ "start": None, "end": None, "room": None } if dayname in _e.keys(): if "start" in _e[dayname].keys(): sem["slots"][e][dayname]["start"]=parse_time(_e[dayname]["start"]) sem["slots"][e][dayname]["end"]=parse_time(_e[dayname]["end"]) if "room" in _e[dayname].keys(): sem["slots"][e][dayname]["room"]=_e[dayname]["room"] if _i["semester"]["projects"] is not None: for p in _i["semester"]["projects"]: _p=_i["semester"]["projects"][p] sem["projects"][p]={} sem["projects"][p]["start"]=parse_date(_p["start"]) sem["projects"][p]["end"]=parse_date(_p["end"]) sem["projects"][p]["name"]=textwrap.fill(_p["name"]) #### Load events events={} for e in _i["events"]: _e=_i["events"][e] events[e]={ "type": _e["type"], "name": textwrap.fill(_e["name"],_c["name_wrap"]), "date": parse_date(_e["date"]), "repeat": { "every": 0, "until": None } } events[e]["hidden"]=_e["hidden"] if "hidden" in _e.keys() else False events[e]["who"]=_e["who"] if "who" in _e.keys() else None events[e]["start"]=parse_time(_e["start"]) if "start" in _e.keys() else None events[e]["end"]=parse_time(_e["end"]) if "end" in _e.keys() else None events[e]["room"]=_e["room"] if "room" in _e.keys() else None if "repeat" in _e.keys(): events[e]["repeat"]["every"]=_e["repeat"]["every"] events[e]["repeat"]["until"]=parse_date(_e["repeat"]["until"]) if "until" in _e["repeat"].keys() else None if _e["type"] in sem["slots"].keys(): dayname=getdayname(events[e]["date"]) if events[e]["start"] is None: events[e]["start"] = sem["slots"][_e["type"]][dayname]["start"] if events[e]["end"] is None: events[e]["end"] = sem["slots"][_e["type"]][dayname]["end"] if events[e]["room"] is None: events[e]["room"] = sem["slots"][_e["type"]][dayname]["room"] #### Gen semester calendar d=getmonday(sem["start"]) w=getweek(d) while d<=sem["end"]: if _ccal["min_col_width"]>0: t = PrettyTable(min_width=_ccal["min_col_width"]) else: t = PrettyTable() t.field_names = [_ccal["labels"]["week"].format(w), "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] t.align[t.field_names[0]]="l" if _ccal["show_date"]: t.add_row(["", formatday(getnextdayn(d, 0)), formatday(getnextdayn(d, 1)), formatday(getnextdayn(d, 2)), formatday(getnextdayn(d, 3)), formatday(getnextdayn(d, 4))],divider=True) add_row(t,["", formatevents(getnextdayn(d, 0)), formatevents(getnextdayn(d, 1)), formatevents(getnextdayn(d, 2)), formatevents(getnextdayn(d, 3)), formatevents(getnextdayn(d, 4))],True) if _ccal["show_project"]: add_row(t,[_ccal["labels"]["project"], formatprojects(getnextdayn(d, 0)), formatprojects(getnextdayn(d, 1)), formatprojects(getnextdayn(d, 2)), formatprojects(getnextdayn(d, 3)), formatprojects(getnextdayn(d, 4))],False) print(t) d=getnextmonday(d) w+=1 if d 0: t = PrettyTable() t.field_names = ["Week", "Day", "Project info"] t.align[t.field_names[-1]]="l" d=getmonday(sem["start"]) w=getweek(d) while d<=sem["end"]: # This is not optimal but works fine for p in sem["projects"].keys(): start=sem["projects"][p]["start"] end=sem["projects"][p]["end"] name=sem["projects"][p]["name"] if d.date() == start.date(): t.add_row([w,formatday(start),_cproj["labels"]["start"].format(name)]) if d.date() == end.date(): t.add_row([w,formatday(end),_cproj["labels"]["end"].format(name)]) d=getnextdayn(d, 1) w=getweek(d) if not _cproj["show_week"]: t.del_column(t.field_names[0]) print("Projects deadlines:") print(t)