]>
us-delaporte.pagekite.me Git - matrix-goal-bot.git/blob - matrix_goal_bot/db.py
e232cd98fbe2332255a7de5361b5600275f14c70
3 from datetime
import datetime
as dt
5 from sqlmodel
import Field
, Session
, SQLModel
, create_engine
, select
, text
, Relationship
8 # - [ ] goal / vision / task
11 DATE_FORMAT
= '%Y-%m-%d'
14 return dt
.now().strftime(DATE_FORMAT
)
17 logger
= logging
.getLogger(__name__
)
18 logging
.basicConfig(filename
='chore.log', encoding
='utf-8', level
=logging
.DEBUG
)
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")
27 return f
'{self.name} (Vision {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 |
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")
39 return f
'{self.name} (Goal {self.id})'
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")
48 return f
'{self.name} ({self.id})'
51 def pretty_print(goal
, tasks
):
53 results
.append(f
' ## {goal}')
55 results
.append('-- Nothing to list --')
58 if(task
.complete_date
):
59 results
.append(f
' - [x] {task}')
61 results
.append(f
' - [ ] {task}')
66 def __init__(self
, db_file
=None):
68 db_file
= os
.path
.join(os
.environ
.get('MATRIX_DATA_DIR'), 'goals.db')
71 self
.engine
= self
.get_engine()
75 return create_engine(f
"sqlite:///{self.file}")
78 SQLModel
.metadata
.create_all(self
.engine
)
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()
87 def print_ophan_tasks(self
):
90 def get_all_goals(self
):
92 with Session(self
.engine
) as session
:
93 cmd
= select(Goal
).where(Goal
.complete_date
== None)
94 return session
.exec(cmd
).all()
97 def get_done_goals(self
):
99 with Session(self
.engine
) as session
:
100 cmd
= select(Goal
).where(Goal
.complete_date
!= None)
101 return session
.exec(cmd
).all()
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
)
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()
115 return (vision
, vision
.goals
)
117 return ('Not found', [])
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()
128 def complete_goal(self
, id):
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
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
147 def add_with_name(self
, cls
, name
):
149 with Session(self
.engine
) as session
:
156 def add_vision(self
, name
):
157 return self
.add_with_name(Vision
, name
)
159 def add_goal(self
, name
):
160 return self
.add_with_name(Goal
, name
)
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
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
179 def add_note(self
, note
, goal
):
180 '''Notes print with the goal.'''
183 # Someday: Notes on each
187 with Session(self
.engine
) as session
:
189 chores
= session
.exec(cmd
).all()
191 retuls
.append('None Found')
194 results
.append(Data
.check_chore(session
, chore
.id))