GUI: logging addded to daq_worker.py, change frequency of occurence of Host requires authentication error

This commit is contained in:
2025-10-30 11:00:40 +01:00
parent ac0e65d7b8
commit 3e8a25f0a5
+44 -27
View File
@@ -1,5 +1,6 @@
import copy
import random
import time
from PySide6.QtCore import Signal, QUrl, Slot, QTimer, QObject, QByteArray
from PySide6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
@@ -11,6 +12,10 @@ from aaredaqlib.models import DAQStatusModel, SampleShortInfoList, SampleShortIn
from aaredaqlib.raster_grid import RasterGridRequest, CompletedRasterGrid
from aaredaqlib.rotation_scan import RotationScanRequest, CompletedRotationScan
from aaredaqlib.logger_config import setup_logger
logger = setup_logger(__name__)
SPREADHSEET_FREQUENCY = 25 # Every 5 seconds
@@ -38,6 +43,9 @@ class DAQWorker(QObject):
self.__timer.start()
self.__counter = 0
self._last_auth_error_log_ts = 0.0
self._auth_error_min_interval = 10.0
@Slot()
def regular_update(self):
if self.__counter % SPREADHSEET_FREQUENCY == 0:
@@ -72,7 +80,7 @@ class DAQWorker(QObject):
parsed_response = DAQStatusModel.model_validate_json(response_data)
self.update.emit(parsed_response)
except Exception as e:
print(e)
logger.error(f"Exception from status response: {e}")
self.http_error.emit(str(e))
@Slot(QNetworkReply)
@@ -82,7 +90,7 @@ class DAQWorker(QObject):
parsed_response = SampleShortInfoList.model_validate_json(response_data)
self.spreadsheet.emit(parsed_response)
except Exception as e:
print(e)
logger.error(f"Exception from spreadsheet response: {e}")
self.http_error.emit(str(e))
@Slot(QNetworkReply)
@@ -92,22 +100,27 @@ class DAQWorker(QObject):
parsed_response = SampleShortInfoList.model_validate_json(response_data)
self.reference_tools.emit(parsed_response)
except Exception as e:
print(e)
logger.error(f"Exception from reference tools response: {e}")
self.http_error.emit(str(e))
def handle_req_response(self, reply: QNetworkReply):
if reply.error() != QNetworkReply.NetworkError.NoError:
if reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) == 401:
print(reply.errorString())
status = reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute)
err_str = reply.errorString()
if status== 401:
now = time.monotonic()
if now - self._last_auth_error_log_ts > self._auth_error_min_interval:
logger.error(f"{err_str}: baton taken by another user")
self._last_auth_error_log_ts = now
self.auth_error.emit()
else:
print(reply.errorString())
self.http_error.emit(reply.errorString())
logger.error(f"{err_str}")
self.http_error.emit(err_str)
reply.deleteLater()
def generic_post(self, url: str, body: str = ""):
if self.__base_url is None:
print(f"POST /{url}: {body}")
logger.info(f"POST /{url}: {body}")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/{url}"))
@@ -119,7 +132,7 @@ class DAQWorker(QObject):
def generic_put(self, url: str, body: str = ""):
if self.__base_url is None:
print(f"PUT /{url}: {body}")
logger.info(f"PUT /{url}: {body}")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/{url}"))
request.setRawHeader(b"Authorization", f"Bearer {self.__token}".encode("utf-8"))
@@ -130,7 +143,7 @@ class DAQWorker(QObject):
def generic_delete(self, url: str):
if self.__base_url is None:
print(f"DELETE /{url}")
logger.info(f"DELETE /{url}")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/{url}"))
@@ -215,7 +228,7 @@ class DAQWorker(QObject):
parsed_response = CompletedRotationScan.model_validate_json(response_data)
self.standard_scan_completed.emit(parsed_response)
except Exception as e:
print(e)
logger.error(f"Exception from rotation scan response: {e}")
self.http_error.emit(str(e))
@Slot(RotationScanRequest)
@@ -235,18 +248,19 @@ class DAQWorker(QObject):
parsed_response = CompletedRasterGrid.model_validate_json(response_data)
self.raster_scan_completed.emit(parsed_response)
except Exception as e:
print(e)
logger.error(f"Exception from raster scan response: {e}")
self.http_error.emit(str(e))
@Slot(RasterGridRequest)
def raster_scan(self, r: RasterGridRequest):
self.run_number_incremented.emit()
if self.__base_url is None:
print(f"POST /scan/raster: {r.model_dump_json()}")
logger.info(f"POST /scan/raster: {r.model_dump_json()}")
image_number = r.get_image_number()
new_copy = copy.deepcopy(r)
images = []
for i in range(image_number):
images.append(ScanResultImagesInner(
number=i,
@@ -257,9 +271,10 @@ class DAQWorker(QObject):
mos = random.uniform(0, 0.1),
b= random.uniform(15.0, 80.0)
))
logger.debug("check that this works - raster scan - complete raster grid")
reply = CompletedRasterGrid(request = new_copy,
result = ScanResult(file_prefix=r.file_prefix, images=images))
logger.debug(f"It appears to work {reply}")
self.raster_scan_completed.emit(reply)
return
@@ -274,7 +289,7 @@ class DAQWorker(QObject):
def raster_scan_auto(self, r: RasterGridRequest):
self.run_number_incremented.emit()
if self.__base_url is None:
print(f"POST /scan/raster: {r.model_dump_json()}")
logger.info(f"POST /scan/raster: {r.model_dump_json()}")
image_number = r.get_image_number()
new_copy = copy.deepcopy(r)
@@ -289,9 +304,10 @@ class DAQWorker(QObject):
mos=random.uniform(0, 0.1),
b=random.uniform(15.0, 80.0)
))
logger.debug("check that this works - raster scan auto - complete raster grid")
reply = CompletedRasterGrid(request=new_copy,
result=ScanResult(file_prefix=r.file_prefix, images=images))
logger.debug(f"It appears to work {reply}")
self.raster_scan_completed.emit(reply)
return
@@ -306,7 +322,7 @@ class DAQWorker(QObject):
@Slot()
def load_spreadsheet(self):
if self.__base_url is None:
print(f"GET /sample/spreadsheet")
logger.info(f"GET /sample/spreadsheet")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/sample/spreadsheet"))
@@ -317,7 +333,7 @@ class DAQWorker(QObject):
@Slot()
def load_reference_tools(self):
if self.__base_url is None:
print(f"GET /sample/reference_tools")
logger.info(f"GET /sample/reference_tools")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/sample/reference_tools"))
request.setRawHeader(b"Authorization", f"Bearer {self.__token}".encode("utf-8"))
@@ -327,14 +343,14 @@ class DAQWorker(QObject):
def handle_auto_scan_response(self, reply, sample_id: int):
if reply.error() == QNetworkReply.NetworkError.NoError:
resp = reply.readAll().data().decode("utf-8")
print(f"Sample time {resp} s")
logger.info(f"Sample time {resp} s")
self.automated_scan_done.emit(sample_id, True)
else:
if reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) == 401:
print(reply.errorString())
logger.Error(f"Error in auto scan: {reply.errorString()}")
self.auth_error.emit()
else:
print(reply.errorString())
logger.Error(f"Error in auto scan: {reply.errorString()}")
self.http_error.emit(reply.errorString())
self.automated_scan_done.emit(sample_id, False)
reply.deleteLater()
@@ -342,7 +358,7 @@ class DAQWorker(QObject):
@Slot(SampleShortInfo)
def automated_scan(self, s: SampleShortInfo):
if self.__base_url is None:
print(f"POST /scan/auto: {s.model_dump_json()}")
logger.info(f"POST /scan/auto: {s.model_dump_json()}")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/scan/auto"))
@@ -355,7 +371,7 @@ class DAQWorker(QObject):
@Slot(SimpleScanParameters)
def smart_params(self, p: SimpleScanParameters):
if self.__base_url is None:
print(f"POST /scan/smart_params: {p.model_dump_json()}")
logger.info(f"POST /scan/smart_params: {p.model_dump_json()}")
return
self.generic_post("scan/smart_params", p.model_dump_json())
@@ -410,13 +426,13 @@ class DAQWorker(QObject):
parsed_response = RasterGridRequest.model_validate_json(response_data)
self.raster_generated_by_ml.emit(parsed_response)
except Exception as e:
print(e)
logger.Error(f"Error in ml box: {e}")
self.http_error.emit(str(e))
@Slot()
def ml_bounding_box(self):
if self.__base_url is None:
print(f"POST /alc/ml_bounding_box")
logger.info(f"POST /alc/ml_bounding_box")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/alc/ml_bounding_box"))
@@ -427,12 +443,14 @@ class DAQWorker(QObject):
def _handle_face_detection_response(self, reply: QNetworkReply):
try:
if reply.error() != QNetworkReply.NetworkError.NoError:
logger.Error(f"Error in face detection: {reply.errorString()}")
raise RuntimeError(reply.errorString())
payload = reply.readAll().data().decode("utf-8") or "{}"
import json
data = json.loads(payload)
self.face_detection_result.emit(data)
except Exception as e:
logger.Error(f"Error in face detection: {e}")
self.http_error.emit(str(e))
finally:
reply.deleteLater()
@@ -440,12 +458,11 @@ class DAQWorker(QObject):
@Slot()
def face_detection(self, steps:int, step_size:int):
if self.__base_url is None:
print(f"POST /face_detection/run?steps={steps}&step_size={step_size}")
logger.info(f"POST /face_detection/run?steps={steps}&step_size={step_size}")
return
request = QNetworkRequest(QUrl(f"{self.__base_url}/face_detection/run?steps={steps}&step_size={step_size}"))
request.setRawHeader(b"Authorization", f"Bearer {self.__token}".encode("utf-8"))
request.setRawHeader(b"Content-Type", b"application/json")
# fire-and-forget; handle reply asynchronously and emit result
reply = self.__net_manager.post(request, QByteArray(b""))
reply.finished.connect(lambda: self._handle_face_detection_response(reply))