class Todo(BaseModel[int], ConditionsRelations):
"""Individual actionable."""
-
# pylint: disable=too-many-instance-attributes
-
table_name = 'todos'
to_save = ['process_id', 'is_done', 'date']
def __init__(self, id_: int | None, process: Process,
is_done: bool, date: str) -> None:
- self.set_int_id(id_)
+ super().__init__(id_)
self.process = process
self._is_done = is_done
self.date = date
@classmethod
def from_table_row(cls, db_conn: DatabaseConnection,
row: Row | list[Any]) -> Todo:
- """Make from DB row, write to DB cache."""
+ """Make from DB row, with dependencies."""
if row[1] == 0:
raise NotFoundException('calling Todo of '
'unsaved Process')
row_as_list = list(row)
row_as_list[1] = Process.by_id(db_conn, row[1])
todo = super().from_table_row(db_conn, row_as_list)
- assert isinstance(todo, Todo)
- return todo
-
- @classmethod
- def by_id(cls, db_conn: DatabaseConnection, id_: int) -> Todo:
- """Get Todo of .id_=id_ and children (from DB cache if possible)."""
- todo, from_cache = super()._by_id(db_conn, id_)
- if todo is None:
- raise NotFoundException(f'Todo of ID not found: {id_}')
- if not from_cache:
- for t_id in db_conn.column_where('todo_children', 'child',
- 'parent', id_):
- todo.children += [cls.by_id(db_conn, t_id)]
- 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', 'enables', 'disables'):
- table = f'todo_{name}'
- assert isinstance(todo.id_, int)
- for cond_id in db_conn.column_where(table, 'condition',
- 'todo', todo.id_):
- target = getattr(todo, name)
- target += [Condition.by_id(db_conn, cond_id)]
- assert isinstance(todo, Todo)
+ assert isinstance(todo.id_, int)
+ for t_id in db_conn.column_where('todo_children', 'child',
+ 'parent', todo.id_):
+ # pylint: disable=no-member
+ todo.children += [cls.by_id(db_conn, t_id)]
+ for t_id in db_conn.column_where('todo_children', 'parent',
+ 'child', todo.id_):
+ # pylint: disable=no-member
+ todo.parents += [cls.by_id(db_conn, t_id)]
+ for name in ('conditions', 'enables', 'disables'):
+ table = f'todo_{name}'
+ assert isinstance(todo.id_, int)
+ for cond_id in db_conn.column_where(table, 'condition',
+ 'todo', todo.id_):
+ target = getattr(todo, name)
+ target += [Condition.by_id(db_conn, cond_id)]
return todo
@classmethod
if s.parent_step_id is None]
for child_process_id in [c.process.id_ for c in self.children]:
if child_process_id in unsatisfied:
- assert isinstance(child_process_id, int)
unsatisfied.remove(child_process_id)
return unsatisfied
and (c not in potentially_enabled)]:
children += [make_node(condition)]
else:
- assert isinstance(step, Condition)
seen = step.id_ in seen_conditions
seen_conditions.add(step.id_)
return TodoStepsNode(step, is_todo, children, seen)
[[c.id_] for c in self.enables])
db_conn.rewrite_relations('todo_disables', 'todo', self.id_,
[[c.id_] for c in self.disables])
+
+ def remove(self, db_conn: DatabaseConnection) -> None:
+ """Remove from DB, including relations."""
+ assert isinstance(self.id_, int)
+ for child in self.children:
+ self.remove_child(child)
+ for parent in self.parents:
+ parent.remove_child(self)
+ db_conn.delete_where('todo_conditions', 'todo', self.id_)
+ db_conn.delete_where('todo_enables', 'todo', self.id_)
+ db_conn.delete_where('todo_disables', 'todo', self.id_)
+ super().remove(db_conn)