-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask_manager.py
More file actions
133 lines (103 loc) · 4.96 KB
/
task_manager.py
File metadata and controls
133 lines (103 loc) · 4.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import os
import json
from datetime import datetime
import shortuuid
from logger import Logger, INFO, WARNING, ERROR
class TaskManager:
def __init__(self, task_file="data/tasks.json"):
self.task_file = task_file
self.tasks = {}
self.logger = Logger(True, "logs/task_manager_logs.txt")
os.makedirs("data", exist_ok=True)
os.makedirs("logs", exist_ok=True)
self._load_tasks()
def _load_tasks(self):
if os.path.exists(self.task_file):
try:
with open(self.task_file, "r") as f:
self.tasks = json.load(f)
self.logger.log("Loaded tasks from file", INFO)
return True
except Exception as e:
self.logger.log(f"Error loading tasks: {e}", ERROR)
self.tasks = {}
return False
else:
self.tasks = {}
return False
def _save_tasks(self):
try:
with open(self.task_file, "w") as f:
json.dump(self.tasks, f, indent=4)
self.logger.log("Saved tasks to file", INFO)
return True
except Exception as e:
self.logger.log(f"Error saving tasks: {e}", ERROR)
return False
def _ensure_project_exists(self, username, project_id):
return self._username_in_tasks(username) and self._project_id_assigned_to_user(project_id, username)
def _username_in_tasks(self, username):
return username in self.tasks
def _project_id_assigned_to_user(self, project_id, username):
return project_id in self.tasks[username]
def _task_id_in_project(self, username, project_id, task_id):
return task_id in self.tasks[username][project_id]
def _project_exists_and_task_id_in_project(self, username, project_id, task_id):
return (self._ensure_project_exists(username, project_id) and
self._task_id_in_project(username, project_id, task_id))
def add_task(self, username, project_id, name, description="", due=None):
def create_task():
self.tasks[username][project_id][task_id] = {
"name": name,
"description": description,
"created": timestamp,
"due": due if due else None,
"done": False
}
if not name.strip():
self.logger.log("Task name cannot be empty", WARNING)
return False, "Invalid task name"
if not self._username_in_tasks(username):
self.tasks[username] = {}
if not self._project_id_assigned_to_user(project_id, username):
self.tasks[username][project_id] = {}
task_id = shortuuid.uuid()[:8]
timestamp = datetime.now().isoformat()
create_task()
self.logger.log(f"Added task '{name}' ({task_id}) for user {username} in project {project_id}", INFO)
self._save_tasks()
return task_id, None
def list_tasks(self, username, project_id):
if self._ensure_project_exists(username, project_id):
return self.tasks[username][project_id]
else:
self.logger.log(f"No tasks found for user {username} in project {project_id}", WARNING)
return {}
def delete_task(self, username, project_id, task_id):
if self._project_exists_and_task_id_in_project(username, project_id, task_id):
del self.tasks[username][project_id][task_id]
self.logger.log(f"Deleted task '{task_id}' for user '{username}'", INFO)
self._save_tasks()
return True
self.logger.log(f"Attempt to delete non-existent task {task_id}", WARNING)
return False, "Task not found"
def edit_task(self, username, project_id, task_id, name=None, description=None, due=None):
if self._project_exists_and_task_id_in_project(username, project_id, task_id):
task = self.tasks[username][project_id][task_id]
if name: task['name'] = name
if description: task['description'] = description
if due: task['due'] = due
self._save_tasks()
self.logger.log(f"Edited task '{task_id}' for user '{username}'", INFO)
return True, None
self.logger.log(f"Attempt to edit non-existent task '{task_id}'", WARNING)
return False, "Task not found"
def mark_task(self, username, project_id, task_id, done=True):
if self._project_exists_and_task_id_in_project(username, project_id, task_id):
self.tasks[username][project_id][task_id]["done"] = done
state = "complete" if done else "incomplete"
self.logger.log(f"Marked task '{task_id}' as {state}", INFO)
self._save_tasks()
return True, None
self.logger.log(f"Attempt to mark non-existent task '{task_id}'", WARNING)
return False, "Task not found"