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