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)
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)