home · contact · privacy
For Todos, on Save check for auto-deletion by .effort < 0, and on removal check if...
[plomtask] / plomtask / todos.py
index 0313e559ee25db4360a14e53cadd31e23a52dda7..b3d50e9d4942c57cb5b4ef16892401df4eb7f6f7 100644 (file)
@@ -23,7 +23,8 @@ 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',
+               'calendarize']
     to_save_relations = [('todo_conditions', 'todo', 'conditions'),
                          ('todo_enables', 'todo', 'enables'),
                          ('todo_disables', 'todo', 'disables'),
@@ -31,8 +32,12 @@ class Todo(BaseModel[int], ConditionsRelations):
                          ('todo_children', 'child', 'parents')]
 
     # pylint: disable=too-many-arguments
-    def __init__(self, id_: int | None, process: Process,
-                 is_done: bool, date: str, comment: str = '') -> None:
+    def __init__(self, id_: int | None,
+                 process: Process,
+                 is_done: bool,
+                 date: str, comment: str = '',
+                 effort: None | float = None,
+                 calendarize: bool = False) -> None:
         super().__init__(id_)
         if process.id_ is None:
             raise NotFoundException('Process of Todo without ID (not saved?)')
@@ -40,12 +45,15 @@ 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.calendarize = calendarize
         self.conditions: list[Condition] = []
         self.enables: list[Condition] = []
         self.disables: list[Condition] = []
         if not self.id_:
+            self.calendarize = self.process.calendarize
             self.conditions = self.process.conditions[:]
             self.enables = self.process.enables[:]
             self.disables = self.process.disables[:]
@@ -97,6 +105,15 @@ class Todo(BaseModel[int], ConditionsRelations):
                 return False
         return True
 
+    @property
+    def is_deletable(self) -> bool:
+        """Decide whether self be deletable (not if preserve-worthy values)."""
+        if self.comment:
+            return False
+        if self.effort and self.effort >= 0:
+            return False
+        return True
+
     @property
     def process_id(self) -> int | str | None:
         """Needed for super().save to save Processes as attributes."""
@@ -193,8 +210,17 @@ class Todo(BaseModel[int], ConditionsRelations):
         self.children.remove(child)
         child.parents.remove(self)
 
+    def save(self, db_conn: DatabaseConnection) -> None:
+        """On save calls, also check if auto-deletion by effort < 0."""
+        if self.effort and self.effort < 0 and self.is_deletable:
+            self.remove(db_conn)
+            return
+        super().save(db_conn)
+
     def remove(self, db_conn: DatabaseConnection) -> None:
         """Remove from DB, including relations."""
+        if not self.is_deletable:
+            raise HandledException('Cannot remove non-deletable Todo.')
         children_to_remove = self.children[:]
         parents_to_remove = self.parents[:]
         for child in children_to_remove: