diff options
| -rw-r--r-- | infos.yaml | 104 | ||||
| -rw-r--r-- | infos2.yaml | 28 | ||||
| -rwxr-xr-x | main.py | 307 | ||||
| -rwxr-xr-x | main2.py | 146 |
4 files changed, 162 insertions, 423 deletions
@@ -3,84 +3,45 @@ course: "Parallel Programming" semester: start: "11/08/2025" end: "15/12/2025" - lectures: - slots: + slots: + lecture: friday: start: "12:15" end: "14:00" -# room: "A20" wednesday: start: "09:15" end: "10:00" - colloquiums: - slots: - monday: - start: "09:10" - end: "10:08" - wednesday: - start: "09:15" - end: "10:00" - -output: - date_format: "%b %d" - time_format: "%H:%M" - format: "text" # Or html/json/csv/latex/mediawiki - week_drift: 0 # Add constant offset to week numbers - tables: - calendar: - hidden: no - show_events: yes - show_time: yes - show_room: no - show_lecturers: yes - show_assignments: yes - show_dates: yes - show_weeks: yes - semester_dates_as_events: no # Display semester start/end in events - defrag: yes # Skip empty rows - text_wrap: 15 # Adjust to your needs - min_col_width: 12 # Adjust as your needs - week_line_skip: 1 # Number of line to skip between weeks - labels: - events: "Others" - lectures: "Lectures" - assignments: "Assignments" - dates: "Dates" - weeks: "Week {}" - rooms: "Room: {}" - deadlines: - hidden: no - msg_handout: "Mandatory assignment {} handout" - msg_deadline: "Mandatory assignment {} deadline" - lectures: - hidden: no - show_rooms: no colloquiums: - hidden: no - show_rooms: yes - + monday: + start: "14:15" + end: "16:00" + friday: + start: "14:15" + end: "16:00" events: - 1: - name: "Deadline student list" - date: "19/11/2025" - hidden: yes - 2: + # test: + # type: "lecture" + # name: "My event name" + # date: "19/11/2025" + # hidden: no + # repeat: + # every: 7 + # until: "26/11/2025" + # who: "loic" + # start: "10:00" + # end: "11:00" + # room: "A232" + exam: + type: "none" name: "Exam" date: "03/12/2025" + student_list: + type: "none" + name: "Deadline student list" + date: "19/11/2025" -assignments: - 1: - start: "01/09/2025" - end: "17/09/2025" - 2: - start: "15/09/2025" - end: "08/10/2025" - 3: - start: "06/10/2025" - end: "29/10/2025" - -lectures: 1: + type: "lecture" name: "Introduction" date: "13/08/2025" who: "Loïc" @@ -88,48 +49,59 @@ lectures: # start: "09:00" # end: "09:00" 2: + type: "lecture" name: "Parallel software and hardware" date: "22/08/2025" who: "Loïc" slot: room: "BB" 3: + type: "lecture" name: "MPI" date: "29/08/2025" who: "Loïc" 4: + type: "lecture" name: "PThread" date: "05/09/2025" who: "Loïc" 5: + type: "lecture" name: "OpenMP" date: "12/09/2025" who: "Loïc" 6: + type: "lecture" name: "Concurrency" date: "19/09/2025" who: "Loïc" 7: + type: "lecture" name: "CUDA Intro" date: "26/09/2025" who: "Loïc" 8: + type: "lecture" name: "CUDA Optim" date: "03/10/2025" who: "Loïc" 9: + type: "lecture" name: "CPU vs GPU" date: "10/10/2025" who: "Loïc" 10: + type: "lecture" name: "Simplify Parallelism" date: "17/10/2025" who: "Loïc" 11: + type: "lecture" name: "Exam Wrap-up" date: "12/11/2025" who: "Loïc" 12: + type: "lecture" name: "Guest Lecture" date: "07/11/2025" who: "Loïc" diff --git a/infos2.yaml b/infos2.yaml deleted file mode 100644 index 3e0dc3d..0000000 --- a/infos2.yaml +++ /dev/null @@ -1,28 +0,0 @@ -course: "Parallel Programming" - -semester: - start: "11/08/2025" - end: "15/12/2025" - slots: - lecture: - friday: - start: "12:15" - end: "14:00" - # room: "A20" - wednesday: - start: "09:15" - end: "10:00" - room: "A67" -events: - test: - type: "lecture" - name: "My event name" - date: "19/11/2025" - hidden: no - repeat: - every: 7 - until: "26/11/2025" - who: "loic" - start: "10:00" - end: "11:00" -# room: "A232" @@ -5,203 +5,144 @@ from prettytable import PrettyTable from datetime import datetime, timedelta with open("infos.yaml", "r") as f: - i=yaml.safe_load(f) + _i=yaml.safe_load(f) -def parse_date(d): - return datetime.strptime(d, "%d/%m/%Y") +#### 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 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() - slots=i["semester"]["lectures"]["slots"] - if dname in slots.keys(): - start,end, room=(None,None,None) - if "start" in slots[dname].keys(): - start=datetime.strptime(i["semester"]["lectures"]["slots"][dname]["start"], "%H:%M") - end=datetime.strptime(i["semester"]["lectures"]["slots"][dname]["end"], "%H:%M") - room=slots[dname]["room"] if "room" in slots[dname].keys() else None - return (start,end, room) - return None -def getglobalcolloquiumsslot(d): - dname=d.strftime("%A").lower() - slots=i["semester"]["colloquiums"]["slots"] - if dname in slots.keys(): - start,end, room=(None,None,None) - if "start" in slots[dname].keys(): - start=datetime.strptime(i["semester"]["colloquiums"]["slots"][dname]["start"], "%H:%M") - end=datetime.strptime(i["semester"]["colloquiums"]["slots"][dname]["end"], "%H:%M") - room=slots[dname]["room"] if "room" in slots[dname].keys() else None - return (start,end, room) - 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, room = (None, None, None) - if slot is not None: - startT, endT, room=slot - if "slot" in i["lectures"][l]: - if "start" in i["lectures"][l]["slot"].keys(): - startT=datetime.strptime(i["lectures"][l]["slot"]["start"], "%H:%M") - endT=datetime.strptime(i["lectures"][l]["slot"]["end"], "%H:%M") - room=i["lectures"][l]["slot"]["room"] if "room" in i["lectures"][l]["slot"].keys() else None - # 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 o["show_room"] and room is not None: - text=textwrap.fill(o["labels"]["rooms"].format(room),o["text_wrap"])+"\n"+text - if o["show_time"] and (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 + 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()<current.date(): + break + if current.date() == d.date(): + return True + current+=delta + continue + return False +def formatevents(d): + output="" + for e in events: + _e=events[e] + if (not _e["hidden"]) and (_e["date"].date() == d.date() or matchrepeat(d, e)): + if _e["start"] is not None: + output+=gettime(_e["start"])+"-"+gettime(_e["end"])+"\n" + if _e["room"] is not None: + output+="Room: "+_e["room"]+"\n" + output+=_e["name"] + if _e["who"] is not None: + output+="\n("+_e["who"]+")" + return output +def formatday(d): + return d.strftime("%b %d") -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"])) +#### Load semester +sem={ + "start": parse_date(_i["semester"]["start"]), + "end": parse_date(_i["semester"]["end"]), + "slots": {} +} +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"] +#### Load events +events={} +for e in _i["events"]: + _e=_i["events"][e] + events[e]={ + "type": _e["type"], + "name": _e["name"], + "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"] -if not i["output"]["tables"]["lectures"]["hidden"]: - sstart=parse_date(i["semester"]["start"]) - monday=getmonday(sstart) +#### Gen semester calendar +d=getmonday(sem["start"]) +w=getweek(d) +while d<=sem["end"]: t = PrettyTable() - t.field_names = ["Day", "Time", "Room"] - t.align["Day"] = "l" - for offset in range(0,5): - d=getnextdayn(monday, offset) - s=getgloballectureslot(d) - if s is not None: - (startT,endT,room)=s - room=room if room is not None else "" - t.add_row([d.strftime("%A"),startT.strftime(i["output"]["time_format"])+"-"+endT.strftime(i["output"]["time_format"]),room]) - if not i["output"]["tables"]["lectures"]["show_rooms"]: - t.del_column("Room") + t.field_names = ["Week "+str(w), "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] + t.align[t.field_names[0]]="l" + 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) + t.add_row(["", + formatevents(getnextdayn(d, 0)), + formatevents(getnextdayn(d, 1)), + formatevents(getnextdayn(d, 2)), + formatevents(getnextdayn(d, 3)), + formatevents(getnextdayn(d, 4))]) print(t) + d=getnextmonday(d) + w+=1 + if d<sem["end"]: + print("") - -if not i["output"]["tables"]["colloquiums"]["hidden"]: - sstart=parse_date(i["semester"]["start"]) - monday=getmonday(sstart) +#### Gen slots tables +for s in sem["slots"]: t = PrettyTable() t.field_names = ["Day", "Time", "Room"] - t.align["Day"] = "l" - for offset in range(0,5): - d=getnextdayn(monday, offset) - s=getglobalcolloquiumsslot(d) - if s is not None: - (startT,endT,room)=s - room=room if room is not None else "" - t.add_row([d.strftime("%A"),startT.strftime(i["output"]["time_format"])+"-"+endT.strftime(i["output"]["time_format"]),room]) - if not i["output"]["tables"]["colloquiums"]["show_rooms"]: - t.del_column("Room") + t.align["Day"]="l" + for dayname in ["monday","tuesday","wednesday","thursday", "friday"]: + p=sem["slots"][s][dayname] + timeStr=gettime(p["start"])+"-"+gettime(p["end"]) if p["start"] is not None else "" + room=p["room"] if p["room"] is not None else "" + if timeStr != "" or room != "": + t.add_row([dayname.capitalize(),timeStr,room]) + print(s+":") print(t) diff --git a/main2.py b/main2.py deleted file mode 100755 index 5c39d9d..0000000 --- a/main2.py +++ /dev/null @@ -1,146 +0,0 @@ -#!./env/bin/python - -import yaml, textwrap -from prettytable import PrettyTable -from datetime import datetime, timedelta - -with open("infos2.yaml", "r") as f: - _i=yaml.safe_load(f) - -#### 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()<current.date(): - break - if current.date() == d.date(): - return True - current+=delta - continue - return False -def formatevents(d): - output="" - for e in events: - _e=events[e] - if (not _e["hidden"]) and (_e["date"].date() == d.date() or matchrepeat(d, e)): - if _e["start"] is not None: - output+=gettime(_e["start"])+"-"+gettime(_e["end"])+"\n" - if _e["room"] is not None: - output+="Room: "+_e["room"]+"\n" - output+=_e["name"] - return output -def formatday(d): - return d.strftime("%b %d") - -#### Load semester -sem={ - "start": parse_date(_i["semester"]["start"]), - "end": parse_date(_i["semester"]["end"]), - "slots": {} -} -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"] - -#### Load events -events={} -for e in _i["events"]: - _e=_i["events"][e] - events[e]={ - "type": _e["type"], - "name": _e["name"], - "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"]: - t = PrettyTable() - t.field_names = ["Week "+str(w), "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] - t.align[t.field_names[0]]="l" - 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) - t.add_row(["", - formatevents(getnextdayn(d, 0)), - formatevents(getnextdayn(d, 1)), - formatevents(getnextdayn(d, 2)), - formatevents(getnextdayn(d, 3)), - formatevents(getnextdayn(d, 4))]) - print(t) - d=getnextmonday(d) - w+=1 - if d<sem["end"]: - print("") - -#### Gen slots tables -for s in sem["slots"]: - t = PrettyTable() - t.field_names = ["Day", "Time", "Room"] - t.align["Day"]="l" - for dayname in ["monday","tuesday","wednesday","thursday", "friday"]: - p=sem["slots"][s][dayname] - timeStr=gettime(p["start"])+"-"+gettime(p["end"]) if p["start"] is not None else "" - room=p["room"] if p["room"] is not None else "" - if timeStr != "" or room != "": - t.add_row([dayname.capitalize(),timeStr,room]) - print(s+":") - print(t) |
