]>
apps.delaporte.us Git - matrix-goal-bot.git/blob - matrix_goal_bot/db.py
4c2d4775ca5dd0094ac15cf519c146069bba79eb
3 from datetime
import datetime
as dt
5 from sqlmodel
import Field
, Session
, SQLModel
, create_engine
, select
, text
, Relationship
8 DATE_FORMAT
= '%Y-%m-%d'
11 return dt
.now().strftime(DATE_FORMAT
)
14 logger
= logging
.getLogger(__name__
)
15 logging
.basicConfig(filename
='goals.log', encoding
='utf-8', level
=logging
.DEBUG
)
18 class Vision(SQLModel
, table
=True):
19 id: int |
None = Field(default
=None, primary_key
=True)
20 name
: str = Field(default
=None, unique
=True)
21 complete_date
: dt |
None = Field(default
=None)
22 goals
: list["Goal"] = Relationship(back_populates
="vision")
24 return f
'{self.name} (Vision {self.id})'
27 class Goal(SQLModel
, table
=True):
28 id: int |
None = Field(default
=None, primary_key
=True)
29 name
: str = Field(default
=None, unique
=True)
30 complete_date
: dt |
None = Field(default
=None)
31 vision_id
: int |
None = Field(default
=None, foreign_key
="vision.id")
32 notes
: str |
None = Field(default
=None)
33 tasks
: list["Task"] = Relationship(back_populates
="goal")
34 vision
: Vision
= Relationship(back_populates
="goals")
36 return f
'{self.name} (Goal {self.id})'
38 class Task(SQLModel
, table
=True):
39 id: int |
None = Field(default
=None, primary_key
=True)
40 name
: str = Field(default
=None, unique
=True)
41 goal_id
: int |
None = Field(default
=None, foreign_key
="goal.id")
42 complete_date
: dt |
None = Field(default
=None)
43 goal
: Goal
= Relationship(back_populates
="tasks")
45 return f
'{self.name} ({self.id})'
48 def pretty_print(goal
, tasks
):
50 results
.append(f
' ## {goal}')
52 results
.append('-- Nothing to list --')
55 if(task
.complete_date
):
56 results
.append(f
' - [x] {task}')
58 results
.append(f
' - [ ] {task}')
63 def __init__(self
, db_file
=None):
65 db_file
= os
.path
.join(os
.environ
.get('MATRIX_DATA_DIR', ''), 'goals.db')
68 self
.engine
= self
.get_engine()
72 return create_engine(f
"sqlite:///{self.file}")
75 SQLModel
.metadata
.create_all(self
.engine
)
79 def get_all_visions(self
):
80 with Session(self
.engine
) as session
:
81 cmd
= select(Vision
).where(Vision
.complete_date
== None)
82 return session
.exec(cmd
).all()
84 def print_ophan_tasks(self
):
87 def get_all_goals(self
):
89 with Session(self
.engine
) as session
:
90 cmd
= select(Goal
).where(Goal
.complete_date
== None)
91 return session
.exec(cmd
).all()
94 def get_done_goals(self
):
96 with Session(self
.engine
) as session
:
97 cmd
= select(Goal
).where(Goal
.complete_date
!= None)
98 return session
.exec(cmd
).all()
101 def get_goal(self
, id):
102 with Session(self
.engine
) as session
:
103 cmd
= select(Goal
).where(Goal
.id == id)
104 goal
= session
.exec(cmd
).first()
105 return (goal
, goal
.tasks
)
107 def get_vision(self
, id):
108 with Session(self
.engine
) as session
:
109 cmd
= select(Vision
).where(Vision
.id == id)
110 vision
= session
.exec(cmd
).first()
112 return (vision
, vision
.goals
)
114 return ('Not found', [])
117 def complete_vision(self
, id):
118 with Session(self
.engine
) as session
:
119 cmd
= select(Vision
).where(Vision
.id == id)
120 vision
= session
.exec(cmd
).first()
121 vision
.complete_date
= dt
.today()
125 def complete_goal(self
, id):
127 with Session(self
.engine
) as session
:
128 cmd
= select(Goal
).where(Goal
.id == id)
129 goal
= session
.exec(cmd
).first()
130 goal
.complete_date
= dt
.today()
131 vision_id
= goal
.vision_id
135 def complete_task(self
, id):
136 with Session(self
.engine
) as session
:
137 cmd
= select(Task
).where(Task
.id == id)
138 task
= session
.exec(cmd
).first()
139 task
.complete_date
= dt
.today()
140 goal_id
= task
.goal_id
144 def add_with_name(self
, cls
, name
):
146 with Session(self
.engine
) as session
:
153 def add_vision(self
, name
):
154 return self
.add_with_name(Vision
, name
)
156 def add_goal(self
, name
):
157 return self
.add_with_name(Goal
, name
)
159 def add_task(self
, goal_id
, name
):
160 result
= self
.add_with_name(Task
, name
)
161 with Session(self
.engine
) as session
:
162 cmd
= select(Task
).where(Task
.name
== name
)
163 new
= session
.exec(cmd
).first()
164 new
.goal_id
= goal_id
168 def assign_vision(self
, goal_id
, vision_id
):
169 '''Goals may move between visions'''
170 with Session(self
.engine
) as session
:
171 cmd
= select(Goal
).where(Goal
.id == goal_id
)
172 goal
= session
.exec(cmd
).first()
173 goal
.vision_id
= vision_id
176 def add_note(self
, note
, goal
):
177 '''Notes print with the goal.'''
180 # Someday: Notes on each
184 with Session(self
.engine
) as session
:
186 chores
= session
.exec(cmd
).all()
188 retuls
.append('None Found')
191 results
.append(Data
.check_chore(session
, chore
.id))