]> git.madduck.net Git - etc/taskwarrior.git/blobdiff - tasklib/task.py

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

TaskResource: Move some Task non-specigic methods to TaskResource
[etc/taskwarrior.git] / tasklib / task.py
index 8ee77fd7215d3c7b8a88ecfe9ac3a4bbc37865e8..f482f5327f2d1201101cba6d4f7e83b11533edde 100644 (file)
@@ -110,9 +110,10 @@ class SerializingObject(object):
             return tags.split(',') if tags else []
         return tags or []
 
-    def serialize_depends(self, cur_dependencies):
+    def serialize_depends(self, value):
         # Return the list of uuids
-        return ','.join(task['uuid'] for task in cur_dependencies)
+        value = value if value is not None else set()
+        return ','.join(task['uuid'] for task in value)
 
     def deserialize_depends(self, raw_uuids):
         raw_uuids = raw_uuids or ''  # Convert None to empty string
@@ -171,6 +172,40 @@ class TaskResource(SerializingObject):
     def __repr__(self):
         return str(self)
 
+    def export_data(self):
+        """
+        Exports current data contained in the Task as JSON
+        """
+
+        # We need to remove spaces for TW-1504, use custom separators
+        data_tuples = ((key, self._serialize(key, value))
+                       for key, value in six.iteritems(self._data))
+
+        # Empty string denotes empty serialized value, we do not want
+        # to pass that to TaskWarrior.
+        data_tuples = filter(lambda t: t[1] is not '', data_tuples)
+        data = dict(data_tuples)
+        return json.dumps(data, separators=(',',':'))
+
+    @property
+    def _modified_fields(self):
+        writable_fields = set(self._data.keys()) - set(self.read_only_fields)
+        for key in writable_fields:
+            new_value = self._data.get(key)
+            old_value = self._original_data.get(key)
+
+            # Make sure not to mark data removal as modified field if the
+            # field originally had some empty value
+            if key in self._data and not new_value and not old_value:
+                continue
+
+            if new_value != old_value:
+                yield key
+
+    @property
+    def modified(self):
+        return bool(list(self._modified_fields))
+
 
 class TaskAnnotation(TaskResource):
     read_only_fields = ['entry', 'description']
@@ -288,25 +323,6 @@ class Task(TaskResource):
             # If the tasks are not saved, return hash of instance id
             return id(self).__hash__()
 
-    @property
-    def _modified_fields(self):
-        writable_fields = set(self._data.keys()) - set(self.read_only_fields)
-        for key in writable_fields:
-            new_value = self._data.get(key)
-            old_value = self._original_data.get(key)
-
-            # Make sure not to mark data removal as modified field if the
-            # field originally had some empty value
-            if key in self._data and not new_value and not old_value:
-                continue
-
-            if new_value != old_value:
-                yield key
-
-    @property
-    def modified(self):
-        return bool(list(self._modified_fields))
-
     @property
     def completed(self):
         return self['status'] == six.text_type('completed')
@@ -329,7 +345,7 @@ class Task(TaskResource):
 
     def serialize_depends(self, cur_dependencies):
         # Check that all the tasks are saved
-        for task in cur_dependencies:
+        for task in (cur_dependencies or set()):
             if not task.saved:
                 raise Task.NotSaved('Task \'%s\' needs to be saved before '
                                     'it can be set as dependency.' % task)
@@ -493,21 +509,6 @@ class Task(TaskResource):
         else:
             self._load_data(new_data)
 
-    def export_data(self):
-        """
-        Exports current data contained in the Task as JSON
-        """
-
-        # We need to remove spaces for TW-1504, use custom separators
-        data_tuples = ((key, self._serialize(key, value))
-                       for key, value in six.iteritems(self._data))
-
-        # Empty string denotes empty serialized value, we do not want
-        # to pass that to TaskWarrior.
-        data_tuples = filter(lambda t: t[1] is not '', data_tuples)
-        data = dict(data_tuples)
-        return json.dumps(data, separators=(',',':'))
-
 class TaskFilter(SerializingObject):
     """
     A set of parameters to filter the task list with.
@@ -669,7 +670,8 @@ class TaskWarrior(object):
         self.config = {
             'data.location': os.path.expanduser(data_location),
             'confirmation': 'no',
-            'dependency.confirmation': 'no', # See TW-1483 or taskrc man page
+            'dependency.confirmation': 'no',  # See TW-1483 or taskrc man page
+            'recurrence.confirmation': 'no',  # Necessary for modifying R tasks
         }
         self.tasks = TaskQuerySet(self)
         self.version = self._get_version()