3cd2510274788d477ab1b5c15e647523a6c1f725
[doneit] / src / file_backend.py
1 import uuid
2 import datetime
3
4 import toolbox
5
6
7 class FileManager(object):
8
9         def __init__(self):
10                 self._projects = {}
11                 self._items = {}
12                 self._locations = {}
13
14         def get_projects(self):
15                 return (projectDetails for projectDetails in self._projects.itervalues())
16
17         def get_project(self, projId):
18                 return self._projects[projId]
19
20         def get_project_names(self):
21                 return (projectDetails["name"] for projectDetails in self._projects.itervalues())
22
23         def lookup_project(self, projName):
24                 """
25                 From a project's name, returns the project's details
26                 """
27                 todoList = [
28                         projectDetails
29                         for projectDetails in self._projects.itervalues()
30                                 if projectDetails["name"] == projName
31                 ]
32                 assert len(todoList) == 1, "Wrong number of lists found for %s, in %r" % (projName, todoList)
33                 return todoList[0]
34
35         def get_locations(self):
36                 return (locDetails for locDetails in self._locations.itervalues())
37
38         def get_tasks_with_details(self, projId):
39                 return (
40                         taskDetails
41                         for taskDetails in self._items
42                                 if taskDetails["projId"] == projId
43                 )
44
45         def get_task_details(self, taskId):
46                 return self._items[taskId]
47
48         def add_task(self, projId, taskName):
49                 taskId = uuid.uuid4()
50                 assert taskId not in self._items, "How did uuid %r repeat?" % taskId
51                 taskDetails = {
52                         "id": taskId,
53                         "projId": projId,
54                         "name": taskName,
55                         "url": "",
56                         "locationId": toolbox.Optional(),
57                         "dueDate": toolbox.Optional(),
58                         "isCompleted": False,
59                         "completedDate": toolbox.Optional(),
60                         "priority": toolbox.Optional(),
61                         "estimate": toolbox.Optional(),
62                         "notes": {},
63                 }
64                 self._items[taskId] = taskDetails
65
66         def set_project(self, taskId, newProjId):
67                 taskDetails = self._items[taskId]
68                 taskDetails["projId"] = newProjId
69
70         def set_name(self, taskId, name):
71                 taskDetails = self._items[taskId]
72                 taskDetails["name"] = name
73
74         def set_duedate(self, taskId, dueDate):
75                 taskDetails = self._items[taskId]
76                 taskDetails["dueDate"] = dueDate
77
78         def set_priority(self, taskId, priority):
79                 taskDetails = self._items[taskId]
80                 taskDetails["priority"] = priority
81
82         def complete_task(self, taskId):
83                 taskDetails = self._items[taskId]
84                 taskDetails["isCompleted"] = True
85                 taskDetails["completionDate"] = toolbox.Optional(datetime.datetime.now())
86
87         def add_note(self, taskId, noteTitle, noteBody):
88                 partialNoteId = uuid.uuid4()
89                 noteId = self._pack_ids(taskId, partialNoteId)
90                 note = {
91                         "id": noteId,
92                         "title": noteTitle,
93                         "body": noteBody,
94                 }
95                 assert noteId not in self._items[taskId]["notes"]
96                 self._items[taskId]["notes"][noteId] = note
97
98         def update_note(self, noteId, noteTitle, noteBody):
99                 taskId, partialNoteId = self._unpack_ids(noteId)
100                 self._items[taskId]["notes"][noteId]["title"] = noteTitle
101                 self._items[taskId]["notes"][noteId]["body"] = noteBody
102
103         def delete_note(self, noteId):
104                 taskId, partialNoteId = self._unpack_ids(noteId)
105                 del self._items[taskId]["notes"][noteId]
106
107         @staticmethod
108         def _pack_ids(*ids):
109                 return "-".join((str(id) for id in ids))
110
111         @staticmethod
112         def _unpack_ids(ids):
113                 return ids.split("-")