]>
apps.delaporte.us Git - matrix-goal-bot.git/blob - matrix_goal_bot/db.py
bc8cdbc4cff1ef941c45bc9e39ddf4ad3b56db64
3 from datetime
import datetime
as dt
5 from sqlmodel
import Field
, Session
, SQLModel
, create_engine
, select
, text
, Relationship
7 logger
= logging
.getLogger(__name__
)
9 DATE_FORMAT
= '%Y-%m-%d'
12 return dt
.now().strftime(DATE_FORMAT
)
15 class Vision(SQLModel
, table
=True):
16 id: int |
None = Field(default
=None, primary_key
=True)
17 name
: str = Field(default
=None, unique
=True)
18 complete_date
: dt |
None = Field(default
=None)
19 goals
: list["Goal"] = Relationship(back_populates
="vision")
21 return f
'{self.name} (Vision {self.id})'
24 class PreferGoal(SQLModel
, table
=True):
25 goal_id
: int |
None = Field(default
=None, foreign_key
="goal.id", primary_key
=True)
28 class Goal(SQLModel
, table
=True):
29 id: int |
None = Field(default
=None, primary_key
=True)
30 name
: str = Field(default
=None, unique
=True)
31 complete_date
: dt |
None = Field(default
=None)
32 vision_id
: int |
None = Field(default
=None, foreign_key
="vision.id")
33 notes
: str |
None = Field(default
=None)
34 tasks
: list["Task"] = Relationship(back_populates
="goal")
35 vision
: Vision
= Relationship(back_populates
="goals")
37 if not self
.complete_date
:
38 return f
'{self.name} (Goal {self.id})'
40 completed
= self
.complete_date
.strftime(DATE_FORMAT
)
41 return f
'(Done {completed}) {self.name} (Goal {self.id})'
43 class Task(SQLModel
, table
=True):
44 id: int |
None = Field(default
=None, primary_key
=True)
45 name
: str = Field(default
=None, unique
=True)
46 goal_id
: int |
None = Field(default
=None, foreign_key
="goal.id")
47 complete_date
: dt |
None = Field(default
=None)
48 goal
: Goal
= Relationship(back_populates
="tasks")
50 return f
'{self.name} ({self.id})'
53 def pretty_print(goal
, tasks
):
55 results
.append(f
' ## {goal}')
57 results
.append('-- Nothing to list --')
60 if(task
.complete_date
):
61 results
.append(f
' - [x] {task}')
63 results
.append(f
' - [ ] {task}')
68 def __init__(self
, db_file
=None):
70 db_file
= os
.path
.join(os
.environ
.get('MATRIX_DATA_DIR', ''), 'goal.db')
73 self
.engine
= self
.get_engine()
77 return create_engine(f
"sqlite:///{self.file}")
80 SQLModel
.metadata
.create_all(self
.engine
)
84 def _set_pref_goal_id(self
, goal_id
):
85 with Session(self
.engine
) as session
:
86 prefs
= session
.exec(select(PreferGoal
)).all()
90 pref
.goal_id
= goal_id
94 def _get_pref_goal_id(self
):
95 with Session(self
.engine
) as session
:
96 pref
= session
.exec(select(PreferGoal
)).one()
101 def get_all_visions(self
):
102 with Session(self
.engine
) as session
:
103 cmd
= select(Vision
).where(Vision
.complete_date
== None)
104 return session
.exec(cmd
).all()
106 def get_all_goals(self
):
108 with Session(self
.engine
) as session
:
109 cmd
= select(Goal
).where(Goal
.complete_date
== None)
110 return session
.exec(cmd
).all()
113 def get_done_goals(self
):
114 '''List completed goals'''
115 with Session(self
.engine
) as session
:
116 cmd
= select(Goal
).where(Goal
.complete_date
!= None)
117 return session
.exec(cmd
).all()
120 def get_goal(self
, goal_id
):
121 self
._set
_pref
_goal
_id
(goal_id
)
122 with Session(self
.engine
) as session
:
123 cmd
= select(Goal
).where(Goal
.id == goal_id
)
124 goal
= session
.exec(cmd
).first()
125 return (goal
, goal
.tasks
)
127 def get_vision(self
, id):
128 with Session(self
.engine
) as session
:
129 cmd
= select(Vision
).where(Vision
.id == id)
130 vision
= session
.exec(cmd
).first()
132 return (vision
, vision
.goals
)
134 return ('Not found', [])
137 def complete_vision(self
, id):
138 with Session(self
.engine
) as session
:
139 cmd
= select(Vision
).where(Vision
.id == id)
140 vision
= session
.exec(cmd
).first()
141 vision
.complete_date
= dt
.today()
145 def complete_goal(self
, goal_id
):
146 self
._set
_pref
_goal
_id
(goal_id
)
148 with Session(self
.engine
) as session
:
149 cmd
= select(Goal
).where(Goal
.id == goal_id
)
150 goal
= session
.exec(cmd
).first()
151 goal
.complete_date
= dt
.today()
152 vision_id
= goal
.vision_id
156 def rename_goal(self
, goal_id
, name
):
157 self
._set
_pref
_goal
_id
(goal_id
)
159 with Session(self
.engine
) as session
:
160 cmd
= select(Goal
).where(Goal
.id == goal_id
)
161 goal
= session
.exec(cmd
).first()
163 vision_id
= goal
.vision_id
168 def complete_task(self
, id):
169 with Session(self
.engine
) as session
:
170 cmd
= select(Task
).where(Task
.id == id)
171 task
= session
.exec(cmd
).first()
172 task
.complete_date
= dt
.today()
173 goal_id
= task
.goal_id
175 self
._set
_pref
_goal
_id
(goal_id
)
178 def add_with_name(self
, cls
, name
):
180 with Session(self
.engine
) as session
:
187 def add_vision(self
, name
):
188 return self
.add_with_name(Vision
, name
)
190 def add_goal(self
, name
):
191 goal_id
= self
.add_with_name(Goal
, name
)
192 self
._set
_pref
_goal
_id
(goal_id
)
195 def quick_add_task(self
, name
):
196 goal_id
= self
._get
_pref
_goal
_id
()
197 task_id
= self
.add_with_name(Task
, name
)
198 with Session(self
.engine
) as session
:
199 cmd
= select(Task
).where(Task
.id == task_id
)
200 new
= session
.exec(cmd
).first()
201 new
.goal_id
= goal_id
205 def remove_task(self
, task_id
):
207 with Session(self
.engine
) as session
:
208 cmd
= select(Task
).where(Task
.id == task_id
)
209 to_remove
= session
.exec(cmd
).first()
210 task_name
= to_remove
.name
211 session
.delete(to_remove
)
213 return f
'Removed task "{task_name}"'
215 def assign_vision(self
, goal_id
, vision_id
):
216 '''Goals may move between visions'''
217 self
._set
_pref
_goal
_id
(goal_id
)
218 with Session(self
.engine
) as session
:
219 cmd
= select(Goal
).where(Goal
.id == goal_id
)
220 goal
= session
.exec(cmd
).first()
221 goal
.vision_id
= vision_id
224 def visionless(self
):
225 '''Get goals with no vision'''
226 with Session(self
.engine
) as session
:
227 cmd
= select(Goal
).where(Goal
.vision_id
== None)
228 return session
.exec(cmd
).all()
231 def add_note(self
, note
, goal
):
232 '''Notes print with the goal.'''
235 # Someday: Notes on each