Refactoring of caldav_recurring_task

This commit is contained in:
2023-09-22 13:12:40 +02:00
parent d48e3c6645
commit f962eceb89
9 changed files with 174 additions and 185 deletions

85
main.py Executable file
View File

@@ -0,0 +1,85 @@
import datetime
from yaml import load, FullLoader
from icalendar.parser import Contentlines, Contentline
from dateutil.rrule import rrule, FREQNAMES
import caldav
class Task:
def __init__(self, reference_date, name, data):
self.ref_date = reference_date
self.name = name
data['start']['freq'] = FREQNAMES.index(data['start']['freq'])
self.date_begin = rrule(count=1, dtstart=reference_date, **data['start'])[0]
self.date_end = self.date_begin + datetime.timedelta(microseconds=-1, **data['duration'])
self.title = data['title']
self.body = data['body']
self.priority = data['priority']
def to_ical(self):
current_dtstamp = datetime.datetime.now().strftime('%Y%m%dT%H%M%SZ')
uid = f"CaldavRecurringTask-{self.name}-{self.date_end.strftime('%Y%m%d')}"
c = Contentlines([
Contentline('BEGIN:VCALENDAR'),
Contentline('VERSION:2.0'),
Contentline('PRODID:-//DorfsvaldNet//CaldavRecuringTaskClient//FR'),
Contentline('BEGIN:VTODO'),
Contentline(f'DTSTAMP:{current_dtstamp}'),
Contentline(f'UID:{uid}'),
Contentline(f'CREATED:{current_dtstamp}'),
Contentline(f'LAST-MODIFIED:{current_dtstamp}'),
Contentline(f'SEQUENCE:{"4"}'),
Contentline(f'DESCRIPTION:{self.body}'),
Contentline(f'SUMMARY:{self.title}'),
Contentline(f'PRIORITY:{self.priority}'),
Contentline(f'DUE;VALUE=DATE:{self.date_end.strftime("%Y%m%d")}'),
Contentline(f'DTSTART;VALUE=DATE:{self.date_begin.strftime("%Y%m%d")}'),
Contentline('PERCENT-COMPLETE:0'),
Contentline('STATUS:NEEDS-ACTION'),
Contentline('END:VTODO'),
Contentline('END:VCALENDAR')
])
return c.to_ical()
class Client:
def __init__(self, url, username, password, calendar_name):
self.client = caldav.DAVClient(url, username=username, password=password)
self.principal = self.client.principal()
self.calendar = None
for c in self.principal.calendars():
if c.name == calendar_name:
self.calendar = c
break
if self.calendar is None:
raise LookupError('No calendar named "{}" found'.format(calendar_name))
def add_event(self, new_task):
self.calendar.add_event(new_task.to_ical())
if __name__ == "__main__":
with open('./configuration.yml', 'r') as configuration_file:
conf = load(configuration_file.read(), Loader=FullLoader)
ref_date = datetime.date.today() + datetime.timedelta(days=2)
with open('tasks.example.yml', 'r') as content_file:
tasks_conf = load(content_file.read(), Loader=FullLoader)
task_list = []
for task_name, task_data in tasks_conf.items():
t = Task(ref_date, task_name, task_data)
if t.date_begin.date() == ref_date:
task_list.append(t)
if task_list:
server = conf['dav_server']
client = Client(server['url'], server['user'], server['pass'], server['calendar'])
for task in task_list:
client.add_event(task)
print('process finished: {} tasks created'.format(len(task_list)))