day events can now stretch over multi. days, collisions for appointments at same time handled better

This commit is contained in:
Justus Kuhlmann 2021-09-22 17:26:05 +02:00
commit dfe340c3a1

View file

@ -2,8 +2,9 @@ from datetime import datetime, date, time, timezone, timedelta
from PIL import Image,ImageDraw,ImageFont from PIL import Image,ImageDraw,ImageFont
import pickle as p import pickle as p
import numpy as np
import requests import requests
import sys import sys, os
sys.path.insert(0, './caldav') sys.path.insert(0, './caldav')
import caldav import caldav
from caldav.lib.error import AuthorizationError from caldav.lib.error import AuthorizationError
@ -16,11 +17,14 @@ selected_cals = []
language="EN" language="EN"
weekday_l_key = "FULL" weekday_l_key = "FULL"
draw_date = False draw_date = False
has_color = False
#open config file, load configs #open config file, load configs
configfile = open("./config", "r")
conf = configfile.readlines() if (os.path.isfile("./config")):
print(conf) configfile = open("./config", "r")
for l in conf: conf = configfile.readlines()
print(conf)
for l in conf:
l = l.strip() l = l.strip()
if(l.startswith("server")): if(l.startswith("server")):
caldav_url = l[7:] caldav_url = l[7:]
@ -42,6 +46,9 @@ for l in conf:
k = l[10:] k = l[10:]
trueish = ["true","TRUE","1","True","T"] trueish = ["true","TRUE","1","True","T"]
draw_date = (k in trueish) draw_date = (k in trueish)
elif(l.startswith("colormode")):
if l[10:] == "2color":
has_color = True
#print(selected_cals) #print(selected_cals)
#look if server and user are set #look if server and user are set
@ -111,7 +118,8 @@ if(server_reached and client_established):
if(event_start_str.startswith("VALUE")): if(event_start_str.startswith("VALUE")):
#if it is an event over a whole day, sort it into the day events #if it is an event over a whole day, sort it into the day events
day_events.append({ 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])), "START":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])),
"END":date(int(event_end_str.split("}")[1].split("-")[0]),int(event_end_str.split("}")[1].split("-")[1]),int(event_end_str.split("}")[1].split("-")[2])),
"SUMMARY":str(event.vobject_instance.vevent.summary.value), "SUMMARY":str(event.vobject_instance.vevent.summary.value),
"CALENDAR":c.name "CALENDAR":c.name
}) })
@ -260,29 +268,30 @@ for y in range(upper_border_grid+weekday_height+4,lower_border_grid,two_hour_spa
draw.text((left_border_grid-timefont.getsize(str(i*2+first_hour))[0], y), str(i*2+first_hour), font = timefont, fill = 0) draw.text((left_border_grid-timefont.getsize(str(i*2+first_hour))[0], y), str(i*2+first_hour), font = timefont, fill = 0)
i +=1 i +=1
events_on_weekday = [0,0,0,0,0,0,0] already_an_event = np.zeros((7,lower_border_grid - upper_border_grid))
known_calendars = {"DLRG Kalendar" : "DLRG", "Uni Kalendar" : "UNI", "Persönlich" : "PER"} known_calendars = {"DLRG Kalendar" : "DLRG", "Uni Kalendar" : "UNI", "Persönlich" : "PER"}
for event in day_events: for event in day_events:
row = width_day*event["DATE"].weekday()+left_border_grid+4 for d in range(event["START"].weekday(),event["END"].weekday()):
row = width_day*d+left_border_grid+4
if event["CALENDAR"] in known_calendars: if event["CALENDAR"] in known_calendars:
cal = known_calendars[event["CALENDAR"]] cal = known_calendars[event["CALENDAR"]]
else: else:
cal = event["CALENDAR"] cal = event["CALENDAR"]
if(events_on_weekday[event["DATE"].weekday()]== 0): if(np.amax(already_an_event[d,:])== 0):
draw.rectangle((row,upper_border_grid+weekday_height+5,row+width_day-6,lower_border_grid-1),fill = 255) draw.rectangle((row,upper_border_grid+weekday_height+5,row+width_day-6,lower_border_grid-1),fill = 255)
draw.line([(row,upper_border_grid+weekday_height+5),(row,lower_border_grid-1)], width = 4, fill = 0) draw.line([(row,upper_border_grid+weekday_height+5),(row,lower_border_grid-1)], width = 4, fill = 0)
draw.line([(row,lower_border_grid-2),(row+width_day-6,lower_border_grid-2)], width = 2, fill = 0) draw.line([(row,lower_border_grid-2),(row+width_day-6,lower_border_grid-2)], width = 2, fill = 0)
draw.line([(row,upper_border_grid+weekday_height+5),(row+width_day-6,upper_border_grid+weekday_height+5)], width = 2, fill = 0) draw.line([(row,upper_border_grid+weekday_height+5),(row+width_day-6,upper_border_grid+weekday_height+5)], width = 2, fill = 0)
draw.line([(row+width_day-7,upper_border_grid+weekday_height+5),(row+width_day-7,lower_border_grid-1)], width = 2, fill = 0) draw.line([(row+width_day-7,upper_border_grid+weekday_height+5),(row+width_day-7,lower_border_grid-1)], width = 2, fill = 0)
wi, hi = eventfont.getsize (event["SUMMARY"]) wi, hi = eventfont.getsize (event["SUMMARY"])
draw_text_90_into("["+cal+"] "+event["SUMMARY"], Himage, (row+4,height_grid-(weekday_height+5)-round(wi/2))) draw_text_90_into("["+cal+"] "+event["SUMMARY"], Himage, (row+4,round(height_grid/2-(weekday_height+5)-wi/2)))
else: else:
wi, hi = eventfont.getsize(event["SUMMARY"]) wi, hi = eventfont.getsize(event["SUMMARY"])
draw.line([(row+6+hi,upper_border_grid+weekday_height+9),(row+6+hi,lower_border_grid-4)], width = 2, fill = 0) draw.line([(row+6+hi,upper_border_grid+weekday_height+9),(row+6+hi,lower_border_grid-4)], width = 2, fill = 0)
draw_text_90_into("["+cal+"] "+event["SUMMARY"], Himage, (row+10+hi,-round(wi/2))) draw_text_90_into("["+cal+"] "+event["SUMMARY"], Himage, (row+10+hi,round(height_grid/2-(weekday_height+5)-wi/2)))
events_on_weekday[event["DATE"].weekday()] += 1 already_an_event[d,:] += 1
for event in time_events: for event in time_events:
#draw rectangle #draw rectangle
@ -290,11 +299,11 @@ for event in time_events:
row_start = width_day*event["START"].weekday()+left_border_grid+4 row_start = width_day*event["START"].weekday()+left_border_grid+4
row_end = width_day*event["END"].weekday()+left_border_grid+4 row_end = width_day*event["END"].weekday()+left_border_grid+4
left_border_event = row_start+(events_on_weekday[event["START"].weekday()]*(6+(eventfont.getsize(event["SUMMARY"])[1]))) right_border_event = row_start+width_day-6
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))) 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))) 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)))
left_border_event = row_start+((np.amax(already_an_event[event["START"].weekday(),upper_border_event:lower_border_event]))*6)
already_an_event[event["START"].weekday(),upper_border_event:lower_border_event] +=1
if (row_start == row_end): if (row_start == row_end):
draw.rectangle((left_border_event,upper_border_event,right_border_event,lower_border_event),fill = 255) draw.rectangle((left_border_event,upper_border_event,right_border_event,lower_border_event),fill = 255)
if(lower_border_event<lower_border_grid): if(lower_border_event<lower_border_grid):