X-Git-Url: https://apps.delaporte.us/gitweb/matrix-goal-bot.git/blobdiff_plain/3fbc817001f4e0bd0590b2bf3509e4bfc286919f..ec5ce64bec2a57f7b884d09b663c12f3447b3809:/goals/db.py diff --git a/goals/db.py b/goals/db.py index 0a1d16c..dd87978 100644 --- a/goals/db.py +++ b/goals/db.py @@ -2,7 +2,7 @@ import logging import os from datetime import datetime as dt -from sqlmodel import Field, Session, SQLModel, create_engine, select, text +from sqlmodel import Field, Session, SQLModel, create_engine, select, text, Relationship ## Todo List # - [ ] goal / vision / task @@ -23,8 +23,9 @@ class Vision(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str = Field(default=None, unique=True) complete_date: dt | None = Field(default=None) + goals: list["Goal"] = Relationship(back_populates="vision") def __str__(self): - return f'{self.name} ({self.id})' + return f'{self.name} (Vision {self.id})' class Goal(SQLModel, table=True): @@ -33,20 +34,41 @@ class Goal(SQLModel, table=True): complete_date: dt | None = Field(default=None) vision_id: int | None = Field(default=None, foreign_key="vision.id") notes: str | None = Field(default=None) + tasks: list["Task"] = Relationship(back_populates="goal") + vision: Vision = Relationship(back_populates="goals") def __str__(self): - return f'{self.name} ({self.id})' + return f'{self.name} (Goal {self.id})' class Task(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str = Field(default=None, unique=True) goal_id: int | None = Field(default=None, foreign_key="goal.id") complete_date: dt | None = Field(default=None) + goal: Goal = Relationship(back_populates="tasks") + def __str__(self): + return f'{self.name} ({self.id})' + + +def pretty_print(goal, tasks): + results = [] + results.append(f' ## {goal}') + if not tasks: + results.append('-- Nothing to list --') + + for task in tasks: + if(task.complete_date): + results.append(f' - [x] {task}') + else: + results.append(f' - [ ] {task}') + return results + class Data(): def __init__(self, db_file = DB_FILE): self.file = db_file self.engine = self.get_engine() + def get_engine(self): return create_engine(f"sqlite:///{self.file}") @@ -55,34 +77,70 @@ class Data(): return 'Success' - def print_all_visions(self): - pass - - def print_all_goals(self): - pass + def get_all_visions(self): + with Session(self.engine) as session: + cmd = select(Vision).where(Vision.complete_date == None) + return session.exec(cmd).all() def print_ophan_tasks(self): pass - def list_goals(self): + def get_all_goals(self): '''List all goals''' with Session(self.engine) as session: cmd = select(Goal).where(Goal.complete_date == None) return session.exec(cmd).all() - def print_goal(self, id, include_finished=False): - '''Includes tasks''' - pass + def get_done_goals(self): + '''List all goals''' + with Session(self.engine) as session: + cmd = select(Goal).where(Goal.complete_date != None) + return session.exec(cmd).all() + + + def get_goal(self, id): + with Session(self.engine) as session: + cmd = select(Goal).where(Goal.id == id) + goal = session.exec(cmd).first() + return (goal, goal.tasks) + + def get_vision(self, id): + with Session(self.engine) as session: + cmd = select(Vision).where(Vision.id == id) + vision = session.exec(cmd).first() + if vision: + return (vision, vision.goals) + else: + return ('Not found', []) + def complete_vision(self, id): - pass + with Session(self.engine) as session: + cmd = select(Vision).where(Vision.id == id) + vision = session.exec(cmd).first() + vision.complete_date = dt.today() + session.commit() + def complete_goal(self, id): - pass + vision_id = -1 + with Session(self.engine) as session: + cmd = select(Goal).where(Goal.id == id) + goal = session.exec(cmd).first() + goal.complete_date = dt.today() + vision_id = goal.vision_id + session.commit() + return vision_id def complete_task(self, id): - pass + with Session(self.engine) as session: + cmd = select(Task).where(Task.id == id) + task = session.exec(cmd).first() + task.complete_date = dt.today() + goal_id = task.goal_id + session.commit() + return goal_id def add_with_name(self, cls, name): id = -1 @@ -112,8 +170,8 @@ class Data(): '''Goals may move between visions''' with Session(self.engine) as session: cmd = select(Goal).where(Goal.id == goal_id) - new = session.exec(cmd).first() - new.vision_id = vision_id + goal = session.exec(cmd).first() + goal.vision_id = vision_id session.commit() def add_note(self, note, goal):