diff --git a/bec_widgets/applications/views/admin_view/__init__.py b/bec_widgets/applications/views/admin_view/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bec_widgets/applications/views/admin_view/admin_view.py b/bec_widgets/applications/views/admin_view/admin_view.py new file mode 100644 index 00000000..ec6e2f59 --- /dev/null +++ b/bec_widgets/applications/views/admin_view/admin_view.py @@ -0,0 +1,42 @@ +"""Module for Admin View.""" + +from qtpy.QtWidgets import QWidget + +from bec_widgets.applications.views.admin_view.admin_widget import AdminWidget +from bec_widgets.applications.views.view import ViewBase +from bec_widgets.utils.error_popups import SafeSlot + + +class AdminView(ViewBase): + """ + A view for administrators to change the current active experiment, manage messaging + services, and more tasks reserved for users with admin privileges. + """ + + def __init__( + self, + parent: QWidget | None = None, + content: QWidget | None = None, + *, + id: str | None = None, + title: str | None = None, + ): + super().__init__(parent=parent, content=content, id=id, title=title) + self.admin_widget = AdminWidget(parent=self) + self.set_content(self.admin_widget) + + @SafeSlot() + def on_enter(self) -> None: + """Called after the view becomes current/visible. + + Default implementation does nothing. Override in subclasses. + """ + self.admin_widget.on_enter() + + @SafeSlot() + def on_exit(self) -> None: + """Called before the view is hidden. + + Default implementation does nothing. Override in subclasses. + """ + self.admin_widget.on_exit() diff --git a/bec_widgets/applications/views/admin_view/admin_widget.py b/bec_widgets/applications/views/admin_view/admin_widget.py new file mode 100644 index 00000000..5942a52b --- /dev/null +++ b/bec_widgets/applications/views/admin_view/admin_widget.py @@ -0,0 +1,40 @@ +"""Module to define a widget for the admin view.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from bec_lib.endpoints import MessageEndpoints +from bec_lib.messages import DeploymentInfoMessage +from qtpy.QtWidgets import QStackedLayout, QWidget + +from bec_widgets.utils.bec_widget import BECWidget +from bec_widgets.utils.error_popups import SafeSlot + + +class AdminWidget(BECWidget, QWidget): + """Widget for admin view.""" + + RPC = False + + def __init__(self, parent=None, client=None): + super().__init__(parent=parent, client=client) + self._current_deployment_info: DeploymentInfoMessage | None = None + + self.stacked_layout = QStackedLayout() + self.stacked_layout.setContentsMargins(0, 0, 0, 0) + self.stacked_layout.setSpacing(0) + self.stacked_layout.setStackingMode(QStackedLayout.StackingMode.StackAll) + self.setLayout(self.stacked_layout) + + self.bec_dispatcher.connect_slot( + slot=self._update_deployment_info, + endpoint=MessageEndpoints.deployment_info(), + from_start=True, + ) + + @SafeSlot(dict, dict) + def _update_deployment_info(self, msg: dict, metadata: dict) -> None: + """Fetch current deployment info from the server.""" + deployment = DeploymentInfoMessage.model_validate(msg) + self._current_deployment_info = deployment