8 class FileBackend(object):
10 def __init__(self, filename):
11 self._filename = filename
18 "projects": self._projects,
20 "locations": self._locations,
22 pickle.dump(state, self._filename)
25 state = pickle.load(self._filename)
26 self._projects = state["projects"]
27 self._items = state["items"]
28 self._locations = state["locations"]
30 def add_project(self, name):
31 projId = uuid.uuid4().hex
38 assert projId not in self._projects, "How did uuid %r repeat?" % projId
39 self._projects[projId] = projDetails
40 if projId not in self._items:
41 self._items[projId] = {}
44 def set_project_name(self, projId, name):
45 projDetails = self._projects[projId]
46 projDetails["name"] = name
48 def set_project_visibility(self, projId, visibility):
49 projDetails = self._projects[projId]
50 projDetails["isVisible"] = visibility
52 def get_projects(self):
53 return self._projects.itervalues()
55 def get_project(self, projId):
56 return self._projects[projId]
58 def lookup_project(self, projName):
60 From a project's name, returns the project's details
64 for projectDetails in self._projects.itervalues()
65 if projectDetails["name"] == projName
67 assert len(todoList) == 1, "Wrong number of lists found for %s, in %r" % (projName, todoList)
70 def get_locations(self):
71 return self._locations.itervalues()
73 def get_tasks_with_details(self, projId):
74 return self._items[projId].itervalues()
76 def get_task_details(self, taskId):
77 projId, partialTaskId = self._unpack_ids(taskId)
78 return self._items[projId][taskId]
80 def add_task(self, projId, taskName):
81 partialTaskId = uuid.uuid4().hex
82 taskId = self._pack_ids(projId, partialTaskId)
83 assert taskId not in self._items, "How did uuid %r repeat?" % taskId
89 "locationId": toolbox.Optional(),
90 "dueDate": toolbox.Optional(),
92 "completedDate": toolbox.Optional(),
93 "priority": toolbox.Optional(),
94 "estimate": toolbox.Optional(),
97 self._items[projId][taskId] = taskDetails
100 def set_project(self, taskId, newProjId):
101 projId, partialTaskId = self._unpack_ids(taskId)
102 taskDetails = self._items[projId][taskId]
103 taskDetails["projId"] = newProjId
105 def set_name(self, taskId, name):
106 projId, partialTaskId = self._unpack_ids(taskId)
107 taskDetails = self._items[projId][taskId]
108 taskDetails["name"] = name
110 def set_duedate(self, taskId, dueDate):
111 projId, partialTaskId = self._unpack_ids(taskId)
112 taskDetails = self._items[projId][taskId]
113 taskDetails["dueDate"] = dueDate
115 def set_priority(self, taskId, priority):
116 projId, partialTaskId = self._unpack_ids(taskId)
117 taskDetails = self._items[projId][taskId]
118 taskDetails["priority"] = priority
120 def complete_task(self, taskId):
121 projId, partialTaskId = self._unpack_ids(taskId)
122 taskDetails = self._items[projId][taskId]
123 taskDetails["isCompleted"] = True
124 taskDetails["completionDate"] = toolbox.Optional(datetime.datetime.now())
126 def add_note(self, taskId, noteTitle, noteBody):
127 projId, partialTaskId = self._unpack_ids(taskId)
128 partialNoteId = uuid.uuid4().hex
129 noteId = self._pack_ids(taskId, partialNoteId)
135 assert noteId not in self._items[projId][taskId]["notes"]
136 self._items[projId][taskId]["notes"][noteId] = note
139 def update_note(self, noteId, noteTitle, noteBody):
140 taskId, partialNoteId = self._unpack_ids(noteId)
141 projId, partialTaskId = self._unpack_ids(taskId)
142 self._items[projId][taskId]["notes"][noteId]["title"] = noteTitle
143 self._items[projId][taskId]["notes"][noteId]["body"] = noteBody
145 def delete_note(self, noteId):
146 taskId, partialNoteId = self._unpack_ids(noteId)
147 projId, partialTaskId = self._unpack_ids(taskId)
148 del self._items[projId][taskId]["notes"][noteId]
152 return "-".join((str(id) for id in ids))
155 def _unpack_ids(ids):
156 return ids.split("-")