9fdbd44871b73380134e3604cfda74806bfa0260
[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 add_project(self, name):
15                 projId = uuid.uuid4()
16                 projDetails = {
17                         "name": name,
18                         "id": projId,
19                         "isVisible": True,
20                         "isMeta": False,
21                 }
22                 assert projId not in self._projects, "How did uuid %r repeat?" % projId
23                 self._projects[projId] = projDetails
24
25         def set_project_name(self, projId, name):
26                 projDetails = self._projects[projId]
27                 projDetails["name"] = name
28
29         def set_project_visibility(self, projId, visibility):
30                 projDetails = self._projects[projId]
31                 projDetails["isVisible"] = visibility
32
33         def get_projects(self):
34                 return (projectDetails for projectDetails in self._projects.itervalues())
35
36         def get_project(self, projId):
37                 return self._projects[projId]
38
39         def lookup_project(self, projName):
40                 """
41                 From a project's name, returns the project's details
42                 """
43                 todoList = [
44                         projectDetails
45                         for projectDetails in self._projects.itervalues()
46                                 if projectDetails["name"] == projName
47                 ]
48                 assert len(todoList) == 1, "Wrong number of lists found for %s, in %r" % (projName, todoList)
49                 return todoList[0]
50
51         def get_locations(self):
52                 return (locDetails for locDetails in self._locations.itervalues())
53
54         def get_tasks_with_details(self, projId):
55                 return (
56                         taskDetails
57                         for taskDetails in self._items
58                                 if taskDetails["projId"] == projId
59                 )
60
61         def get_task_details(self, taskId):
62                 return self._items[taskId]
63
64         def add_task(self, projId, taskName):
65                 taskId = uuid.uuid4()
66                 assert taskId not in self._items, "How did uuid %r repeat?" % taskId
67                 taskDetails = {
68                         "id": taskId,
69                         "projId": projId,
70                         "name": taskName,
71                         "url": "",
72                         "locationId": toolbox.Optional(),
73                         "dueDate": toolbox.Optional(),
74                         "isCompleted": False,
75                         "completedDate": toolbox.Optional(),
76                         "priority": toolbox.Optional(),
77                         "estimate": toolbox.Optional(),
78                         "notes": {},
79                 }
80                 self._items[taskId] = taskDetails
81
82         def set_project(self, taskId, newProjId):
83                 taskDetails = self._items[taskId]
84                 taskDetails["projId"] = newProjId
85
86         def set_name(self, taskId, name):
87                 taskDetails = self._items[taskId]
88                 taskDetails["name"] = name
89
90         def set_duedate(self, taskId, dueDate):
91                 taskDetails = self._items[taskId]
92                 taskDetails["dueDate"] = dueDate
93
94         def set_priority(self, taskId, priority):
95                 taskDetails = self._items[taskId]
96                 taskDetails["priority"] = priority
97
98         def complete_task(self, taskId):
99                 taskDetails = self._items[taskId]
100                 taskDetails["isCompleted"] = True
101                 taskDetails["completionDate"] = toolbox.Optional(datetime.datetime.now())
102
103         def add_note(self, taskId, noteTitle, noteBody):
104                 partialNoteId = uuid.uuid4()
105                 noteId = self._pack_ids(taskId, partialNoteId)
106                 note = {
107                         "id": noteId,
108                         "title": noteTitle,
109                         "body": noteBody,
110                 }
111                 assert noteId not in self._items[taskId]["notes"]
112                 self._items[taskId]["notes"][noteId] = note
113
114         def update_note(self, noteId, noteTitle, noteBody):
115                 taskId, partialNoteId = self._unpack_ids(noteId)
116                 self._items[taskId]["notes"][noteId]["title"] = noteTitle
117                 self._items[taskId]["notes"][noteId]["body"] = noteBody
118
119         def delete_note(self, noteId):
120                 taskId, partialNoteId = self._unpack_ids(noteId)
121                 del self._items[taskId]["notes"][noteId]
122
123         @staticmethod
124         def _pack_ids(*ids):
125                 return "-".join((str(id) for id in ids))
126
127         @staticmethod
128         def _unpack_ids(ids):
129                 return ids.split("-")