home · contact · privacy
For Todos, on Save check for auto-deletion by .effort < 0, and on removal check if...
[plomtask] / plomtask / todos.py
index 0fea23445ac1881a18ea87eca95cba7f03510f95..b3d50e9d4942c57cb5b4ef16892401df4eb7f6f7 100644 (file)
@@ -105,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."""
@@ -201,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: