X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/%7B%7Bdeck_id%7D%7D/cards/%7B%7Bcard_id%7D%7D/form?a=blobdiff_plain;f=plomtask%2Ftodos.py;h=d060e230381d69dc53cacde6ab28fc37e6afefe6;hb=c2004503dc42449f1fa129b8e56eeef0a6df4712;hp=fd72af6bf8c0842f2a2727185c2b4c3f707a20d4;hpb=2d0d3a138de69e5e09208936ac094b53b0785c0b;p=plomtask diff --git a/plomtask/todos.py b/plomtask/todos.py index fd72af6..d060e23 100644 --- a/plomtask/todos.py +++ b/plomtask/todos.py @@ -4,12 +4,12 @@ from typing import Any from sqlite3 import Row from plomtask.db import DatabaseConnection, BaseModel from plomtask.processes import Process -from plomtask.conditions import Condition +from plomtask.conditions import Condition, ConditionsRelations from plomtask.exceptions import (NotFoundException, BadFormatException, HandledException) -class Todo(BaseModel): +class Todo(BaseModel, ConditionsRelations): """Individual actionable.""" # pylint: disable=too-many-instance-attributes @@ -26,12 +26,12 @@ class Todo(BaseModel): self.children: list[Todo] = [] self.parents: list[Todo] = [] self.conditions: list[Condition] = [] - self.fulfills: list[Condition] = [] - self.undoes: list[Condition] = [] + self.enables: list[Condition] = [] + self.disables: list[Condition] = [] if not self.id_: self.conditions = process.conditions[:] - self.fulfills = process.fulfills[:] - self.undoes = process.undoes[:] + self.enables = process.enables[:] + self.disables = process.disables[:] @classmethod def from_table_row(cls, db_conn: DatabaseConnection, @@ -59,7 +59,7 @@ class Todo(BaseModel): for t_id in db_conn.column_where('todo_children', 'parent', 'child', id_): todo.parents += [cls.by_id(db_conn, t_id)] - for name in ('conditions', 'fulfills', 'undoes'): + for name in ('conditions', 'enables', 'disables'): table = f'todo_{name}' for cond_id in db_conn.column_where(table, 'condition', 'todo', todo.id_): @@ -76,31 +76,30 @@ class Todo(BaseModel): todos += [cls.by_id(db_conn, id_)] return todos + @staticmethod + def _x_ablers_for_at(db_conn: DatabaseConnection, name: str, + cond: Condition, date: str) -> list[Todo]: + """Collect all Todos of day that [name] condition.""" + assert isinstance(cond.id_, int) + x_ablers = [] + table = f'todo_{name}' + for id_ in db_conn.column_where(table, 'todo', 'condition', cond.id_): + todo = Todo.by_id(db_conn, id_) + if todo.date == date: + x_ablers += [todo] + return x_ablers + @classmethod - def enablers_for_at(cls, db_conn: DatabaseConnection, condition: Condition, - date: str) -> list[Todo]: + def enablers_for_at(cls, db_conn: DatabaseConnection, + condition: Condition, date: str) -> list[Todo]: """Collect all Todos of day that enable condition.""" - assert isinstance(condition.id_, int) - enablers = [] - for id_ in db_conn.column_where('todo_fulfills', 'todo', 'condition', - condition.id_): - todo = cls.by_id(db_conn, id_) - if todo.date == date: - enablers += [todo] - return enablers + return cls._x_ablers_for_at(db_conn, 'enables', condition, date) @classmethod def disablers_for_at(cls, db_conn: DatabaseConnection, condition: Condition, date: str) -> list[Todo]: """Collect all Todos of day that disable condition.""" - assert isinstance(condition.id_, int) - disablers = [] - for id_ in db_conn.column_where('todo_undoes', 'todo', 'condition', - condition.id_): - todo = cls.by_id(db_conn, id_) - if todo.date == date: - disablers += [todo] - return disablers + return cls._x_ablers_for_at(db_conn, 'disables', condition, date) @property def is_doable(self) -> bool: @@ -130,29 +129,11 @@ class Todo(BaseModel): if self._is_done != value: self._is_done = value if value is True: - for condition in self.fulfills: + for condition in self.enables: condition.is_active = True - for condition in self.undoes: + for condition in self.disables: condition.is_active = False - def set_undoes(self, db_conn: DatabaseConnection, ids: list[int]) -> None: - """Set self.undoes to Conditions identified by ids.""" - self.set_conditions(db_conn, ids, 'undoes') - - def set_fulfills(self, db_conn: DatabaseConnection, - ids: list[int]) -> None: - """Set self.fulfills to Conditions identified by ids.""" - self.set_conditions(db_conn, ids, 'fulfills') - - def set_conditions(self, db_conn: DatabaseConnection, ids: list[int], - target: str = 'conditions') -> None: - """Set self.[target] to Conditions identified by ids.""" - target_list = getattr(self, target) - while len(target_list) > 0: - target_list.pop() - for id_ in ids: - target_list += [Condition.by_id(db_conn, id_)] - def add_child(self, child: Todo) -> None: """Add child to self.children, guard against recursion""" def walk_steps(node: Todo) -> None: @@ -181,7 +162,7 @@ class Todo(BaseModel): [[c.id_] for c in self.children]) db_conn.rewrite_relations('todo_conditions', 'todo', self.id_, [[c.id_] for c in self.conditions]) - db_conn.rewrite_relations('todo_fulfills', 'todo', self.id_, - [[c.id_] for c in self.fulfills]) - db_conn.rewrite_relations('todo_undoes', 'todo', self.id_, - [[c.id_] for c in self.undoes]) + db_conn.rewrite_relations('todo_enables', 'todo', self.id_, + [[c.id_] for c in self.enables]) + db_conn.rewrite_relations('todo_disables', 'todo', self.id_, + [[c.id_] for c in self.disables])