def push_to_qgislogging(title: str, text: str = None, level: LogLevel = LogLevel.INFO) -> None: """ Writes the text to QGIS Logging :param title: message title :param text: message to write to the QGIS messagelog :param level: QGIS message level (standard: 0 -> QgsMessageLog.INFO) :return: Nothing """ if level == LogLevel.DEBUG: return loglevel = Qgis.Info if level == LogLevel.WARNING: loglevel = Qgis.Warning elif level == LogLevel.CRITICAL: loglevel = Qgis.Critical if text is not None: msg = "{} - {}".format(text, title) else: msg = title QgsMessageLog().logMessage(msg, tag="GeologicalDataProcessing", level=loglevel, notifyUser=True)
def sendReport(self, error, tracker_url): """ Copies the given stacktrace in a GeoCat support form. """ payload = { "subject": "[Crash Report] GeoCat Bridge for QGIS", "message": error } req = PreparedRequest() try: req.prepare("GET", tracker_url, params=parse.urlencode(payload, quote_via=parse.quote)) webbrowser.open_new(req.url) except Exception as e: QgsMessageLog().logMessage(f"Failed to send crash report: {e}", 'GeoCat Bridge')
def __init__(self, parent=None, iface=None, visible=False): super(PlanetExplorerDockWidget, self).__init__(parent) self.setupUi(self) self.setVisible(visible) self._iface = iface # noinspection PyArgumentList self._auth_man = QgsApplication.authManager() self.p_client = None self.api_key = None self._save_creds = bool( pluginSetting(SAVE_CREDS_KEY, namespace=SETTINGS_NAMESPACE, typ='bool')) self.leUser.addAction( QIcon(':/plugins/planet_explorer/envelope-gray.svg'), QLineEdit.LeadingPosition) self.lblSignUp.linkActivated[str].connect( lambda: open_link_with_browser(SIGNUP_URL)) self.lblTermsOfService.linkActivated[str].connect( lambda: open_link_with_browser(TOS_URL)) self.lblForgotPass.linkActivated[str].connect( lambda: open_link_with_browser(FORGOT_PASS_URL)) self.btn_ok = self.buttonBoxLogin.button(QDialogButtonBox.Ok) self.btn_ok.setText('Sign In') self.btn_api_key = self.buttonBoxLogin.button(QDialogButtonBox.Abort) """:type: QPushButton""" self.btn_api_key.setText('Use API key') self.btn_api_key.hide() self.buttonBoxLogin.accepted.connect(self.login) self.buttonBoxLogin.rejected.connect(self.api_key_login) self.tabWidgetResourceType.currentChanged[int].connect( self._item_group_changed) self._setup_daily_images_panel() self._setup_mosaics_panel() # Set default group type and filter widget self.tabWidgetResourceType.setCurrentIndex(0) # noinspection PyTypeChecker self._terms_browser = None self.msg_log = QgsMessageLog() # Local QgsMessageBar self.msgBar.hide()
def __init__(self, parent=None, visible=False): super(PlanetExplorerDockWidget, self).__init__(parent) self.setupUi(self) self.setVisible(visible) self._auth_man = QgsApplication.authManager() self.p_client = None self.api_key = None self._save_creds = bool( QSettings().value(f"{SETTINGS_NAMESPACE}/{SAVE_CREDS_KEY}")) self.leUser.addAction( QIcon(":/plugins/planet_explorer/envelope-gray.svg"), QLineEdit.LeadingPosition, ) self.lblSignUp.linkActivated[str].connect( lambda: open_link_with_browser(SIGNUP_URL)) self.lblTermsOfService.linkActivated[str].connect( lambda: open_link_with_browser(TOS_URL)) self.lblForgotPass.linkActivated[str].connect( lambda: open_link_with_browser(FORGOT_PASS_URL)) self.btn_ok = self.buttonBoxLogin.button(QDialogButtonBox.Ok) self.btn_ok.setText("Sign In") self.btn_api_key = self.buttonBoxLogin.button(QDialogButtonBox.Abort) self.btn_api_key.setText("Use API key") self.btn_api_key.hide() self.buttonBoxLogin.accepted.connect(self.login) self.buttonBoxLogin.rejected.connect(self.api_key_login) self.lePass.returnPressed.connect(self.login) self.tabWidgetResourceType.currentChanged[int].connect( self._item_group_changed) self.setWindowTitle(f"Planet Explorer [{plugin_version()}]") self.daily_images_widget = None # self._setup_daily_images_panel() self._setup_mosaics_panel() # Set default group type and filter widget self.tabWidgetResourceType.setCurrentIndex(0) self._terms_browser = None self.msg_log = QgsMessageLog() self.msgBar.hide()
def readServers(): global _servers value = QSettings().value(SERVERS_SETTING) if value is None: return stored_servers = json.loads(value) for serverDef in stored_servers: try: s = serverFromDefinition(serverDef) except KeyError: known_types = ','.join(c.__name__ for c in (GeonetworkServer, GeoserverServer, MapserverServer, PostgisServer)) QgsMessageLog().logMessage(f"Failed to load '{serverDef[0]}' type: expected one of ({known_types})", meta.getAppName(), Qgis.Critical) continue _servers[s.name] = s
def __init__(self, parent=None, iface=None, visible=False): super(PlanetExplorerDockWidget, self).__init__(parent) # Set up the user interface from Designer. # After setupUI you can access any designer object by doing # self.<objectname>, and you can use autoconnect slots - see # http://doc.qt.io/qt-5/designer-using-a-ui-file.html # #widgets-and-dialogs-with-auto-connect self.setupUi(self) self.setVisible(visible) self._iface = iface # noinspection PyArgumentList self._auth_man = QgsApplication.authManager() self.p_client = None self.api_key = None self._save_creds = bool( pluginSetting(SAVE_CREDS_KEY, namespace=SETTINGS_NAMESPACE, typ='bool')) self.leUser.addAction( QIcon(':/plugins/planet_explorer/envelope-gray.svg'), QLineEdit.LeadingPosition) self.lblSignUp.linkActivated[str].connect( lambda: self._open_link_with_browser(SIGNUP_URL)) self.lblTermsOfService.linkActivated[str].connect( lambda: self._open_link_with_browser(TOS_URL)) self.lblForgotPass.linkActivated[str].connect( lambda: self._open_link_with_browser(FORGOT_PASS_URL)) self.btn_ok = self.buttonBoxLogin.button(QDialogButtonBox.Ok) self.btn_ok.setText('Sign In') self.btn_api_key = self.buttonBoxLogin.button(QDialogButtonBox.Abort) """:type: QPushButton""" self.btn_api_key.setText('Use API key') self.btn_api_key.hide() self.buttonBoxLogin.accepted.connect(self.login) self.buttonBoxLogin.rejected.connect(self.api_key_login) self._setup_group_type_selector() self.cmbBoxItemGroupType.currentIndexChanged[int].connect( self._item_group_changed) self._toggle_search_highlight(True) self.btnSearch.clicked[bool].connect(self.perform_search) # Collected sources/filters, upon search request self._sources = None self._sort_order = None self._filters = None self._request = None # Set up the mosaics widget self._setup_mosaics_panel() # Set up AOI, date-range and text filters self._setup_main_filters() # Non-main, per-item-group control widget filters self._filter_widget_registry = {} self._setup_filter_widgets() # Set default group type and filter widget self.cmbBoxItemGroupType.setCurrentIndex(0) self.stckdWidgetFilters.setCurrentIndex(0) # Set up tabbed widget self.tabWidgetResults.tabCloseRequested[int].connect( self.tab_close_requested) # Set up lower button bar self.btnOrder.clicked.connect(self.order_checked) self._setup_cog_button() # noinspection PyTypeChecker self._user_act = None # noinspection PyTypeChecker self._terms_browser = None self._setup_info_button() self.msg_log = QgsMessageLog() # Local QgsMessageBar self.msgBar.hide() self.frameResults.setStyleSheet(RESULTS_BKGRD_PE) self._checked_queue_set_count = 0 self._checked_queue_set = set() self._checked_item_type_nodes = {}
def runAlgorithm(algOrName, onFinish, *args): if isinstance(algOrName, GeoAlgorithm): alg = algOrName else: alg = Processing.getAlgorithm(algOrName) if alg is None: QgsMessageLog.logMessage( Processing.tr('Error: Algorithm {0} not found\n').format( algOrName), Processing.tr("Processing")) return alg = alg.getCopy() if len(args) == 1 and isinstance(args[0], dict): # Set params by name and try to run the alg even if not all parameter values are provided, # by using the default values instead. setParams = [] for (name, value) in args[0].items(): param = alg.getParameterFromName(name) if param and param.setValue(value): setParams.append(name) continue output = alg.getOutputFromName(name) if output and output.setValue(value): continue QgsMessageLog.logMessage( Processing.tr( 'Error: Wrong parameter value {0} for parameter {1}.'). format(value, name), Processing.tr("Processing")) ProcessingLog.addToLog( ProcessingLog.LOG_ERROR, Processing. tr('Error in %s. Wrong parameter value %s for parameter %s.' ) % (alg.name, value, name)) return # fill any missing parameters with default values if allowed for param in alg.parameters: if param.name not in setParams: if not param.setValue(None): QgsMessageLog.logMessage( Processing. tr('Error: Missing parameter value for parameter {0}.' ).format(param.name), Processing.tr("Processing")) ProcessingLog.addToLog( ProcessingLog.LOG_ERROR, Processing. tr('Error in %s. Missing parameter value for parameter %s.' ) % (alg.name, param.name)) return else: if len(args) != alg.getVisibleParametersCount( ) + alg.getVisibleOutputsCount(): QgsMessageLog.logMessage( Processing.tr('Error: Wrong number of parameters'), Processing.tr("Processing")) processing.alghelp(algOrName) return i = 0 for param in alg.parameters: if not param.hidden: if not param.setValue(args[i]): QgsMessageLog.logMessage( Processing.tr('Error: Wrong parameter value: ') + unicode(args[i]), Processing.tr("Processing")) return i = i + 1 for output in alg.outputs: if not output.hidden: if not output.setValue(args[i]): QgsMessageLog.logMessage( Processing.tr('Error: Wrong output value: ') + unicode(args[i]), Processing.tr("Processing")) return i = i + 1 msg = alg._checkParameterValuesBeforeExecuting() if msg: QgsMessageLog( Processing.tr('Unable to execute algorithm\n{0}').format(msg), Processing.tr("Processing")) return if not alg.checkInputCRS(): QgsMessageLog( Processing. tr('Warning: Not all input layers use the same CRS.\nThis can cause unexpected results.' ), Processing.tr("Processing")) if iface is not None: # Don't set the wait cursor twice, because then when you # restore it, it will still be a wait cursor. cursor = QApplication.overrideCursor() if cursor is None or cursor == 0: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) elif cursor.shape() != Qt.WaitCursor: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) progress = None if iface is not None: progress = MessageBarProgress(alg.name) ret = runalg(alg, progress) if ret: if onFinish is not None: onFinish(alg, progress) else: QgsMessageLog( Processing. tr("There were errors executing the algorithm.\nCheck the QGIS log to get more information" ), Processing.tr("Processing")) if iface is not None: QApplication.restoreOverrideCursor() progress.close() return alg
from qgis.PyQt.QtCore import QCoreApplication from qgis.PyQt.QtWidgets import QSizePolicy from qgis.PyQt.QtWidgets import QMessageBox, QWidget from qgis.core import Qgis, QgsMessageLog, QgsMessageOutput from qgis.gui import QgsMessageBar from qgis.utils import iface from geocatbridge.utils.meta import getAppName _LOGGER = QgsMessageLog() class FeedbackMixin: class Buttons: OK = QMessageBox.Ok NO = QMessageBox.No YES = QMessageBox.Yes CANCEL = QMessageBox.Cancel def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._errors = [] self._warnings = [] self._main_bar = iface.messageBar() self._widget_bar = self._main_bar if not hasattr(self, 'tr'): # Do not reset the translate function if it's already there self.tr = None def _updateWidgetBar(self): """ Updates the _widget_bar property if the widget layout has been initialized. """