From fbc432f475a8f9b65f400049521834826d515dea Mon Sep 17 00:00:00 2001 From: chrin Date: Mon, 24 Oct 2022 08:08:33 +0200 Subject: [PATCH 1/2] sendelogsls.py uses bdbase.sendelogframe.py --- .gitignore | 4 + README.md | 2 + enumkind.py | 90 ++++++++---- sendelog.py | 365 +++++++++++++++++++++++++++++++++++++++++++++++++ sendelogsls.py | 203 +++++++++++++++++++++++++++ 5 files changed, 636 insertions(+), 28 deletions(-) create mode 100644 .gitignore create mode 100644 sendelog.py create mode 100644 sendelogsls.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d3d7e83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.*~ +*.*-* +*.*+* +__pycache__ diff --git a/README.md b/README.md index e69de29..d309e34 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,2 @@ +sendelogsls.py inherits from bdbase.sendelogframe +enumkind.py has ELogSLS enum options defined \ No newline at end of file diff --git a/enumkind.py b/enumkind.py index e7174fe..646e38f 100644 --- a/enumkind.py +++ b/enumkind.py @@ -3,38 +3,72 @@ 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) - 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 diff --git a/sendelog.py b/sendelog.py new file mode 100644 index 0000000..9fe68f9 --- /dev/null +++ b/sendelog.py @@ -0,0 +1,365 @@ +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 + +_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(QDialog): + """ Graphical interface to elog + """ + def __init__(self, parent, logbook=None, categoryIdx=0, domainIdx=0, + systemIdx=0, sectionIdx=0, title=None, message=None, + attachFile=None, destination_folder=None): + #super(QSendToELOG, self).__init__(parent) + super().__init__() + + self.files_text = '' + self.fflag = False + self.parent = parent + if destination_folder is None: + self.destination = self.parent.elog_dest + " / " + self.parent.appname + else: + self.destination = destination_folder + self.window_title = self.parent.appname + ": " + _appname + self.pymodule = _pymodule + + self.setWindowTitle(self.window_title) + + elog_books = list(self.parent.settings.data["ElogBooks"]) + self.elog_items = QComboBox() + self.elog_items.addItems(elog_books) + self.elog_items.currentIndexChanged.connect(self.on_elog_change) + idx = 0 + + if logbook is not None: + try: + idx = elog_books.index(logbook) + except Exception: + mess = "Index not found for logbook {0}".format(logbook) + self.parent.show_log_message(MsgSeverity.WARN, self.pymodule, + _line(), mess) + else: + try: + idx = elog_books.index(self.parent.settings.data["Elog"][ + "book"]) + except Exception: + logbook = self.parent.settings.data["Elog"]["book"] + mess = "Index not found for logbook {0}".format(logbook) + self.parent.show_log_message(MsgSeverity.WARN, self.pymodule, + _line(), mess) + + print("logbook", logbook) + + self.elog_items.setCurrentIndex(idx) + self.elog_items.currentIndexChanged.emit(idx) + self.elog_items.setObjectName("Elog") + + print(self.parent.settings.data["Elog"]) + category_str = list(self.parent.settings.data["Elog"]['Projekt']) + print("logbook2", logbook) + self.category = QHBoxLayout() + self.category.addWidget(QLabel('Projekt: ')) + self.category_items = QComboBox() + self.category_items.setObjectName("Elog") + self.category_items.addItems(category_str) + self.category.addWidget(self.category_items) + self.category_items.setCurrentIndex(categoryIdx) + + domain_str = list(self.parent.settings.data["Elog"]['Eintrag']) + self.domain = QHBoxLayout() + self.domain.addWidget(QLabel('Eintrag: ')) + self.domain_items = QComboBox() + self.domain_items.setObjectName("Elog") + self.domain_items.addItems(domain_str) + self.domain.addWidget(self.domain_items) + self.domain_items.setCurrentIndex(domainIdx) + self.domain_items.currentIndexChanged.connect(self.on_domain_change) + print("logbook2", logbook) + + #self.elog_section = list(self.parent.settings.data["Elog"]['Effekt']) + self.section = QHBoxLayout() + self.section.addWidget(QLabel('Effekt: ')) + #self.section_items = QComboBox() + #self.section_items.setObjectName("Elog") + #self.section_items.addItems(self.elog_section[domainIdx]) + #self.section.addWidget(self.section_items) + #self.section_items.setCurrentIndex(sectionIdx) + self.effekt = QLineEdit() + self.effekt.setObjectName('Elog') + self.effekt.setText(str("")) + self.effekt.setFixedWidth(300) + self.effekt.setAlignment(Qt.AlignCenter) + self.section.addWidget(self.effekt) + + + self.system = QHBoxLayout() + self.system.addWidget(QLabel('System: ')) + self.system_items = QComboBox() + self.system_items.setObjectName("Elog") + self.system_items.addItems( + list(self.parent.settings.data["Elog"]['System'])) + + self.system.addWidget(self.system_items) + self.system_items.setCurrentIndex(systemIdx) + print("logbook3", logbook) + self.title_items = QHBoxLayout() + self.title_items.addWidget(QLabel('Title: ')) + self.titleline = QLineEdit() + self.titleline.setObjectName('Elog') + self.titleline.setStatusTip('elog') + if title is None: + title = self.parent.appname + self.titleline.setText(str(title)) + self.titleline.setFixedWidth(300) + self.titleline.setAlignment(Qt.AlignCenter) + self.title_items.addWidget(self.titleline) + + self.applicationbox = QHBoxLayout() + self.applicationbox.addWidget(QLabel('Application:')) + self.applicationlabel = QLabel(self.parent.pymodule) + self.applicationlabel.setObjectName("Elog") + # self.applicationbox.addStretch() + self.applicationbox.addWidget(self.applicationlabel) + + logbook = QHBoxLayout() + logbook.addWidget(QLabel('Logbook: ')) + logbook.addWidget(self.elog_items) + + authorbox = QHBoxLayout() + authorbox.addWidget(QLabel('Author: ')) + self.author = QLineEdit() + self.author.setObjectName('Elog') + self.author.setFixedWidth(195) + self.author.setStatusTip('elog') + self.author.setText(getpass.getuser()) + authorbox.addWidget(self.author) + + self.files = [] + self.attributes = {} + + self.layout = QVBoxLayout(self) + self.layout.addLayout(logbook) + self.layout.addLayout(self.applicationbox) + self.layout.addLayout(self.category) + self.layout.addLayout(self.domain) + self.layout.addLayout(self.section) + self.layout.addLayout(self.system) + self.layout.addLayout(authorbox) + self.layout.addLayout(self.title_items) + print("here4", flush=True) + report = QLabel('Report: ') + self.layout.addWidget(report) + self.message = QTextEdit(message) + self.layout.addWidget(self.message) + + filebox = QHBoxLayout() + qlfile = QLabel('Attach:') + qlfile.setAlignment(Qt.AlignTop) + filebox.addWidget(qlfile) + + self.filesE = QTextEdit() + self.filesE.setAlignment(Qt.AlignTop) + self.filesE.setFixedHeight(80) + self.filesE.setReadOnly(True) + + self.attachFile = attachFile + + 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 + + filebox.addWidget(self.filesE) + + openCloseVBox = QVBoxLayout() + self.openBtn = QPushButton('Add') + self.openBtn.setAutoDefault(False) + self.openBtn.clicked.connect(self.openFiles) + openCloseVBox.addWidget(self.openBtn) + + closeBtn = QPushButton('Clear') + closeBtn.setAutoDefault(False) + closeBtn.clicked.connect(self.clearFiles) + openCloseVBox.addWidget(closeBtn) + + filebox.addLayout(openCloseVBox) + self.layout.addLayout(filebox) + + btnLayout = QHBoxLayout() + self.okBtn = QPushButton('Send') + self.okBtn.setAutoDefault(False) + self.okBtn.clicked.connect(self.ok) + + self.cancelBtn = QPushButton('Cancel') + self.cancelBtn.setAutoDefault(False) + self.cancelBtn.clicked.connect(self.close) + btnLayout.addWidget(self.okBtn) + btnLayout.addWidget(self.cancelBtn) + self.messagelbl = QLabel('') + self.messagelbl.setStyleSheet("QLabel { color : red; }") + self.layout.addWidget(self.messagelbl) + self.layout.addLayout(btnLayout) + print("logbook5", logbook) + self.setMinimumWidth(440) + self.exec() + + def on_elog_change(self, elog_change_val): + if "test" in self.elog_items.currentText(): + _bgcolor = "QComboBox {background: plum; color : black;}" + else: + _bgcolor = "QComboBox {background: lightblue; color : black;}" + self.elog_items.setStyleSheet(_bgcolor) + + def on_domain_change(self, i): + self.section_items.clear() + self.section_items.addItems(self.elog_section[i]) + + def ok(self): + message = self.message.document().toPlainText() + if not message: + self.messagelbl.setText('Please enter a brief Report') + return + title = self.titleline.text() + if not title: + self.messagelbl.setText('Titel attribute is required') + return + cat = self.category_items.currentText() + if not cat: + self.messagelbl.setText('Projekt attribute is required') + return + + el = self.elog_items.currentText() + + author = self.author.text() + application = self.applicationlabel.text() + self.attributes['Autor'] = author + self.attributes['Author'] = author + self.attributes['Application'] = application + # if title is not None: #!= '': + self.attributes['Titel'] = title + self.attributes['Title'] = title + self.attributes['Projekt'] = cat + if el == 'SLS': + self.attributes['Eintrag'] = self.domain_items.currentText() + self.attributes['Effekt'] = self.effekt.text() + self.attributes['System'] = self.system_items.currentText() + self.attributes['When'] = str(time.time()) + self.attributes['Wann'] = str(time.time()) + + + + 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 in range(0, len(_attachFile)): + if "/tmp" in _attachFile[i]: + self.files.append(str(_attachFile[i])) + elif "/afs/psi.ch" in _attachFile[i]: + self.files.append(str(_attachFile[i])) + elif "/sls/bd/data/" in _attachFile[i]: + self.files.append(str(_attachFile[i])) + else: + self.files.append(self.destination + str(_attachFile[i])) + + url = self.parent.settings.data["ElogBooks"][el]["url"] + + self.logbook = elog.open(url, user='robot', password='robot') + + print("sendelog.py: ", url, flush=True) + print(message, flush=True) + try: + if self.files: + self.logbook.post(message, attributes=self.attributes, + attachments=self.files) + else: + self.logbook.post(message, attributes=self.attributes) + + #self.trigger_elog_entry.emit(True, url, "OK") + self.receive_elog_notification(True, url, "OK") + except Exception as ex: + #self.trigger_elog_entry.emit(False, url, str(ex)) + print("Exception in sendelog.py", str(ex)) + self.receive_elog_notification(False, url, str(ex)) + + #for file in self.files: + # if os.path.exists(file): + # os.remove(file) + + 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) diff --git a/sendelogsls.py b/sendelogsls.py new file mode 100644 index 0000000..030c265 --- /dev/null +++ b/sendelogsls.py @@ -0,0 +1,203 @@ +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, effektIdx=0, 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) + + #First check what is the logbook being requested? + #find layout items + layout_items = [] + layout_items_optional = [] + try: + layout_items = list(self.parent.settings.data["ElogBooks"][self.logbook]['Required'].keys()) + except KeyError: + pass + try: + layout_items_optional = list(self.parent.settings.data["ElogBooks"][self.logbook]['Optional'].keys()) + except KeyError: + pass + + layout_items.extend(layout_items_optional) + + print("LAYOUIT ITEMS: ", layout_items) + + #print(self.parent.settings.data["Elog"]) + projekt_str = list(self.parent.settings.data["ElogBooks"]['SLS+Development']['Required']['Projekt']) + self.projekt = QHBoxLayout() + self.projekt.addWidget(QLabel('Projekt: ')) + self.projekt_items = QComboBox() + self.projekt_items.setObjectName("Elog") + self.projekt_items.addItems(projekt_str) + self.projekt.addWidget(self.projekt_items) + self.projekt_items.setCurrentIndex(projektIdx) + + #eintrag_str = list(self.parent.settings.data["Elog"]['Eintrag']) + eintrag_str = list(self.parent.settings.data['ElogBooks']['Sandkasten']['Required']['Eintrag']) + + self.eintrag = QHBoxLayout() + self.eintrag.addWidget(QLabel('Eintrag: ')) + self.eintrag_items = QComboBox() + self.eintrag_items.setObjectName("Elog") + self.eintrag_items.addItems(eintrag_str) + self.eintrag.addWidget(self.eintrag_items) + self.eintrag_items.setCurrentIndex(eintragIdx) + + self.system = QHBoxLayout() + self.system.addWidget(QLabel('System: ')) + self.system_items = QComboBox() + self.system_items.setObjectName("Elog") + self.system_items.addItems( + #list(self.parent.settings.data["Elog"]['System'])) + list(self.parent.settings.data['ElogBooks']['SLS']['Optional']['System'])) + self.system.addWidget(self.system_items) + self.system_items.setCurrentIndex(systemIdx) + + self.effekt_lo = QHBoxLayout() + self.effekt_lo.addWidget(QLabel('Effekt: ')) + self.effekt = QLineEdit() + self.effekt.setObjectName('Elog') + self.effekt.setText(str("")) + self.effekt.setFixedWidth(300) + self.effekt.setAlignment(Qt.AlignCenter) + self.effekt_lo.addWidget(self.effekt) + + + self.estatus = QHBoxLayout() + self.estatus.addWidget(QLabel('Status: ')) + self.estatus_items = QComboBox() + self.estatus_items.setObjectName("Elog") + self.estatus_items.addItems( + list(self.parent.settings.data['ElogBooks']['Sandkasten']['Optional']['Status'])) + self.estatus.addWidget(self.estatus_items) + self.estatus_items.setCurrentIndex(0) + + #Decide on original layout + + self.layout.insertLayout(2, self.projekt) + self.layout.insertLayout(3, self.eintrag) + self.layout.insertLayout(4, self.effekt_lo) + + self.exec() + + #have to remove widgets within layout too! + #https://riverbankcomputing.com/pipermail/pyqt/2009-November/025214.html + def on_elog_change(self, elog_change_val): + + sim_list = ["Sand"] + if any(substring.upper() in self.elog_items.currentText().upper() for substring in sim_list): + _bgcolor = "QComboBox {background: plum; color : black;}" + self.layout.removeItem(self.projekt) + while self.projekt.count(): + item = self.projekt.takeAt(0) + widget = item.widget() + widget.deleteLater() + + + else: + _bgcolor = "QComboBox {background: lightblue; color : black;}" + self.elog_items.setStyleSheet(_bgcolor) + + + 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 el == 'SLS': + self.attributes['Eintrag'] = self.eintrag_items.currentText() + self.attributes['Effekt'] = self.effekt.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) From 0bce9ecc89429f28811cb67615602e1fc81272a1 Mon Sep 17 00:00:00 2001 From: chrin Date: Fri, 6 Jan 2023 14:32:13 +0100 Subject: [PATCH 2/2] sendelogsls modified --- enumkind.py | 12 ++ sendelogsls.py | 299 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 229 insertions(+), 82 deletions(-) diff --git a/enumkind.py b/enumkind.py index 646e38f..64f10b5 100644 --- a/enumkind.py +++ b/enumkind.py @@ -6,6 +6,8 @@ class ElogSLS: 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 Eintrag(IntEnum): PROBLEM = 0 @@ -72,3 +74,13 @@ class ElogSLS: 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 diff --git a/sendelogsls.py b/sendelogsls.py index 030c265..8716373 100644 --- a/sendelogsls.py +++ b/sendelogsls.py @@ -32,7 +32,7 @@ class QSendToELOG(QSendToELOGFrame): """ Graphical interface to elog """ def __init__(self, parent, logbook=None, projektIdx=0, eintragIdx=0, - systemIdx=0, effektIdx=0, title=None, message=None, + systemIdx=0, statusIdx=0, autoIdx=2, title=None, message=None, attachFile=None, destination_folder=None): #super(QSendToELOGFrame, self).__init__( @@ -40,101 +40,219 @@ class QSendToELOG(QSendToELOGFrame): # attachFile=attachFile, # destination_folder=destination_folder) - super().__init__(parent, logbook=logbook, title=title) + super().__init__(parent, logbook=logbook, title=title, message=message) #First check what is the logbook being requested? #find layout items - layout_items = [] - layout_items_optional = [] - try: - layout_items = list(self.parent.settings.data["ElogBooks"][self.logbook]['Required'].keys()) - except KeyError: - pass - try: - layout_items_optional = list(self.parent.settings.data["ElogBooks"][self.logbook]['Optional'].keys()) - except KeyError: - pass + 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 - layout_items.extend(layout_items_optional) - print("LAYOUIT ITEMS: ", layout_items) + 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(self.parent.settings.data["Elog"]) - projekt_str = list(self.parent.settings.data["ElogBooks"]['SLS+Development']['Required']['Projekt']) - self.projekt = QHBoxLayout() - self.projekt.addWidget(QLabel('Projekt: ')) - self.projekt_items = QComboBox() - self.projekt_items.setObjectName("Elog") - self.projekt_items.addItems(projekt_str) - self.projekt.addWidget(self.projekt_items) - self.projekt_items.setCurrentIndex(projektIdx) + print("LAYOUT ITEMS: ", self.layout_items) - #eintrag_str = list(self.parent.settings.data["Elog"]['Eintrag']) - eintrag_str = list(self.parent.settings.data['ElogBooks']['Sandkasten']['Required']['Eintrag']) - - self.eintrag = QHBoxLayout() - self.eintrag.addWidget(QLabel('Eintrag: ')) - self.eintrag_items = QComboBox() - self.eintrag_items.setObjectName("Elog") - self.eintrag_items.addItems(eintrag_str) - self.eintrag.addWidget(self.eintrag_items) - self.eintrag_items.setCurrentIndex(eintragIdx) - - self.system = QHBoxLayout() - self.system.addWidget(QLabel('System: ')) - self.system_items = QComboBox() - self.system_items.setObjectName("Elog") - self.system_items.addItems( - #list(self.parent.settings.data["Elog"]['System'])) - list(self.parent.settings.data['ElogBooks']['SLS']['Optional']['System'])) - self.system.addWidget(self.system_items) - self.system_items.setCurrentIndex(systemIdx) - - self.effekt_lo = QHBoxLayout() - self.effekt_lo.addWidget(QLabel('Effekt: ')) - self.effekt = QLineEdit() - self.effekt.setObjectName('Elog') - self.effekt.setText(str("")) - self.effekt.setFixedWidth(300) - self.effekt.setAlignment(Qt.AlignCenter) - self.effekt_lo.addWidget(self.effekt) - - - self.estatus = QHBoxLayout() - self.estatus.addWidget(QLabel('Status: ')) - self.estatus_items = QComboBox() - self.estatus_items.setObjectName("Elog") - self.estatus_items.addItems( - list(self.parent.settings.data['ElogBooks']['Sandkasten']['Optional']['Status'])) - self.estatus.addWidget(self.estatus_items) - self.estatus_items.setCurrentIndex(0) - - #Decide on original layout - - self.layout.insertLayout(2, self.projekt) - self.layout.insertLayout(3, self.eintrag) - self.layout.insertLayout(4, self.effekt_lo) + 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, elog_change_val): + def on_elog_change(self, idx): - sim_list = ["Sand"] - if any(substring.upper() in self.elog_items.currentText().upper() for substring in sim_list): + #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;}" - self.layout.removeItem(self.projekt) - while self.projekt.count(): - item = self.projekt.takeAt(0) - widget = item.widget() - widget.deleteLater() - - else: _bgcolor = "QComboBox {background: lightblue; color : black;}" - self.elog_items.setStyleSheet(_bgcolor) + self.reset_layout() + self.initialize_layout(new_logbook) + + self.elog_items.setStyleSheet(_bgcolor) + self.logbook = new_logbook def ok(self): @@ -145,21 +263,37 @@ class QSendToELOG(QSendToELOGFrame): #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.text() + 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() @@ -188,7 +322,7 @@ class QSendToELOG(QSendToELOGFrame): def receive_elog_notification(self, is_accepted, logbook_url, elog_message): - '''Receive notification from ELOG, and report to log window''' + #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) @@ -201,3 +335,4 @@ class QSendToELOG(QSendToELOGFrame): self.parent.show_log_message(MsgSeverity.WARN, self.pymodule, _line(), mess) self.parent.statusbar.showMessage(mess) + '''