]>
apps.delaporte.us Git - matrix-goal-bot.git/blob - matrix_goal_bot/db.py
00412220409e903190b3477fc92bccce6b94005e
3 from datetime
import datetime
as dt
5 from sqlmodel
import Field
, Session
, SQLModel
, create_engine
, select
, text
, Relationship
8 # - [ ] goal / vision / task
10 DB_FILE
= os
.path
.join(os
.environ
.get('MATRIX_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 |
None = Field(default
=None)
26 goals
: list["Goal"] = Relationship(back_populates
="vision")
28 return f
'{self.name} (Vision {self.id})'
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")
40 return f
'{self.name} (Goal {self.id})'
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")
49 return f
'{self.name} ({self.id})'
52 def pretty_print(goal
, tasks
):
54 results
.append(f
' ## {goal}')
56 results
.append('-- Nothing to list --')
59 if(task
.complete_date
):
60 results
.append(f
' - [x] {task}')
62 results
.append(f
' - [ ] {task}')
67 def __init__(self
, db_file
= DB_FILE
):
69 self
.engine
= self
.get_engine()
73 return create_engine(f
"sqlite:///{self.file}")
76 SQLModel
.metadata
.create_all(self
.engine
)
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()
85 def print_ophan_tasks(self
):
88 def get_all_goals(self
):
90 with Session(self
.engine
) as session
:
91 cmd
= select(Goal
).where(Goal
.complete_date
== None)
92 return session
.exec(cmd
).all()
95 def get_done_goals(self
):
97 with Session(self
.engine
) as session
:
98 cmd
= select(Goal
).where(Goal
.complete_date
!= None)
99 return session
.exec(cmd
).all()
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
)
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()
113 return (vision
, vision
.goals
)
115 return ('Not found', [])
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()
126 def complete_goal(self
, id):
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
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
145 def add_with_name(self
, cls
, name
):
147 with Session(self
.engine
) as session
:
154 def add_vision(self
, name
):
155 return self
.add_with_name(Vision
, name
)
157 def add_goal(self
, name
):
158 return self
.add_with_name(Goal
, name
)
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
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
177 def add_note(self
, note
, goal
):
178 '''Notes print with the goal.'''
181 # Someday: Notes on each
185 with Session(self
.engine
) as session
:
187 chores
= session
.exec(cmd
).all()
189 retuls
.append('None Found')
192 results
.append(Data
.check_chore(session
, chore
.id))