diff --git a/src/Model/Study.py b/src/Model/Study.py index 6b96cc9e..e68fcc1f 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -502,3 +502,18 @@ class Study(SQLModel): self.status.set_as_read_only() else: self.status.set_as_editable() + + def duplicate_current_scenario(self): + source = self.status.scenario_id + new = self.scenarios.new( + self.status.scenario.parent + ) + + self.river._data_traversal( + predicate=lambda obj: obj._owner_scenario == source, + execute=lambda obj: obj.set_owner_scenario(), + data={} + ) + + self.status.set_as_editable() + return new diff --git a/src/Model/Tools/PamhyrDB.py b/src/Model/Tools/PamhyrDB.py index 3314960f..4b48f5c6 100644 --- a/src/Model/Tools/PamhyrDB.py +++ b/src/Model/Tools/PamhyrDB.py @@ -202,7 +202,7 @@ class SQLSubModel(PamhyrID): self._owner_scenario = self._status.scenario_id self._status.modified() - def set_owner_scenario_if(self, predicate): + def set_owner_scenario(self): """Set study status the object owner_scenario to current scenario if predicate(scenario_id) is true @@ -215,9 +215,8 @@ class SQLSubModel(PamhyrID): if self._status is None: return - if predicate(self._owner_scenario): - self._owner_scenario = self._status.scenario_id - self._status.modified() + self._owner_scenario = self._status.scenario_id + self._status.modified() def is_deleted(self): """This object is deleted? diff --git a/src/Model/Tools/PamhyrDict.py b/src/Model/Tools/PamhyrDict.py index 9a890d55..d27e02c9 100644 --- a/src/Model/Tools/PamhyrDict.py +++ b/src/Model/Tools/PamhyrDict.py @@ -82,20 +82,27 @@ class PamhyrModelDict(SQLSubModel): self.set(key, new) return new - def rec_set_owner_scenario_if(self, predicate): - """Set study status the object owner_scenario to current - scenario if predicate(scenario_id) is true + def _data_traversal(self, + predicate=lambda obj, data: True, + modifier=lambda obj, data: None, + data={}): + """Traversal data and execute modifier fonction if predicate + true Args: - predicate: Function predicate on owner_scenario id + predicate: Function predicate, take current obj and data as input + modifier: Function modifier, take current obj and data as input Returns: Nothing - """ - self.set_owner_scenario_if(predicate) - for k in self._lst: - self._dict[key].set_owner_scenario_if(predicate) + """ + if predicate(self, data): + modifier(self, data) + + for key in self._lst: + self._dict[key]\ + ._data_traversal(predicate, modifier, data) def new(self, key): raise NotImplementedMethodeError(self, self.new) diff --git a/src/Model/Tools/PamhyrList.py b/src/Model/Tools/PamhyrList.py index d757a2d4..abc128df 100644 --- a/src/Model/Tools/PamhyrList.py +++ b/src/Model/Tools/PamhyrList.py @@ -85,20 +85,26 @@ class PamhyrModelList(SQLSubModel): if self._status is not None: self._status.modified() - def rec_set_owner_scenario_if(self, predicate): - """Set study status the object owner_scenario to current - scenario if predicate(scenario_id) is true + def _data_traversal(self, + predicate=lambda obj, data: True, + modifier=lambda obj, data: None, + data={}): + """Traversal data and execute modifier fonction if predicate + true Args: - predicate: Function predicate on owner_scenario id + predicate: Function predicate, take current obj and data as input + modifier: Function modifier, take current obj and data as input Returns: Nothing + """ - self.set_owner_scenario_if(predicate) + if predicate(self, data): + modifier(self, data) for el in self._lst: - el.set_owner_scenario_if(predicate) + el._data_traversal(predicate, modifier, data) def new(self, index): """Create new elements and add it to list diff --git a/src/Model/Tools/PamhyrListExt.py b/src/Model/Tools/PamhyrListExt.py index 870d4b7a..b3580cc6 100644 --- a/src/Model/Tools/PamhyrListExt.py +++ b/src/Model/Tools/PamhyrListExt.py @@ -90,20 +90,26 @@ class PamhyrModelList(SQLSubModel): if self._status is not None: self._status.modified() - def rec_set_owner_scenario_if(self, predicate): - """Set study status the object owner_scenario to current - scenario if predicate(scenario_id) is true + def _data_traversal(self, + predicate=lambda obj, data: True, + modifier=lambda obj, data: None, + data={}): + """Traversal data and execute modifier fonction if predicate + true Args: - predicate: Function predicate on owner_scenario id + predicate: Function predicate, take current obj and data as input + modifier: Function modifier, take current obj and data as input Returns: Nothing + """ - self.set_owner_scenario_if(predicate) + if predicate(self, data): + modifier(self, data) for el in self._lst: - el.set_owner_scenario_if(predicate) + el._data_traversal(predicate, modifier, data) def new(self, index): """Create new elements and add it to list