diff --git a/README.md b/README.md index b461316..b6c00cd 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,7 @@ -task-recurring-delete ---------------------- -Delete all overdue, recurring and duplicate taskwarrior tasks and keep only the -first of a kind. - -task-recurring-postpone ------------------------ +# task-recurring-postpone Postpone recurring task dupes to tomorrow and keep only two per parent task.
-Need the taskw Python bindings to run. These are workarounds for this issue: -https://bug.tasktools.org/browse/TW-1314. +Needs the taskw Python bindings to run (`pip install -r requirements.txt`) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..55ddadf --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +taskw diff --git a/task-recurring-delete b/task-recurring-delete deleted file mode 100755 index 24a8538..0000000 --- a/task-recurring-delete +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 -# Delete all overdue, recurring & duplicate taskwarrior tasks and keep only the -# first of a kind. -# -# Needs the taskw Python bindings to run. - -__requires__ = ["taskw >= 0.8.3"] -import pkg_resources - -from subprocess import Popen, PIPE, STDOUT -from uuid import UUID - -import collections -import datetime -import os -import pytz -import taskw - - -def task_delete(uuid): - """Delete the given task.""" - - assert isinstance(uuid, UUID) - - # This is somewhat a hack, but as TaskWwarrior 2.4.0 does NOT disable - # the 'Do you want to delete all pending recurrences ...' confirmation - # on rc.confirmation=off, so this is necessary. - DEVNULL = open(os.devnull, 'wb') - p = Popen(['task', 'rc.confirmation=off', str(uuid), 'delete'], - stdin=PIPE, stdout=DEVNULL, stderr=STDOUT) - p.communicate(input=bytes('no', 'UTF-8')) - - -w = taskw.TaskWarrior(marshal=True) -tasks = w.load_tasks() - - -# Only (over-)due and recurring tasks are considered for deletion: -due_before = datetime.datetime.utcnow() -due_before = due_before.replace(tzinfo=pytz.utc) -recurring_tasks_due = [task for task in tasks['pending'] - if 'recur' in task - and 'parent' in task - and 'due' in task and task['due'] < due_before] - -# Delete all but the first of all (over-)due and duplicate tasks: -parents = collections.Counter([task['parent'] - for task in recurring_tasks_due]) -for parent in parents: - count = parents[parent] - if count > 1: - dupe_tasks = [task for task in recurring_tasks_due - if task['parent'] == parent] - dupe_tasks = sorted(dupe_tasks, key=lambda t: t['due']) - - dupe_tasks_to_keep = dupe_tasks[0:1] - dupe_tasks_to_trash = dupe_tasks[1:] - - print('Deleting {} duplicate due tasks: "{}"'.format( - len(dupe_tasks_to_trash), dupe_tasks_to_trash[0]['description'])) - for task in dupe_tasks_to_trash: - task_delete(task['uuid'])