############################################################################### # # Copyright (C) 2010 NextGIS (http://nextgis.org), # Alexander Bruy (alexander.bruy@gmail.com), # Maxim Dubinin (sim@gis-lab.info) # # Copyright (C) 2024 Tom Kralidis (tomkralidis@gmail.com) # Copyright (C) 2014 Angelos Tzotsos (tzotsos@gmail.com) # # This source is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This code 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 General Public License for more # details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################### from gettext import gettext, ngettext import logging import warnings import os import webbrowser from xml.dom.minidom import parseString import xml.etree.ElementTree as etree with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=DeprecationWarning) from jinja2 import Environment, FileSystemLoader from qgis.core import Qgis, QgsMessageLog, QgsSettings from qgis.PyQt.QtCore import QUrl, QUrlQuery from qgis.PyQt.QtWidgets import QMessageBox from qgis.PyQt.uic import loadUiType LOGGER = QgsMessageLog() class StaticContext: """base configuration / scaffolding""" def __init__(self): """init""" self.ppath = os.path.dirname(os.path.abspath(__file__)) def get_ui_class(ui_file): """return class object of a uifile""" ui_file_full = '{}{}ui{}{}'.format(os.path.dirname(os.path.abspath(__file__)), os.sep, os.sep, ui_file) return loadUiType(ui_file_full)[0] def render_template(language, context, data, template): """Renders HTML display of raw API request/response/content""" env = Environment(extensions=['jinja2.ext.i18n'], loader=FileSystemLoader(context.ppath)) env.install_gettext_callables(gettext, ngettext, newstyle=True) template_file = 'resources/templates/%s' % template template = env.get_template(template_file) return template.render(language=language, obj=data) def get_connections_from_file(parent, filename): """load connections from connection file""" error = 0 try: doc = etree.parse(filename).getroot() if doc.tag != 'qgsCSWConnections': error = 1 msg = parent.tr('Invalid Catalog connections XML.') except etree.ParseError as err: error = 1 msg = parent.tr('Cannot parse XML file: {0}').format(err) except OSError as err: error = 1 msg = parent.tr('Cannot open file: {0}').format(err) if error == 1: QMessageBox.information(parent, parent.tr('Loading Connections'), msg) return return doc def prettify_xml(xml): """convenience function to prettify XML""" if isinstance(xml, bytes): xml = xml.decode('utf-8') if xml.count('\n') > 20: # likely already pretty printed return xml # check if it's a GET request if xml.startswith('http'): return xml else: return parseString(xml).toprettyxml() def get_help_url(): """return QGIS MetaSearch help documentation link""" locale_name = QgsSettings().value('locale/userLocale')[0:2] major, minor = Qgis.QGIS_VERSION.split('.')[:2] if minor == '99': # master version = 'testing' else: version = '.'.join([major, minor]) path = f'{version}/{locale_name}/docs/user_manual/plugins/core_plugins/plugins_metasearch.html' # noqa return '/'.join(['https://docs.qgis.org', path]) def open_url(url): """open URL in web browser""" webbrowser.open(url) def normalize_text(text): """tidy up string""" return text.replace('\n', '') def serialize_string(input_string): """apply a serial counter to a string""" s = input_string.strip().split() last_token = s[-1] all_other_tokens_as_string = input_string.replace(last_token, '') if last_token.isdigit(): value = f'{all_other_tokens_as_string}{int(last_token) + 1}' else: value = '%s 1' % input_string return value def clean_ows_url(url): """clean an OWS URL of added basic service parameters""" url = QUrl(url) query_string = url.query() if query_string: query_string = QUrlQuery(query_string) query_string.removeQueryItem('service') query_string.removeQueryItem('SERVICE') query_string.removeQueryItem('request') query_string.removeQueryItem('REQUEST') url.setQuery(query_string) return url.toString() def log_message(message, level=Qgis.MessageLevel.Info): """helper function to emit logging messages""" LOGGER.logMessage(message, 'MetaSearch', level)