From fda5cf272018a0596c3ea97c9d4658cf0b5fa048 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 8 Aug 2015 23:22:38 +0200 Subject: [PATCH] Task: Conversion of modified fields to TW Cli args is TW-specific, move to backend --- tasklib/backends.py | 39 ++++++++++++++++++++++++++++++++++++++- tasklib/task.py | 36 ------------------------------------ 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/tasklib/backends.py b/tasklib/backends.py index f0c73ef..38b88b1 100644 --- a/tasklib/backends.py +++ b/tasklib/backends.py @@ -121,6 +121,43 @@ class TaskWarrior(object): stdout, stderr = [x.decode('utf-8') for x in p.communicate()] return stdout.strip('\n') + def _get_modified_task_fields_as_args(self, task): + args = [] + + def add_field(field): + # Add the output of format_field method to args list (defaults to + # field:value) + serialized_value = task._serialize(field, task._data[field]) + + # Empty values should not be enclosed in quotation marks, see + # TW-1510 + if serialized_value is '': + escaped_serialized_value = '' + else: + escaped_serialized_value = six.u("'{0}'").format(serialized_value) + + format_default = lambda: six.u("{0}:{1}").format(field, + escaped_serialized_value) + + format_func = getattr(task, 'format_{0}'.format(field), + format_default) + + args.append(format_func()) + + # If we're modifying saved task, simply pass on all modified fields + if task.saved: + for field in task._modified_fields: + add_field(field) + # For new tasks, pass all fields that make sense + else: + for field in task._data.keys(): + if field in task.read_only_fields: + continue + add_field(field) + + return args + + def get_config(self): raw_output = self.execute_command( ['show'], @@ -198,7 +235,7 @@ class TaskWarrior(object): """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()) + args.extend(self._get_modified_task_fields_as_args(task)) output = self.execute_command(args) # Parse out the new ID, if the task is being added for the first time diff --git a/tasklib/task.py b/tasklib/task.py index 9ae63d4..081646d 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -666,42 +666,6 @@ class Task(TaskResource): self.backend.denotate_task(self, annotation) self.refresh(only_fields=['annotations']) - def _get_modified_fields_as_args(self): - args = [] - - def add_field(field): - # Add the output of format_field method to args list (defaults to - # field:value) - serialized_value = self._serialize(field, self._data[field]) - - # Empty values should not be enclosed in quotation marks, see - # TW-1510 - if serialized_value is '': - escaped_serialized_value = '' - else: - escaped_serialized_value = six.u("'{0}'").format(serialized_value) - - format_default = lambda: six.u("{0}:{1}").format(field, - escaped_serialized_value) - - format_func = getattr(self, 'format_{0}'.format(field), - format_default) - - args.append(format_func()) - - # If we're modifying saved task, simply pass on all modified fields - if self.saved: - for field in self._modified_fields: - add_field(field) - # For new tasks, pass all fields that make sense - else: - for field in self._data.keys(): - if field in self.read_only_fields: - continue - add_field(field) - - return args - def refresh(self, only_fields=None, after_save=False): # Raise error when trying to refresh a task that has not been saved if not self.saved: -- 2.39.2