From 72bbb2d0918a56833385938654cc575fbf5af735 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 8 Aug 2015 19:40:48 +0200 Subject: [PATCH] Task: Move TW-specific saving logic into the backend --- tasklib/backends.py | 31 +++++++++++++++++++++++++++++++ tasklib/task.py | 29 ++--------------------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/tasklib/backends.py b/tasklib/backends.py index f817d4f..a4d074e 100644 --- a/tasklib/backends.py +++ b/tasklib/backends.py @@ -159,6 +159,37 @@ class TaskWarrior(object): raise TaskWarriorException('Invalid JSON: %s' % data) return tasks + def save_task(self, task): + """Save a task into TaskWarrior database using add/modify call""" + + args = [task['uuid'], 'modify'] if task.saved else ['add'] + args.extend(task._get_modified_fields_as_args()) + output = self.execute_command(args) + + # Parse out the new ID, if the task is being added for the first time + if not task.saved: + id_lines = [l for l in output if l.startswith('Created task ')] + + # Complain loudly if it seems that more tasks were created + # Should not happen + if len(id_lines) != 1 or len(id_lines[0].split(' ')) != 3: + raise TaskWarriorException("Unexpected output when creating " + "task: %s" % '\n'.join(id_lines)) + + # Circumvent the ID storage, since ID is considered read-only + identifier = id_lines[0].split(' ')[2].rstrip('.') + + # Identifier can be either ID or UUID for completed tasks + try: + task._data['id'] = int(identifier) + except ValueError: + task._data['uuid'] = identifier + + # Refreshing is very important here, as not only modification time + # is updated, but arbitrary attribute may have changed due hooks + # altering the data before saving + task.refresh(after_save=True) + def merge_with(self, path, push=False): path = path.rstrip('/') + '/' self.execute_command(['merge', path], config_override={ diff --git a/tasklib/task.py b/tasklib/task.py index 4f10b9d..7c6dff8 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -650,33 +650,8 @@ class Task(TaskResource): if self.saved and not self.modified: return - args = [self['uuid'], 'modify'] if self.saved else ['add'] - args.extend(self._get_modified_fields_as_args()) - output = self.warrior.execute_command(args) - - # Parse out the new ID, if the task is being added for the first time - if not self.saved: - id_lines = [l for l in output if l.startswith('Created task ')] - - # Complain loudly if it seems that more tasks were created - # Should not happen - if len(id_lines) != 1 or len(id_lines[0].split(' ')) != 3: - raise TaskWarriorException("Unexpected output when creating " - "task: %s" % '\n'.join(id_lines)) - - # Circumvent the ID storage, since ID is considered read-only - identifier = id_lines[0].split(' ')[2].rstrip('.') - - # Identifier can be either ID or UUID for completed tasks - try: - self._data['id'] = int(identifier) - except ValueError: - self._data['uuid'] = identifier - - # Refreshing is very important here, as not only modification time - # is updated, but arbitrary attribute may have changed due hooks - # altering the data before saving - self.refresh(after_save=True) + # All the actual work is done by the backend + self.backend.save_task(self) def add_annotation(self, annotation): if not self.saved: -- 2.39.2