X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=plomtask%2Ftodos.py;h=3bd3491778d9c95c93bc34db8794c643e2069486;hb=a99b13325a21042825450d2497ddf61f8c5c3644;hp=80dc97c25ac481089b5760a0c8072af5f755ef08;hpb=696aed8a590fa9c67a6b9c723e2134b2663bd769;p=plomtask
diff --git a/plomtask/todos.py b/plomtask/todos.py
index 80dc97c..3bd3491 100644
--- a/plomtask/todos.py
+++ b/plomtask/todos.py
@@ -19,17 +19,15 @@ class TodoStepsNode:
seen: bool
-class Todo(BaseModel, ConditionsRelations):
+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
@@ -46,36 +44,29 @@ class Todo(BaseModel, ConditionsRelations):
@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}'
- 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
@@ -134,7 +125,6 @@ class Todo(BaseModel, ConditionsRelations):
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
@@ -193,7 +183,6 @@ class Todo(BaseModel, ConditionsRelations):
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)
@@ -233,7 +222,6 @@ class Todo(BaseModel, ConditionsRelations):
raise NotFoundException('Process of Todo without ID (not saved?)')
self.save_core(db_conn)
assert isinstance(self.id_, int)
- db_conn.cached_todos[self.id_] = self
db_conn.rewrite_relations('todo_children', 'parent', self.id_,
[[c.id_] for c in self.children])
db_conn.rewrite_relations('todo_conditions', 'todo', self.id_,
@@ -242,3 +230,15 @@ class Todo(BaseModel, ConditionsRelations):
[[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)