From b87977a2d8572c11b6792543ff1b317e11ee2f10 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> Date: Tue, 25 Jul 2023 14:22:50 +0200 Subject: [PATCH] SL: Save sl fk in database for point and profile. --- src/Model/Geometry/PointXYZ.py | 30 +++++++++++++++++++++++++++--- src/Model/Geometry/Profile.py | 2 +- src/Model/Geometry/ProfileXYZ.py | 30 +++++++++++++++++++++++++++--- src/Model/River.py | 14 ++++++++------ src/Model/Study.py | 2 +- 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/Model/Geometry/PointXYZ.py b/src/Model/Geometry/PointXYZ.py index 4e55c7b8..ff0a62fb 100644 --- a/src/Model/Geometry/PointXYZ.py +++ b/src/Model/Geometry/PointXYZ.py @@ -37,6 +37,17 @@ class PointXYZ(Point, SQLSubModel): @classmethod def _sql_update(cls, execute, version): cls._update_submodel(execute, version) + + major, minor, release = version.strip().split(".") + if major == minor == "0": + if int(release) < 2: + execute( + """ + ALTER TABLE geometry_pointXYZ + ADD COLUMN sl INTEGER + REFERENCES sedimentary_layer(id) + """ + ) return True @classmethod @@ -47,7 +58,7 @@ class PointXYZ(Point, SQLSubModel): profile = data["profile"] table = execute( - "SELECT ind, name, x, y, z " + + "SELECT ind, name, x, y, z, sl " + "FROM geometry_pointXYZ " + f"WHERE profile = {profile.id}" ) @@ -63,6 +74,7 @@ class PointXYZ(Point, SQLSubModel): x = row[2] y = row[3] z = row[4] + sl = row[5] new = cls( name = name, @@ -71,6 +83,16 @@ class PointXYZ(Point, SQLSubModel): status = status ) + if sl == -1 or sl == None: + new._sl = None + else: + new._sl = next( + filter( + lambda s: s.id == sl, + data["sediment_layers_list"].sediment_layers + ) + ) + points[ind] = new return points @@ -79,13 +101,15 @@ class PointXYZ(Point, SQLSubModel): profile = data["profile"] ind = data["ind"] + sl = self._sl.id if self._sl is not None else -1 + sql = ( "INSERT OR REPLACE INTO " + - "geometry_pointXYZ(ind, name, x, y, z, profile) "+ + "geometry_pointXYZ(ind, name, x, y, z, profile, sl) "+ "VALUES (" + f"{ind}, '{self._sql_format(self._name)}', " + f"{self.x}, {self.y}, {self.z}, " + - f"{profile.id}" + + f"{profile.id}, {sl}" + ")" ) execute(sql) diff --git a/src/Model/Geometry/Profile.py b/src/Model/Geometry/Profile.py index 7199730f..9fa8e9ed 100644 --- a/src/Model/Geometry/Profile.py +++ b/src/Model/Geometry/Profile.py @@ -133,7 +133,7 @@ class Profile(object): return self._sl @sl.setter - def sl(self, value: str): + def sl(self, value): self._sl = value self._status.modified() diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py index af310769..cb681383 100644 --- a/src/Model/Geometry/ProfileXYZ.py +++ b/src/Model/Geometry/ProfileXYZ.py @@ -68,6 +68,17 @@ class ProfileXYZ(Profile, SQLSubModel): @classmethod def _sql_update(cls, execute, version): + major, minor, release = version.strip().split(".") + if major == minor == "0": + if int(release) < 2: + execute( + """ + ALTER TABLE geometry_profileXYZ + ADD COLUMN sl INTEGER + REFERENCES sedimentary_layer(id) + """ + ) + return cls._update_submodel(execute, version) @classmethod @@ -77,7 +88,7 @@ class ProfileXYZ(Profile, SQLSubModel): reach = data["reach"] table = execute( - "SELECT id, ind, name, kp, num, code1, code2 " + + "SELECT id, ind, name, kp, num, code1, code2, sl " + "FROM geometry_profileXYZ " + f"WHERE reach = {reach}" ) @@ -93,6 +104,7 @@ class ProfileXYZ(Profile, SQLSubModel): num = row[5] code1 = row[5] code2 = row[6] + sl = row[7] new = cls( id=id, num = num, @@ -102,6 +114,16 @@ class ProfileXYZ(Profile, SQLSubModel): status = status ) + if sl == -1 or sl == None: + new._sl = None + else: + new._sl = next( + filter( + lambda s: s.id == sl, + data["sediment_layers_list"].sediment_layers + ) + ) + data["profile"] = new new._points = PointXYZ._sql_load(execute, data) @@ -113,13 +135,15 @@ class ProfileXYZ(Profile, SQLSubModel): ok = True ind = data["ind"] + sl = self._sl.id if self._sl is not None else -1 + sql = ( "INSERT OR REPLACE INTO " + - "geometry_profileXYZ(id, ind, name, reach, kp, num, code1, code2) "+ + "geometry_profileXYZ(id, ind, name, reach, kp, num, code1, code2, sl) "+ "VALUES (" + f"{self.id}, {ind}, '{self._sql_format(self._name)}', " + f"{self.reach.id}, {self.kp}, {self.num}, " + - f"{self.code1}, {self.code1}" + + f"{self.code1}, {self.code1}, {sl}" + ")" ) execute(sql) diff --git a/src/Model/River.py b/src/Model/River.py index 59b47957..b21a95a9 100644 --- a/src/Model/River.py +++ b/src/Model/River.py @@ -233,6 +233,14 @@ class River(Graph, SQLSubModel): ) data["stricklers"] = new._stricklers + + # Initial conditions + new._sediment_layers = SedimentLayerList._sql_load( + execute, + data + ) + data["sediment_layers_list"] = new._sediment_layers + # Network new._nodes = RiverNode._sql_load( execute, @@ -263,12 +271,6 @@ class River(Graph, SQLSubModel): data ) - # Initial conditions - new._sediment_layers = SedimentLayerList._sql_load( - execute, - data - ) - # Parameters new._parameters = SolverParametersList._sql_load( execute, diff --git a/src/Model/Study.py b/src/Model/Study.py index bdebce47..fc553f94 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -24,7 +24,7 @@ class Study(SQLModel): def __init__(self, filename = None, init_new = True): # Metadata - self._version = "0.0.1" + self._version = "0.0.2" self.creation_date = datetime.now() self.last_modification_date = datetime.now() self.last_save_date = datetime.now() -- GitLab