Taking in changes from other projects
[doneit] / src / cache_backend.py
index 17294d4..0e4afcb 100644 (file)
@@ -1,4 +1,9 @@
-class CacheBackend(object):
+"""
+@todo Write and eager cache which will then, combined with file_backend, will be the basis of sync
+"""
+
+
+class LazyCacheBackend(object):
 
        def __init__(self, backend):
                self._backend = backend
@@ -15,8 +20,9 @@ class CacheBackend(object):
                self._backend.load()
 
        def add_project(self, name):
-               self._backend.add_project(name)
+               projId = self._backend.add_project(name)
                self._invalidate_projects()
+               return projId
 
        def set_project_name(self, projId, name):
                self._backend.set_project_name(projId, name)
@@ -53,7 +59,7 @@ class CacheBackend(object):
 
        def get_tasks_with_details(self, projId):
                self._populate_tasks(projId)
-               return self._items[projId]
+               return self._items[projId].itervalues()
 
        def get_task_details(self, taskId):
                projId = self._taskIdToProjId[taskId]
@@ -61,9 +67,11 @@ class CacheBackend(object):
                return self._items[projId][taskId]
 
        def add_task(self, projId, taskName):
-               self._backend.add_task(projId, taskName)
+               taskId = self._backend.add_task(projId, taskName)
                self._invalidate_projects_tasks(projId)
                self._invalidate_metaprojects_tasks()
+               self._taskIdToProjId[taskId] = projId
+               return taskId
 
        def set_project(self, taskId, newProjId):
                self._backend.set_project(taskId, newProjId)
@@ -89,8 +97,9 @@ class CacheBackend(object):
                self._invalidate_task(taskId)
 
        def add_note(self, taskId, noteTitle, noteBody):
-               self._backend.add_note(taskId, noteTitle, noteBody)
+               noteId = self._backend.add_note(taskId, noteTitle, noteBody)
                self._invalidate_task(taskId)
+               return noteId
 
        def update_note(self, noteId, noteTitle, noteBody):
                self._backend.update_note(noteId, noteTitle, noteBody)
@@ -105,6 +114,7 @@ class CacheBackend(object):
 
        def _populate_projects(self):
                if self._projects:
+                       print "SAVED BY THE CACHE"
                        return
                self._projects = dict((
                        (proj["id"], proj)
@@ -113,18 +123,20 @@ class CacheBackend(object):
 
        def _populate_tasks(self, projId):
                if projId in self._items:
+                       print "SAVED BY THE CACHE"
                        return
                self._items[projId] = dict((
                        (task["id"], task)
-                       for task in self.get_tasks_with_details(projId)
+                       for task in self._backend.get_tasks_with_details(projId)
                ))
                for taskId, task in self._items[projId].iteritems():
                        self._taskIdToProjId[taskId] = task["projId"]
-                       for noteId, note in task.notes.iteritems():
+                       for noteId, note in task["notes"].iteritems():
                                self._noteIdToTaskId[noteId] = taskId
 
        def _populate_locations(self):
                if self._locations:
+                       print "SAVED BY THE CACHE"
                        return
                self._locations = dict((
                        (loc["id"], loc)
@@ -140,11 +152,12 @@ class CacheBackend(object):
                self._invalidate_metaprojects_tasks()
 
        def _invalidate_projects_tasks(self, projId):
-               del self._items[projId]
+               if projId in self._items:
+                       del self._items[projId]
 
        def _invalidate_metaprojects_tasks(self):
-               for projId in self._get_metalists():
-                       self._invalidate_projects_tasks(projId)
+               for proj in self._get_metalists():
+                       self._invalidate_projects_tasks(proj["id"])
 
        def _get_metalists(self):
                return (