From 52a9765182e3372629c884295ace6a8546fb22bb Mon Sep 17 00:00:00 2001 From: David Perl Date: Thu, 9 Jul 2026 10:09:39 +0200 Subject: [PATCH 1/3] feat: server about info --- src/aare/daq/server.py | 11 +++++++++++ src/aare/gui/about.py | 11 ++++++++++- src/aare/gui/main_window.py | 2 +- src/aare/gui/threads/daq_worker.py | 11 +++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/aare/daq/server.py b/src/aare/daq/server.py index 8735924b..da3b3ccf 100644 --- a/src/aare/daq/server.py +++ b/src/aare/daq/server.py @@ -1,5 +1,6 @@ import asyncio import hmac +import importlib import io import json import os @@ -722,6 +723,16 @@ def initialise_detector(self): raise +@app.get("/about/running_version") +async def running_version() -> str: + return importlib.metadata.version("aare") + + +@app.get("/about/server_file_path") +async def server_file() -> str: + return __file__ + + @app.get("/local_contact/simulation_state") async def local_contact_simulation_state(token: str = Depends(oauth2_scheme)) -> dict: """ diff --git a/src/aare/gui/about.py b/src/aare/gui/about.py index 4db38cb4..6b5b8596 100644 --- a/src/aare/gui/about.py +++ b/src/aare/gui/about.py @@ -1,18 +1,27 @@ import importlib import sys +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from aare.gui.threads.daq_worker import DAQWorker -def about_text(): +def about_text(client: DAQWorker): from aare.gui import gui try: version = importlib.metadata.version("aaredaq") except Exception: version = "Not found - package is not installed into the environment." + + server_version, server_file_path = client.server_about_info() + return f"""Aare Macromolecular Crystallography GUI Copyright: Paul Scherrer Institute 2023-2026 --- Version: {version} GUI file: {gui.__file__} Interpreter: {sys.executable} +Server version: {server_version} +Server file: {server_file_path} """ diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 06cb4220..2dc40a1b 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -1606,7 +1606,7 @@ class MainWindow(QMainWindow): self.video_tab.setCurrentIndex(0) def show_about_dialog(self): - QMessageBox.about(self, "About", about_text()) + QMessageBox.about(self, "About", about_text(self.daq)) def show_controls_help(self) -> None: if self._controls_help_dialog is None: diff --git a/src/aare/gui/threads/daq_worker.py b/src/aare/gui/threads/daq_worker.py index 29831a8c..84d41d14 100644 --- a/src/aare/gui/threads/daq_worker.py +++ b/src/aare/gui/threads/daq_worker.py @@ -356,6 +356,17 @@ class DAQWorker(QObject): reply = self.__net_manager.get(request) reply.finished.connect(lambda: self.handle_status_response(reply)) + def server_about_info(self) -> tuple[str, str]: + version_request = QNetworkRequest(QUrl(f"{self.__base_url}/about/version")) + version_reply = self.__net_manager.get(version_request) + file_request = QNetworkRequest(QUrl(f"{self.__base_url}/about/server_file_path")) + file_reply = self.__net_manager.get(file_request) + version = ( + str(version_reply.readAll()) if version_reply.waitForReadyRead(500) else "Not connected" + ) + file = str(file_reply.readAll()) if file_reply.waitForReadyRead(500) else "Not connected" + return version, file + _SELF_SIGNED_ERRORS = { QSslError.SslError.SelfSignedCertificate, QSslError.SslError.SelfSignedCertificateInChain, -- 2.54.0 From 1f5af092ac99b89f5e34fe35c48f21251bf08aef Mon Sep 17 00:00:00 2001 From: David Perl Date: Thu, 9 Jul 2026 12:50:38 +0200 Subject: [PATCH 2/3] tidy about functions --- src/aare/daq/server.py | 9 ++++++++- src/aare/gui/about.py | 4 +++- src/aare/gui/threads/daq_worker.py | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/aare/daq/server.py b/src/aare/daq/server.py index da3b3ccf..3e4d39fe 100644 --- a/src/aare/daq/server.py +++ b/src/aare/daq/server.py @@ -48,6 +48,7 @@ from fastapi import status as api_status from fastapi.concurrency import run_in_threadpool from fastapi.security import OAuth2PasswordBearer from starlette.responses import StreamingResponse +from uvicorn.workers import UvicornWorker # deprecated shim, present in pinned 0.34.2 from aare.daq import auth from aare.daq.config import BeamlineConfig @@ -81,6 +82,12 @@ _automation_progress_state: dict = {"seq": 0, "progress": None} _automation_progress_state_lock = asyncio.Lock() +class AareUvicornWorker(UvicornWorker): + # CONFIG_KWARGS merged last into uvicorn Config (uvicorn/workers.py:69) → + # keeps our access-log filter + proxy_headers under gunicorn. + CONFIG_KWARGS = {"log_config": get_uvicorn_logging_config(), "proxy_headers": False} + + @asynccontextmanager async def lifespan(application: FastAPI): """ @@ -723,7 +730,7 @@ def initialise_detector(self): raise -@app.get("/about/running_version") +@app.get("/about/installed_version") async def running_version() -> str: return importlib.metadata.version("aare") diff --git a/src/aare/gui/about.py b/src/aare/gui/about.py index 6b5b8596..0119fa04 100644 --- a/src/aare/gui/about.py +++ b/src/aare/gui/about.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import importlib import sys from typing import TYPE_CHECKING @@ -6,7 +8,7 @@ if TYPE_CHECKING: from aare.gui.threads.daq_worker import DAQWorker -def about_text(client: DAQWorker): +def about_text(client: "DAQWorker"): from aare.gui import gui try: diff --git a/src/aare/gui/threads/daq_worker.py b/src/aare/gui/threads/daq_worker.py index 84d41d14..882b18eb 100644 --- a/src/aare/gui/threads/daq_worker.py +++ b/src/aare/gui/threads/daq_worker.py @@ -357,7 +357,7 @@ class DAQWorker(QObject): reply.finished.connect(lambda: self.handle_status_response(reply)) def server_about_info(self) -> tuple[str, str]: - version_request = QNetworkRequest(QUrl(f"{self.__base_url}/about/version")) + version_request = QNetworkRequest(QUrl(f"{self.__base_url}/about/running_version")) version_reply = self.__net_manager.get(version_request) file_request = QNetworkRequest(QUrl(f"{self.__base_url}/about/server_file_path")) file_reply = self.__net_manager.get(file_request) -- 2.54.0 From 9fb2004e05d75905a595b3fe3c92d3bec6eed9c8 Mon Sep 17 00:00:00 2001 From: David Perl Date: Thu, 9 Jul 2026 12:50:59 +0200 Subject: [PATCH 3/3] fix: detector url --- src/aare/gui/scan_logic/rotation_scan_manager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/aare/gui/scan_logic/rotation_scan_manager.py b/src/aare/gui/scan_logic/rotation_scan_manager.py index 2d9c41d7..ec17b8e1 100644 --- a/src/aare/gui/scan_logic/rotation_scan_manager.py +++ b/src/aare/gui/scan_logic/rotation_scan_manager.py @@ -10,10 +10,8 @@ class RotationScanManager(QObject): super().__init__(parent) self.__beamline = mx_beamline() self.__detector_url = get_jfjoch_url(self.__beamline) - self.__detector_url = None @Slot(CompletedRotationScan) def scan_completed(self, r: CompletedRotationScan): if r.result.file_prefix is not None: - # self.file_ready.emit(r.result.file_prefix, 0) self.file_ready.emit(self.__detector_url, 0) -- 2.54.0