From 1cfc7e6638de670e109c8f58d3974681d62e3f04 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 26 Aug 2024 14:59:47 +0200 Subject: [PATCH] AddFile: Activate scenarios. --- src/Model/AdditionalFile/AddFile.py | 47 +++++++++++++++++-------- src/Model/AdditionalFile/AddFileList.py | 5 ++- src/Model/Study.py | 16 ++++++--- src/Model/Tools/PamhyrDB.py | 19 ++++++++++ 4 files changed, 67 insertions(+), 20 deletions(-) diff --git a/src/Model/AdditionalFile/AddFile.py b/src/Model/AdditionalFile/AddFile.py index 32d5d355..65e0e701 100644 --- a/src/Model/AdditionalFile/AddFile.py +++ b/src/Model/AdditionalFile/AddFile.py @@ -30,10 +30,11 @@ class AddFile(SQLSubModel): def __init__(self, id: int = -1, enabled=True, name="", path="", text="", - status=None): - super(AddFile, self).__init__(id) - - self._status = status + status=None, owner_scenario=-1): + super(AddFile, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) self._enabled = enabled self._name = f"File #{self._pamhyr_id}" if name == "" else name @@ -64,7 +65,7 @@ class AddFile(SQLSubModel): elif key == "text": self._text = value - self._status.modified() + self.modified() @property def enabled(self): @@ -73,7 +74,7 @@ class AddFile(SQLSubModel): @enabled.setter def enabled(self, enabled): self._enabled = enabled - self._status.modified() + self.modified() def is_enabled(self): return self._enabled @@ -85,7 +86,7 @@ class AddFile(SQLSubModel): @name.setter def name(self, name): self._name = name - self._status.modified() + self.modified() @property def path(self): @@ -94,7 +95,7 @@ class AddFile(SQLSubModel): @path.setter def path(self, path): self._path = path - self._status.modified() + self.modified() @property def text(self): @@ -103,7 +104,7 @@ class AddFile(SQLSubModel): @text.setter def text(self, text): self._text = text - self._status.modified() + self.modified() @classmethod def _db_create(cls, execute, ext=""): @@ -158,10 +159,17 @@ class AddFile(SQLSubModel): @classmethod def _db_load(cls, execute, data=None): new = [] + scenario = data["scenario"] + loaded = data['loaded_pid'] + + if scenario is None: + return new table = execute( - "SELECT pamhyr_id, enabled, name, path, text " + - "FROM additional_files" + "SELECT pamhyr_id, enabled, name, path, text, scenario " + + "FROM additional_files " + + f"WHERE scenario = {scenario.id} " + + f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))})" ) for row in table: @@ -172,25 +180,36 @@ class AddFile(SQLSubModel): name = next(it) path = next(it) text = next(it) + owner_scenario = next(it) f = cls( id=id, enabled=enabled, name=name, path=path, text=text, - status=data['status'] + status=data['status'], owner_scenario=owner_scenario ) + loaded.add(id) new.append(f) + data["scenario"] = scenario.parent + new += cls._db_load(execute, data) + data["scenario"] = scenario + return new def _db_save(self, execute, data=None): + if not self.must_be_saved(): + return True + sql = ( "INSERT INTO " + - "additional_files(pamhyr_id, enabled, name, path, text) " + + "additional_files(pamhyr_id, enabled, " + + "name, path, text, scenario) " + "VALUES (" + f"{self._pamhyr_id}, {self._enabled}, " + f"'{self._db_format(self._name)}', " + f"'{self._db_format(self._path)}', " + - f"'{self._db_format(self._text)}'" + + f"'{self._db_format(self._text)}', " + + f"{self._status.scenario_id}" ")" ) execute(sql) diff --git a/src/Model/AdditionalFile/AddFileList.py b/src/Model/AdditionalFile/AddFileList.py index 8d28e211..f45d9cc1 100644 --- a/src/Model/AdditionalFile/AddFileList.py +++ b/src/Model/AdditionalFile/AddFileList.py @@ -38,7 +38,10 @@ class AddFileList(PamhyrModelList): ok = True # Delete previous data - execute("DELETE FROM additional_files") + execute( + "DELETE FROM additional_files " + + f"WHERE scenario = {self._status.scenario_id}" + ) for af in self._lst: ok &= af._db_save(execute, data) diff --git a/src/Model/Study.py b/src/Model/Study.py index a93d3943..b5a63ca3 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -122,7 +122,6 @@ class Study(SQLModel): logger.debug(f"Backup previous version copy: {filename}") shutil.copy(self.filename, filename) self._old_save_id += 1 - is_new = True if ".backup" in self.filename: is_new = True @@ -308,7 +307,6 @@ class Study(SQLModel): @classmethod def _load(cls, filename): new = cls(init_new=False, filename=filename) - data = {"status": new.status} def sql_exec(sql): return new.execute( @@ -340,6 +338,8 @@ class Study(SQLModel): ) ) + data = {"status": new.status} + # Scenarios new.scenarios = Scenarios._db_load( sql_exec, @@ -354,6 +354,9 @@ class Study(SQLModel): scenario = new.scenarios[int(scenario_id[0])] new.status.scenario = scenario + data["scenario"] = scenario + data["loaded_pid"] = set() + # Load river data new._river = River._db_load( sql_exec, @@ -444,14 +447,17 @@ class Study(SQLModel): return new def reload_from_scenario(self, scenario): - data = {"status": new.status} - def sql_exec(sql): - return new.execute( + return self.execute( sql, fetch_one=False, commit=True ) self.status.scenario = scenario + data = { + "status": self.status, + "loaded_pid": set(), + "scenario": scenario + } # Reload river data self._river = River._db_load( diff --git a/src/Model/Tools/PamhyrDB.py b/src/Model/Tools/PamhyrDB.py index c23c9198..1a46b772 100644 --- a/src/Model/Tools/PamhyrDB.py +++ b/src/Model/Tools/PamhyrDB.py @@ -157,6 +157,25 @@ class SQLModel(SQL): class SQLSubModel(PamhyrID): _sub_classes = [] + def __init__(self, id: int = -1, status=None, + owner_scenario=-1): + super(SQLSubModel, self).__init__(id) + + self._status = status + self._owner_scenario = 0 + if owner_scenario == -1: + if status is not None: + self._owner_scenario = self._status.scenario_id + else: + self._owner_scenario = owner_scenario + + def must_be_saved(self): + return self._owner_scenario == self._status.scenario_id + + def modified(self): + self._owner_scenario = self._status.scenario_id + self._status.modified() + def _db_format(self, value): # Replace ''' by ''' to preserve SQL injection if type(value) is str: