From a2ebcadb99501f286bf64f0e08edeb9f7950c222 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Fri, 30 Jun 2023 15:03:38 +0200
Subject: [PATCH] Model, Stricklers: Add SQL export for stricklers.

---
 src/Model/Geometry/PointXYZ.py         |  3 +-
 src/Model/Geometry/Reach.py            |  6 +-
 src/Model/River.py                     |  7 ++-
 src/Model/Stricklers/Stricklers.py     | 78 ++++++++++++++++++++++++--
 src/Model/Stricklers/StricklersList.py | 33 ++++++++++-
 src/tools.py                           |  2 +-
 6 files changed, 114 insertions(+), 15 deletions(-)

diff --git a/src/Model/Geometry/PointXYZ.py b/src/Model/Geometry/PointXYZ.py
index bc878318..0fecd1ea 100644
--- a/src/Model/Geometry/PointXYZ.py
+++ b/src/Model/Geometry/PointXYZ.py
@@ -32,8 +32,7 @@ class PointXYZ(Point, SQLSubModel):
           )
         """)
 
-        cls._create_submodel(execute)
-        return True
+        return cls._create_submodel(execute)
 
     @classmethod
     def _sql_update(cls, execute, version):
diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py
index 4e69f582..c0140db9 100644
--- a/src/Model/Geometry/Reach.py
+++ b/src/Model/Geometry/Reach.py
@@ -33,13 +33,11 @@ class Reach(SQLSubModel):
 
     @classmethod
     def _sql_create(cls, execute):
-        cls._create_submodel(execute)
-        return True
+        return cls._create_submodel(execute)
 
     @classmethod
     def _sql_update(cls, execute, version):
-        cls._update_submodel(execute, version)
-        return None
+        return cls._update_submodel(execute, version)
 
     @classmethod
     def _sql_load(cls, execute, data = None):
diff --git a/src/Model/River.py b/src/Model/River.py
index 16095fc4..2b8f88fa 100644
--- a/src/Model/River.py
+++ b/src/Model/River.py
@@ -183,7 +183,7 @@ class River(Graph, SQLSubModel):
         BoundaryConditionList,
         LateralContributionList,
         # InitialConditionsDict,
-        # StricklersList,
+        StricklersList,
         # SolverParametersList,
     ]
 
@@ -236,6 +236,10 @@ class River(Graph, SQLSubModel):
             execute,
             data
         )
+        new._stricklers = StricklersList._sql_load(
+            execute,
+            data
+        )
 
         return new
 
@@ -243,6 +247,7 @@ class River(Graph, SQLSubModel):
         objs = (self._nodes + self._edges)
         objs.append(self._boundary_condition)
         objs.append(self._lateral_contribution)
+        objs.append(self._stricklers)
 
         self._save_submodel(execute, objs, data)
         return True
diff --git a/src/Model/Stricklers/Stricklers.py b/src/Model/Stricklers/Stricklers.py
index 4eea5036..f205048f 100644
--- a/src/Model/Stricklers/Stricklers.py
+++ b/src/Model/Stricklers/Stricklers.py
@@ -2,17 +2,83 @@
 
 from tools import trace, timer
 
-class Stricklers(object):
-    def __init__(self, status = None):
+from Model.DB import SQLSubModel
+
+class Stricklers(SQLSubModel):
+    def __init__(self, name:str = "",
+                 comment:str = "",
+                 minor:float = 35.0,
+                 medium:float = 15.0,
+                 status = None):
         super(Stricklers, self).__init__()
 
         self._status = status
 
-        self._name = ""
-        self._comment = ""
+        self._name = name
+        self._comment = comment
+
+        self._minor = minor
+        self._medium = medium
+
+
+    @classmethod
+    def _sql_create(cls, execute):
+        execute("""
+          CREATE TABLE stricklers(
+            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+            name TEXT,
+            comment TEXT,
+            minor REAL NOT NULL,
+            medium REAL NOT NULL
+          )
+        """)
+
+        return cls._create_submodel(execute)
+
+    @classmethod
+    def _sql_update(cls, execute, version):
+        return cls._update_submodel(execute, version)
+
+    @classmethod
+    def _sql_load(cls, execute, data = None):
+        stricklers = []
+        status = data["status"]
+
+        table = execute(
+            "SELECT name, comment, minor, medium " +
+            "FROM stricklers"
+        )
+
+        for row in table:
+            name = row[0]
+            comment = row[1]
+            minor = row[2]
+            medium = row[3]
+
+            new = cls(
+                name = name,
+                comment = comment,
+                minor = minor, medium = medium,
+                status = status
+            )
+
+            stricklers.append(new)
+
+        return stricklers
+
+    def _sql_save(self, execute, data = None):
+        sql = (
+            "INSERT INTO " +
+            "stricklers(name, comment, minor, medium) "+
+            "VALUES (" +
+            f"'{self._sql_format(self.name)}', " +
+            f"'{self._sql_format(self.comment)}', " +
+            f"{float(self.minor)}, {float(self.medium)}" +
+            ")"
+        )
+        execute(sql)
 
-        self._minor = 35
-        self._medium = 15
+        return True
 
     def __str__(self):
         if self._name != "":
diff --git a/src/Model/Stricklers/StricklersList.py b/src/Model/Stricklers/StricklersList.py
index d2647823..6ed1269d 100644
--- a/src/Model/Stricklers/StricklersList.py
+++ b/src/Model/Stricklers/StricklersList.py
@@ -2,10 +2,15 @@
 
 from tools import trace, timer
 
+from Model.DB import SQLSubModel
 from Model.Saved import SavedStatus
 from Model.Stricklers.Stricklers import Stricklers
 
-class StricklersList(object):
+class StricklersList(SQLSubModel):
+    _sub_classes = [
+        Stricklers,
+    ]
+
     def __init__(self, status = None):
         if status is None:
             status = SavedStatus()
@@ -13,6 +18,32 @@ class StricklersList(object):
 
         self._stricks = []
 
+    @classmethod
+    def _sql_create(cls, execute):
+        return cls._create_submodel(execute)
+
+    @classmethod
+    def _sql_update(cls, execute, version):
+        return cls._update_submodel(execute, version)
+
+    @classmethod
+    def _sql_load(cls, execute, data = None):
+        new = cls(status = data["status"])
+
+        new._stricks = Stricklers._sql_load(
+            execute,
+            data = data
+        )
+
+        return new
+
+    def _sql_save(self, execute, data = None):
+        if len(self._stricks) != 0:
+            execute("DELETE FROM stricklers")
+
+        objs = self._stricks
+        return self._save_submodel(execute, objs, data)
+
     def __len__(self):
         return len(self._stricks)
 
diff --git a/src/tools.py b/src/tools.py
index 1c72b031..27127754 100644
--- a/src/tools.py
+++ b/src/tools.py
@@ -233,7 +233,7 @@ class SQL(object):
 
     @timer
     def execute(self, cmd, fetch_one = True, commit = False):
-        #print(f"[SQL] {cmd}")
+        print(f"[SQL] {cmd}")
         res = self._cur.execute(cmd)
 
         if commit:
-- 
GitLab