--- /dev/null
+import uuid
+import datetime
+
+import toolbox
+
+
+class FileManager(object):
+
+ def __init__(self):
+ self._projects = {}
+ self._items = {}
+ self._locations = {}
+
+ def get_projects(self):
+ return (projectDetails for projectDetails in self._projects.itervalues())
+
+ def get_project(self, projId):
+ return self._projects[projId]
+
+ def get_project_names(self):
+ return (projectDetails["name"] for projectDetails in self._projects.itervalues())
+
+ def lookup_project(self, projName):
+ """
+ From a project's name, returns the project's details
+ """
+ todoList = [
+ projectDetails
+ for projectDetails in self._projects.itervalues()
+ if projectDetails["name"] == projName
+ ]
+ assert len(todoList) == 1, "Wrong number of lists found for %s, in %r" % (projName, todoList)
+ return todoList[0]
+
+ def get_locations(self):
+ return (locDetails for locDetails in self._locations.itervalues())
+
+ def get_tasks_with_details(self, projId):
+ return (
+ taskDetails
+ for taskDetails in self._items
+ if taskDetails["projId"] == projId
+ )
+
+ def get_task_details(self, taskId):
+ return self._items[taskId]
+
+ def add_task(self, projId, taskName):
+ taskId = uuid.uuid4()
+ assert taskId not in self._items, "How did uuid %r repeat?" % taskId
+ taskDetails = {
+ "id": taskId,
+ "projId": projId,
+ "name": taskName,
+ "url": "",
+ "locationId": toolbox.Optional(),
+ "dueDate": toolbox.Optional(),
+ "isCompleted": False,
+ "completedDate": toolbox.Optional(),
+ "priority": toolbox.Optional(),
+ "estimate": toolbox.Optional(),
+ "notes": {},
+ }
+ self._items[taskId] = taskDetails
+
+ def set_project(self, taskId, newProjId):
+ taskDetails = self._items[taskId]
+ taskDetails["projId"] = newProjId
+
+ def set_name(self, taskId, name):
+ taskDetails = self._items[taskId]
+ taskDetails["name"] = name
+
+ def set_duedate(self, taskId, dueDate):
+ taskDetails = self._items[taskId]
+ taskDetails["dueDate"] = dueDate
+
+ def set_priority(self, taskId, priority):
+ taskDetails = self._items[taskId]
+ taskDetails["priority"] = priority
+
+ def complete_task(self, taskId):
+ taskDetails = self._items[taskId]
+ taskDetails["isCompleted"] = True
+ taskDetails["completionDate"] = toolbox.Optional(datetime.datetime.now())
+
+ def add_note(self, taskId, noteTitle, noteBody):
+ partialNoteId = uuid.uuid4()
+ noteId = self._pack_ids(taskId, partialNoteId)
+ note = {
+ "id": noteId,
+ "title": noteTitle,
+ "body": noteBody,
+ }
+ assert noteId not in self._items[taskId]["notes"]
+ self._items[taskId]["notes"][noteId] = note
+
+ def update_note(self, noteId, noteTitle, noteBody):
+ taskId, partialNoteId = self._unpack_ids(noteId)
+ self._items[taskId]["notes"][noteId]["title"] = noteTitle
+ self._items[taskId]["notes"][noteId]["body"] = noteBody
+
+ def delete_note(self, noteId):
+ taskId, partialNoteId = self._unpack_ids(noteId)
+ del self._items[taskId]["notes"][noteId]
+
+ @staticmethod
+ def _pack_ids(*ids):
+ return "-".join((str(id) for id in ids))
+
+ @staticmethod
+ def _unpack_ids(ids):
+ return ids.split("-")