X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/a6041bc2eac63c34e304e97f280c00586d143742..516b8d6c03058552cfe7c3bfda4362640a3077e1:/tasklib/backends.py diff --git a/tasklib/backends.py b/tasklib/backends.py index fa5ce86..4b0c6df 100644 --- a/tasklib/backends.py +++ b/tasklib/backends.py @@ -7,7 +7,6 @@ import os import re import six import subprocess -import copy from .task import Task, TaskQuerySet, ReadOnlyDictView from .filters import TaskWarriorFilter @@ -76,7 +75,7 @@ class Backend(object): Converts TW syntax datetime string to a localized datetime object. This method is not mandatory. """ - raise NotImplemented + raise NotImplementedError class TaskWarriorException(Exception): @@ -133,7 +132,7 @@ class TaskWarrior(Backend): overrides.update(config_override or dict()) for item in overrides.items(): command_args.append('rc.{0}={1}'.format(*item)) - command_args.extend(map(six.text_type, args)) + command_args.extend([x.decode('utf-8') for x in args]) return command_args def _get_version(self): @@ -172,11 +171,17 @@ class TaskWarrior(Backend): 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(): + # We cannot set stuff that's read only (ID, UUID, ..) if field in task.read_only_fields: continue + # We do not want to do field deletion for new tasks + if task._data[field] is None: + continue + # Otherwise we're fine add_field(field) return args @@ -259,7 +264,8 @@ class TaskWarrior(Backend): return_all=False): command_args = self._get_command_args( args, config_override=config_override) - logger.debug(' '.join(command_args)) + logger.debug(u' '.join(command_args)) + p = subprocess.Popen(command_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = [x.decode('utf-8') for x in p.communicate()] @@ -268,6 +274,7 @@ class TaskWarrior(Backend): error_msg = stderr.strip() else: error_msg = stdout.strip() + error_msg += u'\nCommand used: ' + u' '.join(command_args) raise TaskWarriorException(error_msg) # Return all whole triplet only if explicitly asked for @@ -299,7 +306,7 @@ class TaskWarrior(Backend): def filter_tasks(self, filter_obj): self.enforce_recurrence() - args = ['export', '--'] + filter_obj.get_filter_params() + args = ['export'] + filter_obj.get_filter_params() tasks = [] for line in self.execute_command(args): if line: @@ -324,8 +331,10 @@ class TaskWarrior(Backend): 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: + # Should not happen. + # Expected output: Created task 1. + # Created task 1 (recurrence template). + if len(id_lines) != 1 or len(id_lines[0].split(' ')) not in (3, 5): raise TaskWarriorException("Unexpected output when creating " "task: %s" % '\n'.join(id_lines)) @@ -393,7 +402,7 @@ class TaskWarrior(Backend): for key, value in data.items(): taskfilter.add_filter_param(key, value) - output = self.execute_command(['export', '--'] + + output = self.execute_command(['export'] + taskfilter.get_filter_params()) # If more than 1 task has been matched still, raise an exception