mirror of https://gitlab.com/pamhyr/pamhyr2
Reservoir: Add scenario support.
parent
81264fa63e
commit
cd7a81d828
|
|
@ -27,9 +27,12 @@ logger = logging.getLogger()
|
||||||
class Data(SQLSubModel):
|
class Data(SQLSubModel):
|
||||||
_sub_classes = []
|
_sub_classes = []
|
||||||
|
|
||||||
def __init__(self, id: int = -1, status=None):
|
def __init__(self, id: int = -1,
|
||||||
super(Data, self).__init__(id)
|
status=None, owner_scenario=-1):
|
||||||
self._status = status
|
super(Data, self).__init__(
|
||||||
|
id=id, status=status,
|
||||||
|
owner_scenario=owner_scenario
|
||||||
|
)
|
||||||
|
|
||||||
self._data = []
|
self._data = []
|
||||||
|
|
||||||
|
|
@ -38,6 +41,7 @@ class Data(SQLSubModel):
|
||||||
execute(f"""
|
execute(f"""
|
||||||
CREATE TABLE reservoir_data{ext}(
|
CREATE TABLE reservoir_data{ext}(
|
||||||
{cls.create_db_add_pamhyr_id()},
|
{cls.create_db_add_pamhyr_id()},
|
||||||
|
deleted BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
ind INTEGER NOT NULL,
|
ind INTEGER NOT NULL,
|
||||||
elevation REAL NOT NULL,
|
elevation REAL NOT NULL,
|
||||||
surface REAL NOT NULL,
|
surface REAL NOT NULL,
|
||||||
|
|
@ -62,6 +66,13 @@ class Data(SQLSubModel):
|
||||||
if int(release) > 5:
|
if int(release) > 5:
|
||||||
cls._db_update_to_0_1_0(execute, data)
|
cls._db_update_to_0_1_0(execute, data)
|
||||||
|
|
||||||
|
if major == "0" and minor == "1":
|
||||||
|
if release < 2:
|
||||||
|
execute(
|
||||||
|
"ALTER TABLE reservoir_data " +
|
||||||
|
"ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE"
|
||||||
|
)
|
||||||
|
|
||||||
return cls._update_submodel(execute, version, data)
|
return cls._update_submodel(execute, version, data)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
@ -112,12 +123,20 @@ class Data(SQLSubModel):
|
||||||
@classmethod
|
@classmethod
|
||||||
def _db_load(cls, execute, data=None):
|
def _db_load(cls, execute, data=None):
|
||||||
new = []
|
new = []
|
||||||
|
scenario = data["scenario"]
|
||||||
|
if scenario is None:
|
||||||
|
return new
|
||||||
|
|
||||||
|
loaded = data['loaded_pid']
|
||||||
reseroire = data["reservoir"]
|
reseroire = data["reservoir"]
|
||||||
|
|
||||||
values = execute(
|
values = execute(
|
||||||
"SELECT pamhyr_id, ind, elevation, surface " +
|
"SELECT pamhyr_id, deleted, ind, " +
|
||||||
|
"elevation, surface, scenario " +
|
||||||
"FROM reservoir_data " +
|
"FROM reservoir_data " +
|
||||||
f"WHERE reservoir = {reseroire.pamhyr_id} " +
|
f"WHERE reservoir = {reseroire.pamhyr_id} " +
|
||||||
|
f"AND scenario = {scenario.id} " +
|
||||||
|
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) " +
|
||||||
"ORDER BY ind ASC"
|
"ORDER BY ind ASC"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -125,20 +144,34 @@ class Data(SQLSubModel):
|
||||||
it = iter(v)
|
it = iter(v)
|
||||||
|
|
||||||
pid = next(it)
|
pid = next(it)
|
||||||
|
deleted = (next(it) == 1)
|
||||||
ind = next(it)
|
ind = next(it)
|
||||||
elevation = next(it)
|
elevation = next(it)
|
||||||
surface = next(it)
|
surface = next(it)
|
||||||
|
owner_scenario = next(it)
|
||||||
|
|
||||||
nd = cls(
|
nd = cls(
|
||||||
id=pid, status=data['status']
|
id=pid, status=data['status'],
|
||||||
|
owner_scenario=owner_scenario
|
||||||
)
|
)
|
||||||
|
if deleted:
|
||||||
|
f.set_as_deleted()
|
||||||
|
|
||||||
nd._data = [elevation, surface]
|
nd._data = [elevation, surface]
|
||||||
|
|
||||||
|
loaded.add(pid)
|
||||||
new.append(nd)
|
new.append(nd)
|
||||||
|
|
||||||
|
data["scenario"] = scenario.parent
|
||||||
|
new += cls._db_load(execute, data)
|
||||||
|
data["scenario"] = scenario
|
||||||
|
|
||||||
return new
|
return new
|
||||||
|
|
||||||
def _db_save(self, execute, data=None):
|
def _db_save(self, execute, data=None):
|
||||||
|
if not self.must_be_saved():
|
||||||
|
return True
|
||||||
|
|
||||||
pid = self._pamhyr_id
|
pid = self._pamhyr_id
|
||||||
ind = data["ind"]
|
ind = data["ind"]
|
||||||
elevation = self._db_format(str(self[0]))
|
elevation = self._db_format(str(self[0]))
|
||||||
|
|
@ -146,12 +179,15 @@ class Data(SQLSubModel):
|
||||||
reservoir = data["reservoir"]
|
reservoir = data["reservoir"]
|
||||||
|
|
||||||
execute(
|
execute(
|
||||||
"INSERT INTO " +
|
"INSERT INTO reservoir_data " +
|
||||||
"reservoir_data " +
|
"(pamhyr_id, deleted, ind, " +
|
||||||
"(pamhyr_id, ind, elevation, surface, reservoir) " +
|
"elevation, surface, reservoir, scenario) " +
|
||||||
"VALUES (" +
|
"VALUES (" +
|
||||||
f"{pid}, {ind}, '{elevation}', {surface}, " +
|
f"{pid}, " +
|
||||||
f"{reservoir._pamhyr_id}" +
|
f"{self._db_format(self.is_deleted())}, " +
|
||||||
|
f"{ind}, '{elevation}', {surface}, " +
|
||||||
|
f"{reservoir._pamhyr_id}, " +
|
||||||
|
f"{self._status.scenario_id}" +
|
||||||
")"
|
")"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -167,10 +203,11 @@ class Reservoir(SQLSubModel):
|
||||||
|
|
||||||
def __init__(self, id: int = -1,
|
def __init__(self, id: int = -1,
|
||||||
name: str = "",
|
name: str = "",
|
||||||
status=None):
|
status=None, owner_scenario=-1):
|
||||||
super(Reservoir, self).__init__(id)
|
super(Reservoir, self).__init__(
|
||||||
|
id=id, status=status,
|
||||||
self._status = status
|
owner_scenario=owner_scenario
|
||||||
|
)
|
||||||
|
|
||||||
self._name = name
|
self._name = name
|
||||||
self._node = None
|
self._node = None
|
||||||
|
|
@ -181,6 +218,7 @@ class Reservoir(SQLSubModel):
|
||||||
execute(f"""
|
execute(f"""
|
||||||
CREATE TABLE reservoir{ext} (
|
CREATE TABLE reservoir{ext} (
|
||||||
{cls.create_db_add_pamhyr_id()},
|
{cls.create_db_add_pamhyr_id()},
|
||||||
|
deleted BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
node INTEGER,
|
node INTEGER,
|
||||||
{Scenario.create_db_add_scenario()},
|
{Scenario.create_db_add_scenario()},
|
||||||
|
|
@ -205,6 +243,13 @@ class Reservoir(SQLSubModel):
|
||||||
|
|
||||||
cls._db_update_to_0_1_0(execute, data)
|
cls._db_update_to_0_1_0(execute, data)
|
||||||
|
|
||||||
|
if major == "0" and minor == "1":
|
||||||
|
if release < 2:
|
||||||
|
execute(
|
||||||
|
"ALTER TABLE additional_files " +
|
||||||
|
"ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE"
|
||||||
|
)
|
||||||
|
|
||||||
return cls._update_submodel(execute, version, data)
|
return cls._update_submodel(execute, version, data)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
@ -232,20 +277,35 @@ class Reservoir(SQLSubModel):
|
||||||
@classmethod
|
@classmethod
|
||||||
def _db_load(cls, execute, data=None):
|
def _db_load(cls, execute, data=None):
|
||||||
new = []
|
new = []
|
||||||
|
scenario = data["scenario"]
|
||||||
|
loaded = data['loaded_pid']
|
||||||
|
|
||||||
|
if scenario is None:
|
||||||
|
return new
|
||||||
|
|
||||||
table = execute(
|
table = execute(
|
||||||
"SELECT pamhyr_id, name, node " +
|
"SELECT pamhyr_id, deleted, name, node, scenario " +
|
||||||
"FROM reservoir "
|
"FROM reservoir " +
|
||||||
|
f"WHERE scenario = {scenario.id} " +
|
||||||
|
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))})"
|
||||||
)
|
)
|
||||||
|
|
||||||
for row in table:
|
for row in table:
|
||||||
it = iter(row)
|
it = iter(row)
|
||||||
|
|
||||||
id = next(it)
|
id = next(it)
|
||||||
|
deleted = (next(it) == 1)
|
||||||
name = next(it)
|
name = next(it)
|
||||||
node_id = next(it)
|
node_id = next(it)
|
||||||
|
owner_scenario = next(it)
|
||||||
|
|
||||||
new_reservoir = cls(id, name, status=data["status"])
|
new_reservoir = cls(
|
||||||
|
id, name,
|
||||||
|
status=data["status"],
|
||||||
|
owner_scenario=owner_scenario
|
||||||
|
)
|
||||||
|
if deleted:
|
||||||
|
f.set_as_deleted()
|
||||||
|
|
||||||
new_reservoir._node = None
|
new_reservoir._node = None
|
||||||
if node_id != -1:
|
if node_id != -1:
|
||||||
|
|
@ -260,18 +320,28 @@ class Reservoir(SQLSubModel):
|
||||||
execute, data=data
|
execute, data=data
|
||||||
)
|
)
|
||||||
|
|
||||||
|
loaded.add(id)
|
||||||
new.append(new_reservoir)
|
new.append(new_reservoir)
|
||||||
|
|
||||||
|
data["scenario"] = scenario.parent
|
||||||
|
new += cls._db_load(execute, data)
|
||||||
|
data["scenario"] = scenario
|
||||||
|
|
||||||
return new
|
return new
|
||||||
|
|
||||||
def _db_save(self, execute, data=None):
|
def _db_save(self, execute, data=None):
|
||||||
|
if not self.must_be_saved():
|
||||||
|
return True
|
||||||
|
|
||||||
execute(
|
execute(
|
||||||
"DELETE FROM reservoir " +
|
"DELETE FROM reservoir " +
|
||||||
f"WHERE pamhyr_id = {self.pamhyr_id}"
|
f"WHERE pamhyr_id = {self.pamhyr_id}" +
|
||||||
|
f"AND scenario = {self._status.scenario_id}"
|
||||||
)
|
)
|
||||||
execute(
|
execute(
|
||||||
"DELETE FROM reservoir_data " +
|
"DELETE FROM reservoir_data " +
|
||||||
f"WHERE reservoir = {self.pamhyr_id}"
|
f"WHERE reservoir = {self.pamhyr_id}" +
|
||||||
|
f"AND scenario = {self._status.scenario_id}"
|
||||||
)
|
)
|
||||||
|
|
||||||
node_id = 'NULL'
|
node_id = 'NULL'
|
||||||
|
|
@ -280,10 +350,13 @@ class Reservoir(SQLSubModel):
|
||||||
|
|
||||||
sql = (
|
sql = (
|
||||||
"INSERT INTO " +
|
"INSERT INTO " +
|
||||||
"reservoir(pamhyr_id, name, node) " +
|
"reservoir(pamhyr_id, deleted, name, node, scenario) " +
|
||||||
"VALUES (" +
|
"VALUES (" +
|
||||||
f"{self.pamhyr_id}, '{self._db_format(self._name)}', " +
|
f"{self.pamhyr_id}, " +
|
||||||
f"{node_id}" +
|
f"{self._db_format(self.is_deleted())}, " +
|
||||||
|
f"'{self._db_format(self._name)}', " +
|
||||||
|
f"{node_id}, " +
|
||||||
|
f"{self._status.scenario_id}" +
|
||||||
")"
|
")"
|
||||||
)
|
)
|
||||||
execute(sql)
|
execute(sql)
|
||||||
|
|
@ -313,7 +386,7 @@ class Reservoir(SQLSubModel):
|
||||||
@name.setter
|
@name.setter
|
||||||
def name(self, name):
|
def name(self, name):
|
||||||
self._name = name
|
self._name = name
|
||||||
self._status.modified()
|
self.modified()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def node(self):
|
def node(self):
|
||||||
|
|
@ -322,7 +395,7 @@ class Reservoir(SQLSubModel):
|
||||||
@node.setter
|
@node.setter
|
||||||
def node(self, node):
|
def node(self, node):
|
||||||
self._node = node
|
self._node = node
|
||||||
self._status.modified()
|
self.modified()
|
||||||
|
|
||||||
def has_node(self):
|
def has_node(self):
|
||||||
return self._node is not None
|
return self._node is not None
|
||||||
|
|
@ -357,40 +430,50 @@ class Reservoir(SQLSubModel):
|
||||||
def add(self, index: int):
|
def add(self, index: int):
|
||||||
value = (self._default_elevation, self._default_surface)
|
value = (self._default_elevation, self._default_surface)
|
||||||
self._data.insert(index, value)
|
self._data.insert(index, value)
|
||||||
self._status.modified()
|
self.modified()
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def insert(self, index: int, value):
|
def insert(self, index: int, value):
|
||||||
self._data.insert(index, value)
|
self._data.insert(index, value)
|
||||||
self._status.modified()
|
self.modified()
|
||||||
|
|
||||||
def delete_i(self, indexes):
|
def hard_delete_i(self, indexes):
|
||||||
self._data = list(
|
self._data = list(
|
||||||
map(
|
map(
|
||||||
lambda e: e[1],
|
lambda e: e[1],
|
||||||
filter(
|
filter(
|
||||||
lambda e: e[0] not in indexes,
|
lambda e: e[0] not in indexes,
|
||||||
enumerate(self.data)
|
enumerate(self._data)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
self._status.modified()
|
self.modified()
|
||||||
|
|
||||||
|
def delete_i(self, indexes):
|
||||||
|
list(
|
||||||
|
map(
|
||||||
|
lambda e: e[1].set_as_deleted(),
|
||||||
|
filter(
|
||||||
|
lambda e: e[0] in indexes,
|
||||||
|
enumerate(self.lst)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.modified()
|
||||||
|
|
||||||
def delete(self, els):
|
def delete(self, els):
|
||||||
self._data = list(
|
for el in els:
|
||||||
filter(
|
el.set_as_deleted()
|
||||||
lambda e: e not in els,
|
|
||||||
self.data
|
self.modified()
|
||||||
)
|
|
||||||
)
|
|
||||||
self._status.modified()
|
|
||||||
|
|
||||||
def sort(self, _reverse=False, key=None):
|
def sort(self, _reverse=False, key=None):
|
||||||
if key is None:
|
if key is None:
|
||||||
self._data.sort(reverse=_reverse, key=lambda d: d[0])
|
self._data.sort(reverse=_reverse, key=lambda d: d[0])
|
||||||
else:
|
else:
|
||||||
self._data.sort(reverse=_reverse, key=key)
|
self._data.sort(reverse=_reverse, key=key)
|
||||||
self._status.modified()
|
|
||||||
|
self.modified()
|
||||||
|
|
||||||
def get_i(self, index):
|
def get_i(self, index):
|
||||||
return self.data[index]
|
return self.data[index]
|
||||||
|
|
@ -405,7 +488,7 @@ class Reservoir(SQLSubModel):
|
||||||
v = list(self._data[index])
|
v = list(self._data[index])
|
||||||
v[column] = value
|
v[column] = value
|
||||||
self._data[index] = tuple(v)
|
self._data[index] = tuple(v)
|
||||||
self._status.modified()
|
self.modified()
|
||||||
|
|
||||||
def set_i_elevation(self, index: int, value):
|
def set_i_elevation(self, index: int, value):
|
||||||
self._set_i_c_v(index, 0, value)
|
self._set_i_c_v(index, 0, value)
|
||||||
|
|
@ -418,11 +501,11 @@ class Reservoir(SQLSubModel):
|
||||||
next = index - 1
|
next = index - 1
|
||||||
d = self._data
|
d = self._data
|
||||||
d[index], d[next] = d[next], d[index]
|
d[index], d[next] = d[next], d[index]
|
||||||
self._status.modified()
|
self.modified()
|
||||||
|
|
||||||
def move_down(self, index):
|
def move_down(self, index):
|
||||||
if index >= 0:
|
if index >= 0:
|
||||||
prev = index + 1
|
prev = index + 1
|
||||||
d = self._data
|
d = self._data
|
||||||
d[index], d[prev] = d[prev], d[index]
|
d[index], d[prev] = d[prev], d[index]
|
||||||
self._status.modified()
|
self.modified()
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
from copy import copy
|
from copy import copy
|
||||||
from tools import trace, timer
|
from tools import trace, timer
|
||||||
|
|
||||||
from Model.Tools.PamhyrList import PamhyrModelList
|
from Model.Tools.PamhyrListExt import PamhyrModelList
|
||||||
from Model.Reservoir.Reservoir import Reservoir
|
from Model.Reservoir.Reservoir import Reservoir
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -39,8 +39,14 @@ class ReservoirList(PamhyrModelList):
|
||||||
return new
|
return new
|
||||||
|
|
||||||
def _db_save(self, execute, data=None):
|
def _db_save(self, execute, data=None):
|
||||||
execute("DELETE FROM reservoir")
|
execute(
|
||||||
execute("DELETE FROM reservoir_data")
|
"DELETE FROM reservoir " +
|
||||||
|
f"WHERE scenario = {self._status.scenario_id}"
|
||||||
|
)
|
||||||
|
execute(
|
||||||
|
"DELETE FROM reservoir_data " +
|
||||||
|
f"WHERE scenario = {self._status.scenario_id}"
|
||||||
|
)
|
||||||
|
|
||||||
if data is None:
|
if data is None:
|
||||||
data = {}
|
data = {}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue