@ -1,4 +1,4 @@
@@ -1,4 +1,4 @@
from datetime import datetime
from datetime import datetime , timedelta
from typing import Iterable
import click
@ -12,8 +12,44 @@ ICAL_URL = "https://bwsyncandshare.kit.edu/remote.php/dav/public-calendars/69o9H
@@ -12,8 +12,44 @@ ICAL_URL = "https://bwsyncandshare.kit.edu/remote.php/dav/public-calendars/69o9H
ICS_DATE_FORMAT = " % Y % m %d T % H % M % S "
GERMAN_DATE_FORMAT = " %d . % m. % Y % H: % M "
EARLIEST = datetime . now ( ) - timedelta ( days = 30 * 3 )
LATEST = datetime . now ( ) + timedelta ( days = 30 * 6 )
TABLE_COLUMN_ORDER = ( " date " , " location " , " presenter " )
MAIL_RECIPIENTS = " , " . join ( [
" cpistaff@imtek.de " ,
" andrea.paola.layedra.almeida@uniklinik-freiburg.de " ,
" jaro.homburger@biologie.uni-freiburg.de " ,
" kubilay.acar@continental.com " ,
" Mario.diehlmann@basf.com " ,
" paul.fernandez@fmf.uni-freiburg.de " ,
" sunil.shetty@uniklinik-freiburg.de " ,
" sofia.genoves94@gmail.com " , " sofia.genoves@yahoo.com.ar "
] )
MAIL_SUBJECT = " Updated Group Meeting Schedule "
MAIL_START = """
Dear All ,
There is an updated group - seminar schedule available :
"""
MAIL_END = """
If ( and only if ) you can ' t make it in person, you can join the presentations via zoom: https://uni-freiburg.zoom-x.de/j/62063730956?pwd=6poraREYWvuHkStuYDRvYhO4vhmTbt.1
Meeting - ID : 620 6373 0956
Code : Lm5xaDXPH
You can have a look in our group meeting calendar at : https : / / bwsyncandshare . kit . edu / apps / calendar / p / 69 o9HEM9aeZnER8S
Or on our wiki : https : / / wiki . cpi . imtek . uni - freiburg . de / SeminarSchedule
If you want to add the schedule to your calendar app of choice , please use this subscribe link : https : / / bwsyncandshare . kit . edu / remote . php / dav / public - calendars / 69 o9HEM9aeZnER8S / ? export
Best ,
Holgi
"""
# parsers
def _parse_text ( ics_text : str ) - > str :
@ -56,8 +92,13 @@ def get_ics(url:str) -> str:
@@ -56,8 +92,13 @@ def get_ics(url:str) -> str:
def extract_event_info ( response : str ) - > Events :
events = sorted ( list ( _extract_event_info ( response ) ) , key = lambda d : d [ " date " ] )
for event in events :
events = (
event for event in
_extract_event_info ( response )
if EARLIEST < event [ " date " ] [ 0 ] < LATEST
)
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 :
@ -80,7 +121,7 @@ def extract_vevent(handle:Iterable[str]) -> dict[str:str]:
@@ -80,7 +121,7 @@ def extract_vevent(handle:Iterable[str]) -> dict[str:str]:
return event
def create_table ( events : Events ) - > str :
def create_wiki_ table ( events : Events ) - > str :
table_meta_data = _get_table_meta_data ( events )
headers = { key : f " ' ' ' { key . capitalize ( ) } ' ' ' " for key in TABLE_COLUMN_ORDER }
lines = [
@ -105,12 +146,37 @@ def _get_table_meta_data(events:Events) -> dict[str:int]:
@@ -105,12 +146,37 @@ def _get_table_meta_data(events:Events) -> dict[str:int]:
return meta
def create_email_table ( events : Events ) - > str :
table_meta_data = _get_table_meta_data ( events )
date_key , _ , name_key = TABLE_COLUMN_ORDER
pad_date = table_meta_data [ date_key ]
lines = [
( event [ date_key ] . ljust ( pad_date ) + " | " + event [ name_key ] ) for event in events
]
return " \n " . join ( lines )
@click . command ( )
def group_schedule ( ) :
ics_file = get_ics ( ICAL_URL )
events = list ( extract_event_info ( ics_file ) )
table = create_table ( events )
print ( table )
pyperclip . copy ( table )
wiki_table = create_wiki_table ( events )
email_table = create_email_table ( events )
components = [
wiki_table ,
" " ,
" " ,
" " ,
MAIL_RECIPIENTS ,
" " ,
MAIL_SUBJECT ,
MAIL_START ,
email_table ,
MAIL_END
]
text = " \n " . join ( components )
print ( text )
pyperclip . copy ( text )