From: Tomas Babej Date: Fri, 19 Dec 2014 01:17:43 +0000 (+0100) Subject: Task: Perform done and deleted operations only when necessary X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/commitdiff_plain/72a0095b972ed123f89667af80e112f8135222c2?ds=sidebyside;hp=--cc Task: Perform done and deleted operations only when necessary --- 72a0095b972ed123f89667af80e112f8135222c2 diff --git a/tasklib/task.py b/tasklib/task.py index 491a374..c72a9b3 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -76,6 +76,18 @@ class Task(TaskResource): class DoesNotExist(Exception): pass + class CompletedTask(Exception): + """ + Raised when the operation cannot be performed on the completed task. + """ + pass + + class DeletedTask(Exception): + """ + Raised when the operation cannot be performed on the deleted task. + """ + pass + def __init__(self, warrior, data={}): self.warrior = warrior self._load_data(data) @@ -84,6 +96,22 @@ class Task(TaskResource): def __unicode__(self): return self['description'] + @property + def completed(self): + return self['status'] == six.text_type('completed') + + @property + def deleted(self): + return self['status'] == six.text_type('deleted') + + @property + def waiting(self): + return self['status'] == six.text_type('waiting') + + @property + def pending(self): + return self['status'] == six.text_type('pending') + def serialize_due(self, date): return date.strftime(DATE_FORMAT) @@ -104,13 +132,34 @@ class Task(TaskResource): return ','.join(tags) if tags else '' def delete(self): + # Refresh the status, and raise exception if the task is deleted + self.refresh(only_fields=['status']) + + if self.deleted: + raise self.DeletedTask("Task was already deleted") + self.warrior.execute_command([self['id'], 'delete'], config_override={ 'confirmation': 'no', }) + # Refresh the status again, so that we have updated info stored + self.refresh(only_fields=['status']) + + def done(self): + # Refresh, and raise exception if task is already completed/deleted + self.refresh(only_fields=['status']) + + if self.completed: + raise self.CompletedTask("Cannot complete a completed task") + elif self.deleted: + raise self.DeletedTask("Deleted task cannot be completed") + self.warrior.execute_command([self['id'], 'done']) + # Refresh the status again, so that we have updated info stored + self.refresh(only_fields=['status']) + def save(self): args = [self['id'], 'modify'] if self['id'] else ['add'] args.extend(self._get_modified_fields_as_args())