+import datetime
+import importlib
+import json
+import pytz
+import six
+import tzlocal
+
+
+from .lazy import LazyUUIDTaskSet
+
+DATE_FORMAT = '%Y%m%dT%H%M%SZ'
+local_zone = tzlocal.get_localzone()
+
+
class SerializingObject(object):
"""
Common ancestor for TaskResource & TaskWarriorFilter, since they both
to raise ValueError.
"""
- def __init__(self, warrior):
- self.warrior = warrior
+ def __init__(self, backend):
+ self.backend = backend
def _deserialize(self, key, value):
hydrate_func = getattr(self, 'deserialize_{0}'.format(key),
return serialized_annotations if serialized_annotations else ''
def deserialize_annotations(self, data):
+ task_module = importlib.import_module('tasklib.task')
+ TaskAnnotation = getattr(task_module, 'TaskAnnotation')
return [TaskAnnotation(self, d) for d in data] if data else []
def serialize_tags(self, tags):
def deserialize_tags(self, tags):
if isinstance(tags, six.string_types):
- return tags.split(',') if tags else []
- return tags or []
+ return set(tags.split(',')) if tags else set()
+ return set(tags or [])
def serialize_depends(self, value):
# Return the list of uuids
value = value if value is not None else set()
- return ','.join(task['uuid'] for task in value)
+
+ if isinstance(value, LazyUUIDTaskSet):
+ return ','.join(value._uuids)
+ else:
+ return ','.join(task['uuid'] for task in value)
def deserialize_depends(self, raw_uuids):
raw_uuids = raw_uuids or [] # Convert None to empty list
+ if not raw_uuids:
+ return set()
+
# TW 2.4.4 encodes list of dependencies as a single string
if type(raw_uuids) is not list:
uuids = raw_uuids.split(',')
else:
uuids = raw_uuids
- return set(self.warrior.tasks.get(uuid=uuid) for uuid in uuids if uuid)
+ return LazyUUIDTaskSet(self.backend, uuids)
def datetime_normalizer(self, value):
"""
localized datetime -> localized datetime (no conversion)
"""
- if (isinstance(value, datetime.date)
- and not isinstance(value, datetime.datetime)):
+ if (
+ isinstance(value, datetime.date)
+ and not isinstance(value, datetime.datetime)
+ ):
# Convert to local midnight
value_full = datetime.datetime.combine(value, datetime.time.min)
localized = local_zone.localize(value_full)
# 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)
+ elif isinstance(value, six.string_types):
+ localized = self.backend.convert_datetime_string(value)
else:
raise ValueError("Provided value could not be converted to "
"datetime, its type is not supported: {}"
"not: {}".format(value))
return value
-
-