]> apps.delaporte.us Git - matrix-goal-bot.git/blob - goals/db.py
2921bf044aad389cf135975d56a0729090e079f0
[matrix-goal-bot.git] / goals / db.py
1 import logging
2 import os
3 from datetime import datetime as dt
4
5 from sqlmodel import Field, Session, SQLModel, create_engine, select, text, Relationship
6
7 ## Todo List
8 # - [ ] goal / vision / task
9
10 DB_FILE = os.path.join(os.environ.get('DATA_DIR'), 'goals.db')
11
12 DATE_FORMAT = '%Y-%m-%d'
13
14 def today():
15 return dt.now().strftime(DATE_FORMAT)
16
17
18 logger = logging.getLogger(__name__)
19 logging.basicConfig(filename='chore.log', encoding='utf-8', level=logging.DEBUG)
20
21
22 class Vision(SQLModel, table=True):
23 id: int | None = Field(default=None, primary_key=True)
24 name: str = Field(default=None, unique=True)
25 complete_date: dt | None = Field(default=None)
26 def __str__(self):
27 return f'{self.name} ({self.id})'
28
29
30 class Goal(SQLModel, table=True):
31 id: int | None = Field(default=None, primary_key=True)
32 name: str = Field(default=None, unique=True)
33 complete_date: dt | None = Field(default=None)
34 vision_id: int | None = Field(default=None, foreign_key="vision.id")
35 notes: str | None = Field(default=None)
36 tasks: list["Task"] = Relationship(back_populates="goal")
37 def __str__(self):
38 return f'{self.name} ({self.id})'
39
40 class Task(SQLModel, table=True):
41 id: int | None = Field(default=None, primary_key=True)
42 name: str = Field(default=None, unique=True)
43 goal_id: int | None = Field(default=None, foreign_key="goal.id")
44 complete_date: dt | None = Field(default=None)
45 goal: Goal = Relationship(back_populates="tasks")
46 def __str__(self):
47 return f'{self.name} ({self.id})'
48
49
50 def pretty_print(goal, tasks):
51 results = []
52 results.append(f' ## {goal}')
53 for task in tasks:
54 if(task.complete_date):
55 results.append(f' - [x] {task}')
56 else:
57 results.append(f' - [ ] {task}')
58 return results
59
60
61 class Data():
62 def __init__(self, db_file = DB_FILE):
63 self.file = db_file
64 self.engine = self.get_engine()
65
66 def get_engine(self):
67 return create_engine(f"sqlite:///{self.file}")
68
69 def setup(self):
70 SQLModel.metadata.create_all(self.engine)
71 return 'Success'
72
73
74 def print_all_visions(self):
75 pass
76
77 def print_all_goals(self):
78 pass
79
80 def print_ophan_tasks(self):
81 pass
82
83 def list_goals(self):
84 '''List all goals'''
85 with Session(self.engine) as session:
86 cmd = select(Goal).where(Goal.complete_date == None)
87 return session.exec(cmd).all()
88
89
90 def get_goal(self, id):
91 with Session(self.engine) as session:
92 cmd = select(Goal).where(Goal.id == id)
93 goal = session.exec(cmd).first()
94 return (goal, goal.tasks)
95
96 def complete_vision(self, id):
97 pass
98
99 def complete_goal(self, id):
100 with Session(self.engine) as session:
101 cmd = select(Goal).where(Goal.id == id)
102 goal = session.exec(cmd).first()
103 goal.complete_date = dt.today()
104 session.commit()
105
106 def complete_task(self, id):
107 with Session(self.engine) as session:
108 cmd = select(Task).where(Task.id == id)
109 task = session.exec(cmd).first()
110 task.complete_date = dt.today()
111 goal_id = task.goal_id
112 session.commit()
113 return goal_id
114
115 def add_with_name(self, cls, name):
116 id = -1
117 with Session(self.engine) as session:
118 new = cls(name=name)
119 session.add(new)
120 session.commit()
121 id = new.id
122 return id
123
124 def add_vision(self, name):
125 return self.add_with_name(Vision, name)
126
127 def add_goal(self, name):
128 return self.add_with_name(Goal, name)
129
130 def add_task(self, goal_id, name):
131 result = self.add_with_name(Task, name)
132 with Session(self.engine) as session:
133 cmd = select(Task).where(Task.name == name)
134 new = session.exec(cmd).first()
135 new.goal_id = goal_id
136 session.commit()
137 return result
138
139 def assign_vision(self, goal_id, vision_id):
140 '''Goals may move between visions'''
141 with Session(self.engine) as session:
142 cmd = select(Goal).where(Goal.id == goal_id)
143 new = session.exec(cmd).first()
144 new.vision_id = vision_id
145 session.commit()
146
147 def add_note(self, note, goal):
148 '''Notes print with the goal.'''
149 pass
150
151 # Someday: Notes on each
152
153 def list(self):
154 results = []
155 with Session(self.engine) as session:
156 cmd = select(Chore)
157 chores = session.exec(cmd).all()
158 if(not chores):
159 retuls.append('None Found')
160
161 for chore in chores:
162 results.append(Data.check_chore(session, chore.id))
163 return results
164