import sys
import tzlocal
-from backends import TaskWarrior
+from backends import TaskWarrior, TaskWarriorException
DATE_FORMAT = '%Y%m%dT%H%M%SZ'
DATE_FORMAT_CALC = '%Y-%m-%dT%H:%M:%S'
local_zone = tzlocal.get_localzone()
-class TaskWarriorException(Exception):
- pass
-
-
class ReadOnlyDictView(object):
"""
Provides simplified read-only view upon dict object.
if self.deleted:
raise Task.DeletedTask("Task was already deleted")
- self.warrior.execute_command([self['uuid'], 'delete'])
+ self.backend.delete_task(self)
# Refresh the status again, so that we have updated info stored
self.refresh(only_fields=['status', 'start', 'end'])
elif self.active:
raise Task.ActiveTask("Task is already active")
- self.warrior.execute_command([self['uuid'], 'start'])
+ self.backend.start_task(self)
# Refresh the status again, so that we have updated info stored
self.refresh(only_fields=['status', 'start'])
if not self.active:
raise Task.InactiveTask("Cannot stop an inactive task")
- self.warrior.execute_command([self['uuid'], 'stop'])
+ self.backend.stop_task(self)
# Refresh the status again, so that we have updated info stored
self.refresh(only_fields=['status', 'start'])
elif self.deleted:
raise Task.DeletedTask("Deleted task cannot be completed")
- # Older versions of TW do not stop active task at completion
- if self.warrior.version < VERSION_2_4_0 and self.active:
- self.stop()
-
- self.warrior.execute_command([self['uuid'], 'done'])
+ self.backend.complete_task(self)
# Refresh the status again, so that we have updated info stored
self.refresh(only_fields=['status', 'start', 'end'])
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: