X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomtask%2Fprocesses.py;h=1778e4f73b8eff992322b9b1e166f6987047e05d;hb=53f151ef577dd8115e72d38a8991ad77c75f7e59;hp=c0b13b551862b0c8a00c927c4cc0665ae178daeb;hpb=8570f4ce4d44b813a1f02b72c5c45a57d2003bae;p=plomtask diff --git a/plomtask/processes.py b/plomtask/processes.py index c0b13b5..1778e4f 100644 --- a/plomtask/processes.py +++ b/plomtask/processes.py @@ -4,9 +4,10 @@ from dataclasses import dataclass from typing import Set, Any from sqlite3 import Row from plomtask.db import DatabaseConnection, BaseModel -from plomtask.misc import VersionedAttribute +from plomtask.versioned_attributes import VersionedAttribute from plomtask.conditions import Condition, ConditionsRelations -from plomtask.exceptions import NotFoundException, BadFormatException +from plomtask.exceptions import (NotFoundException, BadFormatException, + HandledException) @dataclass @@ -22,6 +23,10 @@ class ProcessStepsNode: class Process(BaseModel[int], ConditionsRelations): """Template for, and metadata for, Todos, and their arrangements.""" table_name = 'processes' + to_save_versioned = ['title', 'description', 'effort'] + to_save_relations = [('process_conditions', 'process', 'conditions'), + ('process_enables', 'process', 'enables'), + ('process_disables', 'process', 'disables')] # pylint: disable=too-many-instance-attributes @@ -154,21 +159,26 @@ class Process(BaseModel[int], ConditionsRelations): def save(self, db_conn: DatabaseConnection) -> None: """Add (or re-write) self and connected items to DB.""" - self.save_core(db_conn) + super().save(db_conn) assert isinstance(self.id_, int) - self.title.save(db_conn) - self.description.save(db_conn) - self.effort.save(db_conn) - db_conn.rewrite_relations('process_conditions', 'process', self.id_, - [[c.id_] for c in self.conditions]) - db_conn.rewrite_relations('process_enables', 'process', self.id_, - [[c.id_] for c in self.enables]) - db_conn.rewrite_relations('process_disables', 'process', self.id_, - [[c.id_] for c in self.disables]) db_conn.delete_where('process_steps', 'owner', self.id_) for step in self.explicit_steps: step.save(db_conn) + def remove(self, db_conn: DatabaseConnection) -> None: + """Remove from DB, with dependencies. + + Guard against removal of Processes in use. + """ + assert isinstance(self.id_, int) + for _ in db_conn.row_where('process_steps', 'step_process', self.id_): + raise HandledException('cannot remove Process in use') + for _ in db_conn.row_where('todos', 'process', self.id_): + raise HandledException('cannot remove Process in use') + for step in self.explicit_steps: + step.remove(db_conn) + super().remove(db_conn) + class ProcessStep(BaseModel[int]): """Sub-unit of Processes.""" @@ -182,6 +192,8 @@ class ProcessStep(BaseModel[int]): self.step_process_id = step_process_id self.parent_step_id = parent_step_id - def save(self, db_conn: DatabaseConnection) -> None: - """Default to simply calling self.save_core for simple cases.""" - self.save_core(db_conn) + def remove(self, db_conn: DatabaseConnection) -> None: + """Remove from DB, and owner's .explicit_steps.""" + owner = Process.by_id(db_conn, self.owner_id) + owner.explicit_steps.remove(self) + super().remove(db_conn)