home · contact · privacy
Add Todo.effort.
[plomtask] / plomtask / todos.py
index a9bd94c7c0afa6d27e584f1e44bfa318012f93e5..7cbe989b538018e480d24752d2d0cc44450f7396 100644 (file)
@@ -5,6 +5,7 @@ from typing import Any
 from sqlite3 import Row
 from plomtask.db import DatabaseConnection, BaseModel
 from plomtask.processes import Process
+from plomtask.versioned_attributes import VersionedAttribute
 from plomtask.conditions import Condition, ConditionsRelations
 from plomtask.exceptions import (NotFoundException, BadFormatException,
                                  HandledException)
@@ -22,7 +23,7 @@ class Todo(BaseModel[int], ConditionsRelations):
     """Individual actionable."""
     # pylint: disable=too-many-instance-attributes
     table_name = 'todos'
-    to_save = ['process_id', 'is_done', 'date', 'comment']
+    to_save = ['process_id', 'is_done', 'date', 'comment', 'effort']
     to_save_relations = [('todo_conditions', 'todo', 'conditions'),
                          ('todo_enables', 'todo', 'enables'),
                          ('todo_disables', 'todo', 'disables'),
@@ -31,7 +32,8 @@ class Todo(BaseModel[int], ConditionsRelations):
 
     # pylint: disable=too-many-arguments
     def __init__(self, id_: int | None, process: Process,
-                 is_done: bool, date: str, comment: str = '') -> None:
+                 is_done: bool, date: str, comment: str = '',
+                 effort: None | float = None) -> None:
         super().__init__(id_)
         if process.id_ is None:
             raise NotFoundException('Process of Todo without ID (not saved?)')
@@ -39,6 +41,7 @@ class Todo(BaseModel[int], ConditionsRelations):
         self._is_done = is_done
         self.date = date
         self.comment = comment
+        self.effort = effort
         self.children: list[Todo] = []
         self.parents: list[Todo] = []
         self.conditions: list[Condition] = []
@@ -128,6 +131,11 @@ class Todo(BaseModel[int], ConditionsRelations):
                 for condition in self.disables:
                     condition.is_active = False
 
+    @property
+    def title(self) -> VersionedAttribute:
+        """Shortcut to .process.title."""
+        return self.process.title
+
     def adopt_from(self, todos: list[Todo]) -> bool:
         """As far as possible, fill unsatisfied dependencies from todos."""
         adopted = False