X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/2075cf84f9472e28f3229351c85cb1086dd713c1..65a1431e753fccbbc735a58491b395070081dc8a:/tasklib/task.py diff --git a/tasklib/task.py b/tasklib/task.py index e448b04..b9103d1 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -11,6 +11,7 @@ import subprocess import tzlocal DATE_FORMAT = '%Y%m%dT%H%M%SZ' +DATE_FORMAT_CALC = '%Y-%m-%dT%H:%M:%S' REPR_OUTPUT_SIZE = 10 PENDING = 'pending' COMPLETED = 'completed' @@ -88,6 +89,9 @@ class SerializingObject(object): to raise ValueError. """ + def __init__(self, warrior): + self.warrior = warrior + def _deserialize(self, key, value): hydrate_func = getattr(self, 'deserialize_{0}'.format(key), lambda x: x if x != '' else None) @@ -250,13 +254,26 @@ class SerializingObject(object): # Convert to local midnight value_full = datetime.datetime.combine(value, datetime.time.min) localized = local_zone.localize(value_full) - elif isinstance(value, datetime.datetime) and value.tzinfo is None: - # Convert to localized datetime object - localized = local_zone.localize(value) + elif isinstance(value, datetime.datetime): + if value.tzinfo is None: + # Convert to localized datetime object + localized = local_zone.localize(value) + else: + # If the value is already localized, there is no need to change + # time zone at this point. Also None is a valid value too. + localized = value + elif (isinstance(value, six.string_types) + and self.warrior.version > VERSION_2_4_0): + # For strings, use 'task calc' to evaluate the string to datetime + # available since TW 2.4.0 + args = value.split() + result = self.warrior.execute_command(['calc'] + args) + naive = datetime.datetime.strptime(result[0], DATE_FORMAT_CALC) + localized = local_zone.localize(naive) else: - # If the value is already localized, there is no need to change - # time zone at this point. Also None is a valid value too. - localized = value + raise ValueError("Provided value could not be converted to " + "datetime, its type is not supported: {}" + .format(type(value))) return localized @@ -364,6 +381,7 @@ class TaskAnnotation(TaskResource): def __init__(self, task, data={}): self.task = task self._load_data(data) + super(TaskAnnotation, self).__init__(task.warrior) def remove(self): self.task.remove_annotation(self) @@ -444,7 +462,7 @@ class Task(TaskResource): return task def __init__(self, warrior, **kwargs): - self.warrior = warrior + super(Task, self).__init__(warrior) # Check that user is not able to set read-only value in __init__ for key in kwargs.keys(): @@ -690,8 +708,9 @@ class TaskFilter(SerializingObject): A set of parameters to filter the task list with. """ - def __init__(self, filter_params=[]): + def __init__(self, warrior, filter_params=[]): self.filter_params = filter_params + super(TaskFilter, self).__init__(warrior) def add_filter(self, filter_str): self.filter_params.append(filter_str) @@ -726,7 +745,7 @@ class TaskFilter(SerializingObject): return [f for f in self.filter_params if f] def clone(self): - c = self.__class__() + c = self.__class__(self.warrior) c.filter_params = list(self.filter_params) return c @@ -739,7 +758,7 @@ class TaskQuerySet(object): def __init__(self, warrior=None, filter_obj=None): self.warrior = warrior self._result_cache = None - self.filter_obj = filter_obj or TaskFilter() + self.filter_obj = filter_obj or TaskFilter(warrior) def __deepcopy__(self, memo): """