""" CCP4ErrorReportViewer.py: CCP4 GUI Project Copyright (C) 2011 University of York This library is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3, modified in accordance with the provisions of the license to address the requirements of UK law. You should have received a copy of the modified GNU Lesser General Public License along with this library. If not, copies may be downloaded from http://www.ccp4.ac.uk/ccp4license.php This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. """ """ Liz Potterton Jan 2011 - List program error log """ ##@package CCP4ProjectWidget View a project import os import time import tempfile from PyQt4 import QtGui,QtCore from qtgui import CCP4AbstractViewer from qtgui import CCP4TextViewer #from CCP4ErrorHandling import * from core.CCP4ProgramLog import * class CErrorReportSelection(QtGui.QFrame): def __init__(self,parent): QtGui.QFrame.__init__(self,parent) self.setLayout(QtGui.QHBoxLayout()) self.layout().addWidget(QtGui.QLabel('Select reports from class:')) self.classCombo = QtGui.QComboBox(self) self.layout().addWidget(self.classCombo) self.layout().addWidget(QtGui.QLabel('after')) self.startTime = QtGui.QDateTimeEdit(self) self.layout().addWidget(self.startTime) self.layout().addWidget(QtGui.QLabel('and before')) self.endTime = QtGui.QDateTimeEdit(self) self.layout().addWidget(self.endTime) def loadClassCombo(self,model=None): if model is None: return self.classCombo.clear() for item in model.classesInReport(): self.classCombo.addItem(item) def initialiseTime(self,model=None): if model is None: return timeRange = model.getTimeRange() #print 'CErrorReportSelection.initialiseTime',timeRange start = QtCore.QDateTime() start.setTime_t(int(timeRange[0])) start.addMSecs(int((timeRange[0]-int(timeRange[0]))*1000)) self.startTime.setDateTime(start) self.startTime.setMinimumDateTime(start) local = time.localtime() midnight = QtCore.QDateTime(QtCore.QDate(local.tm_year, local.tm_mon,local.tm_mday), QtCore.QTime(23, 59, 0)) self.endTime.setDateTime(midnight) self.endTime.setMinimumDateTime(start) class CErrorReportViewer(CCP4TextViewer.CTextViewer): TIME_FORMAT = '%H:%M:%S' def __init__(self,parent): CCP4TextViewer.CTextViewer.__init__(self, parent) self.setFont(style='fixed_width') self._model = None self.lastErrorIndex = -1 def setModel(self,model=None): #print 'CErrorReportViewer.setModel',model,type(model) self._model = model #self.connect(self._model,QtCore.SIGNAL('dataChanged'),self.update) def open(self,filename=None): self.loadText() self.fileName = None self.lastModTime= None def clear(self): self.viewer.clear() def loadText(self,start=0): text = '' indx = -1 for indx in range(start, len(self._model)): report = self._model[indx] #print 'CErrorReportViewer.loadText',report if report.has_key('time'): timeText = time.strftime(CErrorReportViewer.TIME_FORMAT,time.localtime(report['time'])) else: timeText = '' if hasattr(report['class'],'ERROR_CODES'): description = report['class'].ERROR_CODES[report['code']].get('description',' ') severity = report['class'].ERROR_CODES[report['code']].get('severity',SEVERITY_ERROR) if severity == SEVERITY_OK: severityColour = '00FF00' elif severity == SEVERITY_ERROR: severityColour = 'FF0000' else: severityColour = 'FFC000' line = '''{0!s:12} {1:20} {2:3} {3:60} {4:}'''.format(timeText,report['class'].__name__, report['code'], description, report['details'], severityColour) text = text + line + '
' self.viewer.append(text) self.lastErrorIndex = indx def update(self): self.loadText(start=self.lastErrorIndex + 1) class CSendJobError(QtGui.QDialog): def __init__(self, parent=None, projectId=None, projectName=None): from qtgui import CCP4Widgets QtGui.QDialog.__init__(self, parent=parent) self.projectId = projectId self.projectName = projectName self.setWindowTitle('Send bug report to CCP4') self.setModal(True) self.setLayout(QtGui.QVBoxLayout()) line = QtGui.QHBoxLayout() line.addWidget(QtGui.QLabel('Send', self)) self.sendLog = QtGui.QCheckBox('log files', self) self.sendLog.setChecked(True) line.addWidget(self.sendLog) self.sendData = QtGui.QCheckBox('data files', self) self.sendData.setChecked(False) line.addWidget(self.sendData) self.sendee = QtGui.QComboBox(self) for addr in ['ccp4@ccp4.ac.uk']: self.sendee.addItem(addr) self.sendee.setEditable(True) line.addWidget(QtGui.QLabel('to',self)) line.addWidget(self.sendee) self.layout().addLayout(line) self.layout().addWidget(QtGui.QLabel('for the job(s)..',self)) self.jobListWidget = CCP4Widgets.CFinishedJobsListWidget(self,projectId) self.jobListWidget.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) self.jobListWidget.load() self.layout().addWidget(self.jobListWidget) self.layout().addWidget(QtGui.QLabel('Add comments..')) self.comments = QtGui.QTextEdit(self) self.layout().addWidget(self.comments) buttonBox = QtGui.QDialogButtonBox(self) button = buttonBox.addButton('Send',QtGui.QDialogButtonBox.ApplyRole) self.connect(button,QtCore.SIGNAL('released()'),self.applySend) button = buttonBox.addButton(QtGui.QDialogButtonBox.Cancel) self.connect(button,QtCore.SIGNAL('released()'),self.close) line = QtGui.QHBoxLayout() line.addWidget(buttonBox) self.layout().addLayout(line) def applySend(self): from core import CCP4Utils from dbapi import CCP4DbUtils from core import CCP4Modules print 'applySend' comments = self.comments.toPlainText().__str__() sendee = self.sendee.currentText().__str__() sendLog = self.sendLog.isChecked() sendData = self.sendData.isChecked() jobList = self.jobListWidget.selectedJobs() # Put everything to send in a temp directory dirName = self.projectName + '_' + str(int((time.time()))) tmpDir = tempfile.mkdtemp() tarDir = os.path.join(tmpDir,dirName) print 'Saving job(s) to ',tarDir if sendLog or sendData: copyJobDir = CCP4DbUtils.CCopyJobDirectories(projectId=self.projectId, jobIdList=jobList, targetDir=tarDir, copyData=sendData) copyJobDir.copy() projectTmpDir = os.path.join(CCP4Modules.PROJECTSMANAGER().getProjectDirectory(projectId=self.projectId), 'CCP4_TMP') if not os.path.exists(projectTmpDir): os.mkdir(projectTmpDir) tarFile = os.path.join(projectTmpDir, dirName + '.tar.gz') rv = CCP4Utils.writeTarGzip(tarDir, tarFile=tarFile) message = 'mailto:' + sendee + '?subject=CCP4i2 Job Error Report&body= \n' + comments + '\n' if tarFile is not None: message = message + '\n\nPLEASE ATTACH FILE CONTAINING JOB DIAGNOSTIC: ' + str(tarFile) + \ '\nThe compressed file does not contain any data files but will contain the names of data files.' rv = QtGui.QDesktopServices.openUrl(QtCore.QUrl(message)) self.close() class CPrintLogViewer(CCP4TextViewer.CTextViewer): def __init__(self, parent): CCP4TextViewer.CTextViewer.__init__(self, parent) self.setFont(style='fixed_width') def openThread(self, thread = 'main_thread'): from core import CCP4Modules from core import CCP4Utils versionText = CCP4Utils.versionLogHeader() ph = CCP4Modules.PRINTHANDLER() text = ph.getContent(thread) self.viewer.append(versionText + text)