X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=plomtask%2Ftodos.py;h=d53674b6339679fa31ece5f78c0d871cfd90af01;hb=f19823e9e77ae0017022dbfe63f66d2b065ba33a;hp=a874a6d7d6ba9a3596301ead4c4a024c3594748b;hpb=db1c88ab178f6ec54a994f2789c9db25604fcd83;p=plomtask diff --git a/plomtask/todos.py b/plomtask/todos.py index a874a6d..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."""