X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=plomtask%2Ftodos.py;h=0125b97809350de3c991d332d80c7adfbaf583ce;hb=4691a05e64acb2239f9d449b36f4ff5c678a1d6c;hp=de6438c1e248777f388a1e8217b7fc059c851c2c;hpb=48ed70167c50303f46309c5808f93f2ba169b34f;p=plomtask
diff --git a/plomtask/todos.py b/plomtask/todos.py
index de6438c..0125b97 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.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."""