import os import sys import re import logging import traceback from xhtml2pdf import pisa from PyQt5 import QtWidgets from PyQt5 import QtPrintSupport import sas.qtgui.Utilities.GuiUtils as GuiUtils from sas.qtgui.Utilities.UI.ReportDialogUI import Ui_ReportDialogUI class ReportDialog(QtWidgets.QDialog, Ui_ReportDialogUI): """ Class for stateless grid-like printout of model parameters for mutiple models """ def __init__(self, parent=None, report_list=None): super(ReportDialog, self).__init__(parent._parent) self.setupUi(self) assert isinstance(report_list, list) assert len(report_list) == 3 self.data_html, self.data_txt, self.data_images = report_list # Fill in the table from input data self.setupDialog(self.data_html) # Command buttons self.cmdPrint.clicked.connect(self.onPrint) self.cmdSave.clicked.connect(self.onSave) def setupDialog(self, output=None): """ Display the HTML content in the browser. """ if output is not None: self.txtBrowser.setHtml(output) def onPrint(self): """ Display the print dialog and send the report to printer """ # Define the printer printer = QtPrintSupport.QPrinter() # Display the print dialog dialog = QtPrintSupport.QPrintDialog(printer) dialog.setModal(True) dialog.setWindowTitle("Print") if dialog.exec_() != QtWidgets.QDialog.Accepted: return document = self.txtBrowser.document() try: # pylint chokes on this line with syntax-error # pylint: disable=syntax-error doesn't seem to help document.print(printer) except Exception as ex: # Printing can return various exceptions, let's catch them all logging.error("Print report failed with: " + str(ex)) def onSave(self): """ Display the Save As... prompt and save the report if instructed so """ # Choose user's home directory location = os.path.expanduser('~') # Use a sensible filename default default_name = os.path.join(location, 'fit_report.pdf') kwargs = { 'parent' : self, 'caption' : 'Save Report', 'directory': default_name, 'filter' : 'PDF file (*.pdf);;HTML file (*.html);;Text file (*.txt)', 'options' : QtWidgets.QFileDialog.DontUseNativeDialog} # Query user for filename. filename_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs) filename = filename_tuple[0] if not filename: return extension = filename_tuple[1] try: # extract extension from filter # e.g. "PDF file (*.pdf)" -> ".pdf" ext = extension[extension.find("(")+2:extension.find(")")] except IndexError as ex: # (ext) not found... logging.error("Error while saving report. " + str(ex)) return basename, extension = os.path.splitext(filename) if not extension: filename = '.'.join((filename, ext)) # Create files with charts pictures = self.getPictures(basename) # self.data_html contains all images at the end of the report, in base64 form; # replace them all with their saved on-disk filenames cleanr = re.compile('

' replacement_name += '\n' #