home · contact · privacy
Make explicit ProcessSteps overwrite implicit ones.
[plomtask] / plomtask / processes.py
index 684dec81dde47e6bd409ffaa52edc3a251246e8d..089a7105fddcd9228dbaebcfd3c6313e3ff57f6b 100644 (file)
@@ -26,10 +26,10 @@ class Process(BaseModel[int], ConditionsRelations):
     table_name = 'processes'
     to_save = ['calendarize']
     to_save_versioned = ['title', 'description', 'effort']
-    to_save_relations = [('process_conditions', 'process', 'conditions'),
-                         ('process_blockers', 'process', 'blockers'),
-                         ('process_enables', 'process', 'enables'),
-                         ('process_disables', 'process', 'disables')]
+    to_save_relations = [('process_conditions', 'process', 'conditions', 0),
+                         ('process_blockers', 'process', 'blockers', 0),
+                         ('process_enables', 'process', 'enables', 0),
+                         ('process_disables', 'process', 'disables', 0)]
     to_search = ['title.newest', 'description.newest']
 
     def __init__(self, id_: int | None, calendarize: bool = False) -> None:
@@ -93,6 +93,13 @@ class Process(BaseModel[int], ConditionsRelations):
             for child in explicit_children:
                 assert isinstance(child.id_, int)
                 node.steps[child.id_] = make_node(child)
+                # ensure that one (!) explicit step of process replaces
+                # one (!) implicit step of same process
+                for i in [i for i, s in node.steps.items()
+                          if not s.is_explicit
+                          and s.process.id_ == child.step_process_id]:
+                    del node.steps[i]
+                    break
             node.seen = node_id in seen_step_ids
             seen_step_ids.add(node_id)
             for id_, step in node.steps.items():
@@ -124,7 +131,6 @@ class Process(BaseModel[int], ConditionsRelations):
         just deleted under its feet), or if the parent step would not be
         owned by the current Process.
         """
-
         def walk_steps(node: ProcessStep) -> None:
             if node.step_process_id == self.id_:
                 raise BadFormatException('bad step selection causes recursion')