X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/%7B%7Bdeck_id%7D%7D/cards/%7B%7Bcard_id%7D%7D/static/git-logo.png?a=blobdiff_plain;f=plomtask%2Fconditions.py;h=b60d0af53c534c4672241bb8f853c3f537d55ecb;hb=25b71c6f0b10db05907128daf50c6e543e514c35;hp=66961256e28ad2843ae9d72ba9babbbd552b6f60;hpb=8570f4ce4d44b813a1f02b72c5c45a57d2003bae;p=plomtask diff --git a/plomtask/conditions.py b/plomtask/conditions.py index 6696125..b60d0af 100644 --- a/plomtask/conditions.py +++ b/plomtask/conditions.py @@ -1,15 +1,17 @@ """Non-doable elements of ProcessStep/Todo chains.""" from __future__ import annotations -from typing import Any -from sqlite3 import Row from plomtask.db import DatabaseConnection, BaseModel -from plomtask.misc import VersionedAttribute +from plomtask.versioned_attributes import VersionedAttribute +from plomtask.exceptions import HandledException class Condition(BaseModel[int]): - """Non Process-dependency for ProcessSteps and Todos.""" + """Non-Process dependency for ProcessSteps and Todos.""" table_name = 'conditions' to_save = ['is_active'] + to_save_versioned = ['title', 'description'] + to_search = ['title.newest', 'description.newest'] + can_create_by_id = True def __init__(self, id_: int | None, is_active: bool = False) -> None: super().__init__(id_) @@ -18,27 +20,32 @@ class Condition(BaseModel[int]): self.description = VersionedAttribute(self, 'condition_descriptions', '') - @classmethod - def from_table_row(cls, db_conn: DatabaseConnection, - row: Row | list[Any]) -> Condition: - """Build condition from row, including VersionedAttributes.""" - condition = super().from_table_row(db_conn, row) - for name in ('title', 'description'): - table_name = f'condition_{name}s' - for row_ in db_conn.row_where(table_name, 'parent', row[0]): - getattr(condition, name).history_from_row(row_) - return condition + def remove(self, db_conn: DatabaseConnection) -> None: + """Remove from DB, with VersionedAttributes. - def save(self, db_conn: DatabaseConnection) -> None: - """Save self and its VersionedAttributes to DB and cache.""" - self.save_core(db_conn) - self.title.save(db_conn) - self.description.save(db_conn) + Checks for Todos and Processes that depend on Condition, prohibits + deletion if found. + """ + if self.id_ is not None: + for item in ('process', 'todo'): + for attr in ('conditions', 'blockers', 'enables', 'disables'): + table_name = f'{item}_{attr}' + for _ in db_conn.row_where(table_name, 'condition', + self.id_): + msg = 'cannot remove Condition in use' + raise HandledException(msg) + super().remove(db_conn) class ConditionsRelations: """Methods for handling relations to Conditions, for Todo and Process.""" + def __init__(self) -> None: + self.conditions: list[Condition] = [] + self.blockers: list[Condition] = [] + self.enables: list[Condition] = [] + self.disables: list[Condition] = [] + def set_conditions(self, db_conn: DatabaseConnection, ids: list[int], target: str = 'conditions') -> None: """Set self.[target] to Conditions identified by ids.""" @@ -48,6 +55,11 @@ class ConditionsRelations: for id_ in ids: target_list += [Condition.by_id(db_conn, id_)] + def set_blockers(self, db_conn: DatabaseConnection, + ids: list[int]) -> None: + """Set self.enables to Conditions identified by ids.""" + self.set_conditions(db_conn, ids, 'blockers') + def set_enables(self, db_conn: DatabaseConnection, ids: list[int]) -> None: """Set self.enables to Conditions identified by ids."""