mirror of https://gitlab.com/pamhyr/pamhyr2
Compare commits
No commits in common. "4a94c946d1553b3b2a8ae72288506efd9c0806a1" and "6d16d9dff47136c61ba72f50ec4f8a7338b345bd" have entirely different histories.
4a94c946d1
...
6d16d9dff4
|
|
@ -154,89 +154,6 @@ class Data(SQLSubModel):
|
||||||
self._data[key] = self._types[key](value)
|
self._data[key] = self._types[key](value)
|
||||||
|
|
||||||
|
|
||||||
class WeatherParametersDefault(SQLSubModel):
|
|
||||||
def __init__(self, type: str, value: float = 0.0,
|
|
||||||
id: int = -1, status=None, owner_scenario=-1):
|
|
||||||
super(WeatherParametersDefault, self).__init__(
|
|
||||||
id=id, status=status,
|
|
||||||
owner_scenario=owner_scenario
|
|
||||||
)
|
|
||||||
|
|
||||||
self._type = type
|
|
||||||
self._value = float(value)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _db_load(cls, execute, data=None):
|
|
||||||
new = []
|
|
||||||
status = data['status']
|
|
||||||
scenario = data["scenario"]
|
|
||||||
loaded = data['loaded_pid']
|
|
||||||
|
|
||||||
if scenario is None:
|
|
||||||
return new
|
|
||||||
|
|
||||||
table = execute(
|
|
||||||
"SELECT pamhyr_id, type, value, scenario " +
|
|
||||||
"FROM weather_parameters_default " +
|
|
||||||
f"WHERE scenario = {scenario.id} " +
|
|
||||||
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) "
|
|
||||||
)
|
|
||||||
|
|
||||||
for row in table:
|
|
||||||
it = iter(row)
|
|
||||||
|
|
||||||
pid = next(it)
|
|
||||||
type = next(it)
|
|
||||||
value = next(it)
|
|
||||||
owner_scenario = next(it)
|
|
||||||
|
|
||||||
wp_default = cls(
|
|
||||||
type=type,
|
|
||||||
value=value,
|
|
||||||
id=pid,
|
|
||||||
status=status,
|
|
||||||
owner_scenario=owner_scenario
|
|
||||||
)
|
|
||||||
|
|
||||||
loaded.add(pid)
|
|
||||||
new.append(wp_default)
|
|
||||||
|
|
||||||
data["scenario"] = scenario.parent
|
|
||||||
new += cls._db_load(execute, data)
|
|
||||||
data["scenario"] = scenario
|
|
||||||
|
|
||||||
return new
|
|
||||||
|
|
||||||
def _db_save(self, execute, data=None):
|
|
||||||
if not self.must_be_saved():
|
|
||||||
return True
|
|
||||||
|
|
||||||
execute(
|
|
||||||
"INSERT INTO " +
|
|
||||||
"weather_parameters_default(" +
|
|
||||||
"pamhyr_id, type, value, scenario) " +
|
|
||||||
"VALUES (" +
|
|
||||||
f"{self.id}, '{self._db_format(self._type)}', {self._value}, " +
|
|
||||||
f"{self._status.scenario_id}" +
|
|
||||||
")"
|
|
||||||
)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
@property
|
|
||||||
def type(self):
|
|
||||||
return self._type
|
|
||||||
|
|
||||||
@property
|
|
||||||
def value(self):
|
|
||||||
return self._value
|
|
||||||
|
|
||||||
@value.setter
|
|
||||||
def value(self, value):
|
|
||||||
self._value = float(value)
|
|
||||||
self.modified()
|
|
||||||
|
|
||||||
|
|
||||||
class WeatherParameters(SQLSubModel):
|
class WeatherParameters(SQLSubModel):
|
||||||
_sub_classes = [Data]
|
_sub_classes = [Data]
|
||||||
|
|
||||||
|
|
@ -279,17 +196,6 @@ class WeatherParameters(SQLSubModel):
|
||||||
)
|
)
|
||||||
""")
|
""")
|
||||||
|
|
||||||
execute(f"""
|
|
||||||
CREATE TABLE weather_parameters_default{ext}(
|
|
||||||
{cls.create_db_add_pamhyr_id()},
|
|
||||||
type TEXT NOT NULL,
|
|
||||||
value FLOAT NOT NULL,
|
|
||||||
{Scenario.create_db_add_scenario()},
|
|
||||||
{Scenario.create_db_add_scenario_fk()},
|
|
||||||
primary KEY(pamhyr_id, scenario)
|
|
||||||
)
|
|
||||||
""")
|
|
||||||
|
|
||||||
if ext == "_tmp":
|
if ext == "_tmp":
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
@ -339,18 +245,6 @@ class WeatherParameters(SQLSubModel):
|
||||||
cls._db_create(execute)
|
cls._db_create(execute)
|
||||||
created = True
|
created = True
|
||||||
|
|
||||||
if not cls.is_table_exists(execute, "weather_parameters_default"):
|
|
||||||
execute(f"""
|
|
||||||
CREATE TABLE weather_parameters_default(
|
|
||||||
{cls.create_db_add_pamhyr_id()},
|
|
||||||
type TEXT NOT NULL,
|
|
||||||
value FLOAT NOT NULL,
|
|
||||||
{Scenario.create_db_add_scenario()},
|
|
||||||
{Scenario.create_db_add_scenario_fk()},
|
|
||||||
primary KEY(pamhyr_id, scenario)
|
|
||||||
)
|
|
||||||
""")
|
|
||||||
|
|
||||||
if not created:
|
if not created:
|
||||||
return cls._update_submodel(execute, version, data)
|
return cls._update_submodel(execute, version, data)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,7 @@ from tools import trace, timer
|
||||||
from Model.Tools.PamhyrListExt import PamhyrModelList
|
from Model.Tools.PamhyrListExt import PamhyrModelList
|
||||||
from Model.Except import NotImplementedMethodeError
|
from Model.Except import NotImplementedMethodeError
|
||||||
|
|
||||||
from Model.WeatherParameters.WeatherParameters import (
|
from Model.WeatherParameters.WeatherParameters import WeatherParameters
|
||||||
WeatherParameters,
|
|
||||||
WeatherParametersDefault,
|
|
||||||
)
|
|
||||||
from Model.WeatherParameters.WeatherParametersTypes import (
|
from Model.WeatherParameters.WeatherParametersTypes import (
|
||||||
NotDefined, WeatherParam, AirTemperature, SpecificHumidity,
|
NotDefined, WeatherParam, AirTemperature, SpecificHumidity,
|
||||||
GlobalRadiation, ReferenceWindSpeed, GroundwaterTemperature,
|
GlobalRadiation, ReferenceWindSpeed, GroundwaterTemperature,
|
||||||
|
|
@ -37,14 +34,6 @@ class WeatherParametersList(PamhyrModelList):
|
||||||
_sub_classes = [
|
_sub_classes = [
|
||||||
WeatherParameters,
|
WeatherParameters,
|
||||||
]
|
]
|
||||||
_default_types = [
|
|
||||||
"AT", "SH", "GR", "RWS", "GT", "GFR", "ALB", "SC", "CCF"
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, status=None):
|
|
||||||
super(WeatherParametersList, self).__init__(status=status)
|
|
||||||
self._default = []
|
|
||||||
self._init_missing_default_values()
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _db_load(cls, execute, data=None):
|
def _db_load(cls, execute, data=None):
|
||||||
|
|
@ -57,13 +46,6 @@ class WeatherParametersList(PamhyrModelList):
|
||||||
execute, data
|
execute, data
|
||||||
)
|
)
|
||||||
|
|
||||||
data['loaded_pid'] = set()
|
|
||||||
new._default = WeatherParametersDefault._db_load(
|
|
||||||
execute, data
|
|
||||||
)
|
|
||||||
new._init_missing_default_values()
|
|
||||||
new._sort_default_values()
|
|
||||||
|
|
||||||
return new
|
return new
|
||||||
|
|
||||||
def _db_save(self, execute, data=None):
|
def _db_save(self, execute, data=None):
|
||||||
|
|
@ -75,10 +57,6 @@ class WeatherParametersList(PamhyrModelList):
|
||||||
"DELETE FROM weather_parameters_data " +
|
"DELETE FROM weather_parameters_data " +
|
||||||
f"WHERE scenario = {self._status.scenario_id}"
|
f"WHERE scenario = {self._status.scenario_id}"
|
||||||
)
|
)
|
||||||
execute(
|
|
||||||
"DELETE FROM weather_parameters_default " +
|
|
||||||
f"WHERE scenario = {self._status.scenario_id}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if data is None:
|
if data is None:
|
||||||
data = {}
|
data = {}
|
||||||
|
|
@ -86,41 +64,8 @@ class WeatherParametersList(PamhyrModelList):
|
||||||
for wp in self._lst:
|
for wp in self._lst:
|
||||||
wp._db_save(execute, data=data)
|
wp._db_save(execute, data=data)
|
||||||
|
|
||||||
for wp_default in self._default:
|
|
||||||
wp_default._db_save(execute, data=data)
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _data_traversal(self,
|
|
||||||
predicate=lambda obj, data: True,
|
|
||||||
modifier=lambda obj, data: None,
|
|
||||||
data={}):
|
|
||||||
if predicate(self, data):
|
|
||||||
modifier(self, data)
|
|
||||||
|
|
||||||
for el in self._lst:
|
|
||||||
el._data_traversal(predicate, modifier, data)
|
|
||||||
|
|
||||||
for el in self._default:
|
|
||||||
el._data_traversal(predicate, modifier, data)
|
|
||||||
|
|
||||||
def _init_missing_default_values(self):
|
|
||||||
existing = [wp_default.type for wp_default in self.default]
|
|
||||||
for type in self._default_types:
|
|
||||||
if type not in existing:
|
|
||||||
self._default.append(
|
|
||||||
WeatherParametersDefault(type=type, status=self._status)
|
|
||||||
)
|
|
||||||
|
|
||||||
self._sort_default_values()
|
|
||||||
|
|
||||||
def _sort_default_values(self):
|
|
||||||
self._default.sort(
|
|
||||||
key=lambda wp_default: self._default_types.index(wp_default.type)
|
|
||||||
if wp_default.type in self._default_types
|
|
||||||
else len(self._default_types)
|
|
||||||
)
|
|
||||||
|
|
||||||
def new(self, index, type="ND"):
|
def new(self, index, type="ND"):
|
||||||
if type == "AT":
|
if type == "AT":
|
||||||
n = AirTemperature(status=self._status)
|
n = AirTemperature(status=self._status)
|
||||||
|
|
@ -149,13 +94,3 @@ class WeatherParametersList(PamhyrModelList):
|
||||||
@property
|
@property
|
||||||
def Weather_Parameters_List(self):
|
def Weather_Parameters_List(self):
|
||||||
return self.lst
|
return self.lst
|
||||||
|
|
||||||
@property
|
|
||||||
def default(self):
|
|
||||||
return self._default.copy()
|
|
||||||
|
|
||||||
def default_for_type(self, type):
|
|
||||||
for wp_default in self.default:
|
|
||||||
if wp_default.type == type:
|
|
||||||
return wp_default
|
|
||||||
return None
|
|
||||||
|
|
|
||||||
|
|
@ -62,27 +62,6 @@ class StudyTestCase(unittest.TestCase):
|
||||||
study = Study.new("foo", "bar")
|
study = Study.new("foo", "bar")
|
||||||
self.assertNotEqual(study.river, None)
|
self.assertNotEqual(study.river, None)
|
||||||
|
|
||||||
def test_save_open_study_weather_parameters_default(self):
|
|
||||||
study = Study.new("foo", "bar")
|
|
||||||
defaults = study.river.weather_parameters.default
|
|
||||||
|
|
||||||
self.assertEqual(len(defaults), 9)
|
|
||||||
defaults[0].value = 12.5
|
|
||||||
|
|
||||||
dir = tempfile.mkdtemp()
|
|
||||||
f = os.path.join(dir, "foo.pamhyr")
|
|
||||||
|
|
||||||
study.filename = f
|
|
||||||
study.save()
|
|
||||||
study.close()
|
|
||||||
|
|
||||||
study = Study.open(f)
|
|
||||||
defaults = study.river.weather_parameters.default
|
|
||||||
|
|
||||||
self.assertEqual(len(defaults), 9)
|
|
||||||
self.assertEqual(defaults[0].type, "AT")
|
|
||||||
self.assertEqual(defaults[0].value, 12.5)
|
|
||||||
|
|
||||||
|
|
||||||
class StudyScenarioTestCase(unittest.TestCase):
|
class StudyScenarioTestCase(unittest.TestCase):
|
||||||
def test_create_study(self):
|
def test_create_study(self):
|
||||||
|
|
|
||||||
|
|
@ -56,14 +56,12 @@ class WeatherParametersTableDefaultModel(PamhyrTableModel):
|
||||||
column = index.column()
|
column = index.column()
|
||||||
|
|
||||||
if self._headers[column] == "name":
|
if self._headers[column] == "name":
|
||||||
if self._opt_data is not None:
|
return self._data[row]
|
||||||
return self._opt_data[row]
|
|
||||||
return self._data[row].type
|
|
||||||
elif self._headers[column] == "value":
|
elif self._headers[column] == "value":
|
||||||
value = self._data[row].value
|
n = 0.0
|
||||||
if value is None:
|
if n is None:
|
||||||
return self._trad['not_associated']
|
return self._trad['not_associated']
|
||||||
return value
|
return n
|
||||||
|
|
||||||
return QVariant()
|
return QVariant()
|
||||||
|
|
||||||
|
|
@ -75,7 +73,7 @@ class WeatherParametersTableDefaultModel(PamhyrTableModel):
|
||||||
column = index.column()
|
column = index.column()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if self._headers[column] == "value":
|
if self._headers[column] is not None:
|
||||||
self._undo.push(
|
self._undo.push(
|
||||||
SetCommand(
|
SetCommand(
|
||||||
self._data, row, self._headers[column], value
|
self._data, row, self._headers[column], value
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,6 @@ class SetCommand(QUndoCommand):
|
||||||
|
|
||||||
if self._column == "name":
|
if self._column == "name":
|
||||||
self._old = self._data[self._row].name
|
self._old = self._data[self._row].name
|
||||||
elif self._column == "value":
|
|
||||||
self._old = self._data[self._row].value
|
|
||||||
elif self._column == "concentration":
|
elif self._column == "concentration":
|
||||||
self._old = self._data[self._row].concentration
|
self._old = self._data[self._row].concentration
|
||||||
elif self._column == "eg":
|
elif self._column == "eg":
|
||||||
|
|
@ -61,8 +59,6 @@ class SetCommand(QUndoCommand):
|
||||||
def undo(self):
|
def undo(self):
|
||||||
if self._column == "name":
|
if self._column == "name":
|
||||||
self._data[self._row].name = self._old
|
self._data[self._row].name = self._old
|
||||||
elif self._column == "value":
|
|
||||||
self._data[self._row].value = self._old
|
|
||||||
elif self._column == "concentration":
|
elif self._column == "concentration":
|
||||||
self._data[self._row].concentration = self._old
|
self._data[self._row].concentration = self._old
|
||||||
elif self._column == "eg":
|
elif self._column == "eg":
|
||||||
|
|
@ -75,8 +71,6 @@ class SetCommand(QUndoCommand):
|
||||||
def redo(self):
|
def redo(self):
|
||||||
if self._column == "name":
|
if self._column == "name":
|
||||||
self._data[self._row].name = self._new
|
self._data[self._row].name = self._new
|
||||||
elif self._column == "value":
|
|
||||||
self._data[self._row].value = self._new
|
|
||||||
elif self._column == "concentration":
|
elif self._column == "concentration":
|
||||||
self._data[self._row].concentration = self._new
|
self._data[self._row].concentration = self._new
|
||||||
elif self._column == "eg":
|
elif self._column == "eg":
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ from PyQt5.QtWidgets import (
|
||||||
QFileDialog, QTableView, QAbstractItemView,
|
QFileDialog, QTableView, QAbstractItemView,
|
||||||
QUndoStack, QShortcut, QAction, QItemDelegate,
|
QUndoStack, QShortcut, QAction, QItemDelegate,
|
||||||
QComboBox, QVBoxLayout, QHeaderView, QTabWidget,
|
QComboBox, QVBoxLayout, QHeaderView, QTabWidget,
|
||||||
QVBoxLayout, QToolBar, QAction, QToolButton, QLabel,
|
QVBoxLayout, QToolBar, QAction, QToolButton,
|
||||||
)
|
)
|
||||||
|
|
||||||
from Modules import Modules
|
from Modules import Modules
|
||||||
|
|
@ -125,14 +125,13 @@ class WeatherParametersWindow(PamhyrWindow):
|
||||||
toolBar.addAction(action_delete)
|
toolBar.addAction(action_delete)
|
||||||
toolBar.addAction(action_edit)
|
toolBar.addAction(action_edit)
|
||||||
|
|
||||||
layout.addWidget(self.table_spec_title)
|
|
||||||
layout.addWidget(self.table_spec)
|
layout.addWidget(self.table_spec)
|
||||||
|
|
||||||
def setup_table(self):
|
def setup_table(self):
|
||||||
self.table_default = self.find(QTableView, f"tableView")
|
self.table_default = self.find(QTableView, f"tableView")
|
||||||
|
|
||||||
if self._study.is_editable():
|
if self._study.is_editable():
|
||||||
editable_headers = ["value"]
|
editable_headers = self._trad.get_dict("table_headers")
|
||||||
else:
|
else:
|
||||||
editable_headers = []
|
editable_headers = []
|
||||||
|
|
||||||
|
|
@ -141,15 +140,13 @@ class WeatherParametersWindow(PamhyrWindow):
|
||||||
table_headers=self._trad.get_dict("table_headers"),
|
table_headers=self._trad.get_dict("table_headers"),
|
||||||
editable_headers=editable_headers,
|
editable_headers=editable_headers,
|
||||||
delegates={},
|
delegates={},
|
||||||
data=self._study.river.weather_parameters.default,
|
data=self.weather_params,
|
||||||
opt_data=self.weather_params,
|
|
||||||
undo=self._undo_stack,
|
undo=self._undo_stack,
|
||||||
trad=self._trad
|
trad=self._trad
|
||||||
)
|
)
|
||||||
|
|
||||||
self.table_default.setModel(self._table)
|
self.table_default.setModel(self._table)
|
||||||
self.table_default.setSelectionBehavior(QAbstractItemView.SelectRows)
|
self.table_default.setSelectionBehavior(QAbstractItemView.SelectRows)
|
||||||
self.table_default.setSelectionMode(QAbstractItemView.SingleSelection)
|
|
||||||
self.table_default.horizontalHeader().setSectionResizeMode(
|
self.table_default.horizontalHeader().setSectionResizeMode(
|
||||||
QHeaderView.Stretch
|
QHeaderView.Stretch
|
||||||
)
|
)
|
||||||
|
|
@ -158,7 +155,6 @@ class WeatherParametersWindow(PamhyrWindow):
|
||||||
self.on_table_default_selection_changed
|
self.on_table_default_selection_changed
|
||||||
)
|
)
|
||||||
|
|
||||||
self.table_spec_title = QLabel()
|
|
||||||
self.table_spec = QTableView()
|
self.table_spec = QTableView()
|
||||||
|
|
||||||
self._delegate_reach = ComboBoxDelegate(
|
self._delegate_reach = ComboBoxDelegate(
|
||||||
|
|
@ -214,34 +210,13 @@ class WeatherParametersWindow(PamhyrWindow):
|
||||||
)
|
)
|
||||||
self.table_spec.scrollTo(index)
|
self.table_spec.scrollTo(index)
|
||||||
|
|
||||||
self._selected_default_row_index = 0
|
|
||||||
self.select_table_default_row(0)
|
|
||||||
|
|
||||||
def select_table_default_row(self, row):
|
|
||||||
model = self.table_default.model()
|
|
||||||
if model is None or model.rowCount() == 0:
|
|
||||||
return
|
|
||||||
|
|
||||||
row = max(0, min(row, model.rowCount() - 1))
|
|
||||||
index = model.index(row, 0)
|
|
||||||
|
|
||||||
self.table_default.setCurrentIndex(index)
|
|
||||||
self.table_default.selectionModel().select(
|
|
||||||
index,
|
|
||||||
QItemSelectionModel.Rows |
|
|
||||||
QItemSelectionModel.ClearAndSelect |
|
|
||||||
QItemSelectionModel.Select
|
|
||||||
)
|
|
||||||
self.table_default.scrollTo(index)
|
|
||||||
|
|
||||||
def on_table_default_selection_changed(self, selected, deselected):
|
def on_table_default_selection_changed(self, selected, deselected):
|
||||||
rows = self.table_default.selectionModel().selectedRows()
|
rows = self.table_default.selectionModel().selectedRows()
|
||||||
if len(rows) == 0:
|
if len(rows) == 0:
|
||||||
self.select_table_default_row(self._selected_default_row_index)
|
self._selected_default_row_index = None
|
||||||
return self._selected_default_row_index
|
return None
|
||||||
|
|
||||||
self._selected_default_row_index = rows[0].row()
|
self._selected_default_row_index = rows[0].row()
|
||||||
self.update_table_spec_title()
|
|
||||||
|
|
||||||
self._table_spec.update_tab_spec(
|
self._table_spec.update_tab_spec(
|
||||||
type=self._wp_acronyms[
|
type=self._wp_acronyms[
|
||||||
|
|
@ -251,11 +226,6 @@ class WeatherParametersWindow(PamhyrWindow):
|
||||||
|
|
||||||
return self._selected_default_row_index
|
return self._selected_default_row_index
|
||||||
|
|
||||||
def update_table_spec_title(self):
|
|
||||||
row = self._selected_default_row_index
|
|
||||||
if 0 <= row < len(self.weather_params):
|
|
||||||
self.table_spec_title.setText(self.weather_params[row])
|
|
||||||
|
|
||||||
def index_selected_row(self):
|
def index_selected_row(self):
|
||||||
table = self.table_spec
|
table = self.table_spec
|
||||||
rows = table.selectionModel()\
|
rows = table.selectionModel()\
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue