|
|
|
|
@ -5,7 +5,10 @@ import click
@@ -5,7 +5,10 @@ import click
|
|
|
|
|
import pyperclip |
|
|
|
|
import requests |
|
|
|
|
|
|
|
|
|
Events = Iterable[dict[str:str]] |
|
|
|
|
# typing |
|
|
|
|
RawEvent = dict[str:tuple[str|datetime,str]] |
|
|
|
|
Event = dict[str:str] |
|
|
|
|
TableMetaData = dict[str:int] |
|
|
|
|
|
|
|
|
|
ICAL_URL = "https://bwsyncandshare.kit.edu/remote.php/dav/public-calendars/69o9HEM9aeZnER8S/?export" |
|
|
|
|
|
|
|
|
|
@ -17,6 +20,7 @@ LATEST = datetime.now() + timedelta(days=30 * 6)
@@ -17,6 +20,7 @@ LATEST = datetime.now() + timedelta(days=30 * 6)
|
|
|
|
|
|
|
|
|
|
TABLE_COLUMN_ORDER = ("date", "location", "presenter") |
|
|
|
|
|
|
|
|
|
# for mail sending |
|
|
|
|
|
|
|
|
|
MAIL_RECIPIENTS = ",".join([ |
|
|
|
|
"cpistaff@imtek.de", |
|
|
|
|
@ -91,8 +95,7 @@ def get_ics(url:str) -> str:
@@ -91,8 +95,7 @@ def get_ics(url:str) -> str:
|
|
|
|
|
return response.text |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def extract_event_info(response:str) -> Events: |
|
|
|
|
|
|
|
|
|
def extract_event_info(response:str) -> Iterable[Event]: |
|
|
|
|
events = ( |
|
|
|
|
event for event in |
|
|
|
|
_extract_event_info(response) |
|
|
|
|
@ -101,13 +104,13 @@ def extract_event_info(response:str) -> Events:
@@ -101,13 +104,13 @@ def extract_event_info(response:str) -> Events:
|
|
|
|
|
for event in sorted(events, key=lambda d: d["date"]): |
|
|
|
|
yield {key: values[1] for key, values in event.items()} |
|
|
|
|
|
|
|
|
|
def _extract_event_info(response:str) -> Events: |
|
|
|
|
def _extract_event_info(response:str) -> Iterable[RawEvent]: |
|
|
|
|
handle = (line for line in response.splitlines()) |
|
|
|
|
for line in handle: |
|
|
|
|
if line.upper().startswith("BEGIN:VEVENT"): |
|
|
|
|
yield extract_vevent(handle) |
|
|
|
|
|
|
|
|
|
def extract_vevent(handle:Iterable[str]) -> dict[str:str]: |
|
|
|
|
def extract_vevent(handle:Iterable[str]) -> RawEvent: |
|
|
|
|
event = {} |
|
|
|
|
for line in handle: |
|
|
|
|
if line.upper().startswith("END:VEVENT"): |
|
|
|
|
@ -121,7 +124,7 @@ def extract_vevent(handle:Iterable[str]) -> dict[str:str]:
@@ -121,7 +124,7 @@ def extract_vevent(handle:Iterable[str]) -> dict[str:str]:
|
|
|
|
|
return event |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_wiki_table(events:Events) -> str: |
|
|
|
|
def create_wiki_table(events:Iterable[Event]) -> str: |
|
|
|
|
table_meta_data = _get_table_meta_data(events) |
|
|
|
|
headers = {key: f"'''{key.capitalize()}'''" for key in TABLE_COLUMN_ORDER} |
|
|
|
|
lines = [ |
|
|
|
|
@ -132,13 +135,13 @@ def create_wiki_table(events:Events) -> str:
@@ -132,13 +135,13 @@ def create_wiki_table(events:Events) -> str:
|
|
|
|
|
return "\n".join(lines) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _create_table_line(line, meta) -> str: |
|
|
|
|
columns = [line[key].ljust(meta[key]) for key in TABLE_COLUMN_ORDER] |
|
|
|
|
def _create_table_line(event:Event, meta:TableMetaData) -> str: |
|
|
|
|
columns = [event[key].ljust(meta[key]) for key in TABLE_COLUMN_ORDER] |
|
|
|
|
inner = " || ".join(columns) |
|
|
|
|
return f"|| {inner} ||" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_table_meta_data(events:Events) -> dict[str:int]: |
|
|
|
|
def _get_table_meta_data(events:Iterable[Event]) -> TableMetaData: |
|
|
|
|
meta = {} |
|
|
|
|
for event in events: |
|
|
|
|
for key, value in event.items(): |
|
|
|
|
@ -146,7 +149,7 @@ def _get_table_meta_data(events:Events) -> dict[str:int]:
@@ -146,7 +149,7 @@ def _get_table_meta_data(events:Events) -> dict[str:int]:
|
|
|
|
|
return meta |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_email_table(events:Events) -> str: |
|
|
|
|
def create_email_table(events:Iterable[Event]) -> str: |
|
|
|
|
table_meta_data = _get_table_meta_data(events) |
|
|
|
|
date_key, _, name_key = TABLE_COLUMN_ORDER |
|
|
|
|
pad_date = table_meta_data[date_key] |
|
|
|
|
|