]>
apps.delaporte.us Git - matrix-goal-bot.git/blob - goals/db.py
1ec90a9e17a9af4be8621427d7751ba91fbd532b
3 from datetime
import datetime
as dt
5 from sqlmodel
import Field
, Session
, SQLModel
, create_engine
, select
, text
8 # - [ ] goal / vision / task
10 DB_FILE
= os
.path
.join(os
.environ
.get('DATA_DIR'), 'goals.db')
12 DATE_FORMAT
= '%Y-%m-%d'
15 return dt
.now().strftime(DATE_FORMAT
)
18 logger
= logging
.getLogger(__name__
)
19 logging
.basicConfig(filename
='chore.log', encoding
='utf-8', level
=logging
.DEBUG
)
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
= Field(default
=None)
27 return f
'{self.name} ({self.id})'
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
= Field(default
=None)
34 vision_id
: int |
None = Field(default
=None, foreign_key
="vision.id")
35 notes
: str = Field(default
=None)
37 return f
'{self.name} ({self.id})'
39 class Task(SQLModel
, table
=True):
40 id: int |
None = Field(default
=None, primary_key
=True)
41 name
: str = Field(default
=None, unique
=True)
42 goal_id
: int |
None = Field(default
=None, foreign_key
="goal.id")
43 complete_date
: dt
= Field(default
=None)
46 def __init__(self
, db_file
= DB_FILE
):
48 self
.engine
= self
.get_engine()
51 return create_engine(f
"sqlite:///{self.file}")
54 SQLModel
.metadata
.create_all(self
.engine
)
57 def print_all_visions(self
):
60 def print_all_goals(self
):
63 def print_ophan_tasks(self
):
67 def print_goal(self
, goal
, include_finished
=False):
71 def complete_vision(self
, id):
74 def complete_goal(self
, id):
77 def complete_task(self
, id):
80 def add_with_name(self
, cls
, name
):
82 with Session(self
.engine
) as session
:
86 return f
'Created {name} [{str(cls)}].'
88 return f
'Unable to create {name} [{str(cls)}]. May be duplicate.'
91 def add_vision(self
, name
):
92 return self
.add_with_name(Vision
, name
)
94 def add_goal(self
, name
):
95 return self
.add_with_name(Goal
, name
)
97 def add_task(self
, name
, goal_id
):
98 result
= self
.add_with_name(Task
, name
)
99 with Session(self
.engine
) as session
:
100 new
= select(Task
).where(Task
.name
== name
).first()
101 new
.goal_id
= goal_id
105 def assign_vision(self
, goal_id
, vision_id
):
106 '''Goals may move between visions'''
107 with Session(self
.engine
) as session
:
108 new
= select(Goal
).where(Goal
.id == goal_id
).first()
109 new
.vision_id
= vision_id
112 def add_note(self
, note
, goal
):
113 '''Notes print with the goal.'''
116 # Someday: Notes on each
118 def check(self
, chore_id
):
119 with Session(self
.engine
) as session
:
120 return Data
.check_chore(session
, chore_id
)
124 with Session(self
.engine
) as session
:
126 chores
= session
.exec(cmd
).all()
128 retuls
.append('None Found')
131 results
.append(Data
.check_chore(session
, chore
.id))
136 with Session(self
.engine
) as session
:
137 new_chore
= Chore(name
=name
)
138 session
.add(new_chore
)
140 return f
'Created chore {name}.'
142 return f
'Unable to create {name}. May be duplicate.'
146 def done(self
, chore_id
):
147 with Session(self
.engine
) as session
:
148 chore
= get_chore(session
, chore_id
)
150 return f
'Chore not found: {chore_id}'
153 session
.add(Record(chore_id
=chore
.id))
155 return f
'Marked chore as done: {chore.name}.'
156 except Exception as ex
:
157 return f
'Unable to mark chore as done: {ex}'
160 def undo(self
, chore_id
):
161 with Session(self
.engine
) as session
:
162 cmd
= select(Chore
).where(Chore
.id == chore_id
)
163 chore
= session
.exec(cmd
).first()
166 return f
'Not found: {chore_id}'
169 cmd
= select(Record
).where(Record
.chore_id
== chore_id
).where(Record
.complete_date
>= today())
170 results
= session
.exec(cmd
).all()
171 for result
in results
:
172 session
.delete(result
)
174 return f
'Marked chore as *not* done: {chore.name}.'
175 except Exception as ex
:
176 return f
'Unable to mark chore as done: {ex}'
178 def remove(self
, chore_id
):
180 with Session(self
.engine
) as session
:
181 chore
= get_chore(session
, chore_id
)
183 return f
'Chore not found: {chore_id}'
187 WHERE chore_id = :chore_id
190 params
['chore_id'] = chore_id
191 results
= session
.execute(sql
, params
)
192 logger
.debug(results
)
197 results
= session
.execute(sql
, params
)
198 logger
.debug(results
)
200 return f
'Removed chore {chore_id}'
201 except Exception as ex
:
202 return f
'Unable to remove chore: {ex}'