]>
git.madduck.net Git - etc/taskwarrior.git/blobdiff - tasklib/task.py
madduck's git repository
Every one of the projects in this repository is available at the canonical
URL git://git.madduck.net/madduck/pub/<projectpath> — see
each project's metadata for the exact URL.
All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@ git. madduck. net .
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
SSH access, as well as push access can be individually
arranged .
If you use my repositories frequently, consider adding the following
snippet to ~/.gitconfig and using the third clone URL listed for each
project:
[url "git://git.madduck.net/madduck/"]
insteadOf = madduck:
return ','.join(task['uuid'] for task in value)
def deserialize_depends(self, raw_uuids):
return ','.join(task['uuid'] for task in value)
def deserialize_depends(self, raw_uuids):
- raw_uuids = raw_uuids or '' # Convert None to empty string
- uuids = raw_uuids.split(',')
+ raw_uuids = raw_uuids or [] # Convert None to empty list
+
+ # TW 2.4.4 encodes list of dependencies as a single string
+ if type(raw_uuids) is not list:
+ uuids = raw_uuids.split(',')
+ # TW 2.4.5 and later exports them as a list, no conversion needed
+ else:
+ uuids = raw_uuids
+
return set(self.warrior.tasks.get(uuid=uuid) for uuid in uuids if uuid)
def datetime_normalizer(self, value):
return set(self.warrior.tasks.get(uuid=uuid) for uuid in uuids if uuid)
def datetime_normalizer(self, value):
"task: %s" % '\n'.join(id_lines))
# Circumvent the ID storage, since ID is considered read-only
"task: %s" % '\n'.join(id_lines))
# Circumvent the ID storage, since ID is considered read-only
- self._data['id'] = int(id_lines[0].split(' ')[2].rstrip('.'))
+ 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
# Refreshing is very important here, as not only modification time
# is updated, but arbitrary attribute may have changed due hooks
# of newly saved tasks. Any other place in the code is fine
# with using UUID only.
args = [self['uuid'] or self['id'], 'export']
# of newly saved tasks. Any other place in the code is fine
# with using UUID only.
args = [self['uuid'] or self['id'], 'export']
+ output = self.warrior.execute_command(args)
+
+ # If more than 1 task has been matched, raise exception
+ if len(output) > 1:
+ raise TaskWarriorException(
+ "Unique identifier {0} matches multiple tasks: {1}".format(
+ self['uuid'] or self['id'], output))
+
new_data = json.loads(self.warrior.execute_command(args)[0])
if only_fields:
to_update = dict(
new_data = json.loads(self.warrior.execute_command(args)[0])
if only_fields:
to_update = dict(