X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/238c0ba7d462d67f8b847bee06233a7fd20893c4..1225677a596f1c36eb54ed15459ac9a40f0233e2:/tasklib/task.py diff --git a/tasklib/task.py b/tasklib/task.py index 6ebee4c..c97aee8 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -13,6 +13,9 @@ DATE_FORMAT = '%Y%m%dT%H%M%SZ' REPR_OUTPUT_SIZE = 10 PENDING = 'pending' COMPLETED = 'completed' +DELETED = 'deleted' +WAITING = 'waiting' +RECURRING = 'recurring' logger = logging.getLogger(__name__) @@ -165,98 +168,10 @@ class TaskAnnotation(TaskResource): # their data dics are the same return self.task == other.task and self._data == other._data - __repr__ = __unicode__ - - -class LazyUUIDTask(object): - """ - A lazy wrapper around Task object, referenced by UUID. - - - Supports comparison with LazyUUIDTask or Task objects (equality by UUIDs) - - If any attribute other than 'uuid' requested, a lookup in the - backend will be performed and this object will be replaced by a proper - Task object. - """ - - def __init__(self, tw, uuid): - self._tw = tw - self._uuid = uuid - - def __getitem__(self, key): - # LazyUUIDTask does not provide anything else other than 'uuid' - if key is 'uuid': - return self._uuid - else: - self.replace() - return self[key] - - def __getattr__(self, name): - # Getattr is called only if the attribute could not be found using - # normal means - self.replace() - return self.name - - def __eq__(self, other): - if other['uuid']: - # For saved Tasks, just define equality by equality of uuids - return self['uuid'] == other['uuid'] - - def __hash__(self): - return self['uuid'].__hash__() - - def replace(self): - """ - Performs conversion to the regular Task object, referenced by the - stored UUID. - """ - - replacement = self._tw.tasks.get(uuid=self._uuid) - self.__class__ = replacement.__class__ - self.__dict__ = replacement.__dict__ - - -class LazyUUIDTaskSet(object): - """ - A lazy wrapper around TaskQuerySet object, for tasks referenced by UUID. + def __ne__(self, other): + return not self.__eq__(other) - - Supports 'in' operator with LazyUUIDTask or Task objects - - If iteration over the objects in the LazyUUIDTaskSet is requested, the - LazyUUIDTaskSet will be converted to QuerySet and evaluated - """ - - def __init__(self, tw, uuids): - self._tw = tw - self._uuids = set(uuids) - - def __getattr__(self, name): - # Getattr is called only if the attribute could not be found using - # normal means - self.replace() - return self.name - - def __eq__(self, other): - return set(t['uuid'] for t in other) == self._uuids - - def __contains__(self, task): - return task['uuid'] in self._uuids - - def __len__(self): - return len(self._uuids) - - def __iter__(self): - self.replace() - for task in self: - yield task - - def replace(self): - """ - Performs conversion to the regular TaskQuerySet object, referenced by - the stored UUIDs. - """ - - replacement = self._tw.tasks.filter(' '.join(self._uuids)) - self.__class__ = replacement.__class__ - self.__dict__ = replacement.__dict__ + __repr__ = __unicode__ class Task(TaskResource): @@ -368,6 +283,9 @@ class Task(TaskResource): # If the tasks are not saved, compare the actual instances return id(self) == id(other) + def __ne__(self, other): + return not self.__eq__(other) + def __hash__(self): if self['uuid']: # For saved Tasks, just define equality by equality of uuids @@ -392,6 +310,10 @@ class Task(TaskResource): def pending(self): return self['status'] == six.text_type('pending') + @property + def recurring(self): + return self['status'] == six.text_type('recurring') + @property def active(self): return self['start'] is not None @@ -411,7 +333,8 @@ class Task(TaskResource): def delete(self): if not self.saved: - raise Task.NotSaved("Task needs to be saved before it can be deleted") + raise Task.NotSaved( + "Task needs to be saved before it can be deleted") # Refresh the status, and raise exception if the task is deleted self.refresh(only_fields=['status']) @@ -426,7 +349,8 @@ class Task(TaskResource): def start(self): if not self.saved: - raise Task.NotSaved("Task needs to be saved before it can be started") + raise Task.NotSaved( + "Task needs to be saved before it can be started") # Refresh, and raise exception if task is already completed/deleted self.refresh(only_fields=['status']) @@ -445,7 +369,8 @@ class Task(TaskResource): def stop(self): if not self.saved: - raise Task.NotSaved("Task needs to be saved before it can be stopped") + raise Task.NotSaved( + "Task needs to be saved before it can be stopped") # Refresh, and raise exception if task is already completed/deleted self.refresh(only_fields=['status']) @@ -460,7 +385,8 @@ class Task(TaskResource): def done(self): if not self.saved: - raise Task.NotSaved("Task needs to be saved before it can be completed") + raise Task.NotSaved( + "Task needs to be saved before it can be completed") # Refresh, and raise exception if task is already completed/deleted self.refresh(only_fields=['status']) @@ -595,6 +521,15 @@ class TaskQuerySet(object): def completed(self): return self.filter(status=COMPLETED) + def deleted(self): + return self.filter(status=DELETED) + + def waiting(self): + return self.filter(status=WAITING) + + def recurring(self): + return self.filter(status=RECURRING) + def filter(self, *args, **kwargs): """ Returns a new TaskQuerySet with the given filters added.