Study: Add copy method to prepare scenario comparison.

scenarios
Pierre-Antoine 2025-10-27 14:49:18 +01:00
parent 05e039011a
commit bc08d06bb1
1 changed files with 80 additions and 26 deletions

View File

@ -44,7 +44,10 @@ class Study(SQLModel):
River, River,
] ]
def __init__(self, filename=None, init_new=True): def __init__(self, filename=None, init_new=True, copy=False):
if copy:
return
# Metadata # Metadata
self.creation_date = datetime.now() self.creation_date = datetime.now()
self.last_modification_date = datetime.now() self.last_modification_date = datetime.now()
@ -476,31 +479,8 @@ class Study(SQLModel):
return new return new
def reload_from_scenario(self, scenario): def reload_from_scenario(self, scenario):
if scenario in self._river_scenario_cache: river = self.load_scenario(scenario)
self._river = self._river_scenario_cache[scenario] self._river = river
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
if reduce( if reduce(
lambda a, s: a or (s.parent is scenario), lambda a, s: a or (s.parent is scenario),
@ -511,6 +491,80 @@ class Study(SQLModel):
else: else:
self.status.set_as_editable() 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): def duplicate_current_scenario(self):
source = self.status.scenario_id source = self.status.scenario_id
new = self.scenarios.new( new = self.scenarios.new(