326 lines
11 KiB
Python
326 lines
11 KiB
Python
import getpass
|
|
import inspect
|
|
import os
|
|
import time
|
|
|
|
from qtpy.QtCore import Qt
|
|
from qtpy.QtWidgets import (
|
|
QApplication, QComboBox, QDialog, QFileDialog, QHBoxLayout, QLabel,
|
|
QLineEdit, QPushButton, QTextEdit, QVBoxLayout)
|
|
|
|
import elog # https://github.com/paulscherrerinstitute/py_elog
|
|
|
|
from apps4ops.bdbase.enumkind import MsgSeverity
|
|
from apps4ops.bdbase.utils import _line
|
|
|
|
_version = "1.0.0"
|
|
_pymodule = os.path.basename(__file__)
|
|
_appname, _appext = _pymodule.split(".")
|
|
|
|
|
|
class QSendToELOGFrame(QDialog):
|
|
""" Graphical interface to elog
|
|
"""
|
|
def __init__(self, parent, logbook=None, title=None, message=None,
|
|
attachFile=None, destination_folder=None):
|
|
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:
|
|
logbook = self.parent.settings.data["Elog"]["book"]
|
|
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)
|
|
|
|
self.logbook = logbook
|
|
|
|
self.elog_items.setCurrentIndex(idx)
|
|
self.elog_items.currentIndexChanged.emit(idx)
|
|
self.elog_items.setObjectName("Elog")
|
|
|
|
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(authorbox)
|
|
self.layout.addLayout(self.title_items)
|
|
|
|
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)
|
|
|
|
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 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
|
|
|
|
author = self.author.text()
|
|
application = self.applicationlabel.text()
|
|
self.attributes['Autor'] = author
|
|
self.attributes['Author'] = author
|
|
self.attributes['Application'] = application
|
|
self.attributes['Titel'] = title
|
|
self.attributes['Title'] = title
|
|
self.attributes['When'] = str(time.time())
|
|
self.attributes['Wann'] = str(time.time())
|
|
|
|
QApplication.processEvents()
|
|
|
|
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]))
|
|
elif "/sf/data/" in _attachFile[i]:
|
|
self.files.append(str(_attachFile[i]))
|
|
else:
|
|
self.files.append(self.destination + str(_attachFile[i]))
|
|
QApplication.processEvents()
|
|
|
|
el = self.elog_items.currentText()
|
|
|
|
url = self.parent.settings.data["ElogBooks"][el]["url"]
|
|
|
|
self.logbook = elog.open(url, user='robot', password='robot')
|
|
QApplication.processEvents()
|
|
|
|
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)
|
|
|
|
|
|
def get_logbook_specific_items(self, logbook):
|
|
'''Retrieve logbook specific options'''
|
|
#First check what is the logbook being requested?
|
|
#find layout items
|
|
layout_items = []
|
|
layout_items_optional = []
|
|
print("logbook", logbook)
|
|
try:
|
|
layout_items = list(self.parent.settings.data[
|
|
"ElogBooks"][logbook]['Required'].keys())
|
|
except KeyError:
|
|
pass
|
|
|
|
print("logbook- items", layout_items)
|
|
|
|
try:
|
|
layout_items_optional = list(self.parent.settings.data[
|
|
"ElogBooks"][logbook]['Optional'].keys())
|
|
except KeyError:
|
|
pass
|
|
|
|
print("logbook- optional", layout_items_optional)
|
|
if layout_items_optional:
|
|
layout_items.extend(layout_items_optional)
|
|
|
|
return layout_items
|
|
|