X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=plomtask%2Fprocesses.py;h=9705f17a5672336371ba186ff5d52cdd5fe002ef;hb=4815fe5c7be508e67ceec144968a81bdd6a923d4;hp=32eee4d350db5ed78f4501f7016688f5c174c7cb;hpb=951d8ad55c0d54286f9c986257a67dfa9710fcf2;p=plomtask diff --git a/plomtask/processes.py b/plomtask/processes.py index 32eee4d..9705f17 100644 --- a/plomtask/processes.py +++ b/plomtask/processes.py @@ -18,7 +18,7 @@ class ProcessStepsNode: seen: bool -class Process(BaseModel, ConditionsRelations): +class Process(BaseModel[int], ConditionsRelations): """Template for, and metadata for, Todos, and their arrangements.""" table_name = 'processes' @@ -34,45 +34,34 @@ class Process(BaseModel, ConditionsRelations): self.enables: list[Condition] = [] self.disables: list[Condition] = [] - @classmethod - def all(cls, db_conn: DatabaseConnection) -> list[Process]: - """Collect all Processes and their connected VersionedAttributes.""" - processes = {} - for id_, process in db_conn.cached_processes.items(): - processes[id_] = process - already_recorded = processes.keys() - for id_ in db_conn.column_all('processes', 'id'): - if id_ not in already_recorded: - process = cls.by_id(db_conn, id_) - processes[process.id_] = process - return list(processes.values()) - @classmethod def by_id(cls, db_conn: DatabaseConnection, id_: int | None, create: bool = False) -> Process: """Collect Process, its VersionedAttributes, and its child IDs.""" process = None + from_cache = False if id_: - process, _ = super()._by_id(db_conn, id_) - if not process: - if not create: - raise NotFoundException(f'Process not found of id: {id_}') - process = Process(id_) - if isinstance(process.id_, int): - for name in ('title', 'description', 'effort'): - table = f'process_{name}s' - for row in db_conn.row_where(table, 'parent', process.id_): - getattr(process, name).history_from_row(row) - for row in db_conn.row_where('process_steps', 'owner', - process.id_): - step = ProcessStep.from_table_row(db_conn, row) - process.explicit_steps += [step] - for name in ('conditions', 'enables', 'disables'): - table = f'process_{name}' - for cond_id in db_conn.column_where(table, 'condition', - 'process', process.id_): - target = getattr(process, name) - target += [Condition.by_id(db_conn, cond_id)] + process, from_cache = super()._by_id(db_conn, id_) + if not from_cache: + if not process: + if not create: + raise NotFoundException(f'Process not found of id: {id_}') + process = Process(id_) + if isinstance(process.id_, int): + for name in ('title', 'description', 'effort'): + table = f'process_{name}s' + for row in db_conn.row_where(table, 'parent', process.id_): + getattr(process, name).history_from_row(row) + for row in db_conn.row_where('process_steps', 'owner', + process.id_): + step = ProcessStep.from_table_row(db_conn, row) + process.explicit_steps += [step] + for name in ('conditions', 'enables', 'disables'): + table = f'process_{name}' + for c_id in db_conn.column_where(table, 'condition', + 'process', process.id_): + target = getattr(process, name) + target += [Condition.by_id(db_conn, c_id)] assert isinstance(process, Process) return process @@ -163,8 +152,7 @@ class Process(BaseModel, ConditionsRelations): """Set self.explicit_steps in bulk.""" assert isinstance(self.id_, int) for step in self.explicit_steps: - assert isinstance(step.id_, int) - del db_conn.cached_process_steps[step.id_] + step.uncache() self.explicit_steps = [] db_conn.delete_where('process_steps', 'owner', self.id_) for step_tuple in steps: @@ -187,10 +175,9 @@ class Process(BaseModel, ConditionsRelations): db_conn.delete_where('process_steps', 'owner', self.id_) for step in self.explicit_steps: step.save(db_conn) - db_conn.cached_processes[self.id_] = self -class ProcessStep(BaseModel): +class ProcessStep(BaseModel[int]): """Sub-unit of Processes.""" table_name = 'process_steps' to_save = ['owner_id', 'step_process_id', 'parent_step_id'] @@ -207,7 +194,6 @@ class ProcessStep(BaseModel): """Retrieve ProcessStep by id_, or throw NotFoundException.""" step, _ = super()._by_id(db_conn, id_) if step: - assert isinstance(step, ProcessStep) return step raise NotFoundException(f'found no ProcessStep of ID {id_}')