From 6500c1d0ce7f8f44afbf1936a0efa8115ea3c361 Mon Sep 17 00:00:00 2001 From: DanSava Date: Tue, 8 Oct 2024 13:43:52 +0300 Subject: [PATCH] Allow non zero iteration number when creating experiment-ensemble pair using CreateExperimentDialog --- .../ertwidgets/create_experiment_dialog.py | 33 +++++++++++++++---- .../manage_experiments/storage_widget.py | 1 + src/ert/validation/__init__.py | 3 +- tests/ert/ui_tests/gui/test_main_window.py | 7 ++++ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/ert/gui/ertwidgets/create_experiment_dialog.py b/src/ert/gui/ertwidgets/create_experiment_dialog.py index 110b3a43a3b..0eca7d8f5fe 100644 --- a/src/ert/gui/ertwidgets/create_experiment_dialog.py +++ b/src/ert/gui/ertwidgets/create_experiment_dialog.py @@ -13,15 +13,16 @@ ) from ert.gui.ertnotifier import ErtNotifier -from ert.gui.ertwidgets import StringBox, TextModel -from ert.validation.proper_name_argument import ( +from ert.gui.ertwidgets import StringBox, TextModel, ValueModel +from ert.validation import ( ExperimentValidation, + IntegerArgument, ProperNameArgument, ) class CreateExperimentDialog(QDialog): - onDone = Signal(str, str) + onDone = Signal(str, str, int) def __init__( self, @@ -54,6 +55,15 @@ def __init__( ) self._ensemble_edit.setValidator(ProperNameArgument()) + iteration_label = QLabel("Ensemble iteration:") + self._iterations_model = ValueModel(0) # type: ignore + self._iterations_field = StringBox( + self._iterations_model, # type: ignore + "0", + minimum_width=200, + ) + self._iterations_field.setValidator(IntegerArgument(from_value=0)) + self._iterations_field.setObjectName("iterations_field_ced") buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Orientation.Horizontal, @@ -67,7 +77,7 @@ def __init__( self._ok_button.clicked.connect( lambda: self.onDone.emit( - self._experiment_edit.get_text, self._ensemble_edit.get_text + self.experiment_name, self.ensemble_name, self.iteration ) ) @@ -76,12 +86,15 @@ def enableOkButton() -> None: self._experiment_edit.textChanged.connect(enableOkButton) self._ensemble_edit.textChanged.connect(enableOkButton) + self._iterations_field.textChanged.connect(enableOkButton) layout.addWidget(experiment_label, 0, 0) layout.addWidget(self._experiment_edit, 0, 1) layout.addWidget(ensemble_label, 1, 0) layout.addWidget(self._ensemble_edit, 1, 1) - layout.addWidget(buttons, 2, 1) + layout.addWidget(iteration_label, 2, 0) + layout.addWidget(self._iterations_field, 2, 1) + layout.addWidget(buttons, 3, 1) self.setLayout(layout) @@ -103,5 +116,13 @@ def experiment_name(self) -> str: def ensemble_name(self) -> str: return self._ensemble_edit.get_text + @property + def iteration(self) -> int: + return int(self._iterations_field.get_text) + def isConfigurationValid(self) -> bool: - return self._experiment_edit.isValid() and self._ensemble_edit.isValid() + return ( + self._experiment_edit.isValid() + and self._ensemble_edit.isValid() + and self._iterations_field.isValid() + ) diff --git a/src/ert/gui/tools/manage_experiments/storage_widget.py b/src/ert/gui/tools/manage_experiments/storage_widget.py index a13e9dcc45c..3d419ecc92b 100644 --- a/src/ert/gui/tools/manage_experiments/storage_widget.py +++ b/src/ert/gui/tools/manage_experiments/storage_widget.py @@ -156,6 +156,7 @@ def _addItem(self) -> None: ).create_ensemble( name=create_experiment_dialog.ensemble_name, ensemble_size=self._ensemble_size, + iteration=create_experiment_dialog.iteration, ) self._notifier.set_current_ensemble(ensemble) self._notifier.ertChanged.emit() diff --git a/src/ert/validation/__init__.py b/src/ert/validation/__init__.py index c6d3d779cf5..c4f5e1a2990 100644 --- a/src/ert/validation/__init__.py +++ b/src/ert/validation/__init__.py @@ -2,7 +2,7 @@ from .argument_definition import ArgumentDefinition from .integer_argument import IntegerArgument from .number_list_string_argument import NumberListStringArgument -from .proper_name_argument import ProperNameArgument +from .proper_name_argument import ExperimentValidation, ProperNameArgument from .proper_name_format_argument import ProperNameFormatArgument from .range_string_argument import RangeStringArgument from .rangestring import mask_to_rangestring, rangestring_to_list, rangestring_to_mask @@ -11,6 +11,7 @@ __all__ = [ "ActiveRange", "ArgumentDefinition", + "ExperimentValidation", "IntegerArgument", "NumberListStringArgument", "ProperNameArgument", diff --git a/tests/ert/ui_tests/gui/test_main_window.py b/tests/ert/ui_tests/gui/test_main_window.py index f3e8d135e8f..ac501b0c188 100644 --- a/tests/ert/ui_tests/gui/test_main_window.py +++ b/tests/ert/ui_tests/gui/test_main_window.py @@ -548,12 +548,19 @@ def handle_add_dialog(): dialog._ensemble_edit.setText("_new_ensemble_") assert dialog._ok_button.isEnabled() + dialog._iterations_field.setText("a") + assert not dialog._ok_button.isEnabled() + dialog._iterations_field.setText("42") + assert dialog._ok_button.isEnabled() + qtbot.mouseClick(dialog._ok_button, Qt.MouseButton.LeftButton) QTimer.singleShot(1000, handle_add_dialog) create_widget = get_child(storage_widget, AddWidget) qtbot.mouseClick(create_widget.addButton, Qt.LeftButton) + assert experiments_panel.notifier.current_ensemble.iteration == 42 + # Go to the "initialize from scratch" panel experiments_panel.setCurrentIndex(1) current_tab = experiments_panel.currentWidget()