]> apps.delaporte.us Git - matrix-goal-bot.git/blob - goals/db.py
Fixup
[matrix-goal-bot.git] / goals / db.py
1 import logging
2 import os
3 from datetime import datetime as dt
4
5 from sqlmodel import Field, Session, SQLModel, create_engine, select, text
6
7 ## Todo List
8 # - [ ] goal / vision / task
9
10 DB_FILE = os.path.join(os.environ.get('DATA_DIR'), 'goals.db')
11
12 DATE_FORMAT = '%Y-%m-%d'
13
14 def today():
15 return dt.now().strftime(DATE_FORMAT)
16
17
18 logger = logging.getLogger(__name__)
19 logging.basicConfig(filename='chore.log', encoding='utf-8', level=logging.DEBUG)
20
21
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 def __str__(self):
27 return f'{self.name} ({self.id})'
28
29
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 def __str__(self):
37 return f'{self.name} ({self.id})'
38
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 | None = Field(default=None)
44
45 class Data():
46 def __init__(self, db_file = DB_FILE):
47 self.file = db_file
48 self.engine = self.get_engine()
49
50 def get_engine(self):
51 return create_engine(f"sqlite:///{self.file}")
52
53 def setup(self):
54 SQLModel.metadata.create_all(self.engine)
55 return 'Success'
56
57
58 def print_all_visions(self):
59 pass
60
61 def print_all_goals(self):
62 pass
63
64 def print_ophan_tasks(self):
65 pass
66
67 def list_goals(self):
68 '''List all goals'''
69 pass
70
71 def print_goal(self, id, include_finished=False):
72 '''Includes tasks'''
73 pass
74
75 def complete_vision(self, id):
76 pass
77
78 def complete_goal(self, id):
79 pass
80
81 def complete_task(self, id):
82 pass
83
84 def add_with_name(self, cls, name):
85 id = -1
86 with Session(self.engine) as session:
87 new = cls(name=name)
88 session.add(new)
89 session.commit()
90 id = new.id
91 return id
92
93 def add_vision(self, name):
94 return self.add_with_name(Vision, name)
95
96 def add_goal(self, name):
97 return self.add_with_name(Goal, name)
98
99 def add_task(self, name, goal_id):
100 result = self.add_with_name(Task, name)
101 with Session(self.engine) as session:
102 new = select(Task).where(Task.name == name).first()
103 new.goal_id = goal_id
104 session.commit()
105 return result
106
107 def assign_vision(self, goal_id, vision_id):
108 '''Goals may move between visions'''
109 with Session(self.engine) as session:
110 new = select(Goal).where(Goal.id == goal_id).first()
111 new.vision_id = vision_id
112 session.commit()
113
114 def add_note(self, note, goal):
115 '''Notes print with the goal.'''
116 pass
117
118 # Someday: Notes on each
119
120 def list(self):
121 results = []
122 with Session(self.engine) as session:
123 cmd = select(Chore)
124 chores = session.exec(cmd).all()
125 if(not chores):
126 retuls.append('None Found')
127
128 for chore in chores:
129 results.append(Data.check_chore(session, chore.id))
130 return results
131