#! /home/ggentile/perso/projects/python/Envs/dorfsvald-pim/bin/python3 import os import datetime import calendar from yaml import load from icalendar.parser import Contentlines, Contentline import caldav class Task: def __init__(self, ref_date, name, data): self.ref_date = ref_date self.name = name only = data['only'].split(',') if 'only' in data else None if data['periodicity'] == 'monthly': self.date_begin = self.parse_date_monthly(data['date-begin'], only) self.date_end = self.parse_date_monthly(data['date-end'], only) elif data['periodicity'] == 'weekly': pass self.title = data['title'] self.body = data['body'] self.priority = data['priority'] def parse_date_monthly(self, day, only=None): if day < 0: last_day_month = calendar.monthrange(self.ref_date.year, self.ref_date.month)[1] day = last_day_month + day + 1 if only is not None: only.sort() for selected in only: if int(selected) >= self.ref_date.month: month = int(selected) break if month is None: month = only[0] else: month = self.ref_date.month return datetime.date(year=self.ref_date.year, month=month, day=day) def to_ical(self): current_dtstamp = datetime.datetime.now().strftime('%Y%m%dT%H%M%SZ') uid = "DV-Taskmanager-%s-%s" % (self.name, self.date_end.strftime('%Y%m%d')) c = Contentlines([ Contentline('BEGIN:VCALENDAR'), Contentline('VERSION:2.0'), Contentline('PRODID:-//Example Corp.//CalDAV Client//EN'), Contentline('BEGIN:VTODO'), Contentline('DTSTAMP:%s' % current_dtstamp), Contentline('CREATED:%s' % current_dtstamp), Contentline('UID:%s' % uid), Contentline('SEQUENCE:%s' % '4'), Contentline('LAST-MODIFIED:%s' % current_dtstamp), Contentline('DESCRIPTION:%s' % self.body), Contentline('SUMMARY:%s' % self.title), Contentline('PRIORITY:%s' % 1), Contentline('DUE;VALUE=DATE:%s' % self.date_end.strftime('%Y%m%d')), Contentline('DTSTART;VALUE=DATE:%s' % self.date_begin.strftime('%Y%m%d')), Contentline('PERCENT-COMPLETE:0'), Contentline('END:VTODO'), Contentline('END:VCALENDAR') ]) return c.to_ical() class Client: def __init__(self, url): self.client = caldav.DAVClient(url) self.principal = self.client.principal() self.calendar = self.principal.calendar() def add_event(self, event): self.calendar.add_event(task.to_ical()) #conf = load('./configuration.yml') ref_date = datetime.date.today() + datetime.timedelta(days=3) with open('./tasks.yml', 'r') as content_file: tasks_conf = load(content_file.read()) task_list = [] for task_name, task_data in tasks_conf.items(): t = Task(ref_date, task_name, task_data); if (t.date_begin == ref_date): task_list.append(t) import ipdb; ipdb.set_trace() url = "https://ggentile:ID0t'8h6@cloud.dorfsvald.net/webdav/ggentile/calendar.ics/" client = Client(url) for task in task_list: client.add_event(task)