]> us-delaporte.pagekite.me Git - matrix-goal-bot.git/blob - matrix_goal_bot/db.py
e232cd98fbe2332255a7de5361b5600275f14c70
[matrix-goal-bot.git] / matrix_goal_bot / 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
11 DATE_FORMAT = '%Y-%m-%d'
12
13 def today():
14 return dt.now().strftime(DATE_FORMAT)
15
16
17 logger = logging.getLogger(__name__)
18 logging.basicConfig(filename='chore.log', encoding='utf-8', level=logging.DEBUG)
19
20
21 class Vision(SQLModel, table=True):
22 id: int | None = Field(default=None, primary_key=True)
23 name: str = Field(default=None, unique=True)
24 complete_date: dt | None = Field(default=None)
25 goals: list["Goal"] = Relationship(back_populates="vision")
26 def __str__(self):
27 return f'{self.name} (Vision {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 vision: Vision = Relationship(back_populates="goals")
38 def __str__(self):
39 return f'{self.name} (Goal {self.id})'
40
41 class Task(SQLModel, table=True):
42 id: int | None = Field(default=None, primary_key=True)
43 name: str = Field(default=None, unique=True)
44 goal_id: int | None = Field(default=None, foreign_key="goal.id")
45 complete_date: dt | None = Field(default=None)
46 goal: Goal = Relationship(back_populates="tasks")
47 def __str__(self):
48 return f'{self.name} ({self.id})'
49
50
51 def pretty_print(goal, tasks):
52 results = []
53 results.append(f' ## {goal}')
54 if not tasks:
55 results.append('-- Nothing to list --')
56
57 for task in tasks:
58 if(task.complete_date):
59 results.append(f' - [x] {task}')
60 else:
61 results.append(f' - [ ] {task}')
62 return results
63
64
65 class Data():
66 def __init__(self, db_file=None):
67 if not db_file:
68 db_file = os.path.join(os.environ.get('MATRIX_DATA_DIR'), 'goals.db')
69
70 self.file = db_file
71 self.engine = self.get_engine()
72
73
74 def get_engine(self):
75 return create_engine(f"sqlite:///{self.file}")
76
77 def setup(self):
78 SQLModel.metadata.create_all(self.engine)
79 return 'Success'
80
81
82 def get_all_visions(self):
83 with Session(self.engine) as session:
84 cmd = select(Vision).where(Vision.complete_date == None)
85 return session.exec(cmd).all()
86
87 def print_ophan_tasks(self):
88 pass
89
90 def get_all_goals(self):
91 '''List all goals'''
92 with Session(self.engine) as session:
93 cmd = select(Goal).where(Goal.complete_date == None)
94 return session.exec(cmd).all()
95
96
97 def get_done_goals(self):
98 '''List all goals'''
99 with Session(self.engine) as session:
100 cmd = select(Goal).where(Goal.complete_date != None)
101 return session.exec(cmd).all()
102
103
104 def get_goal(self, id):
105 with Session(self.engine) as session:
106 cmd = select(Goal).where(Goal.id == id)
107 goal = session.exec(cmd).first()
108 return (goal, goal.tasks)
109
110 def get_vision(self, id):
111 with Session(self.engine) as session:
112 cmd = select(Vision).where(Vision.id == id)
113 vision = session.exec(cmd).first()
114 if vision:
115 return (vision, vision.goals)
116 else:
117 return ('Not found', [])
118
119
120 def complete_vision(self, id):
121 with Session(self.engine) as session:
122 cmd = select(Vision).where(Vision.id == id)
123 vision = session.exec(cmd).first()
124 vision.complete_date = dt.today()
125 session.commit()
126
127
128 def complete_goal(self, id):
129 vision_id = -1
130 with Session(self.engine) as session:
131 cmd = select(Goal).where(Goal.id == id)
132 goal = session.exec(cmd).first()
133 goal.complete_date = dt.today()
134 vision_id = goal.vision_id
135 session.commit()
136 return vision_id
137
138 def complete_task(self, id):
139 with Session(self.engine) as session:
140 cmd = select(Task).where(Task.id == id)
141 task = session.exec(cmd).first()
142 task.complete_date = dt.today()
143 goal_id = task.goal_id
144 session.commit()
145 return goal_id
146
147 def add_with_name(self, cls, name):
148 id = -1
149 with Session(self.engine) as session:
150 new = cls(name=name)
151 session.add(new)
152 session.commit()
153 id = new.id
154 return id
155
156 def add_vision(self, name):
157 return self.add_with_name(Vision, name)
158
159 def add_goal(self, name):
160 return self.add_with_name(Goal, name)
161
162 def add_task(self, goal_id, name):
163 result = self.add_with_name(Task, name)
164 with Session(self.engine) as session:
165 cmd = select(Task).where(Task.name == name)
166 new = session.exec(cmd).first()
167 new.goal_id = goal_id
168 session.commit()
169 return result
170
171 def assign_vision(self, goal_id, vision_id):
172 '''Goals may move between visions'''
173 with Session(self.engine) as session:
174 cmd = select(Goal).where(Goal.id == goal_id)
175 goal = session.exec(cmd).first()
176 goal.vision_id = vision_id
177 session.commit()
178
179 def add_note(self, note, goal):
180 '''Notes print with the goal.'''
181 pass
182
183 # Someday: Notes on each
184
185 def list(self):
186 results = []
187 with Session(self.engine) as session:
188 cmd = select(Chore)
189 chores = session.exec(cmd).all()
190 if(not chores):
191 retuls.append('None Found')
192
193 for chore in chores:
194 results.append(Data.check_chore(session, chore.id))
195 return results
196