X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomtask%2Fprocesses.py;h=8082c3cb1d412fa7aa7806735e20ee908f27c404;hb=81e1ac998001bedd8a739e6458c7ed30e474c0da;hp=62220462936ad9452f45d1f87813bf38fcbb5bab;hpb=48ed70167c50303f46309c5808f93f2ba169b34f;p=plomtask diff --git a/plomtask/processes.py b/plomtask/processes.py index 6222046..8082c3c 100644 --- a/plomtask/processes.py +++ b/plomtask/processes.py @@ -44,11 +44,13 @@ class Process(BaseModel[int], ConditionsRelations): self.explicit_steps: list[ProcessStep] = [] self.suppressed_steps: list[ProcessStep] = [] self.calendarize = calendarize + self.n_owners: int | None = None # only set by from_table_row @classmethod def from_table_row(cls, db_conn: DatabaseConnection, row: Row | list[Any]) -> Process: """Make from DB row, with dependencies.""" + # pylint: disable=no-member process = super().from_table_row(db_conn, row) assert isinstance(process.id_, int) for name in ('title', 'description', 'effort'): @@ -58,11 +60,11 @@ class Process(BaseModel[int], ConditionsRelations): for row_ in db_conn.row_where('process_steps', 'owner', process.id_): step = ProcessStep.from_table_row(db_conn, row_) - process.explicit_steps += [step] # pylint: disable=no-member + process.explicit_steps += [step] for row_ in db_conn.row_where('process_step_suppressions', 'process', process.id_): step = ProcessStep.by_id(db_conn, row_[1]) - process.suppressed_steps += [step] # pylint: disable=no-member + process.suppressed_steps += [step] for name in ('conditions', 'blockers', 'enables', 'disables'): table = f'process_{name}' assert isinstance(process.id_, int) @@ -70,6 +72,7 @@ class Process(BaseModel[int], ConditionsRelations): 'process', process.id_): target = getattr(process, name) target += [Condition.by_id(db_conn, c_id)] + process.n_owners = len(process.used_as_step_by(db_conn)) return process def used_as_step_by(self, db_conn: DatabaseConnection) -> list[Process]: @@ -163,6 +166,27 @@ class Process(BaseModel[int], ConditionsRelations): walk_steps(step) self.explicit_steps += [step] + def set_owners(self, db_conn: DatabaseConnection, + owner_ids: list[int]) -> None: + """Re-set owners to those identified in owner_ids.""" + owners_old = self.used_as_step_by(db_conn) + losers = [o for o in owners_old if o.id_ not in owner_ids] + owners_old_ids = [o.id_ for o in owners_old] + winners = [Process.by_id(db_conn, id_) for id_ in owner_ids + if id_ not in owners_old_ids] + steps_to_remove = [] + for loser in losers: + steps_to_remove += [s for s in loser.explicit_steps + if s.step_process_id == self.id_] + for step in steps_to_remove: + step.remove(db_conn) + for winner in winners: + assert isinstance(winner.id_, int) + assert isinstance(self.id_, int) + new_step = ProcessStep(None, winner.id_, self.id_, None) + new_explicit_steps = winner.explicit_steps + [new_step] + winner.set_steps(db_conn, new_explicit_steps) + def save(self, db_conn: DatabaseConnection) -> None: """Add (or re-write) self and connected items to DB.""" super().save(db_conn)