Exemplo n.º 1
0
 def __init__(self, message, parent=None):
     super(PlainTextDialog, self).__init__(parent)
     self.setWindowTitle(_("Plain Text Browser"))
     self.setMinimumWidth(800)
     layout = QtGui.QVBoxLayout(self)
     text_browser = LogWidget(self)
     text_browser.clear_button.setText(_("Close"))
     text_browser.clear_button.clicked.disconnect(text_browser.clear)
     text_browser.clear_button.clicked.connect(self.accept)
     text_browser.log(message)
     layout.addWidget(text_browser)
Exemplo n.º 2
0
 def __init__(self, message, parent=None):
     super(PlainTextDialog, self).__init__(parent)
     self.setWindowTitle(_("Plain Text Browser"))
     self.setMinimumWidth(800)
     layout = QtGui.QVBoxLayout(self)
     text_browser = LogWidget(self)
     text_browser.clear_button.setText(_("Close"))
     text_browser.clear_button.clicked.disconnect(text_browser.clear)
     text_browser.clear_button.clicked.connect(self.accept)
     text_browser.log(message)
     layout.addWidget(text_browser)
Exemplo n.º 3
0
    def __init__(self, parent=None):
        PostgresMainWindow.__init__(self, parent)
        self.setMinimumSize(600, 400)

        self.setWindowTitle("Openmolar Admin")
        self.setWindowIcon(QtGui.QIcon(":icons/openmolar-server.png"))

        ## Main Menu

        ## "file"

        icon = QtGui.QIcon.fromTheme("network-wired")
        self.action_omconnect = QtGui.QAction(icon,
            "OM %s"% _("Connect"), self)
        self.action_omconnect.setToolTip(
                                _("Connect (to an openmolar server)"))
        icon = QtGui.QIcon.fromTheme("network-error")
        self.action_omdisconnect = QtGui.QAction(icon,
            "OM %s"% _("Disconnect"), self)
        self.action_omdisconnect.setToolTip(
            _("Disconnect (from an openmolar server)"))

        insertpoint = self.action_connect
        self.menu_file.insertAction(insertpoint, self.action_omconnect)
        self.menu_file.insertAction(insertpoint,self.action_omdisconnect)
        self.menu_file.insertSeparator(insertpoint)

        insertpoint = self.action_connect
        self.main_toolbar.insertAction(insertpoint, self.action_omconnect)
        self.main_toolbar.insertAction(insertpoint, self.action_omdisconnect)

        ## "Database Tools"
        self.menu_database = QtGui.QMenu(_("&Database Tools"), self)
        self.insertMenu_(self.menu_database)

        icon = QtGui.QIcon.fromTheme("contact-new")
        self.action_new_database = QtGui.QAction(icon,
            _("New Openmolar Database"), self)

        icon = QtGui.QIcon(":icons/database.png")
        self.action_populate_demo = QtGui.QAction(icon,
            _("Populate database with demo data"), self)

        self.menu_database.addAction(self.action_new_database)
        self.menu_database.addAction(self.action_populate_demo)

        self.database_toolbar = QtGui.QToolBar(self)
        self.database_toolbar.setObjectName("Database Toolbar")
        self.database_toolbar.toggleViewAction().setText(
            _("Database Toolbar"))
        self.database_toolbar.addAction(self.action_new_database)
        self.database_toolbar.addAction(self.action_populate_demo)
        self.insertToolBar(self.help_toolbar, self.database_toolbar)

        self.log_widget = LogWidget(LOGGER, self.parent())
        self.log_widget.welcome()
        self.log_dock_widget = QtGui.QDockWidget(_("Log"), self)
        self.log_dock_widget.setObjectName("LogWidget") #for save state!
        self.log_dock_widget.setWidget(self.log_widget)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea,
            self.log_dock_widget)

        self.action_show_log = self.log_dock_widget.toggleViewAction()
        insertpoint = self.action_show_statusbar
        self.menu_view.insertAction(insertpoint, self.action_show_log)

        #take a note of this before restoring settings
        self.system_font = self.font()

        ####       now load stored settings                                ####
        self.loadSettings()

        self.pg_sessions = []

        self.end_pg_sessions()
        self.connect_signals()
        self.show()

        QtCore.QTimer.singleShot(100, self.setBriefMessageLocation)
        QtCore.QTimer.singleShot(1000, self._init_proxies)

        SETTINGS.main_ui = self
        SETTINGS.load_plugins("admin")
        SETTINGS.activate_plugins()
Exemplo n.º 4
0
class AdminMainWindow(PostgresMainWindow, ProxyManager):
    '''
    This class is the core application.
    '''
    log = LOGGER

    CONN_CLASS = AdminConnection

    def __init__(self, parent=None):
        PostgresMainWindow.__init__(self, parent)
        self.setMinimumSize(600, 400)

        self.setWindowTitle("Openmolar Admin")
        self.setWindowIcon(QtGui.QIcon(":icons/openmolar-server.png"))

        ## Main Menu

        ## "file"

        icon = QtGui.QIcon.fromTheme("network-wired")
        self.action_omconnect = QtGui.QAction(icon,
            "OM %s"% _("Connect"), self)
        self.action_omconnect.setToolTip(
                                _("Connect (to an openmolar server)"))
        icon = QtGui.QIcon.fromTheme("network-error")
        self.action_omdisconnect = QtGui.QAction(icon,
            "OM %s"% _("Disconnect"), self)
        self.action_omdisconnect.setToolTip(
            _("Disconnect (from an openmolar server)"))

        insertpoint = self.action_connect
        self.menu_file.insertAction(insertpoint, self.action_omconnect)
        self.menu_file.insertAction(insertpoint,self.action_omdisconnect)
        self.menu_file.insertSeparator(insertpoint)

        insertpoint = self.action_connect
        self.main_toolbar.insertAction(insertpoint, self.action_omconnect)
        self.main_toolbar.insertAction(insertpoint, self.action_omdisconnect)

        ## "Database Tools"
        self.menu_database = QtGui.QMenu(_("&Database Tools"), self)
        self.insertMenu_(self.menu_database)

        icon = QtGui.QIcon.fromTheme("contact-new")
        self.action_new_database = QtGui.QAction(icon,
            _("New Openmolar Database"), self)

        icon = QtGui.QIcon(":icons/database.png")
        self.action_populate_demo = QtGui.QAction(icon,
            _("Populate database with demo data"), self)

        self.menu_database.addAction(self.action_new_database)
        self.menu_database.addAction(self.action_populate_demo)

        self.database_toolbar = QtGui.QToolBar(self)
        self.database_toolbar.setObjectName("Database Toolbar")
        self.database_toolbar.toggleViewAction().setText(
            _("Database Toolbar"))
        self.database_toolbar.addAction(self.action_new_database)
        self.database_toolbar.addAction(self.action_populate_demo)
        self.insertToolBar(self.help_toolbar, self.database_toolbar)

        self.log_widget = LogWidget(LOGGER, self.parent())
        self.log_widget.welcome()
        self.log_dock_widget = QtGui.QDockWidget(_("Log"), self)
        self.log_dock_widget.setObjectName("LogWidget") #for save state!
        self.log_dock_widget.setWidget(self.log_widget)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea,
            self.log_dock_widget)

        self.action_show_log = self.log_dock_widget.toggleViewAction()
        insertpoint = self.action_show_statusbar
        self.menu_view.insertAction(insertpoint, self.action_show_log)

        #take a note of this before restoring settings
        self.system_font = self.font()

        ####       now load stored settings                                ####
        self.loadSettings()

        self.pg_sessions = []

        self.end_pg_sessions()
        self.connect_signals()
        self.show()

        QtCore.QTimer.singleShot(100, self.setBriefMessageLocation)
        QtCore.QTimer.singleShot(1000, self._init_proxies)

        SETTINGS.main_ui = self
        SETTINGS.load_plugins("admin")
        SETTINGS.activate_plugins()

    def connect_signals(self):
        '''
        set up signals/slots
        '''

        ##some old style connects are used to ensure argument (bool=0)
        ##is not passed to the slot

        self.action_omconnect.triggered.connect(self.om_connect)
        self.action_omdisconnect.triggered.connect(self.om_disconnect)

        self.action_show_log.triggered.connect(self.show_log)

        self.action_new_database.triggered.connect(self.create_new_database)
        self.action_populate_demo.triggered.connect(self.populate_demo)

        self.connect(self.central_widget, QtCore.SIGNAL("end_pg_sessions"),
            self.end_pg_sessions)

        self.known_server_widget.shortcut_clicked.connect(self.manage_shortcut)
        self.known_server_widget.server_changed.connect(self.set_proxy_index)

    @property
    def central_widget(self):
        '''
        overwrite the property of the Base Class
        '''
        if self._central_widget is None:
            LOGGER.debug("AdminMainWindow.. creating central widget")
            self._central_widget = AdminTabWidget(self)
            self.known_server_widget = self._central_widget.known_server_widget

            self._central_widget.add = self._central_widget.addTab
            self._central_widget.remove = self._central_widget.removeTab

        return self._central_widget

    @property
    def new_session_widget(self):
        '''
        overwrite the property of the Base Class
        '''
        admin_session_widget = AdminSessionWidget(self)
        admin_session_widget.query_error.connect(self.advise_dl)
        admin_session_widget.query_sucess.connect(self.advise)

        return admin_session_widget

    def handle_schema_version_error(self, session, error):
        '''
        re-implement PostgresMainwindows.handle_schema_version_error function
        '''
        self.advise(_("Warning - schema is out of date"), 1)
        #self.advise(_("Do you wish to upgrade the database?"), 1)
        self.add_session(session)
        
    def _init_proxies(self):
        '''
        called at startup, and by the om_connect action
        '''
        self.wait()
        self.advise(_("Initiating OMServer connections"))
        self.advise(u"%s....."% _("Please wait"))
        ProxyManager._init_proxies(self)
        self.known_server_widget.clear()
        for client in self.proxy_clients:
            self.known_server_widget.add_proxy_client(client)
        self.known_server_widget.setEnabled(True)
        self.wait(False)
        self.advise(u"....%s"% _("Done!"))

    def om_disconnect(self):
        ProxyManager.om_disconnect(self)
        self.known_server_widget.clear()
        self.known_server_widget.setEnabled(False)

    def show_log(self):
        '''
        toggle the state of the log dock window
        '''
        if self.action_show_log.isChecked():
            self.log_dock_widget.show()
        else:
            self.log_dock_widget.hide()

    def end_pg_sessions(self, shutting_down=False):
        '''
        overwrite baseclass function
        '''
        if shutting_down or (
        self.has_pg_connection and self.central_widget.closeAll()):
            PostgresMainWindow.end_pg_sessions(self)
        else:
            if self.central_widget.closeAll():
                PostgresMainWindow.end_pg_sessions(self)
        self.update_session_status()

    def create_new_database(self):
        '''
        raise a dialog, then create a database with the chosen name
        '''
        dl = NewDatabaseDialog(self)
        if not dl.exec_() or dl.database_name == "":
            self.display_proxy_message()
            return
        dbname = dl.database_name
        try:
            ProxyManager.create_database(self, dbname)
        except ProxyClient.PermissionError as exc:
            self.advise(exc.message, 2)

    def create_demo_database(self):
        '''
        initiates the demo database
        '''
        LOGGER.info("creating demo database")
        result = ProxyManager.create_demo_database(self)
        LOGGER.info(result)
        if (result and
        QtGui.QMessageBox.question(self, _("Confirm"),
        u"%s"% _("Populate with demo data now?"),
        QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
        QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Ok):
            self.populate_demo()

        self.display_proxy_message()

    @property
    def chosen_pg_session(self):
        '''
        if multiple postgres sessions are in progress, this should
        select the current session.
        '''
        if len(self.session_widgets) == 1:
            i = 0
        else:
            i = self.central_widget.currentIndex()-1
        LOGGER.debug(
            "AdminMainWindow.chosen_pg_session - returning session %s"% i)
        
        pg_session = self.session_widgets[i].pg_session
        return pg_session

    @require_session
    def populate_demo(self):
        '''
        catches signal when user hits the demo action
        '''
        pg_session = self.chosen_pg_session
        LOGGER.info("calling populate demo on session %s"% pg_session)
        dl = PopulateDemoDialog(pg_session, self)
        if not dl.exec_():
            self.advise(_("Demo data population was abandoned"), 1)

    def manage_db(self, dbname):
        '''
        raise a dialog, and provide database management tools
        '''
        dl = ManageDatabaseDialog(dbname, self.selected_client , self)
        dl.waiting.connect(self.wait)
        dl.function_completed.connect(self.display_proxy_message)
        dl.exec_()

    def manage_pg_users(self, dbname):
        '''
        raise a dialog, and provide database management tools
        '''
        dl = ManagePGUsersDialog(dbname, self.selected_client , self)
        dl.waiting.connect(self.wait)
        dl.function_completed.connect(self.display_proxy_message)
        dl.exec_()

    def configure_db(self, dbname):
        '''
        raise a dialog, and provide database management tools
        '''
        dl = ConfigureDatabaseDialog(dbname, self.selected_client , self)
        dl.exec_()

    def closeEvent(self, event=None):
        '''
        re-implement the close event of QtGui.QMainWindow, and check the user
        really meant to do this.
        '''
        if (self.log_widget.dirty and
        QtGui.QMessageBox.question(self, _("Confirm"),
        _("You have unsaved log changes - Quit Application?"),
        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
        QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No):
            event.ignore()
        else:
            self.saveSettings()
            self.end_pg_sessions(shutting_down=True)

    @property
    def confirmDataOverwrite(self):
        '''
        check that the user is prepared to lose any changes
        '''
        return self.get_confirm(u"<p>%s<br />%s</p>"% (
        _("this action will overwrite any current data stored"),
        _("proceed?")))

    def save_template(self):
        '''
        save the template, so it can be re-used in future
        '''
        try:
            filepath = QtGui.QFileDialog.getSaveFileName(self,
            _("save template file"),"",
            _("openmolar template files ")+"(*.om_xml)")
            if filepath != '':
                if not re.match(".*\.om_xml$", filepath):
                    filepath += ".om_xml"
                f = open(filepath, "w")
                f.write(self.template.toxml())
                f.close()
                self.advise(_("Template Saved"), 1)
            else:
                self.advise(_("operation cancelled"), 1)
        except Exception, e:
            self.advise(_("Template not saved")+" - %s"% e, 2)
Exemplo n.º 5
0
    def __init__(self, parent=None):
        PostgresMainWindow.__init__(self, parent)
        self.setMinimumSize(600, 400)

        self.setWindowTitle("Openmolar Admin")
        self.setWindowIcon(QtGui.QIcon(":icons/openmolar-server.png"))

        ## Main Menu

        ## "file"

        icon = QtGui.QIcon.fromTheme("network-wired")
        self.action_omconnect = QtGui.QAction(icon, "OM %s" % _("Connect"),
                                              self)
        self.action_omconnect.setToolTip(_("Connect (to an openmolar server)"))
        icon = QtGui.QIcon.fromTheme("network-error")
        self.action_omdisconnect = QtGui.QAction(icon,
                                                 "OM %s" % _("Disconnect"),
                                                 self)
        self.action_omdisconnect.setToolTip(
            _("Disconnect (from an openmolar server)"))

        insertpoint = self.action_connect
        self.menu_file.insertAction(insertpoint, self.action_omconnect)
        self.menu_file.insertAction(insertpoint, self.action_omdisconnect)
        self.menu_file.insertSeparator(insertpoint)

        insertpoint = self.action_connect
        self.main_toolbar.insertAction(insertpoint, self.action_omconnect)
        self.main_toolbar.insertAction(insertpoint, self.action_omdisconnect)

        ## "Database Tools"
        self.menu_database = QtGui.QMenu(_("&Database Tools"), self)
        self.insertMenu_(self.menu_database)

        icon = QtGui.QIcon.fromTheme("contact-new")
        self.action_new_database = QtGui.QAction(icon,
                                                 _("New Openmolar Database"),
                                                 self)

        icon = QtGui.QIcon(":icons/database.png")
        self.action_populate_demo = QtGui.QAction(
            icon, _("Populate database with demo data"), self)

        self.menu_database.addAction(self.action_new_database)
        self.menu_database.addAction(self.action_populate_demo)

        self.database_toolbar = QtGui.QToolBar(self)
        self.database_toolbar.setObjectName("Database Toolbar")
        self.database_toolbar.toggleViewAction().setText(_("Database Toolbar"))
        self.database_toolbar.addAction(self.action_new_database)
        self.database_toolbar.addAction(self.action_populate_demo)
        self.insertToolBar(self.help_toolbar, self.database_toolbar)

        self.log_widget = LogWidget(LOGGER, self.parent())
        self.log_widget.welcome()
        self.log_dock_widget = QtGui.QDockWidget(_("Log"), self)
        self.log_dock_widget.setObjectName("LogWidget")  #for save state!
        self.log_dock_widget.setWidget(self.log_widget)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea,
                           self.log_dock_widget)

        self.action_show_log = self.log_dock_widget.toggleViewAction()
        insertpoint = self.action_show_statusbar
        self.menu_view.insertAction(insertpoint, self.action_show_log)

        #take a note of this before restoring settings
        self.system_font = self.font()

        ####       now load stored settings                                ####
        self.loadSettings()

        self.pg_sessions = []

        self.end_pg_sessions()
        self.connect_signals()
        self.show()

        QtCore.QTimer.singleShot(100, self.setBriefMessageLocation)
        QtCore.QTimer.singleShot(1000, self._init_proxies)

        SETTINGS.main_ui = self
        SETTINGS.load_plugins("admin")
        SETTINGS.activate_plugins()
Exemplo n.º 6
0
class AdminMainWindow(PostgresMainWindow, ProxyManager):
    '''
    This class is the core application.
    '''
    log = LOGGER

    CONN_CLASS = AdminConnection

    def __init__(self, parent=None):
        PostgresMainWindow.__init__(self, parent)
        self.setMinimumSize(600, 400)

        self.setWindowTitle("Openmolar Admin")
        self.setWindowIcon(QtGui.QIcon(":icons/openmolar-server.png"))

        ## Main Menu

        ## "file"

        icon = QtGui.QIcon.fromTheme("network-wired")
        self.action_omconnect = QtGui.QAction(icon, "OM %s" % _("Connect"),
                                              self)
        self.action_omconnect.setToolTip(_("Connect (to an openmolar server)"))
        icon = QtGui.QIcon.fromTheme("network-error")
        self.action_omdisconnect = QtGui.QAction(icon,
                                                 "OM %s" % _("Disconnect"),
                                                 self)
        self.action_omdisconnect.setToolTip(
            _("Disconnect (from an openmolar server)"))

        insertpoint = self.action_connect
        self.menu_file.insertAction(insertpoint, self.action_omconnect)
        self.menu_file.insertAction(insertpoint, self.action_omdisconnect)
        self.menu_file.insertSeparator(insertpoint)

        insertpoint = self.action_connect
        self.main_toolbar.insertAction(insertpoint, self.action_omconnect)
        self.main_toolbar.insertAction(insertpoint, self.action_omdisconnect)

        ## "Database Tools"
        self.menu_database = QtGui.QMenu(_("&Database Tools"), self)
        self.insertMenu_(self.menu_database)

        icon = QtGui.QIcon.fromTheme("contact-new")
        self.action_new_database = QtGui.QAction(icon,
                                                 _("New Openmolar Database"),
                                                 self)

        icon = QtGui.QIcon(":icons/database.png")
        self.action_populate_demo = QtGui.QAction(
            icon, _("Populate database with demo data"), self)

        self.menu_database.addAction(self.action_new_database)
        self.menu_database.addAction(self.action_populate_demo)

        self.database_toolbar = QtGui.QToolBar(self)
        self.database_toolbar.setObjectName("Database Toolbar")
        self.database_toolbar.toggleViewAction().setText(_("Database Toolbar"))
        self.database_toolbar.addAction(self.action_new_database)
        self.database_toolbar.addAction(self.action_populate_demo)
        self.insertToolBar(self.help_toolbar, self.database_toolbar)

        self.log_widget = LogWidget(LOGGER, self.parent())
        self.log_widget.welcome()
        self.log_dock_widget = QtGui.QDockWidget(_("Log"), self)
        self.log_dock_widget.setObjectName("LogWidget")  #for save state!
        self.log_dock_widget.setWidget(self.log_widget)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea,
                           self.log_dock_widget)

        self.action_show_log = self.log_dock_widget.toggleViewAction()
        insertpoint = self.action_show_statusbar
        self.menu_view.insertAction(insertpoint, self.action_show_log)

        #take a note of this before restoring settings
        self.system_font = self.font()

        ####       now load stored settings                                ####
        self.loadSettings()

        self.pg_sessions = []

        self.end_pg_sessions()
        self.connect_signals()
        self.show()

        QtCore.QTimer.singleShot(100, self.setBriefMessageLocation)
        QtCore.QTimer.singleShot(1000, self._init_proxies)

        SETTINGS.main_ui = self
        SETTINGS.load_plugins("admin")
        SETTINGS.activate_plugins()

    def connect_signals(self):
        '''
        set up signals/slots
        '''

        ##some old style connects are used to ensure argument (bool=0)
        ##is not passed to the slot

        self.action_omconnect.triggered.connect(self.om_connect)
        self.action_omdisconnect.triggered.connect(self.om_disconnect)

        self.action_show_log.triggered.connect(self.show_log)

        self.action_new_database.triggered.connect(self.create_new_database)
        self.action_populate_demo.triggered.connect(self.populate_demo)

        self.connect(self.central_widget, QtCore.SIGNAL("end_pg_sessions"),
                     self.end_pg_sessions)

        self.known_server_widget.shortcut_clicked.connect(self.manage_shortcut)
        self.known_server_widget.server_changed.connect(self.set_proxy_index)

    @property
    def central_widget(self):
        '''
        overwrite the property of the Base Class
        '''
        if self._central_widget is None:
            LOGGER.debug("AdminMainWindow.. creating central widget")
            self._central_widget = AdminTabWidget(self)
            self.known_server_widget = self._central_widget.known_server_widget

            self._central_widget.add = self._central_widget.addTab
            self._central_widget.remove = self._central_widget.removeTab

        return self._central_widget

    @property
    def new_session_widget(self):
        '''
        overwrite the property of the Base Class
        '''
        admin_session_widget = AdminSessionWidget(self)
        admin_session_widget.query_error.connect(self.advise_dl)
        admin_session_widget.query_sucess.connect(self.advise)

        return admin_session_widget

    def handle_schema_version_error(self, session, error):
        '''
        re-implement PostgresMainwindows.handle_schema_version_error function
        '''
        self.advise(_("Warning - schema is out of date"), 1)
        #self.advise(_("Do you wish to upgrade the database?"), 1)
        self.add_session(session)

    def _init_proxies(self):
        '''
        called at startup, and by the om_connect action
        '''
        self.wait()
        self.advise(_("Initiating OMServer connections"))
        self.advise(u"%s....." % _("Please wait"))
        ProxyManager._init_proxies(self)
        self.known_server_widget.clear()
        for client in self.proxy_clients:
            self.known_server_widget.add_proxy_client(client)
        self.known_server_widget.setEnabled(True)
        self.wait(False)
        self.advise(u"....%s" % _("Done!"))

    def om_disconnect(self):
        ProxyManager.om_disconnect(self)
        self.known_server_widget.clear()
        self.known_server_widget.setEnabled(False)

    def show_log(self):
        '''
        toggle the state of the log dock window
        '''
        if self.action_show_log.isChecked():
            self.log_dock_widget.show()
        else:
            self.log_dock_widget.hide()

    def end_pg_sessions(self, shutting_down=False):
        '''
        overwrite baseclass function
        '''
        if shutting_down or (self.has_pg_connection
                             and self.central_widget.closeAll()):
            PostgresMainWindow.end_pg_sessions(self)
        else:
            if self.central_widget.closeAll():
                PostgresMainWindow.end_pg_sessions(self)
        self.update_session_status()

    def create_new_database(self):
        '''
        raise a dialog, then create a database with the chosen name
        '''
        dl = NewDatabaseDialog(self)
        if not dl.exec_() or dl.database_name == "":
            self.display_proxy_message()
            return
        dbname = dl.database_name
        try:
            ProxyManager.create_database(self, dbname)
        except ProxyClient.PermissionError as exc:
            self.advise(exc.message, 2)

    def create_demo_database(self):
        '''
        initiates the demo database
        '''
        LOGGER.info("creating demo database")
        result = ProxyManager.create_demo_database(self)
        LOGGER.info(result)
        if (result and QtGui.QMessageBox.question(
                self, _("Confirm"), u"%s" % _("Populate with demo data now?"),
                QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
                QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Ok):
            self.populate_demo()

        self.display_proxy_message()

    @property
    def chosen_pg_session(self):
        '''
        if multiple postgres sessions are in progress, this should
        select the current session.
        '''
        if len(self.session_widgets) == 1:
            i = 0
        else:
            i = self.central_widget.currentIndex() - 1
        LOGGER.debug(
            "AdminMainWindow.chosen_pg_session - returning session %s" % i)

        pg_session = self.session_widgets[i].pg_session
        return pg_session

    @require_session
    def populate_demo(self):
        '''
        catches signal when user hits the demo action
        '''
        pg_session = self.chosen_pg_session
        LOGGER.info("calling populate demo on session %s" % pg_session)
        dl = PopulateDemoDialog(pg_session, self)
        if not dl.exec_():
            self.advise(_("Demo data population was abandoned"), 1)

    def manage_db(self, dbname):
        '''
        raise a dialog, and provide database management tools
        '''
        dl = ManageDatabaseDialog(dbname, self.selected_client, self)
        dl.waiting.connect(self.wait)
        dl.function_completed.connect(self.display_proxy_message)
        dl.exec_()

    def manage_pg_users(self, dbname):
        '''
        raise a dialog, and provide database management tools
        '''
        dl = ManagePGUsersDialog(dbname, self.selected_client, self)
        dl.waiting.connect(self.wait)
        dl.function_completed.connect(self.display_proxy_message)
        dl.exec_()

    def configure_db(self, dbname):
        '''
        raise a dialog, and provide database management tools
        '''
        dl = ConfigureDatabaseDialog(dbname, self.selected_client, self)
        dl.exec_()

    def closeEvent(self, event=None):
        '''
        re-implement the close event of QtGui.QMainWindow, and check the user
        really meant to do this.
        '''
        if (self.log_widget.dirty and QtGui.QMessageBox.question(
                self, _("Confirm"),
                _("You have unsaved log changes - Quit Application?"),
                QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
                QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No):
            event.ignore()
        else:
            self.saveSettings()
            self.end_pg_sessions(shutting_down=True)

    @property
    def confirmDataOverwrite(self):
        '''
        check that the user is prepared to lose any changes
        '''
        return self.get_confirm(
            u"<p>%s<br />%s</p>" %
            (_("this action will overwrite any current data stored"),
             _("proceed?")))

    def save_template(self):
        '''
        save the template, so it can be re-used in future
        '''
        try:
            filepath = QtGui.QFileDialog.getSaveFileName(
                self, _("save template file"), "",
                _("openmolar template files ") + "(*.om_xml)")
            if filepath != '':
                if not re.match(".*\.om_xml$", filepath):
                    filepath += ".om_xml"
                f = open(filepath, "w")
                f.write(self.template.toxml())
                f.close()
                self.advise(_("Template Saved"), 1)
            else:
                self.advise(_("operation cancelled"), 1)
        except Exception, e:
            self.advise(_("Template not saved") + " - %s" % e, 2)