This commit is contained in:
2023-02-21 15:13:20 +01:00
parent 869ef989dc
commit a21cf1355f
3 changed files with 417 additions and 28 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
*.*+*
*.*~
*.*-*
*.*+*
__pycache__

View File

@@ -3,38 +3,84 @@ from enum import IntEnum
class ElogSLS:
def __init__(self):
self.category = self.Category(0)
self.domain = self.Domain(0)
self.eintrag = self.Eintrag(0)
self.projekt = self.Projekt(0)
self.system = self.System(0)
self.auto = self.Auto(0)
self.status = self.Status(0)
class Category(IntEnum):
INFO = 0
MEASUREMENT = 1
class Eintrag(IntEnum):
PROBLEM = 0
INFO = 1
TUNING = 2
OPERATION_CHANGE = 3
BRIDGE = 4
PIKETT = 5
STATUS = 6
AK3 = 7
TIPS = 8
SHIFT_CHANGE = 9
SHIFT_REPORT = 10
class Domain(IntEnum):
NONE = 0
INJECTOR = 1
LINAC1 = 2
LINAC2 = 3
LINAC3 = 4
ARAMIS = 5
ARAMIS_BEAMLINES = 6
ATHOS = 7
ATHOS_BEAMLINES = 8
class Projekt(IntEnum):
BBA = 0
BOOSTER = 1
COUPLING = 2
EMITTANCE = 3
FILLING_PATTERNS = 4
IDS = 5
MBFM = 6
OPTICS = 7
LOW_BEAM_ENERGY = 8
LOW_ALPHA = 9
LIFETIME = 10
RGM = 11
PHOTON_MONITORS = 12
STABILITY = 13
BEAM_TRANSMISSIONS = 14
LOSS_FACTOR_MEAS = 15
BEAM_SIZE_MONITOR = 16
ID_ALIGNMENT = 17
BEAM_LOSS_MONITORS = 18
SINGLE_TURN_BPM = 19
INJECTION = 20
CHARGE_MONITORING = 21
ORBIT_CORRECTION = 22
BUNCH_LENGTH_MEASUREMENT = 23
LOSS_MEASUREMENT = 24
TRIBS = 25
ROBINSON_STABILITY = 26
INJECTION_TRANSIENT = 27
TBT_BPM_MEASUREMENT = 28
LINAC_OPTMIZER = 29
class System(IntEnum):
NONE = 0
BEAMDYNAMICS = 1
CONTROLS = 2
DIAGNOSTICS = 3
ELECTRICSUPPLY = 4
INSERTIONDEVICES = 5
LASER = 6
MAGNETPOWERSUPPLIES = 7
OPERATION = 8
RF = 9
SAFETY = 10
VACUUM = 11
WATERCOOLING = 11
OTHER = 12
UNKNOWN = 13
FEEDBACKS = 2
CONTROLS = 3
DIAGNOSTICS = 4
ELECTRIC_SUPPLY = 5
FRONTENDS = 6
INSERTION_DEVICES = 7
HF = 8
TIMING = 9
MAGNET_POWER_SUPPLIES = 10
OPERATION = 11
SU = 12
PSYS = 13
VACUUM = 14
WATER_COOLING = 15
OTHER = 16
UNKNOWN = 17
class Auto(IntEnum):
NONE = 0
YES = 1
NO = 2
class Status(IntEnum):
NONE = 0
OFFEN = 1
GESCHLOSSEN = 2

338
sendelogsls.py Normal file
View File

@@ -0,0 +1,338 @@
import getpass
import inspect
import os
import time
from qtpy.QtCore import Qt
from qtpy.QtWidgets import (QComboBox, QDialog, QFileDialog, QHBoxLayout,
QLabel, QLineEdit, QPushButton, QTextEdit,
QVBoxLayout)
import elog # https://github.com/paulscherrerinstitute/py_elog
from pyqtacc.bdbase.enumkind import MsgSeverity
from pyqtacc.bdbase.sendelogframe import QSendToELOGFrame
_version = "1.0.0"
_pymodule = os.path.basename(__file__)
_appname, _appext = _pymodule.split(".")
def _line():
"""Macro to return the current line number.
The current line number within the file is used when
reporting messages to the message logging window.
Returns:
int: Current line number.
"""
return inspect.currentframe().f_back.f_lineno
class QSendToELOG(QSendToELOGFrame):
""" Graphical interface to elog
"""
def __init__(self, parent, logbook=None, projektIdx=0, eintragIdx=0,
systemIdx=0, statusIdx=0, autoIdx=2, title=None, message=None,
attachFile=None, destination_folder=None):
#super(QSendToELOGFrame, self).__init__(
# parent, logbook=logbook, title=title, message=message,
# attachFile=attachFile,
# destination_folder=destination_folder)
super().__init__(parent, logbook=logbook, title=title, message=message)
#First check what is the logbook being requested?
#find layout items
self.layout_items = self.get_logbook_specific_items(self.logbook)
self.layout_to_widget_dict = {}
self.projekt_idx = projektIdx
self.eintrag_idx = eintragIdx
self.system_idx = systemIdx
self.status_idx = statusIdx
self.auto_idx = autoIdx
print("indices", self.projekt_idx, self.eintrag_idx, self.system_idx, self.auto_idx)
self.projekt = None
self.eintrag = None
self.system = None
self.effekt = None
self.estatus = None
self.auto = None
print("LAYOUT ITEMS: ", self.layout_items)
self.sim_list = ["Sand", "test"]
self.initialize_layout(self.logbook)
self.exec()
def reset_layout(self):
def remove_wgt(wgt):
self.layout.removeItem(wgt)
while wgt.count():
item = wgt.takeAt(0)
widget = item.widget()
widget.deleteLater()
for layout in self.get_logbook_specific_items(self.logbook):
remove_wgt(self.layout_to_widget_dict[layout])
def create_layout_widgets(self):
if not self.projekt:
self.projekt = QHBoxLayout()
self.projekt.addWidget(QLabel('Projekt: '))
self.projekt_items = QComboBox()
self.projekt_items.setObjectName("Elog")
self.projekt.addWidget(self.projekt_items)
self.layout_to_widget_dict['Projekt'] = self.projekt
if not self.eintrag:
self.eintrag = QHBoxLayout()
self.eintrag.addWidget(QLabel('Eintrag: '))
self.eintrag_items = QComboBox()
self.eintrag_items.setObjectName("Elog")
self.eintrag.addWidget(self.eintrag_items)
self.layout_to_widget_dict['Eintrag'] = self.eintrag
if not self.system:
self.system = QHBoxLayout()
self.system.addWidget(QLabel('System: '))
self.system_items = QComboBox()
self.system_items.setObjectName("Elog")
self.system.addWidget(self.system_items)
self.layout_to_widget_dict['System'] = self.system
if not self.effekt:
self.effekt = QHBoxLayout()
self.effekt.addWidget(QLabel('Effekt: '))
self.effekt_le = QLineEdit()
self.effekt_le.setObjectName('Elog')
self.effekt_le.setText(str(""))
self.effekt_le.setFixedWidth(300)
self.effekt_le.setAlignment(Qt.AlignCenter)
self.effekt.addWidget(self.effekt_le)
self.layout_to_widget_dict['Effekt'] = self.effekt
if not self.estatus:
self.estatus = QHBoxLayout()
self.estatus.addWidget(QLabel('Status: '))
self.estatus_items = QComboBox()
self.estatus_items.setObjectName("Elog")
self.estatus.addWidget(self.estatus_items)
self.layout_to_widget_dict['Status'] = self.estatus
if not self.auto:
self.auto = QHBoxLayout()
self.auto.addWidget(QLabel('auto: '))
self.auto_items = QComboBox()
self.auto_items.setObjectName("Elog")
self.auto.addWidget(self.auto_items)
self.layout_to_widget_dict['auto'] = self.auto
def initialize_layout(self, logbook):
#Decide on layout
self.create_layout_widgets()
item_no = 2
if 'Projekt' in self.layout_items:
self.projekt_items.clear()
self.projekt_items.addItems(list(self.parent.settings.data[
"ElogBooks"][logbook]['Required']['Projekt']))
self.projekt_items.setCurrentIndex(self.projekt_idx)
self.layout.insertLayout(item_no, self.projekt)
if 'Eintrag' in self.layout_items:
self.eintrag_items.clear()
self.eintrag_items.addItems(list(self.parent.settings.data[
'ElogBooks'][logbook]['Required']['Eintrag']))
self.eintrag_items.setCurrentIndex(self.eintrag_idx)
self.layout.insertLayout(item_no, self.eintrag)
if 'Effekt' in self.layout_items:
item_no += 1
self.layout.insertLayout(item_no, self.effekt)
if 'System' in self.layout_items:
item_no += 1
self.system_items.clear()
self.system_items.addItems(list(self.parent.settings.data[
'ElogBooks'][logbook]['Optional']['System']))
self.system_items.setCurrentIndex(self.system_idx)
self.layout.insertLayout(item_no, self.system)
if 'Status' in self.layout_items:
item_no += 1
self.estatus_items.clear()
self.estatus_items.addItems(list(self.parent.settings.data[
'ElogBooks'][logbook]['Optional']['Status']))
self.estatus_items.setCurrentIndex(self.status_idx)
self.layout.insertLayout(item_no, self.estatus)
if 'auto' in self.layout_items:
item_no += 1
self.auto_items.clear()
self.auto_items.addItems(list(self.parent.settings.data[
'ElogBooks'][logbook]['Optional']['auto']))
self.auto_items.setCurrentIndex(self.auto_idx)
self.layout.insertLayout(item_no, self.auto)
print("self.attachFile==>", self.parent.attach_files)
self.attachFile = self.parent.attach_files
self.filesE.clear()
self.files_text = ''
if self.attachFile is not None:
_attachFile = []
if isinstance(self.attachFile, str):
_attachFile.append(self.attachFile)
elif isinstance(self.attachFile, list):
_attachFile = self.attachFile
for i, file in enumerate(_attachFile):
_attach_base = os.path.basename(file)
if i > 0:
self.files_text += "\n"
self.files_text += str(_attach_base)
self.filesE.setText(self.files_text)
self.fflag = True
if any(substring.upper() in logbook.upper() \
for substring in self.sim_list):
_bgcolor = "QComboBox {background: plum; color : black;}"
else:
_bgcolor = "QComboBox {background: lightblue; color : black;}"
self.elog_items.setStyleSheet(_bgcolor)
#have to remove widgets within layout too!
#https://riverbankcomputing.com/pipermail/pyqt/2009-November/025214.html
def on_elog_change(self, idx):
#print(self.elog_items.currentText(), "new=", idx)
#print(self.elog_items.itemText(idx))
#print(self.logbook)
new_logbook = self.elog_items.itemText(idx)
#Meet the new logbook. Same as the old logbook
if new_logbook == self.logbook:
return
self.layout_items = self.get_logbook_specific_items(new_logbook)
print("self.layout_items", self.layout_items)
'''
#Acquire New Layout List
new_items = self.get_logbook_specific_items(new_logbook)
#Acquire Current Layout List
old_items = self.get_logbook_specific_items(self.logbook)
#Compare lists and remove Layouts that do not belong
common_items = list(set(new_items) & set(old_items))
print("common items", common_items)
#remove common_items from old_items
#unwanted_items = [ele for ele in old_items if ele not in common_items]
#print("unwamted items", unwanted_items)
unwanted_items = [ele for ele in old_items if ele not in new_items]
print("unwamted items", unwanted_items)
#Add Layouts that are new
wanted_items = [ele for ele in new_items if ele not in old_items]
print("wanted items", wanted_items)
'''
if any(substring.upper() in new_logbook.upper() \
for substring in self.sim_list):
_bgcolor = "QComboBox {background: plum; color : black;}"
else:
_bgcolor = "QComboBox {background: lightblue; color : black;}"
self.reset_layout()
self.initialize_layout(new_logbook)
self.elog_items.setStyleSheet(_bgcolor)
self.logbook = new_logbook
def ok(self):
#proj = self.projekt_items.currentText()
#if not proj:
# self.messagelbl.setText('Projekt attribute is required')
# return
#self.attributes['Projekt'] = proj
el = self.elog_items.currentText()
if 'Projekt' in self.layout_items:
self.attributes['Projekt'] = self.projekt_items.currentText()
if 'Eintrag' in self.layout_items:
self.attributes['Eintrag'] = self.eintrag_items.currentText()
if 'Effekt' in self.layout_items:
self.attributes['Effekt'] = self.effekt_le.text()
if 'System' in self.layout_items:
self.attributes['System'] = self.system_items.currentText()
if 'Status' in self.layout_items:
self.attributes['Status'] = self.estatus_items.currentText()
if 'auto' in self.layout_items:
self.attributes['auto'] = self.auto_items.currentText()
'''
if el == 'SLS':
self.attributes['Eintrag'] = self.eintrag_items.currentText()
self.attributes['Effekt'] = self.effekt_le.text()
self.attributes['System'] = self.system_items.currentText()
elif el == 'Sandkasten':
self.attributes['Eintrag'] = self.eintrag_items.currentText()
self.attributes['Status'] = "Geschlossen"
self.attributes['When'] = str(time.time())
self.attributes['Wann'] = str(time.time())
'''
QSendToELOGFrame.ok(self)
#self.close()
'''
def clearFiles(self):
self.attachFile = []
self.filesE.clear()
self.files = []
self.files_text = ''
self.fflag = False
def openFiles(self):
# Notethat openFiles also gets called when qDialog cacnel is clicked!
qFileDialog = QFileDialog()
extensions = ("Images (*.bmp *.eps *.gif *.jpeg *.jpg *.pdf *.png " +
"*.ps *.tiff *.xpm);;Text files (*.txt *.text);;" +
"JSON/XML files (*.json *.xml)")
flocal = qFileDialog.getOpenFileNames(
self, 'Open File', self.destination, extensions)[0]
if not flocal:
return
self.files.append(flocal[0])
if self.fflag:
self.files_text += '\n'
self.files_text += str(flocal[0].split('/')[-1])
self.fflag = True
self.filesE.setText(self.files_text)
def receive_elog_notification(self, is_accepted, logbook_url, elog_message):
#Receive notification from ELOG, and report to log window
yes_no = "made" if is_accepted else "failed"
mess = "Entry into ELOG: {0} {1}".format(logbook_url, yes_no)
if is_accepted:
self.parent.show_log_message(MsgSeverity.INFO, self.pymodule,
_line(), mess)
else:
mess += ".\n" + elog_message
self.parent.show_log_message(MsgSeverity.WARN, self.pymodule,
_line(), mess)
self.parent.statusbar.showMessage(mess)
'''