home · contact · privacy
Refactor Process/ProcessStep setting and saving.
[plomtask] / plomtask / processes.py
index dc0613f8dbb2b01f941603203f57cbddb3766693..76ed30df049b5d801b283ab904364da27f05f240 100644 (file)
@@ -149,12 +149,15 @@ class Process:
         """Set self.undoes to Conditions identified by ids."""
         self.set_conditions(db_conn, ids, 'undoes')
 
-    def add_step(self, db_conn: DatabaseConnection, id_: int | None,
-                 step_process_id: int,
-                 parent_step_id: int | None) -> ProcessStep:
+    def _add_step(self,
+                  db_conn: DatabaseConnection,
+                  id_: int | None,
+                  step_process_id: int,
+                  parent_step_id: int | None) -> ProcessStep:
         """Create new ProcessStep, save and add it to self.explicit_steps.
 
         Also checks against step recursion.
+
         The new step's parent_step_id will fall back to None either if no
         matching ProcessStep is found (which can be assumed in case it was
         just deleted under its feet), or if the parent step would not be
@@ -180,10 +183,27 @@ class Process:
         step.save(db_conn)  # NB: This ensures a non-None step.id_.
         return step
 
-    def save_without_steps(self, db_conn: DatabaseConnection) -> None:
-        """Add (or re-write) self and connected VersionedAttributes to DB."""
+    def set_steps(self, db_conn: DatabaseConnection,
+                  steps: list[tuple[int | None, int, int | None]]) -> None:
+        """Set self.explicit_steps in bulk."""
+        for step in self.explicit_steps:
+            assert step.id_ is not None
+            del db_conn.cached_process_steps[step.id_]
+        self.explicit_steps = []
+        db_conn.exec('DELETE FROM process_steps WHERE owner_id = ?',
+                     (self.id_,))
+        for step_tuple in steps:
+            self._add_step(db_conn, step_tuple[0],
+                           step_tuple[1], step_tuple[2])
+
+    def save_id(self, db_conn: DatabaseConnection) -> None:
+        """Write bare-bones self (sans connected items), ensuring self.id_."""
         cursor = db_conn.exec('REPLACE INTO processes VALUES (?)', (self.id_,))
         self.id_ = cursor.lastrowid
+
+    def save(self, db_conn: DatabaseConnection) -> None:
+        """Add (or re-write) self and connected items to DB."""
+        self.save_id(db_conn)
         self.title.save(db_conn)
         self.description.save(db_conn)
         self.effort.save(db_conn)
@@ -203,27 +223,11 @@ class Process:
             db_conn.exec('INSERT INTO process_undoes VALUES (?,?)',
                          (self.id_, condition.id_))
         assert self.id_ is not None
-        db_conn.cached_processes[self.id_] = self
-
-    def fix_steps(self, db_conn: DatabaseConnection) -> None:
-        """Rewrite ProcessSteps from self.explicit_steps.
-
-        This also fixes illegal Step.parent_step_id values, i.e. those pointing
-        to steps now absent, or owned by a different Process, fall back into
-        .parent_step_id=None
-        """
         db_conn.exec('DELETE FROM process_steps WHERE owner_id = ?',
                      (self.id_,))
         for step in self.explicit_steps:
-            if step.parent_step_id is not None:
-                try:
-                    parent_step = ProcessStep.by_id(db_conn,
-                                                    step.parent_step_id)
-                    if parent_step.owner_id != self.id_:
-                        step.parent_step_id = None
-                except NotFoundException:
-                    step.parent_step_id = None
             step.save(db_conn)
+        db_conn.cached_processes[self.id_] = self
 
 
 class ProcessStep: