diff --git a/gwhat/projet/manager_data.py b/gwhat/projet/manager_data.py index b655fefe..6402c3ee 100644 --- a/gwhat/projet/manager_data.py +++ b/gwhat/projet/manager_data.py @@ -818,20 +818,7 @@ def accept_dataset(self): del_dset(self.name) # Update dataset attributes from UI and emit dataset. - if self._datatype == 'water level': - self._dataset['Well'] = self.station_name - self._dataset['Well ID'] = self.station_id - self._dataset['Province'] = self.province - self._dataset['Latitude'] = self.latitude - self._dataset['Longitude'] = self.longitude - self._dataset['Elevation'] = self.altitude - elif self._datatype == 'daily weather': - self._dataset.metadata['Station Name'] = self.station_name - self._dataset.metadata['Station ID'] = self.station_id - self._dataset.metadata['Location'] = self.province - self._dataset.metadata['Latitude'] = self.latitude - self._dataset.metadata['Longitude'] = self.longitude - self._dataset.metadata['Elevation'] = self.altitude + self._update_attributes_from_ui() self.sig_new_dataset_imported.emit(self.name, self._dataset) if len(self._queued_filenames): @@ -848,6 +835,22 @@ def close(self): self.directory.clear() self.update_gui() + def _update_attributes_from_ui(self): + if self._datatype == 'water level': + self._dataset['Well'] = self.station_name + self._dataset['Well ID'] = self.station_id + self._dataset['Province'] = self.province + self._dataset['Latitude'] = self.latitude + self._dataset['Longitude'] = self.longitude + self._dataset['Elevation'] = self.altitude + elif self._datatype == 'daily weather': + self._dataset.metadata['Station Name'] = self.station_name + self._dataset.metadata['Station ID'] = self.station_id + self._dataset.metadata['Location'] = self.province + self._dataset.metadata['Latitude'] = self.latitude + self._dataset.metadata['Longitude'] = self.longitude + self._dataset.metadata['Elevation'] = self.altitude + if __name__ == '__main__': import sys diff --git a/gwhat/projet/reader_waterlvl.py b/gwhat/projet/reader_waterlvl.py index d563748b..a0fed040 100644 --- a/gwhat/projet/reader_waterlvl.py +++ b/gwhat/projet/reader_waterlvl.py @@ -303,10 +303,10 @@ def __len__(self): return len(self._dataf) def __setitem__(self, key, value): - return NotImplementedError + raise NotImplementedError def __iter__(self): - return NotImplementedError + raise NotImplementedError # ---- Attributes @property @@ -399,12 +399,18 @@ def __getitem__(self, key): elif key in COLUMNS: return self.data[key].values elif key in HEADER.keys(): - return self._dataf.attrs[key] + return self.data.attrs[key] elif key == 'filename': - return self._dataf.filename + return self.data.filename return self.dset.__getitem__(key) + def __setitem__(self, key, value): + if key in HEADER.keys(): + self.data.attrs[key] = value + else: + raise KeyError(key) + def __load_dataset__(self, filename): """Loads the dataset from a file and saves it in the store.""" self._dataf = read_water_level_datafile(filename) diff --git a/gwhat/projet/tests/test_manager_data.py b/gwhat/projet/tests/test_manager_data.py index 82626221..d355996e 100644 --- a/gwhat/projet/tests/test_manager_data.py +++ b/gwhat/projet/tests/test_manager_data.py @@ -125,7 +125,67 @@ def test_delete_weather_data(datamanager, mocker, qtbot): def test_import_waterlevel_data(datamanager, mocker, qtbot): """ - Test that importing water level data in gwhat projects is + Test that importing a water level dataset in a gwhat project is + working as expected. + + Regression test for jnsebgosselin/gwhat#416 + """ + datamanager.new_waterlvl_win.setModal(False) + new_waterlvl_dialog = datamanager.new_waterlvl_win + + # Mock the file dialog to return the path of the weather datafiles. + mocker.patch.object( + QFileDialog, 'exec_', return_value=True) + mocker.patch.object( + QFileDialog, 'selectedFiles', + return_value=[WLFILENAME, WLFILENAME2, WLFILENAME3]) + + with qtbot.waitSignal(new_waterlvl_dialog.sig_new_dataset_loaded): + qtbot.mouseClick(datamanager.btn_load_wl, Qt.LeftButton) + + assert new_waterlvl_dialog.directory.text() == WLFILENAME + assert new_waterlvl_dialog.name == "PO01 - Calixa-Lavallée" + assert new_waterlvl_dialog.station_name == "PO01 - Calixa-Lavallée" + assert new_waterlvl_dialog.station_id == "3040002" + assert new_waterlvl_dialog.province == "QC" + assert new_waterlvl_dialog.latitude == 45.74581 + assert new_waterlvl_dialog.longitude == -73.28024 + assert new_waterlvl_dialog.altitude == 19.51 + + # Change dataset info in the UI. + new_waterlvl_dialog._dset_name.setText("test_dataset_name") + new_waterlvl_dialog._stn_name.setText("test_well_name") + new_waterlvl_dialog._sid.setText("test_well_id") + new_waterlvl_dialog._lat.setValue(45.678) + new_waterlvl_dialog._lon.setValue(-76.543) + new_waterlvl_dialog._alt.setValue(123.23) + new_waterlvl_dialog._prov.setText("test_prov") + + assert new_waterlvl_dialog.name == "test_dataset_name" + assert new_waterlvl_dialog.station_name == "test_well_name" + assert new_waterlvl_dialog.station_id == "test_well_id" + assert new_waterlvl_dialog.province == "test_prov" + assert new_waterlvl_dialog.latitude == 45.678 + assert new_waterlvl_dialog.longitude == -76.543 + assert new_waterlvl_dialog.altitude == 123.23 + + # Import the water level dataset into the project. + with qtbot.waitSignal(new_waterlvl_dialog.sig_new_dataset_imported): + qtbot.mouseClick(new_waterlvl_dialog.btn_ok, Qt.LeftButton) + + wldset = datamanager.get_current_wldset() + assert wldset.name == "test_dataset_name" + assert wldset['Well'] == "test_well_name" + assert wldset['Well ID'] == "test_well_id" + assert wldset['Province'] == "test_prov" + assert wldset['Latitude'] == 45.678 + assert wldset['Longitude'] == -76.543 + assert wldset['Elevation'] == 123.23 + + +def test_import_multiple_waterlevel_data(datamanager, mocker, qtbot): + """ + Test that importing multiple water level datasets in a gwhat project is working as expected. """ datamanager.new_waterlvl_win.setModal(False) diff --git a/gwhat/projet/tests/test_read_waterlvl.py b/gwhat/projet/tests/test_read_waterlvl.py index cf07a5ca..d052f677 100644 --- a/gwhat/projet/tests/test_read_waterlvl.py +++ b/gwhat/projet/tests/test_read_waterlvl.py @@ -105,6 +105,27 @@ def test_read_waterlvl(ext): assert list(dataset['Time']) == expected_results +def test_set_waterlvl_dataset(): + """ + Test that modifying water level datasets is working as expected. + """ + filename = osp.join(DATADIR, 'water_level_datafile.csv') + dataset = WLDataset(filename) + + expected_results = { + 'Well': "test_well_name", + 'Well ID': "test_well_id", + 'Province': 'test_prov', + 'Latitude': 45.678, + 'Longitude': -76.543, + 'Elevation': 123.23, + 'Municipality': 'test_municipality'} + + for key, value in expected_results.items(): + dataset[key] = value + assert dataset[key] == expected_results[key] + + @pytest.mark.parametrize("ext", ['.csv', '.xls', '.xlsx']) def test_load_waterlvl_measurements(datatmpdir, ext): filename = osp.join(datatmpdir, "waterlvl_manual_measurements" + ext)