From bc08d06bb13e10cb8837940921f3fd8c1755bdf1 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 27 Oct 2025 14:49:18 +0100 Subject: [PATCH] Study: Add copy method to prepare scenario comparison. --- src/Model/Study.py | 106 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 80 insertions(+), 26 deletions(-) diff --git a/src/Model/Study.py b/src/Model/Study.py index a89416f8..df00579b 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -44,7 +44,10 @@ class Study(SQLModel): River, ] - def __init__(self, filename=None, init_new=True): + def __init__(self, filename=None, init_new=True, copy=False): + if copy: + return + # Metadata self.creation_date = datetime.now() self.last_modification_date = datetime.now() @@ -476,31 +479,8 @@ class Study(SQLModel): return new def reload_from_scenario(self, scenario): - if scenario in self._river_scenario_cache: - self._river = self._river_scenario_cache[scenario] - self.status.scenario = scenario - else: - def sql_exec(sql): - 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 - river = River._db_load( - sql_exec, data=data - ) - data["study"] = self - river._db_load_results(sql_exec, data=data) - - self._river_scenario_cache[scenario] = river - self._river = river + river = self.load_scenario(scenario) + self._river = river if reduce( lambda a, s: a or (s.parent is scenario), @@ -511,6 +491,80 @@ class Study(SQLModel): else: self.status.set_as_editable() + def load_scenario(self, scenario): + if scenario in self._river_scenario_cache: + return self._river_scenario_cache[scenario] + + def sql_exec(sql): + return self.execute( + sql, fetch_one=False, commit=True + ) + + old_scenario = self.status.scenario + self.status.scenario = scenario + + data = { + "status": self.status, + "loaded_pid": set(), + "scenario": scenario + } + + # Load river data + river = River._db_load( + sql_exec, data=data + ) + data["study"] = self + river._db_load_results(sql_exec, data=data) + + self._river_scenario_cache[scenario] = river + self.status.scenario = old_scenario + + return river + + def copy_from_scenario(self, scenario): + new = self._copy() + + new._river = self.load_scenario(scenario) + + def set_status(obj): + obj._status = new.status + + new.river._data_traversal( + modifier=lambda obj, data: set_status(obj), + ) + + return new + + def _copy(self): + """ + This method make a copy of current study. This copy is like an + empty shell, it's not fully functional. Study object use + SQLite connection to file, this copy as no valid connection. + + /!\ Please use this copy as read only object! + """ + new = Study(copy=True) + + new._filename = "" + new.creation_date = self.creation_date + new.last_modification_date = self.last_modification_date + new.last_save_date = self.last_save_date + + new._name = self._name + new.description = self.description + + new._time_system = self._time_system + new._date = self._date + + new.status = StudyStatus() + new.scenarios = self.scenarios + new.status.scenario = self.status.scenario + + new._river = self._river + new._river_scenario_cache = self._river_scenario_cache + + return new + def duplicate_current_scenario(self): source = self.status.scenario_id new = self.scenarios.new(