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