Source code for brainvisa.data.qt4gui.history

# -*- coding: utf-8 -*-
#  This software and supporting documentation are distributed by
#      Institut Federatif de Recherche 49
#      CEA/NeuroSpin, Batiment 145,
#      91191 Gif-sur-Yvette cedex
#      France
#
# This software is governed by the CeCILL license version 2 under
# French law and abiding by the rules of distribution of free software.
# You can  use, modify and/or redistribute the software under the
# terms of the CeCILL license version 2 as circulated by CEA, CNRS
# and INRIA at the following URL "http://www.cecill.info".
#
# As a counterpart to the access to the source code and  rights to copy,
# modify and redistribute granted by the license, users are provided only
# with a limited warranty  and the software's author,  the holder of the
# economic rights,  and the successive licensors  have only  limited
# liability.
#
# In this respect, the user's attention is drawn to the risks associated
# with loading,  using,  modifying and/or developing or reproducing the
# software by the user in light of its specific status of free software,
# that may mean  that it is complicated to manipulate,  and  that  also
# therefore means  that it is reserved for developers  and  experienced
# professionals having in-depth computer knowledge. Users are therefore
# encouraged to load and test the software's suitability as regards their
# requirements in conditions enabling the security of their systems and/or
# data to be ensured and,  more generally, to use and operate it in the
# same conditions as regards security.
#
# The fact that you are presently reading this means that you have had
# knowledge of the CeCILL license version 2 and that you accept its terms.

from __future__ import absolute_import
import os
from soma.qt_gui.qt_backend import uic, QtCore, QtGui
from soma.qt_gui.qt_backend.QtCore import Qt
from soma.minf.api import readMinf
from brainvisa.processes import getProcessInstanceFromProcessEvent, defaultContext
from brainvisa.processing.qt4gui.neuroProcessesGUI import ProcessView
from brainvisa.processing.qt4gui.neuroLogGUI import LogItemsViewer


[docs]class DataHistoryWindow(QtGui.QMainWindow): """ :Attributes: .. py:attribute:: data The :py:class:`DiskItem` whose history is displayed in this window. .. py:attribute:: ui The :py:class:`QtGui.QMainWindow` loaded from a qt designer file that is the base of this window. .. py:attribute:: bvproc_uuid The uuid of the bvproc history file that is displayed in this window. .. py:attribute:: process_menu The "Process" :py:class:`QtGui.QMenu` of the window in the menubar. It contains an action to open the process of the history in normal mode (not read only). .. py:attribute:: process_view The widget of the process described in the history bvproc file. """ data = None ui = None bvproc_uuid = None process_menu = None process_view = None def __init__(self, data, bvproc_uuid, parent=None): super(DataHistoryWindow, self).__init__(parent) UiDataHistory = uic.loadUiType(os.path.join(os.path.dirname(__file__), 'dataHistory.ui'))[0] self.ui = UiDataHistory() self.ui.setupUi(self) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.data = data self.bvproc_uuid = bvproc_uuid self.process_view = None # menu bar self.process_menu = self.ui.menubar.addMenu("&Process") view_menu = self.ui.menubar.addMenu("&View") view_menu.addAction(self.ui.log_dock.toggleViewAction()) self.ui.info.setText("History of " + self.data.relativePath()) self.ui.info.setToolTip(self.data.fullPath()) self.ui.text_widget.setReadOnly(True) self.tabifyDockWidget(self.ui.text_dock, self.ui.log_dock) # self.setAttribute(Q) # QTextEdit.setReadOnly(True). While QTextEdit is a fairly # large class -- it really is a rich text editor -- setting # text is still easy: use QTextEdit.setText(text if self.bvproc_uuid is not None: # print "! history qt4gui : " , type(self.data) if self.data.type: res = self.data.type.name else: res = None # print "! history qt4gui print type " , res # print "! history qt4gui print type " , type(res) # bvproc_file = os.path.join(self.data.get("_database", ""), # self.data.getFileNameFromUuid(self.bvproc_uuid)) # if self.data.type.name is not "Process execution event" : if str(res) != "Process execution event": bvproc_file = self.data.getFileNameFromUuid( str(self.bvproc_uuid)) if bvproc_file is None: # try the old way, for a non-updated database bvproc_file = os.path.join(self.data.get("_database", ""), "history_book", self.bvproc_uuid + ".bvproc") if os.path.exists(bvproc_file): defaultContext().warning( _t_('History file is not indexed in the database - databases should probably be updated.')) else: raise RuntimeError( 'The requested history file cannot be found.') else: bvproc_file = os.path.join(self.data.get("_database", ""), bvproc_file) else: bvproc_file = self.data.fullPath() if os.path.exists(bvproc_file): minf = readMinf(bvproc_file) # print "minf ", minf if minf: process_event = minf[0] # print "! history qt4gui process_event : " , process_event process = getProcessInstanceFromProcessEvent(process_event) if process is not None: self.show_process(process) bvsession = process_event.content.get("bvsession", None) # print 'session:', bvsession log = process_event.content.get("log", None) if log: self.show_log(log, bvsession) self.ui.text_widget.setText(str(minf[0]))
[docs] def closeEvent(self, event): """Called when the window is closed. Cleans up the process view before closing.""" if self.process_view: self.process_view.cleanup() QtGui.QMainWindow.closeEvent(self, event)
[docs] def show_process(self, process): """ Shows the signature of the process in read only mode. :param process: Instance of :py:class:`Process`. """ if process: QtGui.QApplication.setOverrideCursor(QtGui.QCursor(Qt.WaitCursor)) try: self.process_view = ProcessView( process, parent=self, read_only=True) finally: QtGui.QApplication.restoreOverrideCursor() self.process_view.inlineGUI.hide() self.process_view.info.hide() self.ui.process_widget.layout().addWidget(self.process_view) self.process_view.action_clone_process.setText("Edit") self.process_menu.addAction(self.process_view.action_clone_process)
[docs] def show_log(self, log, bvsession): """ Shows the given process and brainvisa session logs in a log window. :param log: list of :py:class:`Log.Item` that represent the log of the process in the history file. :param string bvsession: uuid of the brainvisa session mentionned in the history file. Enables to retrieve the brainvisa session history file and display it in the log window. """ session_item = None bvsession_file = self.data.getFileNameFromUuid(str(bvsession)) if bvsession_file is None: # try the old way, for a non-updated database bvsession_file = os.path.join(self.data.get("_database", ""), "history_book", str(bvsession) + ".bvsession") else: bvsession_file = os.path.join(self.data.get("_database", ""), bvsession_file) if os.path.exists(bvsession_file): minf = readMinf(bvsession_file) if minf: session_item = minf[0].content.get("log", None) logitems = [] if session_item: logitems.extend(session_item) if log: logitems.extend(log) logitems_viewer = LogItemsViewer(logitems, self) self.ui.log_widget.layout().addWidget(logitems_viewer)