Source code for bec_lib.logbook_connector
"""
This module provides a connector to the electronic logbook SciLog.
"""
from __future__ import annotations
import sys
import warnings
from typing import TYPE_CHECKING
from requests.exceptions import HTTPError
from bec_lib.endpoints import MessageEndpoints
from bec_lib.logger import bec_logger
logger = bec_logger.logger
try:
import scilog
except ImportError:
logger.info("Unable to import `scilog` optional dependency")
if TYPE_CHECKING:
from bec_lib.redis_connector import RedisConnector
[docs]
class LogbookConnector:
def __init__(self, connector: RedisConnector) -> None:
self.connector = connector
self.connected = False
self._scilog_module = None
self._connect()
self.logbook = None
def _connect(self):
if "scilog" not in sys.modules:
return
msg = self.connector.get(MessageEndpoints.logbook())
if not msg:
return
scilog_creds = msg.credentials
account_msg = self.connector.get(MessageEndpoints.account())
if not account_msg:
return
account = account_msg.value
account = account.replace("e", "p")
self._scilog_module = scilog
self.log = self._scilog_module.SciLog(
scilog_creds["url"], options={"token": scilog_creds["token"]}
)
# FIXME the python sdk should not use the ownergroup
with warnings.catch_warnings():
warnings.simplefilter("ignore")
try:
logbooks = self.log.get_logbooks(readACL={"inq": [account]})
except HTTPError:
self.connector.set(MessageEndpoints.logbook(), b"")
return
if len(logbooks) > 1:
logger.warning("Found two logbooks. Taking the first one.")
self.log.select_logbook(logbooks[0])
# set aliases
# pylint: disable=no-member, invalid-name
self.LogbookMessage = self._scilog_module.LogbookMessage
self.send_logbook_message = self.log.send_logbook_message
self.send_message = self.log.send_message
self.connected = True
# if __name__ == "__main__":
# import datetime
# logbook = LogbookConnector()
# msg = LogbookMessage(logbook)
# msg.add_text(
# f"<p><mark class='pen-red'><strong>Beamline checks failed at {str(datetime.datetime.now())}.</strong></mark></p>"
# ).add_tag("BEC")
# logbook.send_logbook_message(msg)