X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=plomtask%2Ftodos.py;h=ecdd599f2cd538acda5494fc5035e72e076b6730;hb=704c00a101fc1922158a3a71a043562d34b696ad;hp=a874a6d7d6ba9a3596301ead4c4a024c3594748b;hpb=db1c88ab178f6ec54a994f2789c9db25604fcd83;p=plomtask diff --git a/plomtask/todos.py b/plomtask/todos.py index a874a6d..ecdd599 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): @@ -176,20 +177,55 @@ class Todo(BaseModel[int], ConditionsRelations): potentially_enabled = set() for child in step.children: for condition in child.enables: - potentially_enabled.add(condition) + potentially_enabled.add(condition.id_) children += [make_node(child)] for condition in [c for c in step.conditions if (not c.is_active) - and (c not in potentially_enabled)]: + and (c.id_ not in potentially_enabled)]: children += [make_node(condition)] 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."""