#! /usr/bin/env python3 import csv from datetime import datetime DAYS_SR = ["PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED"] DAYS_EN = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"] TYPES_DICT = { "hack": ("hakaton", "hackathon"), "lecture": ("predavanje", "lecture"), "workshop": ("radionica", "workshop"), "discussion": ("diskusija", "discussion"), "lighting": ("kratka predavanja", "short talks"), "movie": ("film", "movie"), "meeting": ("sastanak", "meeting"), "conference": ("konferencija", "conference"), "music": ("svirka", "gig"), "party": ("zabava", "entertainment"), } def load_events(csv_path:str) -> list[dict]: events = [] with open(csv_path) as csv_file: csv_reader = csv.reader(csv_file, skipinitialspace=True) next(csv_reader, None) for event in csv_reader: event_date = event[0] event_date_parsed = datetime.strptime(event_date, "%d-%m-%Y").date() event_time = event[1] event_location = event[2] event_title = event[3] types = event[4].split() try: link = event[5] except IndexError: link = "" current_event = {"date":event_date_parsed, "time":event_time, "location": event_location, "title":event_title.strip(), "types": types, "link": link} events.append(current_event) return events def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str: events_html = [] for event in events: title = event["title"] location = event["location"] date = event["date"] date = dayNames[date.weekday()]+", "+str(date.day)+". "+str(date.month)+". "+str(date.year)+", " time = event["time"]+"h" event_html = [] event_html.append(f"
{date} {time}
") if event["link"] != "": event_html.append(f"
{title}
") else: event_html.append(f"
{title}
") if "https://" in location: place,link = location.split("https://") event_html.append(f"
@{place.strip()}
") else: event_html.append(f"
@{location.strip()}
") if len(event["types"]) != 0: types_list = "
" last_item = event["types"][-1] for t in event["types"]: if typesNames.get(t) is not None: types_list += typesNames.get(t) if t != last_item: types_list += ', ' else: print(f"Unknown type {t}!") types_list += "
" event_html.append(types_list) event_html = "".join(event_html) events_html.append(f"\n
{event_html}
") return events_html def build_ical(events: list[dict]) -> str: today = datetime.today().now() # Header events_ical = "" with open("template/head.ical", "r") as file: events_ical += file.read() # Events for event in events: title = event["title"] location = event["location"] date = event["date"] time = event["time"] url = event["link"] uid = str(date.month).zfill(2) + str(date.day).zfill(2) + time[:2] date = str(date.year) + str(date.month).zfill(2) + str(date.day).zfill(2) created = str(today.year) + str(today.month).zfill(2) + str(today.day).zfill(2) + "T" + str(today.hour).zfill(2) + str(today.minute).zfill(2) + str(today.second).zfill(2) + "Z" date = date + "T" + time.replace(":", "") + "00" event_template = "" with open("template/event.ical", "r") as file: event_template += file.read() event_template = event_template.replace("", uid) event_template = event_template.replace("", created) event_template = event_template.replace("", date) event_template = event_template.replace("", title) event_template = event_template.replace("", url) if location.startswith("DC Krov"): event_template = event_template.replace("", "DC Krov\\, Kraljice Marije 47\\, 6\\, Beograd\\, Serbia") elif location.startswith("Matematički fakultet (Učionica 153)"): event_template = event_template.replace("", "Matematički fakultet\\, Svetog Nikole 39\\, Beograd\\, Serbia") else: event_template = event_template.replace("", "") events_ical += event_template # Footer with open("template/end.ical", "r") as file: events_ical += file.read() return events_ical events = sorted(load_events("dogadjaji.csv"), key=lambda e: e["date"]) today = datetime.today().date() past_events = list(filter(lambda e: e["date"] <= today, events)) past_events.reverse() new_events = list(filter(lambda e: e["date"] >= today, events)) page_template = "" sr_types = {} en_types = {} for key, value_pair in TYPES_DICT.items(): sr_types[key] = value_pair[0] en_types[key] = value_pair[1] # Build Serbian Events page new_events_html = build_html(new_events, DAYS_SR, sr_types) with open("template/events-sr.html", "r") as file: page_template = ([line for line in file]) with open("pages/sr/events.html", "w") as file: file.writelines(page_template + new_events_html) # Build English Events page new_events_html = build_html(new_events, DAYS_EN, en_types) with open("template/events-en.html", "r") as file: page_template = ([line for line in file]) with open("pages/en/events.html", "w") as file: file.writelines(page_template + new_events_html) # Build Serbian Archive page past_events_html = build_html(past_events, DAYS_SR, sr_types) with open("template/events_archive-sr.html", "r") as file: page_template = ([line for line in file]) with open("pages/sr/events_archive.html", "w") as file: file.writelines(page_template + past_events_html) # Build English Archive page past_events_html = build_html(past_events, DAYS_EN, en_types) with open("template/events_archive-en.html", "r") as file: page_template = ([line for line in file]) with open("pages/en/events_archive.html", "w") as file: file.writelines(page_template + past_events_html) new_events_ical = build_ical(new_events) # Build ical with open("site/events.ical", "w") as file: file.write(build_ical(new_events))