Skip to content

Commit 1d0af44

Browse files
Fix remaining issues
1 parent b6986bc commit 1d0af44

File tree

12 files changed

+166
-212
lines changed

12 files changed

+166
-212
lines changed

src/aiidalab_qe/app/configuration/__init__.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99

1010
from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS
1111
from aiidalab_qe.app.utils import get_entry_items
12+
from aiidalab_qe.app.utils.plugin_manager import (
13+
DEFAULT_PLUGIN_CONFIG_SOURCE,
14+
PluginManager,
15+
is_package_installed,
16+
)
1217
from aiidalab_qe.common.infobox import InAppGuide
1318
from aiidalab_qe.common.panel import (
1419
ConfigurationSettingsModel,
@@ -106,7 +111,6 @@ def _render(self):
106111
description="Plugin store",
107112
link="plugin_manager.ipynb",
108113
icon="puzzle-piece", # More intuitive icon
109-
button_style="primary", # Keeps it prominent
110114
tooltip="Browse and install additional plugins from the Plugin Store",
111115
)
112116

@@ -211,12 +215,6 @@ def _update_state(self, _=None):
211215
self.state = self.State.INIT
212216

213217
def _fetch_not_installed_property(self, plugin_config_source=None):
214-
from aiidalab_qe.app.utils.plugin_manager import (
215-
DEFAULT_PLUGIN_CONFIG_SOURCE,
216-
PluginManager,
217-
is_package_installed,
218-
)
219-
220218
self.not_installed_property_children = []
221219

222220
plugin_config_source = plugin_config_source or DEFAULT_PLUGIN_CONFIG_SOURCE

src/aiidalab_qe/app/result/components/viewer/viewer.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,4 @@ def _fetch_plugin_results(self, viewer_model: WorkChainResultsViewerModel):
9292
panel = entry["panel"]
9393
model = entry["model"]()
9494
viewer_model.add_model(identifier, model)
95-
self.panels[identifier] = panel(
96-
identifier=identifier,
97-
model=model,
98-
)
95+
self.panels[identifier] = panel(model=model)

src/aiidalab_qe/app/submission/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,16 @@ def _render(self):
8383
super()._render()
8484

8585
self.process_label = ipw.Text(
86-
description="Label:",
87-
layout=ipw.Layout(width="auto", indent="0px"),
86+
description="Label",
87+
layout=ipw.Layout(width="auto"),
8888
)
8989
ipw.link(
9090
(self._model, "process_label"),
9191
(self.process_label, "value"),
9292
)
9393
self.process_description = ipw.Textarea(
9494
description="Description",
95-
layout=ipw.Layout(width="auto", indent="0px"),
95+
layout=ipw.Layout(width="auto"),
9696
)
9797
ipw.link(
9898
(self._model, "process_description"),

src/aiidalab_qe/app/submission/global_settings/model.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import numpy as np
34
import traitlets as tl
45

56
from aiida import orm
@@ -208,6 +209,9 @@ def _get_properties(self) -> list[str]:
208209
return self.input_parameters.get("workchain", {}).get("properties", [])
209210

210211
def _check_blockers(self):
212+
if not self.input_parameters:
213+
return
214+
211215
warning_in_blockers = (
212216
"""
213217
<b>Please note</b> that, if this blocker is shown for an already finished workflow,
@@ -252,7 +256,8 @@ def _check_blockers(self):
252256
if not code_model.is_ready:
253257
continue
254258
if not issubclass(
255-
code_model.code_widget_class, QEAppComputationalResourcesWidget
259+
code_model.code_widget_class,
260+
QEAppComputationalResourcesWidget,
256261
):
257262
yield (
258263
f"Error: hi, plugin developer, please use the QEAppComputationalResourcesWidget from aiidalab_qe.common.widgets for code {identifier}."
@@ -306,8 +311,6 @@ def _estimate_min_cpus(
306311
`int`
307312
The estimated minimum number of CPUs required.
308313
"""
309-
import numpy as np
310-
311314
return int(
312315
np.ceil(
313316
num_cpus0

src/aiidalab_qe/app/submission/global_settings/setting.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def render(self):
6363
def build_global_codes(self, codes: PluginCodes):
6464
for identifier, code_models in codes.items():
6565
for _, code_model in code_models.items():
66+
self.register_code(code_model)
6667
base_code_model = self._model.add_global_model(identifier, code_model)
6768
if base_code_model is not None:
6869
base_code_model.observe(
@@ -73,15 +74,26 @@ def build_global_codes(self, codes: PluginCodes):
7374
self._on_code_selection_change,
7475
"selected",
7576
)
77+
self.register_code(base_code_model)
78+
if base_code_model.default_calc_job_plugin == "quantumespresso.pw":
79+
base_code_model.observe(
80+
self._on_pw_code_resource_change,
81+
[
82+
"num_cpus",
83+
"num_nodes",
84+
"ntasks_per_node",
85+
"cpus_per_task",
86+
"max_wallclock_seconds",
87+
],
88+
)
7689
self._model.update_global_codes()
7790

7891
def reset(self):
7992
self._model.set_selected_codes()
8093

8194
def _on_input_parameters_change(self, _):
8295
self._model.update_active_codes()
83-
if self._model.input_parameters:
84-
self._model.update_blockers()
96+
self._model.update_blockers()
8597

8698
def _on_input_structure_change(self, _):
8799
self._model.check_resources()
@@ -107,17 +119,6 @@ def _render_code_widget(
107119
code_widget: QEAppComputationalResourcesWidget,
108120
):
109121
super()._render_code_widget(code_model, code_widget)
110-
if code_model.default_calc_job_plugin == "quantumespresso.pw":
111-
code_model.observe(
112-
self._on_pw_code_resource_change,
113-
[
114-
"num_cpus",
115-
"num_nodes",
116-
"ntasks_per_node",
117-
"cpus_per_task",
118-
"max_wallclock_seconds",
119-
],
120-
)
121122

122123
def toggle_widget(_=None, model=code_model, widget=code_widget):
123124
widget = self.code_widgets[model.name]

src/aiidalab_qe/app/submission/model.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,8 @@ def _get_properties(self) -> list[str]:
230230
def _create_builder(self, parameters) -> ProcessBuilderNamespace:
231231
builder = QeAppWorkChain.get_builder_from_protocol(
232232
structure=self.input_structure,
233-
parameters=shallow_copy_nested_dict(
234-
parameters
235-
), # use shallow copy to avoid workflow mute these parameters.
233+
# Use shallow copy to avoid parameter mutation by the workflow
234+
parameters=shallow_copy_nested_dict(parameters),
236235
)
237236

238237
codes = parameters["codes"]["global"]["codes"]

src/aiidalab_qe/app/utils/plugin_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,8 @@ def _build_ui(self) -> None:
396396

397397
# Build plugin description details
398398
details = f"""
399-
<b>Author:</b> {plugin_data.get('author', 'N/A')}<br>
400-
<b>Description:</b> {plugin_data.get('description', 'No description available')}<br>
399+
<b>Author:</b> {plugin_data.get("author", "N/A")}<br>
400+
<b>Description:</b> {plugin_data.get("description", "No description available")}<br>
401401
<b>Status:</b> {badge_html}<br>
402402
{version_message}
403403
"""

src/aiidalab_qe/common/panel.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,27 @@ def __init__(self, model, **kwargs):
272272
super().__init__(model, **kwargs)
273273
self.code_widgets = {}
274274

275+
def register_code(self, code_model: CodeModel):
276+
if code_model.default_calc_job_plugin == "quantumespresso.pw":
277+
code_model.observe(
278+
self._on_code_resource_change,
279+
[
280+
"parallelization_override",
281+
"npool",
282+
],
283+
)
284+
code_model.observe(
285+
self._on_code_resource_change,
286+
[
287+
"selected",
288+
"num_cpus",
289+
"num_nodes",
290+
"ntasks_per_node",
291+
"cpus_per_task",
292+
"max_wallclock_seconds",
293+
],
294+
)
295+
275296
def _on_code_resource_change(self, _):
276297
pass
277298

@@ -346,24 +367,6 @@ def _render_code_widget(
346367
(code_model, "npool"),
347368
(code_widget.parallelization.npool, "value"),
348369
)
349-
code_model.observe(
350-
self._on_code_resource_change,
351-
[
352-
"parallelization_override",
353-
"npool",
354-
],
355-
)
356-
code_model.observe(
357-
self._on_code_resource_change,
358-
[
359-
"selected",
360-
"num_cpus",
361-
"num_nodes",
362-
"ntasks_per_node",
363-
"cpus_per_task",
364-
"max_wallclock_seconds",
365-
],
366-
)
367370
code_widget.code_selection.code_select_dropdown.observe(
368371
self._on_code_options_change,
369372
"options",

src/aiidalab_qe/common/widgets.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ def _observe_value(self, change):
262262
class CalcJobOutputFollower(traitlets.HasTraits):
263263
calcjob_uuid = traitlets.Unicode(allow_none=True)
264264
filename = traitlets.Unicode(allow_none=True)
265-
output = traitlets.List(trait=traitlets.Unicode)
265+
output = traitlets.List(trait=traitlets.Unicode())
266266
lineno = traitlets.Int()
267267

268268
def __init__(self, **kwargs):
@@ -447,8 +447,8 @@ class AddingTagsEditor(ipw.VBox):
447447
"""Editor for adding tags to atoms."""
448448

449449
structure = traitlets.Instance(ase.Atoms, allow_none=True)
450-
selection = traitlets.List(traitlets.Int, allow_none=True)
451-
input_selection = traitlets.List(traitlets.Int, allow_none=True)
450+
selection = traitlets.List(traitlets.Int(), allow_none=True)
451+
input_selection = traitlets.List(traitlets.Int(), allow_none=True)
452452
structure_node = traitlets.Instance(orm_Data, allow_none=True, read_only=True)
453453

454454
def __init__(self, title="", **kwargs):
@@ -693,18 +693,29 @@ def __init__(self, **kwargs):
693693
the number of nodes and the number of cpus.
694694
"""
695695
self.code_selection = ComputationalResourcesWidget(
696+
description=kwargs.pop("description", None),
697+
default_calc_job_plugin=kwargs.pop("default_calc_job_plugin", None),
696698
include_setup_widget=False,
697699
fetch_codes=True, # TODO resolve testing issues when set to `False`
698700
**kwargs,
699701
)
700702
self.code_selection.layout.width = "80%"
701703

702704
self.num_nodes = ipw.BoundedIntText(
703-
value=1, step=1, min=1, max=1000, description="Nodes", width="10%"
705+
value=1,
706+
step=1,
707+
min=1,
708+
max=1000,
709+
description="Nodes",
704710
)
711+
705712
self.num_cpus = ipw.BoundedIntText(
706-
value=1, step=1, min=1, description="CPUs", width="10%"
713+
value=1,
714+
step=1,
715+
min=1,
716+
description="CPUs",
707717
)
718+
708719
self.btn_setup_resource_detail = ipw.ToggleButton(description="More")
709720
self.btn_setup_resource_detail.observe(self._setup_resource_detail, "value")
710721
self._setup_resource_detail_output = ipw.Output(layout={"width": "500px"})
@@ -896,7 +907,7 @@ def __init__(self, **kwargs):
896907
value=1, step=1, min=1, max=128, description="Number of k-pools", **extra
897908
)
898909
self.override = ipw.Checkbox(
899-
escription="",
910+
description="",
900911
indent=False,
901912
value=False,
902913
layout=ipw.Layout(max_width="20px"),
@@ -1285,7 +1296,7 @@ def __init__(self, widget: ipw.ValueWidget, units: str, **kwargs):
12851296

12861297
class ShakeNBreakEditor(ipw.VBox):
12871298
structure = traitlets.Instance(ase.Atoms, allow_none=True)
1288-
selection = traitlets.List(traitlets.Int)
1299+
selection = traitlets.List(traitlets.Int())
12891300
structure_node = traitlets.Instance(orm_Data, allow_none=True, read_only=True)
12901301

12911302
def __init__(self, title="Editor ShakeNbreak"):

0 commit comments

Comments
 (0)