90 lines
No EOL
2.9 KiB
Python
90 lines
No EOL
2.9 KiB
Python
#!/usr/bin python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
# TODO: Comment this
|
|
"""
|
|
|
|
import caldav
|
|
from datetime import date, datetime, timedelta
|
|
import pytz
|
|
import vobject
|
|
|
|
|
|
class CalendarHelper:
|
|
|
|
def __init__(self, caldavURL: str, caldavUser: str, caldavPassword: str, timezone="Europe/Madrid", caldavBlacklist=[""]):
|
|
self.caldavURL = caldavURL
|
|
self.caldavUser = caldavUser
|
|
self.caldavPassword = caldavPassword
|
|
self.caldavBlacklist = caldavBlacklist
|
|
self.timezone = timezone
|
|
|
|
|
|
def fetch_cals(self):
|
|
|
|
with caldav.DAVClient(
|
|
url=self.caldavURL,
|
|
username=self.caldavUser,
|
|
password=self.caldavPassword
|
|
) as client:
|
|
|
|
principal = client.principal()
|
|
|
|
# Get user's calendars
|
|
calendars = principal.calendars()
|
|
|
|
# Upcoming events on all calendars
|
|
tz = pytz.timezone(self.timezone)
|
|
now = datetime.now(tz=tz)
|
|
end = now + timedelta(days=30)
|
|
all_events = []
|
|
for calendar in calendars:
|
|
#print(str(calendar))
|
|
if str(calendar) not in self.caldavBlacklist:
|
|
events = calendar.search(start=now, end=end, expand=True)
|
|
all_events.extend(events)
|
|
|
|
|
|
# Parse events into parsed_vents list
|
|
parsed_events = []
|
|
for event in all_events:
|
|
parsed_events.append(self.parse_event(event.data))
|
|
|
|
for event in parsed_events:
|
|
# If datetime.datetime, do nothing, if datetime.time, convert it to datetime.datetime
|
|
if not isinstance(event["DTSTART"], datetime):
|
|
event["DTSTART"] = date.strftime(event["DTSTART"], '%Y-%m-%d, %H:%M:%S')
|
|
event["DTSTART"] = datetime.strptime(event["DTSTART"], '%Y-%m-%d, %H:%M:%S')
|
|
|
|
else:
|
|
event["DTSTART"] = datetime.strftime(event["DTSTART"], '%Y-%m-%d, %H:%M:%S')
|
|
event["DTSTART"] = datetime.strptime(event["DTSTART"], '%Y-%m-%d, %H:%M:%S')
|
|
|
|
|
|
#event["DTSTART"] = datetime.combine(event["DTSTART"], datetime.min.time())
|
|
|
|
#print(parsed_events)
|
|
# Sort the list of dictionaries by DTSTART
|
|
sorted_events = sorted(parsed_events, key=lambda x: x['DTSTART'])
|
|
|
|
#return sorted_events
|
|
|
|
# Print the sorted list of events
|
|
#for event in sorted_events:
|
|
#print(f'{event["DTSTART"]} --- {event["SUMMARY"]}')
|
|
|
|
return sorted_events
|
|
|
|
|
|
def parse_event(self, event_str: str):
|
|
calendar = vobject.readOne(event_str)
|
|
event = calendar.vevent
|
|
|
|
event_dict = {}
|
|
for component in event.getChildren():
|
|
try:
|
|
event_dict[component.name] = component.value
|
|
except:
|
|
continue
|
|
|
|
return(event_dict) |