X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=plomtask%2Ftodos.py;h=d53674b6339679fa31ece5f78c0d871cfd90af01;hb=f19823e9e77ae0017022dbfe63f66d2b065ba33a;hp=3bd3491778d9c95c93bc34db8794c643e2069486;hpb=a99b13325a21042825450d2497ddf61f8c5c3644;p=plomtask diff --git a/plomtask/todos.py b/plomtask/todos.py index 3bd3491..d53674b 100644 --- a/plomtask/todos.py +++ b/plomtask/todos.py @@ -17,6 +17,7 @@ class TodoStepsNode: is_todo: bool children: list[TodoStepsNode] seen: bool + hide: bool class Todo(BaseModel[int], ConditionsRelations): @@ -185,11 +186,46 @@ class Todo(BaseModel[int], ConditionsRelations): else: seen = step.id_ in seen_conditions seen_conditions.add(step.id_) - return TodoStepsNode(step, is_todo, children, seen) + return TodoStepsNode(step, is_todo, children, seen, False) node = make_node(self) return node + def get_undone_steps_tree(self) -> TodoStepsNode: + """Return tree of depended-on undone Todos and Conditions.""" + + def walk_tree(node: TodoStepsNode) -> None: + if isinstance(node.item, Todo) and node.item.is_done: + node.hide = True + for child in node.children: + walk_tree(child) + + seen_todos: set[int] = set() + seen_conditions: set[int] = set() + step_tree = self.get_step_tree(seen_todos, seen_conditions) + walk_tree(step_tree) + return step_tree + + def get_done_steps_tree(self) -> list[TodoStepsNode]: + """Return tree of depended-on done Todos.""" + + def make_nodes(node: TodoStepsNode) -> list[TodoStepsNode]: + children: list[TodoStepsNode] = [] + if not isinstance(node.item, Todo): + return children + for child in node.children: + children += make_nodes(child) + if node.item.is_done: + node.children = children + return [node] + return children + + seen_todos: set[int] = set() + seen_conditions: set[int] = set() + step_tree = self.get_step_tree(seen_todos, seen_conditions) + nodes = make_nodes(step_tree) + return nodes + def add_child(self, child: Todo) -> None: """Add child to self.children, avoid recursion, update parenthoods.""" @@ -222,6 +258,8 @@ class Todo(BaseModel[int], ConditionsRelations): raise NotFoundException('Process of Todo without ID (not saved?)') self.save_core(db_conn) assert isinstance(self.id_, int) + db_conn.rewrite_relations('todo_children', 'child', self.id_, + [[p.id_] for p in self.parents]) 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_, @@ -234,10 +272,14 @@ class Todo(BaseModel[int], ConditionsRelations): def remove(self, db_conn: DatabaseConnection) -> None: """Remove from DB, including relations.""" assert isinstance(self.id_, int) - for child in self.children: + children_to_remove = self.children[:] + parents_to_remove = self.parents[:] + for child in children_to_remove: self.remove_child(child) - for parent in self.parents: + for parent in parents_to_remove: parent.remove_child(self) + db_conn.delete_where('todo_children', 'parent', self.id_) + db_conn.delete_where('todo_children', 'child', self.id_) 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_)