Compare commits

..

No commits in common. "4a94c946d1553b3b2a8ae72288506efd9c0806a1" and "6d16d9dff47136c61ba72f50ec4f8a7338b345bd" have entirely different histories.

6 changed files with 11 additions and 241 deletions

View File

@ -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)

View File

@ -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

View File

@ -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):

View File

@ -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

View File

@ -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":

View File

@ -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()\