From: Tomas Babej Date: Thu, 24 Dec 2015 09:19:57 +0000 (+0100) Subject: task: Add LazyUUIDTask object X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/commitdiff_plain/710d5afab2bce3b087d4be58b9cb60f6facccd30?ds=sidebyside task: Add LazyUUIDTask object --- diff --git a/tasklib/task.py b/tasklib/task.py index 5eabc65..faf6604 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -168,6 +168,53 @@ class TaskAnnotation(TaskResource): __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 Task(TaskResource): read_only_fields = ['id', 'entry', 'urgency', 'uuid', 'modified']