import abc
+import datetime
import json
import os
import re
+import six
import subprocess
-from tasklib.filters import TaskWarriorFilter
+from .task import Task, TaskQuerySet
+from .filters import TaskWarriorFilter
+from .serializing import local_zone
+
+DATE_FORMAT_CALC = '%Y-%m-%dT%H:%M:%S'
VERSION_2_1_0 = six.u('2.1.0')
VERSION_2_2_0 = six.u('2.2.0')
class Backend(object):
- filter_class = TaskWarriorFilter
+ @abc.abstractproperty
+ def filter_class(self):
+ """Returns the TaskFilter class used by this backend"""
+ pass
@abc.abstractmethod
def filter_tasks(self, filter_obj):
"""Syncs the backend database with the taskd server"""
pass
+ def convert_datetime_string(self, value):
+ """
+ Converts TW syntax datetime string to a localized datetime
+ object. This method is not mandatory.
+ """
+ raise NotImplemented
+
class TaskWarriorException(Exception):
pass
else:
return six.u("description:'{0}'").format(task._data['description'] or '')
+ def convert_datetime_string(self, value):
+
+ if self.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.execute_command(['calc'] + args)
+ naive = datetime.datetime.strptime(result[0], DATE_FORMAT_CALC)
+ localized = local_zone.localize(naive)
+ else:
+ raise ValueError("Provided value could not be converted to "
+ "datetime, its type is not supported: {}"
+ .format(type(value)))
+
+ @property
+ def filter_class(self):
+ return TaskWarriorFilter
# Public interface