From 984f3d578f127e8209ef083125f2b89d1a505306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Cuevas?= Date: Thu, 9 Dec 2021 09:38:15 +0100 Subject: [PATCH] WebDav calendar access implemented --- smallprint.py | 40 ++++++++++++++++++++++++++++++++++++++++ webdav.py | 32 +++++++++++++++++++++++++------- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/smallprint.py b/smallprint.py index e6a0a63..f57ed1c 100644 --- a/smallprint.py +++ b/smallprint.py @@ -18,6 +18,7 @@ import re import requests from config import load_config, CONFIG_PATH +from webdav import Client # Enable logging @@ -335,6 +336,36 @@ def print_image(printer, image): os.remove("temp.png") +def print_calendar(printer): + """ + Connects to a webdav calendar and retrieves + the events for today + """ + c = Client(config) + events = c.get_todays_events() + + printer.set(align="center", + text_type="BU", + smooth=True) + printer.text("Today:\n") + + printer.set(align="left", + text_type="NORMAL", + font="b", + smooth=True) + + for event in events: + hour = event[1].hour + minutes = event[1].minute + if minutes < 10: + printer.text(f"{hour}:0{minutes}\n") + + else: + printer.text(f"{hour}:{minutes}\n") + + printer.text(f"{event[0]}\n--\n") + + def printing_script(printer): """ Gets the configuration and parses its script @@ -366,6 +397,9 @@ def printing_script(printer): if key == 'TEXT': print_text(printer, value) + if key == 'CALENDAR': + print_text(printer) + printer.set(align="center", text_type="NORMAL", font="b", @@ -391,6 +425,7 @@ def create_parser(): parser.add_argument("--text", nargs=1, default=None, help="Print the given text, use '-' to read from stdin") parser.add_argument("--file", default=None, type=open, help="Loads a file and sends it to the printer (as text)") parser.add_argument("--image", nargs=1, default=None, help="Print an image") + parser.add_argument("--calendar", action="store_true", help="Print configured calendar events for today") parser.add_argument("--genqr", action="store_true", help="Activates the generation of QR codes for links in news and gemini") return parser @@ -435,6 +470,11 @@ if __name__ == "__main__": print_image(printer, args.image[0]) printer.text("\n\n") + if args.calendar: + ops_called += 1 + print_calendar(printer) + printer.text("\n\n") + # In case we get called (almost) empty if ops_called == 0: # Try to parse a config script diff --git a/webdav.py b/webdav.py index 538e71c..32141df 100644 --- a/webdav.py +++ b/webdav.py @@ -1,7 +1,8 @@ +import datetime import os import os.path import tempfile -from icalendar import Calendar, Event +from icalendar import Calendar from webdav3.client import Client as WDClient @@ -22,7 +23,8 @@ class Client: """ Retrieves the calendar list """ - return self.client.list(self.path) + paths = [path for path in self.client.list(self.calendar_path) if ".ics" in path] + return paths def read_calendar(self, pathname): """ @@ -33,8 +35,9 @@ class Client: self.client.download_sync(remote_path=rpath, local_path=temp_path) # Read the temporary data, close the file, remove it - data = f.read() - f.close() + fics = open(temp_path, 'r') + data = fics.read() + fics.close() os.remove(temp_path) # Now with the data read, we can process it return self.parse_calendar(data) @@ -43,15 +46,30 @@ class Client: """ Parses ICS calendar data received """ + events = [] + now = datetime.datetime.now() + start_day = datetime.datetime(now.year, now.month, now.day) + tomorrow = start_day + datetime.timedelta(days=1) calendar = Calendar.from_ical(data) for component in calendar.walk(): if component.name == 'VEVENT': - pass - + event_date = component.decoded('dtstart') + ed = datetime.datetime(event_date.year, event_date.month, event_date.day) + if ed >= start_day and ed < tomorrow: + events.append((component.get('summary'), + component.decoded('dtstart'))) + return events def get_todays_events(self): """ Get todays events """ - pass + calendars = self.retrieve_calendars_list() + events = [] + for calendar in calendars: + cal_events = self.read_calendar(calendar) + for ev in cal_events: + events.append(ev) + + return events