From d891c9783db6adbaf32aee8ac60dc7738bd1a67a Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Mon, 27 Nov 2023 16:58:46 +0100
Subject: [PATCH] Model: Fix possible data removing durring save.

---
 src/Model/Friction/FrictionList.py                   |  4 +++-
 src/Model/Geometry/ProfileXYZ.py                     |  4 +++-
 src/Model/Geometry/Reach.py                          |  5 +++--
 src/Model/InitialConditions/InitialConditionsDict.py | 10 +++++++---
 4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/Model/Friction/FrictionList.py b/src/Model/Friction/FrictionList.py
index 6f585fcc..20c33197 100644
--- a/src/Model/Friction/FrictionList.py
+++ b/src/Model/Friction/FrictionList.py
@@ -57,12 +57,14 @@ class FrictionList(PamhyrModelList):
         return new
 
     def _db_save(self, execute, data=None):
+        frictions = self.lst
+
         reach = data["reach"]
         execute(f"DELETE FROM friction WHERE reach = {reach.id}")
 
         ok = True
         ind = 0
-        for friction in self._lst:
+        for friction in frictions:
             data["ind"] = ind
             ok &= friction._db_save(execute, data=data)
             ind += 1
diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py
index f19100bc..4375d18c 100644
--- a/src/Model/Geometry/ProfileXYZ.py
+++ b/src/Model/Geometry/ProfileXYZ.py
@@ -173,11 +173,13 @@ class ProfileXYZ(Profile, SQLSubModel):
         )
         execute(sql)
 
+        points = self.points
+
         data["profile"] = self
         execute(f"DELETE FROM geometry_pointXYZ WHERE profile = {self.id}")
 
         ind = 0
-        for point in self.points:
+        for point in points:
             data["ind"] = ind
             ok &= point._db_save(execute, data)
             ind += 1
diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py
index b6a5952d..c3ee413c 100644
--- a/src/Model/Geometry/Reach.py
+++ b/src/Model/Geometry/Reach.py
@@ -71,15 +71,16 @@ class Reach(SQLSubModel):
         return new
 
     def _db_save(self, execute, data=None):
+        profiles = self.profiles
+
         # Delete old data
         execute(f"DELETE FROM geometry_profileXYZ WHERE reach = {self.id}")
-        # execute(f"DELETE FROM geometry_pointXYZ")
 
         if data is None:
             data = {}
 
         ind = 0
-        for profile in self.profiles:
+        for profile in profiles:
             data["ind"] = ind
             profile._db_save(execute, data)
             ind += 1
diff --git a/src/Model/InitialConditions/InitialConditionsDict.py b/src/Model/InitialConditions/InitialConditionsDict.py
index 86655e36..0cc75293 100644
--- a/src/Model/InitialConditions/InitialConditionsDict.py
+++ b/src/Model/InitialConditions/InitialConditionsDict.py
@@ -55,14 +55,18 @@ class InitialConditionsDict(PamhyrModelDict):
         if data is None:
             data = {}
 
-        execute("DELETE FROM initial_conditions")
-
-        for reach in self._dict:
+        ics = self._dict
+        for reach in ics:
             data["reach"] = reach
             v = self._dict[reach]
             if isinstance(v, types.GeneratorType):
                 self._dict[reach] = list(v)[0]
 
+            execute(
+                "DELETE FROM initial_conditions " +
+                f"WHERE reach = '{reach.id}'"
+            )
+
             ok &= self._dict[reach]._db_save(execute, data)
 
         return ok
-- 
GitLab