X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomtask%2Ftodos.py;fp=plomtask%2Ftodos.py;h=af45f720ca6e2011fb52bd5af18582a2feca76f1;hb=f0f10048714c1bbcf23a7fa6a934d126408845f3;hp=de6438c1e248777f388a1e8217b7fc059c851c2c;hpb=19f308751a3e651296d8ef9f87059279fad6267b;p=plomtask diff --git a/plomtask/todos.py b/plomtask/todos.py index de6438c..af45f72 100644 --- a/plomtask/todos.py +++ b/plomtask/todos.py @@ -177,6 +177,15 @@ class Todo(BaseModel[int], ConditionsRelations): return False return True + @property + def performed_effort(self) -> float: + """Return performed effort, i.e. self.effort or default if done..""" + if self.effort is not None: + return self.effort + if self.is_done: + return self.effort_then + return 0 + @property def process_id(self) -> int | str | None: """Needed for super().save to save Processes as attributes.""" @@ -244,6 +253,18 @@ class Todo(BaseModel[int], ConditionsRelations): return make_node(self) + @property + def tree_effort(self) -> float: + """Return sum of performed efforts of self and all descendants.""" + + def walk_tree(node: Todo) -> float: + local_effort = 0 + for child in node.children: + local_effort += walk_tree(child) + return node.performed_effort + local_effort + + return walk_tree(self) + def add_child(self, child: Todo) -> None: """Add child to self.children, avoid recursion, update parenthoods."""