|
3 | 3 |
|
4 | 4 | from aiida.engine import ProcessState |
5 | 5 | from aiidalab_qe.common.infobox import InAppGuide |
| 6 | +from aiidalab_qe.common.process import STATE_ICONS |
6 | 7 | from aiidalab_qe.common.widgets import LoadingWidget |
7 | 8 | from aiidalab_qe.common.wizard import QeDependentWizardStep |
8 | 9 | from aiidalab_widgets_base import ProcessMonitor, WizardAppWidgetStep |
|
13 | 14 | from .components.viewer import WorkChainResultsViewer, WorkChainResultsViewerModel |
14 | 15 | from .model import ResultsStepModel |
15 | 16 |
|
16 | | -STATUS_TEMPLATE = "<h4>Workflow status: {}</h4" |
17 | | - |
18 | | -STATUS_MAP = { |
19 | | - ProcessState.EXCEPTED: "Excepted", |
20 | | - ProcessState.KILLED: "Killed", |
21 | | -} |
22 | | - |
23 | 17 |
|
24 | 18 | class ViewQeAppWorkChainStatusAndResultsStep(QeDependentWizardStep[ResultsStepModel]): |
25 | 19 | missing_information_warning = ( |
26 | 20 | "No available results. Did you submit or load a calculation?" |
27 | 21 | ) |
28 | 22 |
|
| 23 | + STATUS_TEMPLATE = "<h4>Workflow status: {}</h4" |
| 24 | + |
29 | 25 | def __init__(self, model: ResultsStepModel, **kwargs): |
30 | 26 | self.log_widget = kwargs.pop("log_widget", None) |
31 | 27 | super().__init__(model=model, **kwargs) |
@@ -235,30 +231,42 @@ def _update_status(self): |
235 | 231 | self._model.monitor_counter += 1 |
236 | 232 |
|
237 | 233 | def _update_state(self): |
238 | | - process_node = self._model.fetch_process_node() |
239 | | - if not process_node: |
| 234 | + if not (process_node := self._model.fetch_process_node()): |
240 | 235 | self.state = self.State.INIT |
241 | | - elif process_node.process_state in ( |
242 | | - ProcessState.CREATED, |
| 236 | + self._update_controls() |
| 237 | + return |
| 238 | + |
| 239 | + if process_state := process_node.process_state: |
| 240 | + status = self._get_process_status(process_state.value) |
| 241 | + else: |
| 242 | + status = "Unknown" |
| 243 | + |
| 244 | + if process_state is ProcessState.CREATED: |
| 245 | + self.state = self.State.ACTIVE |
| 246 | + elif process_state in ( |
243 | 247 | ProcessState.RUNNING, |
244 | 248 | ProcessState.WAITING, |
245 | 249 | ): |
246 | 250 | self.state = self.State.ACTIVE |
247 | | - self._model.process_info = STATUS_TEMPLATE.format("Running") |
248 | | - elif ( |
249 | | - process_node.process_state |
250 | | - in ( |
251 | | - ProcessState.EXCEPTED, |
252 | | - ProcessState.KILLED, |
253 | | - ) |
254 | | - or process_node.is_failed |
| 251 | + status = self._get_process_status("running") # overwrite status |
| 252 | + elif process_state in ( |
| 253 | + ProcessState.EXCEPTED, |
| 254 | + ProcessState.KILLED, |
255 | 255 | ): |
256 | 256 | self.state = self.State.FAIL |
257 | | - status = STATUS_MAP.get(process_node.process_state, "Failed") |
258 | | - self._model.process_info = STATUS_TEMPLATE.format(status) |
| 257 | + elif process_node.is_failed: |
| 258 | + self.state = self.State.FAIL |
259 | 259 | elif process_node.is_finished_ok: |
260 | 260 | self.state = self.State.SUCCESS |
261 | | - self._model.process_info = STATUS_TEMPLATE.format("Completed successfully") |
| 261 | + |
| 262 | + self._model.process_info = self.STATUS_TEMPLATE.format(status) |
| 263 | + |
| 264 | + self._update_controls() |
| 265 | + |
| 266 | + def _update_controls(self): |
262 | 267 | if self.state in (self.State.SUCCESS, self.State.FAIL): |
263 | 268 | self._update_kill_button_layout() |
264 | 269 | self._update_clean_scratch_button_layout() |
| 270 | + |
| 271 | + def _get_process_status(self, state: str): |
| 272 | + return f"{state.capitalize()} {STATE_ICONS[state]}" |
0 commit comments