From 7cb394f8049dd3316271e1de13e2f0bf831a2bae Mon Sep 17 00:00:00 2001 From: Gentile G Date: Tue, 26 Sep 2023 11:06:05 +0200 Subject: [PATCH] Adding a last run tracking file to be able to created skipped days tasks --- .gitignore | 3 ++- main.py | 64 ++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 5b29eec..f183d01 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea/ +.last.run configuration.yml tasks.yml -test/ \ No newline at end of file +test/ diff --git a/main.py b/main.py index 2891928..4867bf3 100755 --- a/main.py +++ b/main.py @@ -1,12 +1,11 @@ import datetime +import os -from caldav.lib.error import NotFoundError -from caldav.objects import Todo from yaml import load, FullLoader -import icalendar from icalendar.parser import Contentlines, Contentline from dateutil.rrule import rrule, FREQNAMES import caldav +from caldav.lib.error import NotFoundError APP_ID = 'CaldavRecurringTask' @@ -66,6 +65,9 @@ class Client: if self.calendar is None: raise LookupError('No calendar named "{}" found'.format(calendar_name)) + def todos(self, include_completed=True): + return self.calendar.todos(include_completed=include_completed) + def add_todo(self, new_task): self.calendar.add_todo(new_task.to_ical()) @@ -82,28 +84,42 @@ 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.yml', 'r') as content_file: - tasks_conf = load(content_file.read(), Loader=FullLoader) + last_run_file_path = './.last.run' + if os.path.isfile(last_run_file_path): + with open(last_run_file_path, 'r') as last_run_file: + run_date_str = last_run_file.readline() + run_date = datetime.datetime.strptime(run_date_str, '%Y-%m-%d') + datetime.timedelta(days=1) + run_date = run_date.date() + else: + run_date = datetime.date.today() - 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) + while run_date <= datetime.date.today(): + ref_date = run_date + datetime.timedelta(days=2) + with open('tasks.yml', 'r') as content_file: + tasks_conf = load(content_file.read(), Loader=FullLoader) - if task_list: - server = conf['dav_server'] - client = Client(server['url'], server['user'], server['pass'], server['calendar']) - previous_tasks = client.todos(include_completed=True) - for task in task_list: - if not client.get_todo_by_uid(task.uid): - # Removing previous completed tasks - for t in previous_tasks: - if t.icalendar_component.get('uid').startswith(f"{APP_ID}-{task.name}")\ - and t.icalendar_component.get('status') == 'COMPLETED': - t.delete() + 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) - client.add_todo(task) + if task_list: + server = conf['dav_server'] + client = Client(server['url'], server['user'], server['pass'], server['calendar']) + previous_tasks = client.todos(include_completed=True) + for task in task_list: + if not client.get_todo_by_uid(task.uid): + # Removing previous completed tasks + for t in previous_tasks: + if t.icalendar_component.get('uid').startswith(f"{APP_ID}-{task.name}")\ + and t.icalendar_component.get('status') == 'COMPLETED': + t.delete() - print('process finished: {} tasks created'.format(len(task_list))) + client.add_todo(task) + + print('process finished for date {}: {} tasks created\n'.format(run_date, len(task_list))) + run_date = run_date + datetime.timedelta(days=1) + + with open(last_run_file_path, 'w') as last_run_file: + last_run_file.write(str(datetime.date.today()))