From 9cf3177b57bd675c91343047086194ee62d810ac Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Mon, 3 Jul 2023 11:46:49 +0200
Subject: [PATCH] Model, SQL: Fix solver parameters loading.

---
 src/Model/River.py                            | 10 ++--
 .../SolverParameters/SolverParametersList.py  | 58 ++++++++++++-------
 2 files changed, 42 insertions(+), 26 deletions(-)

diff --git a/src/Model/River.py b/src/Model/River.py
index 15f3e6e4..da323b6c 100644
--- a/src/Model/River.py
+++ b/src/Model/River.py
@@ -251,12 +251,10 @@ class River(Graph, SQLSubModel):
         )
 
         # Parameters
-        for solver in new._parameters:
-            data["solver"] = solver
-            new._parameters[solver] = SolverParametersList(
-                execute,
-                data
-            )
+        new._parameters = SolverParametersList._sql_load(
+            execute,
+            data
+        )
 
         return new
 
diff --git a/src/Model/SolverParameters/SolverParametersList.py b/src/Model/SolverParameters/SolverParametersList.py
index abac7c40..88d1d567 100644
--- a/src/Model/SolverParameters/SolverParametersList.py
+++ b/src/Model/SolverParameters/SolverParametersList.py
@@ -2,6 +2,7 @@
 
 from copy import copy
 from tools import trace, timer
+from Solver.Solvers import solver_type_list
 
 from Model.DB import SQLSubModel
 
@@ -81,32 +82,33 @@ class SolverParametersList(SQLSubModel):
     @classmethod
     def _sql_load(cls, execute, data = None):
         status = data["status"]
-        solver = data["solver"]
+        solvers = execute("SELECT DISTINCT solver FROM solver_parameter")
+        new = {}
 
-        new = cls(solver_type = solver, status = status)
+        for solver in solvers:
+            solver = solver[0]
+            if solver not in solver_type_list:
+                continue
 
-        table = execute(
-            "SELECT ind, name, value " +
-            "FROM solver_parameter " +
-            f"WHERE solver = '{solver.type}'"
-        )
+            st = solver_type_list[solver]
+            n = cls(solver_type = st, status = status)
 
-        for _ in table:
-            new._parameters.append(None)
+            table = execute(
+                "SELECT ind, name, value " +
+                "FROM solver_parameter " +
+                f"WHERE solver = '{solver}'"
+            )
 
-        for row in table:
-            ind = row[0]
-            name = row[1]
-            value = row[2]
+            for row in table:
+                ind = row[0]
+                name = row[1]
+                value = row[2]
 
-            p = cls(
-                name = name,
-                value = value,
-                status = status
-            )
-            new._parameters[ind] = p
+                n.set_value(name, value)
+
+            new[solver] = n
 
-        return stricklers
+        return new
 
     def _sql_save(self, execute, data = None):
         t = self._solver._type
@@ -146,6 +148,22 @@ class SolverParametersList(SQLSubModel):
         self._parameters[index] = new
         self._status.modified()
 
+    def set_value(self, key, value):
+        for p in self._parameters:
+            if p["name"] == key:
+                p["value"] = value
+                self._status.modified()
+                return
+
+        self._parameters.append(
+            Parameter(
+                name = key,
+                value = value,
+                status = self._status
+            )
+        )
+        self._status.modified()
+
     def new(self, index):
         n = Parameter(status = self._status)
         self._parameters.insert(index, n)
-- 
GitLab