From 84e933af8c9239ffa94b6098ab7d179a48375796 Mon Sep 17 00:00:00 2001 From: Justus Kuhlmann Date: Sun, 12 Sep 2021 20:43:53 +0200 Subject: [PATCH] time events longer than a day now displayed, some more controll in config --- calDAVconnector.py | 83 ++++++++++++++++++++++++++++----------------- calendarlib.p | Bin 271 -> 0 bytes canvas.bmp | Bin 48062 -> 0 bytes config | 5 ++- 4 files changed, 55 insertions(+), 33 deletions(-) delete mode 100644 calendarlib.p delete mode 100644 canvas.bmp diff --git a/calDAVconnector.py b/calDAVconnector.py index 46e5c5a..48c1f57 100644 --- a/calDAVconnector.py +++ b/calDAVconnector.py @@ -1,22 +1,21 @@ -from datetime import datetime -from datetime import date -from datetime import timedelta +from datetime import datetime, date, time, timezone, timedelta from PIL import Image,ImageDraw,ImageFont import pickle as p import requests import sys -import getopt sys.path.insert(0, './caldav') import caldav from caldav.lib.error import AuthorizationError - caldav_url = '' username = '' password = '' datafile = '' selected_cals = [] +language="EN" +weekday_l_key = "FULL" +draw_date = False #open config file, load configs configfile = open("./config", "r") conf = configfile.readlines() @@ -35,7 +34,17 @@ for l in conf: datafile = l[9:] elif(l.startswith("calendars")): selected_cals = l[10:].split(";") -print(selected_cals) + elif(l.startswith("language")): + language = l[9:] + elif(l.startswith("weekday_format")): + weekday_l_key = l[15:] + elif(l.startswith("draw_date")): + k = l[10:] + trueish = ["true","TRUE","1","True","T"] + draw_date = (k in trueish) + +#print(selected_cals) +#look if server and user are set if(len(caldav_url) == 0): print("Please provide a calDAV link") if(len(username) == 0): @@ -43,8 +52,6 @@ if(len(username) == 0): #calDAV setup -timezone = [2,0] - timeout = 5 if not (len(datafile) == 0): @@ -67,7 +74,11 @@ try: except (Exception) as ex: client_established = False +#check in which time zone we are +tz = timedelta(minutes = round((datetime.now()-datetime.utcnow()).seconds/60)) + if(server_reached and client_established): + #if server is available, download new information from server print("Successfully connected to server, starting to download calendars...") my_principal = client.principal() calendars_fetched = my_principal.calendars() @@ -82,43 +93,47 @@ if(server_reached and client_established): for c in calendars: print(c.name) - + time_events = [] day_events = [] birthdays = [] + #go through all calendars to look for events for c in calendars: current_calendar = my_principal.calendar(name=c.name) events_fetched = current_calendar.date_search( start=datetime.today()-timedelta(days = datetime.today().weekday()), end=datetime.today()+timedelta(days = 6-datetime.today().weekday()), expand=True) - if len(events_fetched)> 0: for event in events_fetched: event_start_str = str(event.vobject_instance.vevent.dtstart)[10:-1] event_end_str = str(event.vobject_instance.vevent.dtend)[8:-1] + print(event.vobject_instance.vevent) if(event_start_str.startswith("VALUE")): + #if it is an event over a whole day, sort it into the day events day_events.append({ "DATE":date(int(event_start_str.split("}")[1].split("-")[0]),int(event_start_str.split("}")[1].split("-")[1]),int(event_start_str.split("}")[1].split("-")[2])), "SUMMARY":str(event.vobject_instance.vevent.summary.value), "CALENDAR":c.name }) else: + #otherwise it has to be a time event sd = event_start_str.split(" ")[0] st = event_start_str.split(" ")[1] - sh = int(st.split(":")[0])+timezone[0]+int(st.split(":")[2][2:4]) - sm = int(st.split(":")[1])+timezone[1]+int(st.split(":")[3]) + sh = int(st.split(":")[0])+int(st.split(":")[2][2:4]) + sm = int(st.split(":")[1])+int(st.split(":")[3]) ss = int(st.split(":")[2][0:1]) ed = event_end_str.split(" ")[0] et = event_end_str.split(" ")[1] - eh = int(et.split(":")[0])+timezone[0]+int(st.split(":")[2][2:4]) - em = int(et.split(":")[1])+timezone[1]+int(et.split(":")[3]) + eh = int(et.split(":")[0])+int(st.split(":")[2][2:4]) + em = int(et.split(":")[1])+int(et.split(":")[3]) es = int(et.split(":")[2][0:1]) time_events.append({ - "START":datetime(int(sd.split("-")[0]),int(sd.split("-")[1]),int(sd.split("-")[2]), hour = sh, minute = sm, second = ss), - "END":datetime(int(ed.split("-")[0]),int(ed.split("-")[1]),int(ed.split("-")[2]), hour = eh, minute = em, second = es), + "START":datetime(int(sd.split("-")[0]),int(sd.split("-")[1]),int(sd.split("-")[2]), hour = sh, minute = sm, second = ss)+tz, + "END":datetime(int(ed.split("-")[0]),int(ed.split("-")[1]),int(ed.split("-")[2]), hour = eh, minute = em, second = es)+tz, "SUMMARY":str(event.vobject_instance.vevent.summary.value), "CALENDAR":c.name }) + #if the user wants one calendar to be treated as a birthday calendar, these are sorted into an extra library if(not (len(birthdaycal) == 0)): for event in day_events: if event["CALENDAR"] == birthdaycal: @@ -128,11 +143,13 @@ if(server_reached and client_established): birthdays.append(event) day_events.remove(event) print("Download complete") + #back up the data received to a local copy so that it can be displayed if needed if(len(datafile)!= 0): calendarlib = {"DAY_EVENTS":day_events,"TIME_EVENTS":time_events,"BIRTHDAYS":birthdays} p.dump( calendarlib, open( "calendarlib.p", "wb" )) f.close() else: + #if the server is not available, instead load information from datafile if(len(datafile)!= 0): print("Loading caldata from last time...") calendarlib = p.load(open(datafile,"rb")) @@ -143,9 +160,6 @@ else: print("No data available!") exit() - -#get principal file - print(birthdays) print(day_events) print(time_events) @@ -184,9 +198,7 @@ Himage = Image.new('1', (800,480), 255) # 255: clear the frame draw = ImageDraw.Draw(Himage) #define language, and if abbreviations for weekdays should be used -language = "EN" -weekday_l_key = "FULL" -draw_date = True + #define grid coordinates upper_border_grid = 0 lower_border_grid = 465 @@ -282,22 +294,29 @@ for event in time_events: right_border_event = row_start+width_day-6-((events_on_weekday[event["START"].weekday()])>0)*3 upper_border_event = round(upper_border_grid+weekday_height+5+((lower_border_grid-(upper_border_grid+weekday_height+5))/hours_in_day)*(event["START"].hour-first_hour+(event["START"].minute/60))) lower_border_event = round(upper_border_grid+weekday_height+5+((lower_border_grid-(upper_border_grid+weekday_height+5))/hours_in_day)*(event["END"].hour-first_hour+(event["END"].minute/60))) - #blank out everything + if (row_start == row_end): draw.rectangle((left_border_event,upper_border_event,right_border_event,lower_border_event),fill = 255) + if(lower_border_eventERCX^mRq>H9$&OgF_sHLZ$($aDpab5u^wXN#9+v<12JHD6wC7C z3jI;+1E`}v02}tM6jT@@as?(bc8kZ@FTsvmtHs-~M*>%A30$Rv;<=Jx2f;N<;7A;|H0;C{Uc<&6tfr*$OfRM*GKhm>-8AOa7=^6&^NV9zvT7vl=!3Pe$@W$-yAF08w+eixMyfC19u$ zFl2C*lwgMq0`CnV9VK~=YnFhXGW``el8QKf06t3M3e+K27*{wKwI@W8hJ6Vj1p5+P z-v!~oM9dFB2<8Xo2M7nu4}5lz;QXp6BkU@UAAk=WKOSQI2m&HS%}Zpg!v!SR(J28# z#@Z{cSprASfVB)xS9d|F8Tv7fd0UHP7n^I;$u7x z4#VgE=Gxx9Q?=hHo|S-MyUDpA#ty`=Lcd&}h+H9876a8AKQOK=Rxt-LuB>R_(x8O= z2uQ#PO2F7H0YiozM1mcN0TQiDzngc!H&FK3=Au=5pC$U-a!46}VC-5{mHqx4_VqaoK5B4S4msrt&eF^p@GzRc{9FP*F&zC$Q z_mSBerf8d%7$m|&~_rW#GndJ}65A+9M0PhVT8BCTi4k891eFltC z=nwPGCE!VGpD9DavT)*6$ zJ9^1IkUI80`Zq=Nv zi){PJFA(E{bl>^9u+Jv}qfsOV=PKMQ(vIu(>BW7W;gcdU?n&@R){&-hHPrP@h5oox zJLP+vec873-C$?s`Eh6J&p__WE=z9>bP`@F$-#>3;9OOXF}!-}Tp6ubj!_9$)5S>45tb-B4xb`Tt>3jrMcQ#Dthl@{9~Fw>3HzHDc$V-RR#9A?d+tyj4PK#kFh9t^ zU^uLZ;>u{<*b2pPlB`HO?*35gaJFAMFA^gatF3ps<8kpAw}oQpj4SuQLNQXq!8uO% zO|cjf{E;4}Ty1#gZE-%=0wfk}a0<|+!#{-0M#Suhd$e6=Xu0RpP zRq`xc!kb$M0IN4|mw^E<{4sv-AimEMII`Tm0XP)jHEAQG^tS-E>c{wfWN3%Q0Om*a z#wd$bDq(&AIt+%jD!RX`b`ulVz_!j{|z3%Tk!*WDy*yU8A!OkD?oPAUk(Up*48A& zu$Kode5mlyinxL&(t8}6YVT(r5+he=nq$!4Ul_&2h#H#8Kg^uvc9<1~OUoF?8P9V1 zO=a?9vQ@(l#jG$f%w|=-*UVXtG1*5LrxmW0pB6RSus&LdpDV_}-b9pZCPs?zD^&Tu z%r4#($4JpV3fpU(mX8{(@Y6=w&ru2`+5P>OFSPCrab1sfEe_1{#YefOEkE$ehGpvp z+roaTA6oL->iLUC{LN9S& zp&g<83WX{RW5i1_UZe`qGfl2Y*iDR9v{9dHuw^3eWL3OmJQrIUmEDG66vO8|=pW|{ z5Y4ytlR