From 02681490f6f4ff760a6937da1f285443153e92a4 Mon Sep 17 00:00:00 2001 From: tlaveille Date: Fri, 9 Jan 2026 11:16:56 +0100 Subject: [PATCH] Repaire --- CenRa_METABASE/CenRa_Metabase.py | 217 ++ CenRa_METABASE/README.md | 1 + CenRa_METABASE/__init__.py | 10 + CenRa_METABASE/about_form.py | 46 + CenRa_METABASE/dock.py | 453 ++++ CenRa_METABASE/editor.py | 775 +++++++ CenRa_METABASE/icon.png | Bin 0 -> 4977 bytes CenRa_METABASE/issues.py | 89 + CenRa_METABASE/metadata.txt | 49 + CenRa_METABASE/tools/css/dock.css | 61 + CenRa_METABASE/tools/html/contact.html | 7 + CenRa_METABASE/tools/html/link.html | 7 + CenRa_METABASE/tools/html/main.html | 123 ++ CenRa_METABASE/tools/icons/CEN_RA.png | Bin 0 -> 8893 bytes CenRa_METABASE/tools/icons/auto_add.png | Bin 0 -> 42290 bytes CenRa_METABASE/tools/icons/icon.png | Bin 0 -> 15984 bytes CenRa_METABASE/tools/icons/icon_2.png | Bin 0 -> 27716 bytes .../tools/images/must_be_a_file.png | Bin 0 -> 25798 bytes CenRa_METABASE/tools/resources.py | 184 ++ CenRa_METABASE/tools/ui/CenRa_IssuesSend.ui | 332 +++ .../ui/CenRa_Metabase_dockwidget_base.ui | 74 + .../ui/CenRa_Metabase_editorwidget_base.ui | 1946 +++++++++++++++++ CenRa_METABASE/tools/ui/CenRa_about_form.ui | 81 + CenRa_METABASE/tools/xml/dcat.xml | 26 + CenRa_METABASE/tools/xml/distribution.xml | 9 + CenRa_METABASE/tools/xml/publisher.xml | 6 + CenRa_PAGERENDER/CenRa_PageRender.py | 141 ++ CenRa_PAGERENDER/README.md | 1 + CenRa_PAGERENDER/__init__.py | 10 + CenRa_PAGERENDER/about_form.py | 46 + CenRa_PAGERENDER/canvas_editor.py | 1 - CenRa_PAGERENDER/demoV2.py | 169 ++ CenRa_PAGERENDER/icon.png | Bin 0 -> 4977 bytes CenRa_PAGERENDER/issues.py | 89 + CenRa_PAGERENDER/tools/icons/CEN_RA.png | Bin 0 -> 8893 bytes CenRa_PAGERENDER/tools/icons/icon.png | Bin 0 -> 45060 bytes CenRa_PAGERENDER/tools/resources.py | 174 ++ CenRa_PAGERENDER/tools/ui/CenRa_IssuesSend.ui | 332 +++ .../tools/ui/CenRa_PageRender_base.ui | 109 +- CenRa_PAGERENDER/tools/ui/CenRa_about_form.ui | 81 + CenRa_PAGERENDER/tools/ui/rotate.png | Bin 0 -> 19524 bytes CenRa_PAGERENDER/tools/ui/size.png | Bin 0 -> 17021 bytes CenRa_PAGERENDER/tools/ui/size_0.png | Bin 0 -> 17730 bytes 43 files changed, 5562 insertions(+), 87 deletions(-) create mode 100644 CenRa_METABASE/CenRa_Metabase.py create mode 100644 CenRa_METABASE/README.md create mode 100644 CenRa_METABASE/__init__.py create mode 100644 CenRa_METABASE/about_form.py create mode 100644 CenRa_METABASE/dock.py create mode 100644 CenRa_METABASE/editor.py create mode 100644 CenRa_METABASE/icon.png create mode 100644 CenRa_METABASE/issues.py create mode 100644 CenRa_METABASE/metadata.txt create mode 100644 CenRa_METABASE/tools/css/dock.css create mode 100644 CenRa_METABASE/tools/html/contact.html create mode 100644 CenRa_METABASE/tools/html/link.html create mode 100644 CenRa_METABASE/tools/html/main.html create mode 100644 CenRa_METABASE/tools/icons/CEN_RA.png create mode 100644 CenRa_METABASE/tools/icons/auto_add.png create mode 100644 CenRa_METABASE/tools/icons/icon.png create mode 100644 CenRa_METABASE/tools/icons/icon_2.png create mode 100644 CenRa_METABASE/tools/images/must_be_a_file.png create mode 100644 CenRa_METABASE/tools/resources.py create mode 100644 CenRa_METABASE/tools/ui/CenRa_IssuesSend.ui create mode 100644 CenRa_METABASE/tools/ui/CenRa_Metabase_dockwidget_base.ui create mode 100644 CenRa_METABASE/tools/ui/CenRa_Metabase_editorwidget_base.ui create mode 100644 CenRa_METABASE/tools/ui/CenRa_about_form.ui create mode 100644 CenRa_METABASE/tools/xml/dcat.xml create mode 100644 CenRa_METABASE/tools/xml/distribution.xml create mode 100644 CenRa_METABASE/tools/xml/publisher.xml create mode 100644 CenRa_PAGERENDER/CenRa_PageRender.py create mode 100644 CenRa_PAGERENDER/README.md create mode 100644 CenRa_PAGERENDER/__init__.py create mode 100644 CenRa_PAGERENDER/about_form.py create mode 100644 CenRa_PAGERENDER/demoV2.py create mode 100644 CenRa_PAGERENDER/icon.png create mode 100644 CenRa_PAGERENDER/issues.py create mode 100644 CenRa_PAGERENDER/tools/icons/CEN_RA.png create mode 100644 CenRa_PAGERENDER/tools/icons/icon.png create mode 100644 CenRa_PAGERENDER/tools/resources.py create mode 100644 CenRa_PAGERENDER/tools/ui/CenRa_IssuesSend.ui create mode 100644 CenRa_PAGERENDER/tools/ui/CenRa_about_form.ui create mode 100644 CenRa_PAGERENDER/tools/ui/rotate.png create mode 100644 CenRa_PAGERENDER/tools/ui/size.png create mode 100644 CenRa_PAGERENDER/tools/ui/size_0.png diff --git a/CenRa_METABASE/CenRa_Metabase.py b/CenRa_METABASE/CenRa_Metabase.py new file mode 100644 index 0000000..d1e265a --- /dev/null +++ b/CenRa_METABASE/CenRa_Metabase.py @@ -0,0 +1,217 @@ +__copyright__ = "Copyright 2021, 3Liz" +__license__ = "GPL version 3" +__email__ = "info@3liz.org" + + +from qgis.core import QgsApplication +from qgis.PyQt.QtCore import Qt, QUrl, QSettings +from qgis.PyQt.QtGui import QDesktopServices, QIcon +from qgis.PyQt.QtWidgets import QAction +from qgis.utils import iface +import qgis + +# include +''' +from pg_metadata.connection_manager import ( + store_connections, + validate_connections_names, +) + + +from pg_metadata.locator import LocatorFilter +from pg_metadata.processing.provider import PgMetadataProvider +from pg_metadata.qgis_plugin_tools.tools.custom_logging import setup_logger +''' +import os +from .about_form import MetabaseAboutDialog +from .tools.resources import ( + # plugin_path, + pyperclip, + resources_path, + maj_verif, +) +pyperclip() +from .dock import CenRa_Metabase +from .editor import Metabase_Editor + +# from CenRa_Metabase.issues import CenRa_Issues + + +class PgMetadata: + def __init__(self): + """ Constructor. """ + self.dock = None + self.editor = None +# self.issues = None + self.provider = None + self.locator_filter = None + self.dock_action = None + self.help_action = None + plugin_dir = os.path.dirname(__file__) + end_find = plugin_dir.rfind('\\') + 1 + global NAME + NAME = plugin_dir[end_find:] + maj_verif(NAME) + + # Display About window on first use + version = qgis.utils.pluginMetadata('CenRa_METABASE', 'version') + s = QSettings() + versionUse = s.value("metadata/version", 1, type=str) + if str(versionUse) != str(version): + s.setValue("metadata/version", str(version)) + print(versionUse, version) + self.open_about_dialog() +# setup_logger('pg_metadata') + + # locale, file_path = setup_translation( + # folder=plugin_path("i18n"), file_pattern="CenRa_Metabase_{}.qm") + # if file_path: + # self.translator = QTranslator() + # self.translator.load(file_path) + # noinspection PyCallByClass,PyArgumentList + # QCoreApplication.installTranslator(self.translator) + + # noinspection PyPep8Naming + # def initProcessing(self): + # """ Add the QGIS Processing provider. """ + # if not self.provider: + # self.provider = PgMetadataProvider() + # QgsApplication.processingRegistry().addProvider(self.provider) + + # noinspection PyPep8Naming + def initGui(self): + """ Build the plugin GUI. """ + # self.initProcessing() + + # self.check_invalid_connection_names() + + self.toolBar = iface.addToolBar("CenRa_Metabase") + self.toolBar.setObjectName("CenRa_Metabase") + + icon = QIcon(resources_path('icons', 'icon.png')) + icon2 = QIcon(resources_path('icons', 'icon_2.png')) + + # Open the online help + self.help_action = QAction(icon, 'CenRa_Metabase', iface.mainWindow()) + iface.pluginHelpMenu().addAction(self.help_action) + self.help_action.triggered.connect(self.open_help) + if not self.editor: + self.editor = Metabase_Editor() + + self.editor_action = QAction(icon2, 'CenRa_Metabase', None) + self.toolBar.addAction(self.editor_action) + self.editor_action.triggered.connect(self.open_editor) + + if not self.dock: + self.dock = CenRa_Metabase() + iface.addDockWidget(Qt.DockWidgetArea(0x2), self.dock) + + # Open/close the dock from plugin menu + self.dock_action = QAction(icon, 'CenRa_Metabase', iface.mainWindow()) + iface.pluginMenu().addAction(self.dock_action) + self.dock_action.triggered.connect(self.open_dock) +# if not self.issues: +# self.issues = CenRa_Issues() + + +# self.issues_action = QAction(icon, 'CenRa_Metabase',None) +# self.toolBar.addAction(self.issues_action) +# self.issues_action.triggered.connect(self.open_issues) + ''' + if not self.locator_filter: + self.locator_filter = LocatorFilter(iface) + iface.registerLocatorFilter(self.locator_filter) + + @staticmethod + def check_invalid_connection_names(): + """ Check for invalid connection names in the QgsSettings. """ + valid, invalid = validate_connections_names() + n_invalid = len(invalid) + + if n_invalid == 0: + return + + invalid_text = ', '.join(invalid) + msg = QMessageBox() + msg.setIcon(QMessageBox.Warning) + msg.setWindowTitle(tr('PgMetadata: Database connection(s) not available')) + msg.setText(tr( + f'{n_invalid} connection(s) listed in PgMetadata’s settings are invalid or ' + f'no longer available: {invalid_text}')) + msg.setInformativeText(tr( + 'Do you want to remove these connection(s) from the PgMetadata settings? ' + '(You can also do this later with the “Set Connections” tool.)')) + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + clicked = msg.exec() + + if clicked == QMessageBox.Yes: + iface.messageBar().pushSuccess('PgMetadata', tr(f'{n_invalid} invalid connection(s) removed.')) + store_connections(valid) + if clicked == QMessageBox.No: + iface.messageBar().pushInfo('PgMetadata', tr(f'Keeping {n_invalid} invalid connections.')) + ''' + def open_about_dialog(self): + """ + About dialog + """ + dialog = MetabaseAboutDialog(iface) + dialog.exec() + + def open_help(): + """ Open the online help. """ + QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/')) + + def open_dock(self): + """ Open the dock. """ + self.dock.show() + self.dock.raise_() + + def open_editor(self): + self.editor.show() + self.editor.raise_() + +# def open_issues(self): +# self.issues.show() +# self.issues.raise_() + + def unload(self): + """ Unload the plugin. """ + # if self.editor: + # iface.removePluginMenu('CenRa_Metabase',self.editor_action) + # self.editor.removeToolBarIcon(self.editor_action) + + if self.dock: + iface.removeDockWidget(self.dock) + self.dock.deleteLater() + + if self.provider: + QgsApplication.processingRegistry().removeProvider(self.provider) + del self.provider + + if self.locator_filter: + iface.deregisterLocatorFilter(self.locator_filter) + del self.locator_filter + + if self.help_action: + iface.pluginHelpMenu().removeAction(self.help_action) + del self.help_action + + if self.dock_action: + iface.pluginMenu().removeAction(self.dock_action) + del self.dock_action + + @staticmethod + def run_tests(pattern='test_*.py', package=None): + """Run the test inside QGIS.""" + try: + from pathlib import Path + + from pg_metadata.qgis_plugin_tools.infrastructure.test_runner import ( + test_package, + ) + if package is None: + package = '{}.__init__'.format(Path(__file__).parent.name) + test_package(package, pattern) + except (AttributeError, ModuleNotFoundError): + message = 'Could not load tests. Are you using a production package?' + print(message) # NOQA diff --git a/CenRa_METABASE/README.md b/CenRa_METABASE/README.md new file mode 100644 index 0000000..86abd18 --- /dev/null +++ b/CenRa_METABASE/README.md @@ -0,0 +1 @@ +# CenRa_Metabase \ No newline at end of file diff --git a/CenRa_METABASE/__init__.py b/CenRa_METABASE/__init__.py new file mode 100644 index 0000000..4eaf7d0 --- /dev/null +++ b/CenRa_METABASE/__init__.py @@ -0,0 +1,10 @@ +__copyright__ = "Copyright 2021, 3Liz" +__license__ = "GPL version 3" +__email__ = "info@3liz.org" + + +# noinspection PyPep8Naming +def classFactory(iface): # pylint: disable=invalid-name + _ = iface + from CenRa_METABASE.CenRa_Metabase import PgMetadata + return PgMetadata() diff --git a/CenRa_METABASE/about_form.py b/CenRa_METABASE/about_form.py new file mode 100644 index 0000000..b9fa5a7 --- /dev/null +++ b/CenRa_METABASE/about_form.py @@ -0,0 +1,46 @@ +import os.path + +from pathlib import Path + +from qgis.PyQt import uic +# from qgis.PyQt.QtGui import QPixmap +from qgis.PyQt.QtWidgets import QDialog + +from .tools.resources import devlog + +ABOUT_FORM_CLASS, _ = uic.loadUiType( + os.path.join( + str(Path(__file__).resolve().parent), + 'tools/ui', + 'CenRa_about_form.ui' + ) +) + + +class MetabaseAboutDialog(QDialog, ABOUT_FORM_CLASS): + + """ About - Let the user display the about dialog. """ + + def __init__(self, iface, parent=None): + super().__init__(parent) + self.iface = iface + self.setupUi(self) + + self.viewer.setHtml(devlog('CenRa_METABASE')) + + self.rejected.connect(self.onReject) + self.buttonBox.rejected.connect(self.onReject) + self.buttonBox.accepted.connect(self.onAccept) + + def onAccept(self): + """ + Save options when pressing OK button + """ + self.accept() + + def onReject(self): + """ + Run some actions when + the user closes the dialog + """ + self.close() diff --git a/CenRa_METABASE/dock.py b/CenRa_METABASE/dock.py new file mode 100644 index 0000000..a2979e2 --- /dev/null +++ b/CenRa_METABASE/dock.py @@ -0,0 +1,453 @@ +"""Dock file.""" + +__copyright__ = 'Copyright 2020, 3Liz' +__license__ = 'GPL version 3' +__email__ = 'info@3liz.org' + +import logging +import os + +from collections import namedtuple +from enum import Enum +from functools import partial +from pathlib import Path +from xml.dom.minidom import parseString + +from qgis.core import ( + QgsApplication, + QgsProviderRegistry, + QgsSettings, +) +from qgis.PyQt.QtCore import QLocale, QUrl +from qgis.PyQt.QtGui import QDesktopServices, QIcon +from qgis.PyQt.QtPrintSupport import QPrinter +# from qgis.PyQt.QtWebKitWidgets import QWebPage +from qgis.PyQt.QtWidgets import ( + QAction, + QDockWidget, + QFileDialog, + QMenu, + QToolButton, +) +from qgis.utils import iface +import qgis +from .tools.resources import ( + load_ui, + resources_path, +) +try: + from .tools.PythonSQL import login_base +except ValueError: + print('Pas de fichier PythonSQL') + +DOCK_CLASS = load_ui('CenRa_Metabase_dockwidget_base.ui') +LOGGER = logging.getLogger('CenRa_Metabase') + + +class Format(namedtuple('Format', ['label', 'ext'])): + """ Format available for exporting metadata. """ + pass + + +class OutputFormats(Format, Enum): + """ Output format for a metadata sheet. """ + PDF = Format(label='PDF', ext='pdf') + HTML = Format(label='HTML', ext='html') + DCAT = Format(label='DCAT', ext='xml') + + +class CenRa_Metabase(QDockWidget, DOCK_CLASS): + + def __init__(self, parent=None): + _ = parent + super().__init__() + self.setupUi(self) + self.settings = QgsSettings() + + self.current_datasource_uri = None + self.current_connection = None + + # self.viewer.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) + # self.viewer.page().linkClicked.connect(self.open_link) + + # Help button + self.external_help.setText('') + self.external_help.setIcon(QIcon(QgsApplication.iconPath('mActionHelpContents.svg'))) + self.external_help.clicked.connect(self.open_external_help) + + # Flat table button + self.flatten_dataset_table.setText('') + # self.flatten_dataset_table.setToolTip(tr("Add the catalog table")) + self.flatten_dataset_table.setIcon(QgsApplication.getThemeIcon("/mActionAddHtml.svg")) + # self.flatten_dataset_table.clicked.connect(self.add_flatten_dataset_table) + + # Settings menu + self.config.setAutoRaise(True) + # self.config.setToolTip(tr("Settings")) + self.config.setPopupMode(QToolButton.ToolButtonPopupMode(2)) + self.config.setIcon(QgsApplication.getThemeIcon("/mActionOptions.svg")) + + self.auto_open_dock_action = QAction( + ("Dommage, cette option n'existe pas encore."), + iface.mainWindow()) + self.auto_open_dock_action.setCheckable(True) + self.auto_open_dock_action.setChecked( + self.settings.value("pgmetadata/auto_open_dock", True, type=bool) + ) + self.auto_open_dock_action.triggered.connect(self.save_auto_open_dock) + menu = QMenu() + menu.addAction(self.auto_open_dock_action) + self.config.setMenu(menu) + + # Setting PDF/HTML menu + self.save_button.setAutoRaise(True) + # self.save_button.setToolTip(tr("Save metadata")) + self.save_button.setPopupMode(QToolButton.ToolButtonPopupMode(2)) + self.save_button.setIcon(QIcon(QgsApplication.iconPath('mActionFileSave.svg'))) + + self.save_as_pdf = QAction( + ('Enregistrer en PDF') + '…', + iface.mainWindow()) + self.save_as_pdf.triggered.connect(partial(self.export_dock_content, OutputFormats.PDF)) + + self.save_as_html = QAction( + ('Enregistrer en HTML') + '…', + iface.mainWindow()) + self.save_as_html.triggered.connect(partial(self.export_dock_content, OutputFormats.HTML)) + self.save_as_dcat = QAction( + ('Enregistrer en DCAT') + '…', + iface.mainWindow()) + self.save_as_dcat.triggered.connect(partial(self.export_dock_content, OutputFormats.DCAT)) + + self.menu_save = QMenu() + self.menu_save.addAction(self.save_as_pdf) + self.menu_save.addAction(self.save_as_html) + self.menu_save.addAction(self.save_as_dcat) + self.save_button.setMenu(self.menu_save) + self.save_button.setEnabled(False) + + self.metadata = QgsProviderRegistry.instance().providerMetadata('postgres') + + # Display message in the dock + # if not settings_connections_names(): + # self.default_html_content_not_installed() + # else: + self.default_html_content_not_pg_layer() + iface.layerTreeView().currentLayerChanged.connect(self.layer_changed) + try: + login_base() + iface.layerTreeView().currentLayerChanged.connect(self.layer_changed) + except ValueError: + # qgis.utils.plugins['CenRa_METABASE'].initGui() + qgis.utils.plugins['CenRa_METABASE'].unload() + # self.default_html_content_not_pg_layer() + + if iface.activeLayer(): + layer = iface.activeLayer() + iface.layerTreeView().setCurrentLayer(None) + iface.layerTreeView().setCurrentLayer(layer) + + def export_dock_content(self, output_format: OutputFormats): + """ Export the current displayed metadata sheet to the given format. """ + layer_name = iface.activeLayer().name() + + file_path = os.path.join( + os.environ['USERPROFILE'], + 'Desktop\\{name}.{ext}'.format(name=layer_name, ext=output_format.ext) + ) + output_file = QFileDialog.getSaveFileName( + self, + ("Enregistrer en {format}").format(format=output_format.label), + file_path, + "{label} (*.{ext})".format( + label=output_format.label, + ext=output_format.ext, + ) + ) + if output_file[0] == '': + return + + self.settings.setValue("UI/lastFileNameWidgetDir", os.path.dirname(output_file[0])) + + output_file_path = output_file[0] + parent_folder = str(Path(output_file_path).parent) + + if output_format == OutputFormats.PDF: + printer = QPrinter() + printer.setOutputFormat(QPrinter.OutputFormat(1)) + # printer.setPageMargins(20,20,20,20,QPrinter.Unit(0)) + printer.setOutputFileName(output_file_path) + self.viewer.print(printer) + iface.messageBar().pushSuccess( + ("Export PDF"), + ( + "The metadata has been exported as PDF successfully in " + "{}").format(parent_folder, output_file_path) + ) + + elif output_format in [OutputFormats.HTML, OutputFormats.DCAT]: + if output_format == OutputFormats.HTML: + data_str = self.viewer.page().currentFrame().toHtml() + else: + layer = iface.activeLayer() + uri = layer.dataProvider().uri() + dataall = self.sql_info(uri) + data = self.sql_to_xml(dataall) + + with open(resources_path('xml', 'dcat.xml'), encoding='utf8') as xml_file: + xml_template = xml_file.read() + + xml = parseString(xml_template.format(language=data[0][0], content=data[0][1])) + + data_str = xml.toprettyxml() + + with open(output_file[0], "w", encoding='utf8') as file_writer: + file_writer.write(data_str) + iface.messageBar().pushSuccess( + ("Export") + ' ' + output_format.label, + ( + "The metadata has been exported as {format} successfully in " + "{path}").format( + format=output_format.label, folder=parent_folder, path=output_file_path) + ) + + def save_auto_open_dock(self): + """ Save settings about the dock. """ + self.settings.setValue("pgmetadata/auto_open_dock", self.auto_open_dock_action.isChecked()) + + def sql_to_xml(self, dataall): + distribution = '' + for y in dataall[1]: + distribution = distribution + ('' + '' + '{data}'.format(data=y[0]) + '{data}'.format(data=y[1]) + '{data}'.format(data=y[2]) + '{data}'.format(data=y[3]) + '{data}'.format(data=y[4]) + '' + '') + publisher = '' + for z in dataall[2]: + publisher = publisher + ('' + '' + '{data}'.format(data=z[1]) + '{data}'.format(data=z[3]) + '' + '') + data_str = [[dataall[0][26], '{data}'.format(data=dataall[0][1]) + '{data}'.format(data=dataall[0][4]) + '{data}'.format(data=dataall[0][5]) + '{data}'.format(data=dataall[0][26]) + '{data}'.format(data=dataall[0][28]) + '{data}'.format(data=dataall[0][20]) + '{data}'.format(data=dataall[0][11]) + '{data}'.format(data=dataall[0][21]) + '{data}'.format(data=dataall[0][13]) + distribution + publisher + '{data}'.format(data=", ".join(str(x) for x in dataall[0][24])) + '{data}'.format(data=", ".join(str(x) for x in dataall[0][6])) + '{data}'.format(data=dataall[0][12])]] + + return data_str + + @staticmethod + def sql_for_layer(uri, output_format: OutputFormats): + """ Get the SQL query for a given layer and output format. """ + locale = QgsSettings().value("locale/userLocale", QLocale().name()) + locale = locale.split('_')[0].lower() + + if output_format == [OutputFormats.HTML, OutputFormats.DCAT]: + sql = ( + "SELECT pgmetadata.get_dataset_item_html_content('{schema}', '{table}', '{locale}');" + ).format(schema=uri.schema(), table=uri.table(), locale=locale) + else: + raise NotImplementedError('Output format is not yet implemented.') + + return sql + + def layer_changed(self, layer): + """ When the layer has changed in the legend, we must check this new layer. """ + self.current_datasource_uri = None + self.current_connection = None + self.ce_trouve_dans_psql(layer) + + def add_flatten_dataset_table(self): + """ Add a flatten dataset table with all links and contacts. """ + ''' + connections, message = connections_list() + if not connections: + LOGGER.critical(message) + self.set_html_content('PgMetadata', message) + return + + if len(connections) > 1: + dialog = QInputDialog() + dialog.setComboBoxItems(connections) + dialog.setWindowTitle(tr("Database")) + dialog.setLabelText(tr("Choose the database to add the catalog")) + if not dialog.exec_(): + return + connection_name = dialog.textValue() + else: + connection_name = connections[0] + + metadata = QgsProviderRegistry.instance().providerMetadata('postgres') + connection = metadata.findConnection(connection_name) + + locale = QgsSettings().value("locale/userLocale", QLocale().name()) + locale = locale.split('_')[0].lower() + + uri = QgsDataSourceUri(connection.uri()) + uri.setTable(f'(SELECT * FROM pgmetadata.export_datasets_as_flat_table(\'{locale}\'))') + uri.setKeyColumn('uid') + + layer = QgsVectorLayer(uri.uri(), '{} - {}'.format(tr("Catalog"), connection_name), 'postgres') + QgsProject.instance().addMapLayer(layer) + ''' + + @staticmethod + def open_external_help(): + QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/')) + + @staticmethod + def open_link(url): + QDesktopServices.openUrl(url) + + def set_html_content(self, title=None, body=None): + """ Set the content in the dock. """ + # ink_logo=resources_path('icons', 'CEN_RA.png') + css_file = resources_path('css', 'dock.css') + with open(css_file, 'r', encoding='utf8') as f: + css = f.read() + + html = '' + # html += '' + html += ''.format(css=css) + # html += '' + # html += '' + # html += '' + if title: + html += '

{title}

'.format(title=title) + if body: + html += body + + html += '' + + # It must be a file, even if it does not exist on the file system. + # base_url = QUrl.fromLocalFile(resources_path('images', 'must_be_a_file.png')) + self.viewer.setHtml(html) + + def ce_trouve_dans_psql(self, layer): + try: + uri = layer.dataProvider().uri() + except AttributeError: + self.default_html_content_not_pg_layer() + self.save_button.setEnabled(False) + uri = '' + if uri != '': + if not uri.table(): + layertype = layer.providerType().lower() + if layertype == 'wms' or layertype == 'wfs': + self.set_html_to_wms(layer) + else: + self.default_html_content_not_pg_layer() + self.save_button.setEnabled(False) + else: + data_count = self.sql_check(uri) + # print(data_count) + if data_count == 0: + self.default_html_content_not_metadata() + self.save_button.setEnabled(False) + else: + self.build_html_content(layer, uri) + self.save_button.setEnabled(True) + + def build_html_content(self, layer, uri): + body = '' + + dataall = self.sql_info(uri) + data = dataall[0] + data_url = dataall[1] + data_contact = dataall[2] + # print(len(data_url)) + # data_collonne = [field.name() for field in layer.dataProvider().fields()] + + body += '

Identification

' + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=(", ".join(str(x) for x in data[6]))) + body += ''.format(data=(", ".join(str(x) for x in data[24]))) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += '
Titre{data[4]}
Description{data[5]}
Categories{data}
Thèmes{data}
Mots-clés{data[7]}
Dernier mise à jour{data[23]}
Langue{data[26]}
' + + body += '

Properties spatial

' + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += '
Niveau{data[8]}
Echelle minimum{data[9]}
Echelle maximum{data[10]}
Nombre d\'entités {data[15]}
Type de géométrie{data[16]}
Nom de projection{data[17]}
ID de projection{data[18]}
Emprise{data[28]}
' + + # body += '
' + + body += '

Publication

' + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += '
Date{data[11]}
Fréquence de mise à jour{data[12]}
Licence{data[13]}
Licence attribué{data[25]}
Restriction{data[14]}
' + + body += '

Lien

' + body += '' + for value_url in data_url: + body += ''.format(value_url=value_url) + body += '
TypeURLType MIMEFormatTaille
{value_url[0]}{value_url[1]}{value_url[2]}{value_url[3]}{value_url[4]}
' + ''' + body += '

Liste des champs

' + for collonne in data_collonne: + body += ''.format(collonne=collonne,defini='') + body += '
{collonne}{defini}
' + ''' + body += '

Contacts

' + body += '' + for value_contact in data_contact: + body += ''.format(value_contact=value_contact) + body += '
RôleNomOrganisationEmailTélèphone
{value_contact[0]}{value_contact[1]}{value_contact[2]}{value_contact[3]}{value_contact[4]}
' + + body += '

Metadata

' + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += ''.format(data=data) + body += '
Table{data[2]}
Schema{data[3]}
Date de création{data[20]}
Date de modification{data[21]}
Encodage{data[27]}
UUID{data[1]}
' + + self.set_html_content( + layer.name(), body) + + def set_html_to_wms(self, layer): + self.set_html_content( + 'CenRa Metadata', (layer.htmlMetadata())) + + def default_html_content_not_pg_layer(self): + """ When it's not a PostgreSQL layer. """ + self.set_html_content( + 'CenRa Metadata', ('Vous devez cliquer sur une couche dans la légende qui est stockée dans PostgreSQL.')) + + def default_html_content_not_metadata(self): + self.set_html_content( + 'CenRa Metadata', ('La couche ne contien pas de métadonnée.')) + + def sql_check(self, uri): + cur = login_base() + table = uri.table() + schema = uri.schema() + + sql_count = """SELECT count(uid) FROM metadata.dataset + WHERE schema_name LIKE '""" + schema + """' AND table_name LIKE '""" + table + """';""" + + cur.execute(sql_count) + data_count = cur.fetchall() + cur.close() + return data_count[0][0] + + def sql_info(self, uri): + cur = login_base() + table = uri.table() + schema = uri.schema() + # [s for s in iface.activeLayer().source().split(" ") if "dbname" in s][0].split("'")[1] + sql_find = """SELECT *,right(left(st_astext(geom,2),-2),-9) FROM metadata.dataset + WHERE schema_name LIKE '""" + schema + """' AND table_name LIKE '""" + table + """';""" + cur.execute(sql_find) + data_general = cur.fetchall() + sql_findurl = """SELECT type,url,mime,format,taille FROM metadata.dataurl WHERE schema_name LIKE '""" + schema + """' AND table_name LIKE '""" + table + """';""" + cur.execute(sql_findurl) + data_url = cur.fetchall() + sql_findcontact = """SELECT role,nom,organisation,email,telephone FROM metadata.datacontact WHERE schema_name LIKE '""" + schema + """' AND table_name LIKE '""" + table + """';""" + cur.execute(sql_findcontact) + data_contact = cur.fetchall() + cur.close() + return data_general[0], data_url, data_contact diff --git a/CenRa_METABASE/editor.py b/CenRa_METABASE/editor.py new file mode 100644 index 0000000..7896e2d --- /dev/null +++ b/CenRa_METABASE/editor.py @@ -0,0 +1,775 @@ +import logging +import os + +# from collections import namedtuple +# from enum import Enum +# from functools import partial +# from pathlib import Path +# from xml.dom.minidom import parseString +# from qgis.gui import * +from qgis.core import ( + QgsApplication, + QgsSettings, + QgsGeometry, + QgsWkbTypes, + Qgis, +) +from qgis.PyQt import QtGui, QtCore +from qgis.PyQt.QtGui import QIcon +# from qgis.PyQt.QtPrintSupport import QPrinter +# from qgis.PyQt.QtWebKitWidgets import QWebPage +import psycopg2 +from qgis.PyQt.QtWidgets import ( + QDialog, + QFileDialog, + QTableWidgetItem, +) +from qgis.utils import iface + +try: + from .tools.PythonSQL import login_base +except ValueError: + print('Pas de fichier PythonSQL') + +from .tools.resources import ( + load_ui, + resources_path, + # send_issues, +) +# from .issues import CenRa_Issues + +EDITOR_CLASS = load_ui('CenRa_Metabase_editorwidget_base.ui') +LOGGEr = logging.getLogger('CenRa_Metabase') + + +class Metabase_Editor(QDialog, EDITOR_CLASS): + def __init__(self, parent=None): + _ = parent + super().__init__() + self.setupUi(self) + self.settings = QgsSettings() + self.setWindowIcon(QtGui.QIcon(resources_path('icons', 'icon.png'))) + self.import_xml.setAutoRaise(True) + self.import_xml.setText('') + self.import_xml.setIcon(QIcon(QgsApplication.iconPath('mActionAddHtml.svg'))) + self.import_xml.clicked.connect(self.py_import_xml) + self.issues_app.setAutoRaise(True) + self.issues_app.setText('') + self.issues_app.setIcon(QIcon(QgsApplication.iconPath('mIconInfo.svg'))) + self.auto_adding.setIcon(QtGui.QIcon(resources_path('icons', 'auto_add.png'))) + self.auto_adding.hide() + if os.getlogin() == 'tlaveille' or 'lpoulin' or 'rclement': + self.auto_adding.show() + + self.auto_adding.clicked.connect(self.auto_run) + # self.issues_app.clicked.connect(self.issues_open) + self.categories_select_view.itemDoubleClicked.connect(self.add_categories_view) + self.categories_view.itemDoubleClicked.connect(self.deleter_categories_view) + self.themes_select_view.itemDoubleClicked.connect(self.add_themes_view) + self.themes_view.itemDoubleClicked.connect(self.deleter_themes_view) + + self.annuler_button.clicked.connect(self.close) + self.ok_button.clicked.connect(self.add_metadata) + + self.add_lien_button.clicked.connect(self.add_lien) + self.add_contact_button.clicked.connect(self.add_contact) + self.delete_lien_button.clicked.connect(self.delete_lien) + self.delete_contact_button.clicked.connect(self.delete_contact) + + def auto_run(self): + self.role_box.setCurrentIndex(1) + self.nom_line.setText('LAVEILLE') + self.organisation_box.setCurrentIndex(1) + self.email_line.setText('tom.laveille@cen-rhonealpes.fr') + self.telephone_line.setText('0451260811') + self.add_contact() + + self.type_box.setCurrentIndex(16) + self.url_line.setText('www.cen-rhonealpes.fr') + self.mime_box.setCurrentIndex(16) + self.format_box.setCurrentIndex(0) + self.taille_line.setText('45') + self.add_lien() + + def add_metadata(self): + table_name = layer.dataProvider().uri().table() + schema_name = layer.dataProvider().uri().schema() + text_titre = self.titre_line.text() + text_description = self.description_text.toPlainText() + text_mots_cles = self.mots_cles_text.toPlainText() + text_date_maj = str(self.date_maj_date.date().toPyDate()) + text_langue = self.langue_box.currentText() + + row_count_categories = self.categories_view.rowCount() + row_count_themes = self.themes_view.rowCount() + row = 1 + array_categories = '{' + while row_count_categories >= row: + if row_count_categories != row: + array_categories += (self.categories_view.item(row - 1, 0).text()) + ', ' + else: + array_categories += (self.categories_view.item(row - 1, 0).text()) + row = row + 1 + array_categories += '}' + row = 1 + array_themes = '{' + while row_count_themes >= row: + if row_count_themes != row: + array_themes += (self.themes_view.item(row - 1, 0).text()) + ', ' + else: + array_themes += (self.themes_view.item(row - 1, 0).text()) + row = row + 1 + array_themes += '}' + + text_date_creation = str(self.date_creation_date.date().toPyDate()) + text_date_modification = str(self.date_modification_date.date().toPyDate()) + text_encode = self.encodage_box.currentText() + text_extend = self.extend_plaintext.toPlainText() + int_nbr_entites = (self.nbr_layers.toPlainText()) + text_geomtype = self.typegeom_plaintext.toPlainText() + text_crsname = self.crsname_plaintext.toPlainText() + text_crscode = self.crscode_plaintext.toPlainText() + text_niveau = self.niveau_plain.toPlainText() + + text_echelle_min = self.echelle_min_plain.toPlainText() + text_echelle_max = self.echelle_max_plain.toPlainText() + if text_echelle_min == '': + text_echelle_min = 'NULL' + if text_echelle_max == '': + text_echelle_max = 'NULL' + + text_date_publication = str(self.date_publication_date.date().toPyDate()) + + text_frequence = self.frequence_box.currentText() + text_restriction = self.restriction_box.currentText() + text_licence = self.licence_box.currentText() + text_licence_attrib = self.licence_attrib_box.currentText() + + ''' + row_count_link = self.table_lien.rowCount() + row = 1 + array_link = '' + while row_count_link >= row: + if row_count_link != row: + array_link += "('" + table_name + "', '" + schema_name + "', '" + (self.table_lien.item(row - 1,1).text()) + "', '" + (self.table_lien.item(row - 1,2).text()) + "', '" + (self.table_lien.item(row - 1,3).text()) + "', '" + (self.table_lien.item(row - 1,4).text()) + "', '" + (self.table_lien.item(row - 1,5).text()) + "')" + ', ' + else: + array_link += "('" + table_name + "', '" + schema_name + "', '" + (self.table_lien.item(row - 1,1).text()) + "', '" + (self.table_lien.item(row - 1,2).text()) + "', '" + (self.table_lien.item(row - 1,3).text()) + "', '" + (self.table_lien.item(row - 1,4).text()) + "', '" + (self.table_lien.item(row - 1,5).text()) + "')" + row = row + 1 + + row_count_contact = self.table_contact.rowCount() + row = 1 + array_contact = '' + while row_count_contact >= row: + if row_count_contact != row: + array_contact += "('" + table_name + "', '" + schema_name + "', '" + (self.table_contact.item(row - 1,1).text()) + "', '" + (self.table_contact.item(row - 1,2).text()) + "', '" + (self.table_contact.item(row - 1,3).text()) + "', '" + (self.table_contact.item(row - 1,4).text()) + "', '" + (self.table_contact.item(row - 1,5).text()) + "')" + ', ' + else: + array_contact += "('" + table_name + "', '" + schema_name + "', '" + (self.table_contact.item(row - 1,1).text()) + "', '" + (self.table_contact.item(row - 1,2).text()) + "', '" + (self.table_contact.item(row - 1,3).text()) + "', '" + (self.table_contact.item(row - 1,4).text()) + "', '" + (self.table_contact.item(row - 1,5).text()) + "')" + row = row + 1 + ''' + + exist = self.status_metadata(layer) + cur_con = login_base(take=True) + cur = cur_con[0] + con = cur_con[1] + list_champs_sql = '' + values_sql_add = '' + if exist: + SQL_uid = """SELECT uid from metadata.dataset where table_name like '""" + table_name + """' and schema_name like '""" + schema_name + """';""" + cur.execute(SQL_uid) + text_uid = (cur.fetchall())[0][0] + + SQL_delete = """DELETE from metadata.dataset where table_name like '""" + table_name + """' and schema_name like '""" + schema_name + """';""" + cur.execute(SQL_delete) + values_sql_add += "'" + text_uid + "'," + + list_champs_sql += 'uid,' + global uid_delete_list_link, uid_delete_list_contact + if len(uid_delete_list_link) >= 35: + SQL_delete_link = """DELETE FROM metadata.dataurl WHERE uid IN (""" + uid_delete_list_link[:- 1] + """);""" + cur.execute(SQL_delete_link) + uid_delete_list_link = '' + if len(uid_delete_list_contact) >= 35: + SQL_delete_contact = """DELETE FROM metadata.datacontact WHERE uid IN (""" + uid_delete_list_contact[:- 1] + """);""" + cur.execute(SQL_delete_contact) + uid_delete_list_contact = '' + + list_champs_sql += 'table_name, schema_name, title, abstract, keywords, data_last_update, langue, categories, themes, creation_date, update_date, encode, geom, spatial_extent, feature_count, geometry_type, projection_name, projection_authid, spatial_level, minimum_optimal_scale, maximum_optimal_scale, publication_date, publication_frequency, confidentiality, license, license_attribution' + values_sql_add += "'" + table_name + "', '" + schema_name + "', '" + text_titre + "', '" + text_description + "', '" + text_mots_cles + "', '" + text_date_maj + "', '" + text_langue + "', '" + array_categories + "', '" + array_themes + "', '" + text_date_creation + "', '" + text_date_modification + "', '" + text_encode + "', '" + text_extend + "', '" + text_extend + "', '" + int_nbr_entites + "', '" + text_geomtype + "', '" + text_crsname + "', '" + text_crscode + "', '" + text_niveau + "'," + text_echelle_min + "," + text_echelle_max + ",'" + text_date_publication + "', '" + text_frequence + "', '" + text_restriction + "', '" + text_licence + "', '" + text_licence_attrib + "'" + + SQL_add = """INSERT INTO metadata.dataset (""" + list_champs_sql + """) VALUES (""" + values_sql_add + """);""" + + cur.execute(SQL_add) + + global array_link, array_contact + if len(array_link) >= 25: + array_link = array_link[:- 1] + SQL_add_link = """INSERT INTO metadata.dataurl (table_name, schema_name, type, url, mime, format, taille) VALUES """ + array_link + """;""" + cur.execute(SQL_add_link) + array_link = '' + + if len(array_contact) >= 25: + array_contact = array_contact[0:- 1] + SQL_add_contact = """INSERT INTO metadata.datacontact (table_name, schema_name, role, nom, organisation, email, telephone) VALUES """ + array_contact + """;""" + cur.execute(SQL_add_contact) + array_contact = '' + + con.commit() + cur.close() + self.close() + + iface.layerTreeView().setCurrentLayer(None) + iface.layerTreeView().setCurrentLayer(layer) + + def raise_(self): + self.activateWindow() + global layer + layer = iface.activeLayer() + global uid_delete_list_link, uid_delete_list_contact, array_link, array_contact + uid_delete_list_link = '' + uid_delete_list_contact = '' + array_link = '' + array_contact = '' + + is_ok = self.is_in_psql(layer) + if is_ok: + exist = self.status_metadata(layer) + if exist: + self.reload_data(layer) + else: + self.new_data(layer) + else: + self.close() + iface.messageBar().pushMessage("Information:", "Cette couche n'est pas stockée dans PostgreSQL", level=Qgis.Warning, duration=30) + + def is_in_psql(self, layer): + try: + uri = layer.dataProvider().uri() + except AttributeError: + uri = '' + return False + if uri != '': + if not uri.table(): + return False + else: + return True + + def status_metadata(self, layer): + uri = layer.dataProvider().uri() + table = uri.table() + schema = uri.schema() + + cur = login_base() + count_sql = """ SELECT count(uid) FROM metadata.dataset WHERE table_name LIKE '""" + table + """' AND schema_name LIKE '""" + schema + """';""" + + cur.execute(count_sql) + data_count = (cur.fetchall())[0][0] + if data_count == 1: + return True + else: + return False + cur.close() + + def new_data(self, layer): + # print(layer.name(),'is new data') + reloader = False + self.interface_view(layer, reloader) + + def reload_data(self, layer): + # print(layer.name(),'reload data') + reloader = True + self.interface_view(layer, reloader) + + def interface_view(self, layer, reloader): + + self.description_text.setText(None) + self.mots_cles_text.setText(None) + self.uuid_ligne.setText(None) + self.niveau_plain.setPlainText(None) + self.echelle_min_plain.setPlainText(None) + self.echelle_max_plain.setPlainText(None) + self.url_line.setText(None) + self.taille_line.setText(None) + self.nom_line.setText(None) + self.email_line.setText(None) + self.telephone_line.setText(None) + self.encodage_box.clear() + self.frequence_box.clear() + self.licence_box.clear() + self.licence_attrib_box.clear() + self.restriction_box.clear() + + all_list = self.fletch_ref() + + categories_list = all_list[0] + themes_list = all_list[1] + langue_list = all_list[2] + encodage_list = all_list[3] + frequency_list = all_list[4] + confidentiality_list = all_list[5] + license_list = all_list[6] + type_list = all_list[7] + mime_list = all_list[8] + format_list = all_list[9] + role_list = all_list[10] + organisation_list = all_list[11] + + # langue_box + self.langue_box.clear() + self.langue_box.addItem('') + # self.langue_box.addItem('Fr') + # self.langue_box.addItem('En') + for langue_list_data in langue_list: + self.langue_box.addItem(langue_list_data[0]) + + for encodage_list_data in encodage_list: + self.encodage_box.addItem(encodage_list_data[0]) + + self.table_ligne.setText(layer.dataProvider().uri().table()) + self.schema_ligne.setText(layer.dataProvider().uri().schema()) + + # categories_select_view + self.categories_select_view.setColumnCount(1) + self.categories_select_view.setColumnWidth(0, 230) + self.categories_select_view.setHorizontalHeaderLabels(['List des categories']) + # categories_view + self.categories_view.setRowCount(0) + self.categories_view.setColumnCount(1) + self.categories_view.setColumnWidth(0, 230) + self.categories_view.setHorizontalHeaderLabels(['Categories']) + + # themes_select_view + self.themes_select_view.setColumnCount(1) + self.themes_select_view.setColumnWidth(0, 230) + self.themes_select_view.setHorizontalHeaderLabels(['List des thèmes']) + # themes_view + self.themes_view.setRowCount(0) + self.themes_view.setColumnCount(1) + self.themes_view.setColumnWidth(0, 230) + self.themes_view.setHorizontalHeaderLabels(['Thèmes']) + + # lien_view + self.table_lien.setRowCount(0) + self.table_lien.setColumnCount(6) + self.table_lien.setColumnWidth(0, 0) + self.table_lien.setHorizontalHeaderLabels(['', 'Type', 'URL', 'MIME', 'Format', 'Taille']) + + # contact_view + self.table_contact.setRowCount(0) + self.table_contact.setColumnCount(6) + self.table_contact.setColumnWidth(0, 0) + self.table_contact.setHorizontalHeaderLabels(['', 'Rôle', 'Nom', 'Organisation', 'Email', 'Telephone']) + + # print(self.date_maj_date.date().toPyDate()) + vector_extend = layer.extent() + polygone_extend = QgsGeometry.fromRect(vector_extend).asWkt() + self.extend_plaintext.setPlainText(str(polygone_extend)) + + qgstype = str(layer.type())[10:] + + if qgstype != 'Raster': + count_layers = str(layer.featureCount()) + geomtype = QgsWkbTypes.displayString(layer.wkbType()) + elif qgstype == 'Raster': + count_layers = str(layer.dataProvider().bandCount()) + geomtype = qgstype + + self.nbr_layers.setPlainText(count_layers) + self.typegeom_plaintext.setPlainText(geomtype) + crs_name = str(layer.crs().description()) + self.crsname_plaintext.setPlainText(crs_name) + crs_code = str(layer.crs().authid()) + self.crscode_plaintext.setPlainText(crs_code) + + self.frequence_box.addItem('') + self.restriction_box.addItem('') + self.licence_box.addItem('') + self.licence_attrib_box.addItem('') + for frequency_list_data in frequency_list: + self.frequence_box.addItem(frequency_list_data[0]) + for confidentiality_list_data in confidentiality_list: + self.restriction_box.addItem(confidentiality_list_data[0]) + for license_list_data in license_list: + self.licence_box.addItem(license_list_data[0]) + + self.type_box.clear() + self.mime_box.clear() + self.format_box.clear() + self.role_box.clear() + self.organisation_box.clear() + + self.type_box.addItem('') + self.mime_box.addItem('') + self.format_box.addItem('') + self.role_box.addItem('') + self.organisation_box.addItem('') + + for type_list_data in type_list: + self.type_box.addItem(type_list_data[0]) + for mime_list_data in mime_list: + self.mime_box.addItem(mime_list_data[0]) + for format_list_data in format_list: + self.format_box.addItem(format_list_data[0]) + for role_list_data in role_list: + self.role_box.addItem(role_list_data[0]) + for organisation_list_data in organisation_list: + self.organisation_box.addItem(organisation_list_data[0]) + + if reloader: + sql_dataload = self.sql_info(layer.dataProvider().uri()) + sql_contactlink = self.sql_infoother(layer.dataProvider().uri()) + sql_datalink = sql_contactlink[0] + sql_datacontact = sql_contactlink[1] + + # print(sql_dataload) + self.titre_line.setText(sql_dataload[4]) + self.date_maj_date.setDateTime(sql_dataload[23]) + self.date_publication_date.setDateTime(sql_dataload[11]) + self.description_text.setText(sql_dataload[5]) + self.mots_cles_text.setText(sql_dataload[7]) + array_langue_box = [self.langue_box.itemText(i) for i in range(self.langue_box.count())] + self.langue_box.setCurrentIndex(array_langue_box.index(sql_dataload[26])) + self.uuid_ligne.setText(sql_dataload[1]) + + self.categories_view.setRowCount(len(sql_dataload[6])) + i = 0 + for categorie_data in sql_dataload[6]: + self.categories_view.setItem(i, 0, QTableWidgetItem(categorie_data)) + i = i + 1 + self.themes_view.setRowCount(len(sql_dataload[24])) + i = 0 + for themes_data in sql_dataload[24]: + self.themes_view.setItem(i, 0, QTableWidgetItem(themes_data)) + i = i + 1 + + self.categories_select_view.setRowCount(len(categories_list) - len(sql_dataload[6])) + self.themes_select_view.setRowCount(len(themes_list) - len(sql_dataload[24])) + i = 0 + for categorie_select_data in categories_list: + try: + in_index = sql_dataload[6].index(categorie_select_data[0]) + in_index = False + except ValueError: + in_index = True + if in_index: + self.categories_select_view.setItem(i, 0, QTableWidgetItem(categorie_select_data[0])) + i = i + 1 + i = 0 + for themes_select_data in themes_list: + try: + in_index = sql_dataload[24].index(themes_select_data[0]) + in_index = False + except ValueError: + in_index = True + if in_index: + self.themes_select_view.setItem(i, 0, QTableWidgetItem(themes_select_data[0])) + i = i + 1 + + array_encodage_box = [self.encodage_box.itemText(i) for i in range(self.encodage_box.count())] + self.encodage_box.setCurrentIndex(array_encodage_box.index(sql_dataload[27])) + + self.niveau_plain.setPlainText(sql_dataload[8]) + + if str(sql_dataload[9]) == 'None': + value_echelle_min = '' + else: + value_echelle_min = str(sql_dataload[9]) + + if str(sql_dataload[10]) == 'None': + value_echelle_max = '' + else: + value_echelle_max = str(sql_dataload[10]) + + self.echelle_min_plain.setPlainText(value_echelle_min) + self.echelle_max_plain.setPlainText(value_echelle_max) + + array_frequence_box = [self.frequence_box.itemText(i) for i in range(self.frequence_box.count())] + self.frequence_box.setCurrentIndex(array_frequence_box.index(sql_dataload[12])) + array_licence_box = [self.licence_box.itemText(i) for i in range(self.licence_box.count())] + self.licence_box.setCurrentIndex(array_licence_box.index(sql_dataload[13])) + array_confidentiality_box = [self.restriction_box.itemText(i) for i in range(self.restriction_box.count())] + self.restriction_box.setCurrentIndex(array_confidentiality_box.index(sql_dataload[14])) + array_licence_attrib_box = [self.licence_attrib_box.itemText(i) for i in range(self.licence_attrib_box.count())] + self.licence_attrib_box.setCurrentIndex(array_licence_attrib_box.index(sql_dataload[25])) + + c = 0 + # self.table_lien.setRowCount(len(sql_datalink)) + for lien_data in sql_datalink: + self.table_lien.insertRow(c) + self.table_lien.setItem(c, 0, QTableWidgetItem(lien_data[1])) + self.table_lien.setItem(c, 1, QTableWidgetItem(lien_data[4])) + self.table_lien.setItem(c, 2, QTableWidgetItem(lien_data[5])) + self.table_lien.setItem(c, 3, QTableWidgetItem(lien_data[6])) + self.table_lien.setItem(c, 4, QTableWidgetItem(lien_data[7])) + self.table_lien.setItem(c, 5, QTableWidgetItem(lien_data[8])) + c = c + 1 + c = 0 + # self.table_contact.setRowCount(len(sql_datacontact)) + for contact_data in sql_datacontact: + self.table_contact.insertRow(c) + self.table_contact.setItem(c, 0, QTableWidgetItem(contact_data[1])) + self.table_contact.setItem(c, 1, QTableWidgetItem(contact_data[4])) + self.table_contact.setItem(c, 2, QTableWidgetItem(contact_data[5])) + self.table_contact.setItem(c, 3, QTableWidgetItem(contact_data[6])) + self.table_contact.setItem(c, 4, QTableWidgetItem(contact_data[7])) + self.table_contact.setItem(c, 5, QTableWidgetItem(contact_data[8])) + c = c + 1 + + else: + + # titre_line + self.titre_line.setText(layer.name()) + self.langue_box.setCurrentIndex(1) + # date_maj_date + now = QtCore.QDateTime.currentDateTime() + self.date_maj_date.setDateTime(now) + self.date_creation_date.setDateTime(now) + self.date_modification_date.setDateTime(now) + self.date_publication_date.setDateTime(now) + self.categories_select_view.setRowCount(len(categories_list)) + self.themes_select_view.setRowCount(len(themes_list)) + i = 0 + for categorie_select_data in categories_list: + self.categories_select_view.setItem(i, 0, QTableWidgetItem(categorie_select_data[0])) + i = i + 1 + i = 0 + for themes_select_data in themes_list: + self.themes_select_view.setItem(i, 0, QTableWidgetItem(themes_select_data[0])) + i = i + 1 + + # print(self.langue_box.currentText()) + + def sql_info(self, uri): + cur = login_base() + table = uri.table() + schema = uri.schema() + # [s for s in iface.activeLayer().source().split(" ") if "dbname" in s][0].split("'")[1] + sql_find = """SELECT *, right(left(st_astext(geom,2),-2),-9) FROM metadata.dataset + WHERE schema_name LIKE '""" + schema + """' AND table_name LIKE '""" + table + """';""" + cur.execute(sql_find) + data_general = cur.fetchall() + cur.close() + return data_general[0] + + def sql_infoother(self, uri): + cur = login_base() + table = uri.table() + schema = uri.schema() + + sql_findlink = """SELECT * FROM metadata.dataurl + WHERE schema_name LIKE '""" + schema + """' AND table_name LIKE '""" + table + """';""" + cur.execute(sql_findlink) + data_link = cur.fetchall() + + sql_findcontact = """SELECT * FROM metadata.datacontact + WHERE schema_name LIKE '""" + schema + """' AND table_name LIKE '""" + table + """';""" + cur.execute(sql_findcontact) + data_contact = cur.fetchall() + + cur.close() + return data_link, data_contact + + def add_categories_view(self): + values_add_categories = self.categories_select_view.selectedItems()[0].text() + self.categories_select_view.removeRow(self.categories_select_view.currentRow()) + self.categories_view.insertRow(0) + self.categories_view.setItem(0, 0, QTableWidgetItem(values_add_categories)) + + def deleter_categories_view(self): + values_deleter_categories = self.categories_view.selectedItems()[0].text() + self.categories_view.removeRow(self.categories_view.currentRow()) + self.categories_select_view.insertRow(0) + self.categories_select_view.setItem(0, 0, QTableWidgetItem(values_deleter_categories)) + + def add_themes_view(self): + values_add_themes = self.themes_select_view.selectedItems()[0].text() + self.themes_select_view.removeRow(self.themes_select_view.currentRow()) + self.themes_view.insertRow(0) + self.themes_view.setItem(0, 0, QTableWidgetItem(values_add_themes)) + + def deleter_themes_view(self): + values_deleter_themes = self.themes_view.selectedItems()[0].text() + self.themes_view.removeRow(self.themes_view.currentRow()) + self.themes_select_view.insertRow(0) + self.themes_select_view.setItem(0, 0, QTableWidgetItem(values_deleter_themes)) + + def add_lien(self): + cur = login_base() + maxrow = self.table_lien.rowCount() + self.table_lien.insertRow(maxrow) + + table = layer.dataProvider().uri().table() + schema = layer.dataProvider().uri().schema() + + if self.taille_line.text() == '': + sql_sizefile = """SELECT pg_size_pretty(pg_total_relation_size('""" + schema + '.' + table + """'));""" + try: + cur.execute(sql_sizefile) + boolean = True + + except psycopg2.errors.UndefinedTable: + boolean = False + + if boolean is True: + size_file = (cur.fetchall())[0][0] + else: + size_file = '' + + else: + size_file = self.taille_line.text() + + self.table_lien.setItem(maxrow, 0, QTableWidgetItem('new_value')) + self.table_lien.setItem(maxrow, 1, QTableWidgetItem(self.type_box.currentText())) + self.table_lien.setItem(maxrow, 2, QTableWidgetItem(self.url_line.text())) + self.table_lien.setItem(maxrow, 3, QTableWidgetItem(self.mime_box.currentText())) + self.table_lien.setItem(maxrow, 4, QTableWidgetItem(self.format_box.currentText())) + self.table_lien.setItem(maxrow, 5, QTableWidgetItem(str(size_file))) + + global array_link + array_link += "('" + table + "', '" + schema + "', '" + self.type_box.currentText() + "', '" + self.url_line.text() + "', '" + self.mime_box.currentText() + "', '" + self.format_box.currentText() + "', '" + size_file + "')," + + cur.close() + + def add_contact(self): + maxrow = self.table_contact.rowCount() + self.table_contact.insertRow(maxrow) + + self.table_contact.setItem(maxrow, 0, QTableWidgetItem('new_value')) + self.table_contact.setItem(maxrow, 1, QTableWidgetItem(self.role_box.currentText())) + self.table_contact.setItem(maxrow, 2, QTableWidgetItem(self.nom_line.text())) + self.table_contact.setItem(maxrow, 3, QTableWidgetItem(self.organisation_box.currentText())) + self.table_contact.setItem(maxrow, 4, QTableWidgetItem(self.email_line.text())) + self.table_contact.setItem(maxrow, 5, QTableWidgetItem(self.telephone_line.text())) + + table = layer.dataProvider().uri().table() + schema = layer.dataProvider().uri().schema() + + global array_contact + array_contact += "('" + table + "', '" + schema + "', '" + self.role_box.currentText() + "', '" + self.nom_line.text() + "', '" + self.organisation_box.currentText() + "', '" + self.email_line.text() + "', '" + self.telephone_line.text() + "')," + + def delete_lien(self): + fin = '' + global uid_delete_list_link, array_link + try: + lien_uid = self.table_lien.item(self.table_lien.currentRow(), 0).text() + except AttributeError: + lien_uid = True + self.table_lien.removeRow(self.table_lien.currentRow()) + if lien_uid == 'new_value': + position = self.table_lien.currentRow() + if position < 0: + position = position + 1 + run_x = 0 + while position >= run_x: + # print(position, run_x) + if run_x == 0: + debut = array_link.find("(") + else: + debut = array_link.find("(", fin + 1) + fin = array_link.find(")", debut) + # print(debut, fin) + if run_x == 50: + break + run_x += 1 + # print(array_link[fin + 1:]) + if debut <= 0: + debut = 1 + fin += 1 + array_link = array_link[:debut - 1] + array_link[fin + 1:] + # print('a:', array_link) + elif lien_uid is True: + print('Pas de ligne "Lien"') + else: + uid_delete_list_link += "'" + lien_uid + "'," + + def delete_contact(self): + fin = '' + global uid_delete_list_contact, array_contact + try: + contact_uid = self.table_contact.item(self.table_contact.currentRow(), 0).text() + except AttributeError: + contact_uid = True + self.table_contact.removeRow(self.table_contact.currentRow()) + if contact_uid == 'new_value': + position = self.table_contact.currentRow() + if position < 0: + position = position + 1 + # print('p:', position) + run_x = 0 + while position >= run_x: + if run_x == 0: + debut = array_contact.find("(") + else: + debut = array_contact.find("(", fin + 1) + fin = array_contact.find(")", debut) + # print(debut, fin) + if run_x == 50: + break + run_x += 1 + # print(array_contact[fin + 1:]) + if debut <= 0: + debut = 1 + fin += 1 + array_contact = array_contact[:debut - 1] + array_contact[fin + 1:] + # print('a:', array_contact) + elif contact_uid is True: + print('Pas de ligne "Contact"') + else: + uid_delete_list_contact += "'" + contact_uid + "'," + + def fletch_ref(self): + cur = login_base() + + SQL_categories = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'dataset.categories' ORDER BY code, item_order;""" + SQL_themes = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'dataset.themes' ORDER BY label_fr;""" + SQL_langue = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'dataset.langue';""" + SQL_encodage = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'dataset.encodage';""" + SQL_frequency = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'dataset.publication_frequency' ORDER BY label_fr;""" + SQL_confidentiality = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'dataset.confidentiality' ORDER BY label_fr;""" + SQL_license = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'dataset.license' ORDER BY label_fr;""" + SQL_type = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'link.type' ORDER BY label_fr;""" + SQL_mime = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'link.mime' ORDER BY label_fr;""" + SQL_format = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'link.format' ORDER BY label_fr;""" + SQL_role = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'contact.contact_role' ORDER BY label_fr;""" + SQL_organisation = """SELECT label_fr FROM metadata.glossary WHERE field LIKE 'contact.organisation' ORDER BY label_fr;""" + + cur.execute(SQL_categories) + categories_list = cur.fetchall() + cur.execute(SQL_themes) + themes_list = cur.fetchall() + cur.execute(SQL_langue) + langue_list = cur.fetchall() + cur.execute(SQL_encodage) + encodage_list = cur.fetchall() + + cur.execute(SQL_frequency) + frequency_list = cur.fetchall() + cur.execute(SQL_confidentiality) + confidentiality_list = cur.fetchall() + cur.execute(SQL_license) + license_list = cur.fetchall() + + cur.execute(SQL_type) + type_list = cur.fetchall() + cur.execute(SQL_mime) + mime_list = cur.fetchall() + cur.execute(SQL_format) + format_list = cur.fetchall() + cur.execute(SQL_role) + role_list = cur.fetchall() + cur.execute(SQL_organisation) + organisation_list = cur.fetchall() + + return categories_list, themes_list, langue_list, encodage_list, frequency_list, confidentiality_list, license_list, type_list, mime_list, format_list, role_list, organisation_list + + cur.close() + + def py_import_xml(self): + folder = QFileDialog.getOpenFileName() + if folder: + folder = folder[0] + if folder[len(folder) - 4:] == '.xml': + print('is .xml') + + # def issues_open(self): + # self.issues = CenRa_Issues() + # self.issues.show() diff --git a/CenRa_METABASE/icon.png b/CenRa_METABASE/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a910fea37e4930c40122d285e6ea9fdc75ba7 GIT binary patch literal 4977 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 literal 0 HcmV?d00001 diff --git a/CenRa_METABASE/issues.py b/CenRa_METABASE/issues.py new file mode 100644 index 0000000..0d6416a --- /dev/null +++ b/CenRa_METABASE/issues.py @@ -0,0 +1,89 @@ +import os +plugin_dir = os.path.dirname(__file__) +end_find = plugin_dir.rfind('\\')+1 + +NAME = plugin_dir[end_find:] +#print(NAME) + +from qgis.gui import * + +from qgis.core import ( + NULL, + QgsApplication, + QgsDataSourceUri, + QgsProject, + QgsProviderConnectionException, + QgsProviderRegistry, + QgsRasterLayer, + QgsSettings, + QgsVectorLayer, + QgsGeometry, +) +from qgis.PyQt.QtWidgets import ( + QDialog, + QAction, + QDockWidget, + QFileDialog, + QInputDialog, + QMenu, + QToolButton, + QTableWidget, + QTableWidgetItem, +) +from qgis.utils import iface + + +from .tools.resources import ( + load_ui, + resources_path, + send_issues, +) + +EDITOR_CLASS = load_ui('CenRa_IssuesSend.ui') + +class CenRa_Issues(QDialog, EDITOR_CLASS): + + def __init__(self, parent=None): + _ = parent + super().__init__() + self.setupUi(self) + self.settings = QgsSettings() + + #place connect here + self.annuler_button.clicked.connect(self.close) + self.ok_button.clicked.connect(self.run_sendissues) + + def run_sendissues(self): + text_titre = self.titre_line.text() + text_message = self.messages_plain.toPlainText() + statu_bug = self.check_bug.isChecked() + statu_aide = self.check_aide.isChecked() + statu_question = self.check_question.isChecked() + statu_amelioration = self.check_amelioration.isChecked() + statu_autre = self.check_autre.isChecked() + + statu = [] + if statu_bug == True : statu = statu + [1] + if statu_aide == True : statu = statu + [3] + if statu_question == True : statu = statu + [5] + if statu_amelioration == True : statu = statu + [2] + if statu_autre == True : statu = statu + [6] + + if len(statu) >= 1: + import qgis + url = qgis.utils.pluginMetadata(NAME,'tracker') + print(text_message) + send_info = send_issues(url,text_titre,text_message,statu) + code = send_info.status_code + print(code) + else: + code = 423 + if code == 201: + iface.messageBar().pushMessage("Envoyer :", "Votre messages à bien été envoyer.", level=Qgis.Success, duration=20) + self.close() + elif code == 422: + iface.messageBar().pushMessage("Erreur :", "Erreur dans le contenu du messages.", level=Qgis.Critical, duration=20) + elif code == 423: + iface.messageBar().pushMessage("Erreur :", "Pas de sujet sélectionné.", level=Qgis.Critical, duration=20) + elif code == 404: + iface.messageBar().pushMessage("Missing :", "Le serveur de messagerie est injoignable.", level=Qgis.Warning, duration=20) diff --git a/CenRa_METABASE/metadata.txt b/CenRa_METABASE/metadata.txt new file mode 100644 index 0000000..8c689d1 --- /dev/null +++ b/CenRa_METABASE/metadata.txt @@ -0,0 +1,49 @@ +# This file contains metadata for your plugin. + +# This file should be included when you package your plugin.# Mandatory items: + +[general] +name=CenRa_Metabase +qgisMinimumVersion=3.0 +supportsQt6=True +description=CenRa_METABASE +version=0.3.1 +author=Conservatoire d'Espaces Naturels de Rhône-Alpes +email=si_besoin@cen-rhonealpes.fr + +about=Permet de saisire et de visualisé les information lier à la metadonné d'une couche ce trouvent sur PostgreSQL + +repository=https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS +homepage=https://plateformesig.cenra-outils.org/ +tracker=https://gitea.cenra-outils.org/api/v1/repos/CEN-RA/Plugin_QGIS/issues +# End of mandatory metadata + +# Recommended items: + +hasProcessingProvider=no +# Uncomment the following line and add your changelog: +changelog=

CenRa_METABASE:


30/07/2025 - Version 0.3.1:

- Correctife de bug.


19/05/2025 - Version 0.3.0:

- Compatible PyQt5 et PyQt6


09/04/2025 - Version 0.2.3:

- Correctif bug en TT.


09/04/2025 - Version 0.2.2:

- Optimisation pour le TT.


03/04/2025 - Version 0.2.1:

- Mise a jour de securite.


07/01/2025 - Version 0.2.0:

- Deployment sur serveur SIG.


07/01/2025 - Version 0.1.6:

- ByPass du certif ssl ci erreur


19/12/2024 - Version 0.1.5:

- Fix les problem de lenteur qu'en la base est down.


12/12/2024 - Version 0.1.4:

- Crash Fix .


08/10/2024 - Version 0.1.3:

- Lecture de métadonnée des flux WMS/WFS.


07/10/2024 - Version 0.1.2:

- Correctif de bug.


03/10/2024 - Version 0.1.1:

- Remonte la fênetre dans la pille.


26/08/2024 - Version 0.1.0:

- Lancement du plugin CenRa_Metabase

+ +# Tags are comma separated with spaces allowed +tags=python + + +category=Plugins +icon=icon.png +# experimental flag +experimental=True + +# deprecated flag (applies to the whole plugin, not just a single version) +deprecated=False + +# Since QGIS 3.8, a comma separated list of plugins to be installed +# (or upgraded) can be specified. +# Check the documentation for more information. +# plugin_dependencies= + +Category of the plugin: Raster, Vector, Database or Web +# category=cenra,database,metadata + +# If the plugin can run on QGIS Server. +server=False + diff --git a/CenRa_METABASE/tools/css/dock.css b/CenRa_METABASE/tools/css/dock.css new file mode 100644 index 0000000..f05b850 --- /dev/null +++ b/CenRa_METABASE/tools/css/dock.css @@ -0,0 +1,61 @@ +body { + font-family: Ubuntu, Lucida Grande, Segoe UI, Arial, sans-serif; + margin-left: 0px; + margin-right: 0px; + margin-top: 0px; + font-size: 14px; +} +img { + max-width: 100%; +} +img.logo{ + display: inline-block; + margin-left:0px; + margin-right: 0px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: top; + width:25% +} +h2, h3 { + color: #fff; + background-color: #8cb63c; + line-height: 2; + padding-left:5px; +} + +table { + border-collapse: collapse; + width: 100%; + font-size: 13px; +} +th{ + color: #2c4491 +} +table tr th, table tr td { + text-align: left; + padding: 5px; +} + +table.table-striped { + border: 1px solid #BBB; +} +table.table-striped tr td { + border: 1px solid #BBB; +} +table.table-striped tr th { + border: 1px solid #BBB; +} +table.table-striped tr:nth-child(even) { + background: #EEE; +} +table.table-striped tr:nth-child(odd) { + background: #FFF; +} + +#map { + padding: 5px; + width: 400px; + height: 400px; + box-shadow: 0 0 10px #999; +} diff --git a/CenRa_METABASE/tools/html/contact.html b/CenRa_METABASE/tools/html/contact.html new file mode 100644 index 0000000..a6cda01 --- /dev/null +++ b/CenRa_METABASE/tools/html/contact.html @@ -0,0 +1,7 @@ + + [% contact_role %] + [% name %] + [% organisation_name %] ([% organisation_unit %]) + [% email %] + [% phone %] + diff --git a/CenRa_METABASE/tools/html/link.html b/CenRa_METABASE/tools/html/link.html new file mode 100644 index 0000000..cdcdabe --- /dev/null +++ b/CenRa_METABASE/tools/html/link.html @@ -0,0 +1,7 @@ + + [% type %] + [% name %] + [% mime %] + [% format %] + [% size %] + diff --git a/CenRa_METABASE/tools/html/main.html b/CenRa_METABASE/tools/html/main.html new file mode 100644 index 0000000..f7ff4a0 --- /dev/null +++ b/CenRa_METABASE/tools/html/main.html @@ -0,0 +1,123 @@ +
+

Identification

+ + + + + + + + + + + + + + + + + + + +
Title[% title %]
Abstract[% abstract %]
Categories[% categories %]
Themes[% themes %]
Keywords[% keywords %]
Data last update[% data_last_update %]
+
+ +
+

Spatial properties

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Level[% spatial_level %]
Minimum scale[% minimum_optimal_scale %]
Maximum scale[% maximum_optimal_scale %]
Feature count[% feature_count %]
Geometry[% geometry_type %]
Extent[% spatial_extent %]
Projection name[% projection_name %]
Projection ID[% projection_authid %]
+
+ +
+

Publication

+ + + + + + + + + + + + + + + + +
Date[% publication_date %]
Frequency[% publication_frequency %]
License[% license %]
License attribution / number[% license_attribution %]
Confidentiality[% confidentiality %]
+
+ +
+

Links

+ + + + + + + + + [% meta_links %] +
TypeNameMIMEFormatSize
+
+ +
+

Contacts

+ + + + + + + + + [% meta_contacts %] +
RoleNameOrganisationEmailPhone
+
+ +
+

Metadata

+ + + + + + + + + + + + + + + + +
Table[% table_name %]
Schema[% schema_name %]
Creation[% creation_date %]
Update[% update_date %]
UUID[% uid %]
+
diff --git a/CenRa_METABASE/tools/icons/CEN_RA.png b/CenRa_METABASE/tools/icons/CEN_RA.png new file mode 100644 index 0000000000000000000000000000000000000000..95ead1cf7313bc03e4637c9bb20945373f27ddca GIT binary patch literal 8893 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 LNkvXXu0mjfe10PI literal 0 HcmV?d00001 diff --git a/CenRa_METABASE/tools/icons/auto_add.png b/CenRa_METABASE/tools/icons/auto_add.png new file mode 100644 index 0000000000000000000000000000000000000000..021f85b54cbedd265057e378133784d5539e23b5 GIT binary patch literal 42290 zcmce-WmH_j)-BqNy9Jj3L4r$gcMb0DPH=aJ1P|^SEI0%U);I(Y?ry=|;cm{o-#z2K zpYO*T188WvyLQ!DHEXUp*Z!uYAccxVhy((GP-UdWRX`vp;8!RR0vzyga}rIg^94W#$P#AqYeU zk`WhC^UOM0@i5Ze^J9KGb*T|yu*U-3Vl=>0eNQU29$t#g?p3JIXgv7s@VD)_U4CgP zGqdUVSl%bowcUD((;Ta&r&d%_gyV+mPG38$cSY6K`s*73_1@}=)~8|xr` z5W?o|J+mNs&Lzx;z%{S_Q+Nzf1oF`T`@;;!B>g>zoU(nkI>McI{GU=;nmj1V@w=BK zpXCauS1v9FBS8=wgi-f^7@Ix&tOpqY5rZZWgs+1*!H#-?kl3%78$;)8_4)^-)Z~=e zG$1mwYm=SI#sU02L+GB2Py+;FSjzz3MV?!WpKwwLLkvhD1nsaa#`{e1udgWKjppvx zxeqmGOI+h#ZILL^7>pnaTw7r!C*6jfvQf?*F7p%tLFi;0}q zWiSMpu7zIY+QotVJIhTwR5$z)$q7WkAo6l?ugo2T{)MQ!GdQ85Xo{bU2ZC&T2?Z~R zQYpjxIrA5eqYdNY&% z^Y>Z%>-!k-Nf$dPDT9{SVLY?ZlZZTA!sUXO7-=*anm3HBU#U=yQ}-F!k;rGl_plkO8Y>iQC{P)-xb$1SsA3Am!e=5kgT?$L z01}nH5U&~dQB@8DHoR+xt_yeq=M`5WIYvZ_Gtrg;eY>Sf^rl(eXVJD5=`@F z?D92-XZ*uhHbJzqijP6Q5EBW;Oz871 z%%`eXJ%zzw^I+bCw6KXGz|4vumT_s>X22NXK2vtN7N=Puv2ww&#gP*i3EZS`64v1+19JhUN|6B ziZC=m-~bt+m(U6{_P6Jim$DpCOZ%E2HB>myY&E2@?jwF^foYMzMmmrHa=!xWZP#W< z-+@7zDihCflGiSsNDt>9&1Ul6#x&bs-b~XtT|taJrJFW~fsnTFwdHo{Y8g0zfz2a2 z07BF@--W|GkAcgr=f2W6nn%iG8LEm6to^u5vRaZ%ObR4Xo&Ye6$>``rw6$ICPF6q) z*atIU)&UXX0_xa0IeRbjjDSd<{NASn`zd+`-q?M}E{e5^92!urkZG?S* zT)@n#B{+cNmj-6HjRqtKd1yTG8yJLQB!mFL1_03+0~Q24NTUG@2EgNx2oPKVDtW#F zS&l$X39k$i2Hv$z_W$3TrLzyf7zy^UjIg*d_>3xL>B&+2mcd4F7VypD(8cr)wVWjm z;^_kt>Vft9CX>M)zsiyG<>DgZUH=2=Wfp681|eV1SS-0A_)AD*!)yZ7b(`WKlutEi zV`tP+lDQ-T$C*P{c?dF8NT9)gSKMmusXK^{H&md?^!I2(yyS3gAd#p3eVMf~IrQ*& zH6W-JygPO&KIwxm?@??&3E~5vV4^;M2KLKP+mqo6$*Q5I zw_NBCWLV%m3%ZqS;4?2CJ6I86yJV7vWOp_0KY24sXbcy~FJV+DG0_|SdB`WWg%FNG9V1`%XPkU-KJ&W(#VQR@!E{cDc;$K; zSqqkF6k6Yf&L#eH!Yp7{FNPPE#!4G1^T8EPSECTYsA+Pe*U97(E}1H}wxV3p9`VxB zH4N)33d|xSW2SSiT*L9DA~B^9mjU)=U2OZz4FV)L*@glE>V0!LD$dPcSJbEq(Gq5Z zo|eyZn;g2)NRt`g5?_W~qrYJkO`y>vgx#I?+D>-3yaU$Ee5uxp@t&FK?G2DXziRALwVdWW+9=duK|V{jFZF~83!lq;J)?iPEF&ZeBys7%Y$ApvVz&SKO#eT^hVfb?aTJtllRvH^8w z!kQz&PL1v$omNx>AXd`u#`7QCT8a~}ps;ojg9GU-+d3H=c^E^;#mRv*I6CK61O5Av z!9D!>FFSsMZPtxvfNmC&^7jg0zYh^6n`$5jrolfDm<|pXUL8?#jCcWON912tG|{C0 zykN41PVwJwk?Ii0zGB9Y@JW2G<{zUUDa$9CsD=oYsb#6pG!d`%uhl zMAy>(9|*v1E}>FTw~|4MBsEN+=H#I;)CV~NY5wFBP3lXl0`R87EY${Qmz%3qzeMk| z?9FEcVK7Kp+J%kXRA+dgYoQQy5+!bgnfAAjS|aR`LR=&(l`Xtp)|~(c41xD4cf-#T z7+1d=njdO0m0bTb zq0z!ynDP<8ql6|>8=t6SQtkmo(6psDcj)%lR>-}zPt*=_`g?>SdtecNuycu-qU#vK zY+X@_OFxu#%?oksFd7bB2}|DqKu2jVXZq~pxSV+4gpn}JJ)gUv%g~v0;1quZfTK)W zJIAXr=#^?}i!3xSsMaC%*LJdnHyPz4z|pWSxz&s&I|r{=5Xeti%hMmq)8E4k3A&=h zQ}%9rS{vulC9TdTL!hbA&X3I%RBx1Kk37(hGkKkpCW+KN%6ElKx)j^Gx6u>u4 zf4}%Mp7FFgPbL2cnc<`$bQjs~uAg(pi}$tv(ks5Nt-Zn|I9?qf90?d>VNzQS)<4U; zR(uwX*lALr5kTwL_vg$)zABS~iCsJqKE8y{J%x^O@;!W~A%knVdD2BH`K1uJl6IKu z83pY5QiW)}g@>1n7`Ug40igoV&Z&AA?x$I&=8x1x8P;MV=U|YKiZ94)=52lc*_TD3 za;ST5=Y$*(e%5h9LqTbs^y;8LQPpNA?CYIIp)R&?Jo(GPeN1I#yBb&krJEs{>9_yf zUS9x3^gdu;@M$SgsIM)6++8eI3_wuIKq%0MwJjxMm{_e;0%)`od-=Vue=YjA`X*KJ zSXns|rw{c{WcUScs0nT9CsykSbYdhoFfF*e1BwoQ5gu7D#NrtW5w>EQCLa)CYNG;2 zR~-)eE{+(^qeH(H3&e)A$VJ+Ea!M%Lv}B9|OW%ObWQ@oAA%d0Xxa%2y$*7^CgA8BfeOP)U{6lY_xPD$1u({f8eNRRzuyT&FB*|mhg|2oOO~n6TdsU@a}l{6chtZv zaSqvZCm-o^>0b6eUtG!zz8#3tC=@4%S=@dE{IIYHA^9w5oeSVs(Gy&+!rRpNkvHbS zcjoEmdA)D_mER2q0WTHG^FBrufMD9z0a=MtX7cnm4(Q?7cKJaxzvk%1%S%#Cop-$^ zRiq@j6Kv=0j<&~SsA%z3J7(2T^iv!s80!KoR=9;vk{P+AP^r9??}NU++PXNYr1`uW z5En|(Jncpz6!5~~n$?2elpD3;r`1`ETg-2MNnN3K^@3IR>8-ec&k~%&X_5~sBo4Sq zekH<*y+GGjwVk$Ftpktha;~fG!9Mk^J+a}YLa{z#6@FlHzb^3G+cl5j)17$yJorcW zGbnV~!nr@hI!?1LrpF+>^R>Ks`F!9YWKpMa^YHZ$eM>?2c9mE}P4C%u=518xw^8lj z!j}`~)ah_uw&OZsK11E3&9cvKHVM7b4smuFA)K6BFZfx|dj}wD^8i8J<~;YOL?fAx z$@r5tgkkEvp5y1p`-gHVdIy4z-QF2mK@6}H=gfr`uc5;Tw8oD!)v`t1UF~*%Z*OGR zd^qxeS(so#=Ahk|P+fBh_>-$v7Z8;xXx8_|@( zf=%t;_7n*owyfq)WQh+lx7n!s&s1jS`9K^!Sg8F3@KKn`UyWEOz4WOnI&_el-lCiw z_BKrZlr@CXzbFMtWQ5U_WI=$F*6$VO)3Q0me}|wGflXBA)z#Ze|15J$%50lGlaT7V zwh#zJRs$CxRW0%|${pL+CAk98rD>kv%mV`S*lhm#3ZH7Y|1M(IPG722s0NTV=VV{TmbmwIz0ZoDOa?R0-M&$qesk)4PIIf-3F+q=d~YA| zR-%75;v_hqhkjJnwbuM0)E`($MCfF7idMQs95Dq8cwhXp22x$2dikem3;n0L*+x{9s7ljFoZ2 zHh|~hkryWTTi6itPGJB@4#WT;k)f+eS2ilVsw)!(o+^`QHT!?_{5n>!-ap>Ggj7WG z&48HWP$NXS~`*X1m`662l(*X0&n0t3J_1|vw`35k)&9-k7T#L zA`FqtJ;HDPS}(LFK+xs@UW2$H+%$bn@lm1cFp7WzLo|Wq$a!nod?@ZcL`&0KQcMGx z7fu@M18CgI$g<+l3GwfC31bouWJUvouLi!6POc1^V%{U2E*Hi4vQ9WAZi+gyK6)h1GWfrG=5=}{T? z0xD2K{Nz-J0cdUfiraZ+eGor3hqu$j{|Rj5ZvUQ{m?y|7p`QEh6^2Ye0)S8e z(XjfP|CQ&F3|J5F0QhZE9N{Fj;fQU?tUr9k;*8D5Gt2tAB^MWLMhXzUZa_`a2ML17 z5)Nv&6N-dEFJaA6U7swRbuN-uC5dl0RAKs+1ld+6CHpC`I8=Hu)|Ks z5sIUCtWY><=8e!|A&#-&SEb74`V>bA08aw@ZP`63>)0(c{@9h4bC6_Z_>@7yfpM>z z;o-;?hBF*=Y?(!v9iSF5V+M+kx@h+?4}_6rnDsaijSpO;?_f>}BMTu=K=enb z&3~?~En}MM8HAnV9vG0~YlANyV~Do&W}$4YT)r1i@OvNehsR`z;*&qKxSGhif}@4n z8JZ4=$W)(wkKjB#ZmnefSfjYe2qU%C-pJP(ZbRCl$#~z5cUo$m8@6^GhR@>)jL}A8xt}H&3oq-vprtV!f70%z_F!P%gY>?jBSW zuTJGh?g8ZJsPUMbn`;YiM@lY$i2Sv9_O=qRSn>k}U_->#X*%2_(n(L0Xey+ILYHM& z@Kt`&+|P#cebY?;riGD z4d>xpHe*V-+VaYG9N_6qVPc@Wp+of}Hxe}+N z8)^Guz`x}VX zo^n=;sNMO2a$)mS>l{>bFt62=O z3j0ee&PIj@AXFA9jrLkmVm|IG=NaRjfyTG^4-t|qEJva&Kjy82J>*%=0*p}BoU=1h zbBY0W1t7mRF=L9x*gPrd4gp(-*93)zkxA4~o$B9DI%O5LI|Dip?Z=B|hTBI*-D_7kU-+fp|)S3o_l(lSy`as=E|p) zz>sn7SG2j(ms!8=cRs&^<2?Y>{J}DyFbthlD+KB>DB@*gX6ny)Agm}W51RQRdv_gV zgzC>0$n$)dCQZKSHA325bf|39b za2_S0z;#F0zM2^sdSqYdDgRWhdjJL#{Lw;?;Z%8?xc)RuJfA0?>z$3psLN$6uaEi# z_p@6xsCTe;^*?0`)I?W03=8?SnH)} zu@(PpFh7KaAo-r0iIGXt!+|u|sqU4LfhoV-613q6BLS;XI^%kg+{?+w6}Lr#H|g|3 z*S#UVd=ulwF<-0w9iM=@5Hp(9^_otD>nm$s5V+IC{oieR_9Bs>rj>Zvn9NNf0bt7n z7tTC5p*Lq@nW_$%l4?nnF&JV*1~5 zY>=A{D#LEuuQkp8IeV=;Z;ylXF>vvq0fvH4>}2Xb_VKYnqaHEW=Sg|r?ay(T-@&M9 zvv<2~qJW3!3U6%CHn&vNG05_X2-L_}LRu(-o-7+U-ico?pF9<- z$nX2=Y=22^$?UNa)5M2;%r=KT&oDpNh+|F_X5C`waZ1L^>`IO?xa!MEClaRUcO{a9 zN1wXDi}h`jwDXoUpyAbI860kal{G>~^W^ zRbTa4d{KqH>YlN8bSD?vz>gjdAsU5U@wWUHy1CDMqvyz4O~i zCVsmaMZy?d5t5Tiy5MY$mVit?0(^p=!+~)!tf8aCS7(Iaz=)H@hzz8Xg6A7Fl>F8v z!@5zalckVj-C5DHsB_*C=a$oVq<54E zqLR3uZ*)Rcqr(BHPpz>XN#qv|1_s!5LuoqnctQx1a<4-g$#2-Ts&y|{RrzB*QN99a z`1+;=e-5mTfb=gCf+AFTWmQPJT4&$U-vd@;KQ=!O|IIRzibmkT$P-~I98)JIS(H|RIUht-AhPr;8#r)J#(@fG4= zVYHeiohI;|l;di~$f0^Ll6;K%e50}a@|J5%LvjKb0!R_XmI5?%gNhb32^m~fQVml< zsRlyfwX`}|(n$s-Gf@2InZj;_95DTLbs9Yn{ocznt3UU{JD0An(1nxcF=$!B!~e~H zMgtbE`P7KW!lIqq=bjKQeB~QF6pAh+?A?vV@GS-ZLquXW@;k&E;W`vXaD~YjXGzz# z5n%OsfYqoUypv_au5E3cPCK%#O3MN@`X6fgvLfi`96k`nw6htO%;o?2o>68|C=wSV zkIIsM!NRsDL6+7|H2T->G8`_cs3xI67K4SA1G(CP-27HaC#;?L_Skk{jFCvyJM=0h zktFSQz~3{7XoyNIpZ6um-^W%9uDktINd z15muH9e#1L(eCq4x~KMm!^^Eo)$9a2_b&!f-B9I6f~asL|9)lz)s6|R<6)X1oxhkQ@?t#jLi;1jJUz~;r4%-J_0-i}$HdBSv}neC zZv39fr%!9bjx^Vct#`sYGWxi#tJUnbOxMp}=3op)cDm>sHfG%`^0j<+{=ejtcSq>u zR0j#pspSx^|Dz=(H2Ad}D+QaI&Z=G~Z*H}PB}uX{XvivbGB0ArL^Qc4wjek-3AV(; z`QMWS@hLyvv30mo9zO4iwnNPjRx;MC7K9SRGs> z(e^LpnnQtjvDIbac7yn>K#FzIOyuK$oc)xYc=|WEG<9N*9$ta)3#NwfC}PpT;`tNz zqhMfxxPcA(ey#0*Pj|InjUdUK4MC(Y(OJ8yfEV(+=WxBg z650O7jAzAR10-G)a8eq{>r=^j^Mp5|GP zcT+h$YCK016?v``?^M~i-A)S3fLi@Ja(dhdg=VDKh;{+=e|iC$Otvz3foRFejmw_Q zw1n_7Mdos8{*&~rBEuojfu#WrI^(ofxb4=wn1gb~pk8x=$&3!eC6`+}af zuf1Kb`xQRnev?$zP>F`hd~zFA!{iw_h|)ak{$7}N`?1X$NwN?;nwjBvyP6Haui>m3 zV+&h|NJNG#AD}jpIitl5WS&_E6O0r8_HoE#S&MwaIrD%ASuz<0`S^a?b!#_>Xs^`8 ze)jzo1dvOR{I$B49*U8>!tce6M?(|=h@gf0zw&6S%X(DeLlQ%}aOF?BN6b zN~#BH>>O?%!lecrH~w)9aUL^fs&pioHKf&4)xu@D$SI6cV=3VvX1&(6h;r?_z*ZOA zhf=Bo@&7c|C>lXq;DZVI_#Hw$CM!kzzRid0XO_9O&p+1m=w@d|cWc$}Q8YCRN-9Y& zG0v&g*X!v$)uyyv{NNd!o#tC%`V63A&o6t4X4`kODy@853=96%PzBVHM_kAD08nfl zR+{`l^;ge}Wmq|dfz^+utb6$lUZy$i?}KO}=?~CHDp?h;$n$mQc{EB_Y_8AgRvp=Ar=uLXEAWADg|N%{26n4L4R)2A{&Axh(KsV*5mj+ zv#5ugRr)!tzWPCvR8>C<80I`|@@&bkfSyT@`CM4R0!T5kxE2n<#)(-sgfWD1#JpcgGP#Uwym8sEgxoJX zU;(E#K6RHFj|T_p85tR1yX_`KHQnE7a=bTKs4cg%&zTvSdMR#yO(nh3Y3Nyrg|)+o zRXJ(TAe2}NAcS?7mbub#hO4Q)sQ#Hb_6L2tMDi2aUX8; z_dDocudnCYPg|E2WdqSm-!tjreArZG8C-le<=oi-%ERdJ3|-sD%B99$ztMY?Q7HCV zSv-^U%-b%3{K07o@v-wKTL*{$xdVl2ay@a}@>EU&6+&HI5;op??c?pARSch-3-zq_ z3cc9OlMbQ;iI`~{oS*c^kt>Q-R_u|0jgw#(4F}EHS+7}Qen`#leX3vQV(hqX8s*ZM zJG+L?E7lqe&<@f0rAvC)u{DqqV~L-aHKO2St(20=T~v&yIh90dWxT%*foqKMY@+aq zL)iRqWIW!-M)ED1O+sk-7^M5oIt&=%T@6>5x~sE0C~H*ouaz9^Hn^g#hl{w zz~rF!KA%Qba}0+Ho@mSj?@t#ya6Fot`uJ1rSufBvVQS(Bv^5G-WkaXs099ica4a&n4Uz_iijkb1g*9yx!;rluqR{nY!o zWz?pajX>kirq=5RwX6(>ZRFbTkwBjYYp3)OV!1%QqhZ7Nj*cGmI!$)5t;%CxKINBl z-6)u%kzswyqaL-5kqmjy6``kv6l&7Aku^|>!Od|fvNkG`)wvjBO0svRF<|X_ePcQ= zKwaM91$1q|-+qY@7JA`PtkeKVL~QI&P8A1tcrMOWV`$P8GMC`wmDKn?|FSko7Le+ z031qb04l2p8w96%EPRe~eC^`QxcPWGX*FG1#UN$)TImXLb{yL<)Pl@!V|zQGZHyF^ z@3-)P;ym6H6I-aRKECw7QImXng`Ljqvg)T>5iU6W{S%U;FZF&?aMPNf9X4U@882rv zH7T%>x&$yE+59u*sY}L=JYWrzIkXCZ&bv>>LetbtPtjobO%9;gLSJboJtX{x^*e0H zsJDTrmW$YF3=>BJKrgI+9xa<12-rMGb{hNF-g?IeJ(IEZp3l9sSIfk`+anC!Sc*zc zr`eW}p4+1#t$WQnXMjv3VdLaE7*QV7zearqH-9XiSec7+No{2j6hKzS2AXdsyw07M z{{+}s|9rY-8VjNr7?)-W0N5PA^M2mZIEtyTe9=2)K&@kVDSHn$Yf&}9{GivBSO>3w z4N!y!R-g2pR+OW2PgGbDh?vK*m}+}Pd(dg3L&IkOItDJK`^}j5Zf#=+T_wT5wi*I4 zF-hM6aw;p!QFq&TuC(7p8lX75|Lw!|1vi~9MP`gOGkU^i249)%oq-xQ>sGqhDUgLN z%VA~Oab`xf`DIMU$**wwrp;I%&&Ox44>y^HR%8INNSZQo(n_k%&Gks>rBAp0-|DrrqT55MOV#cM^PwlK z6PFnD^f!dLvAV3Dp!856A-hP&fYc_PewiYUtAik4c)>Z`Zgh9)d5jNzve3kLK>F&z zF{@EnD*RC4;&BQ}3I5BMm#m?AoRpoQju?AkQejuBu=FhLzBE!gbyHTRKVe6l;c>We^%JDBQ@jTHMpufGV7WO83p0L8p z{B4gq9)r&l(k9U&WjssA4>%G`PX2_m)kz5KAr=m8o#fV;vyGc z!cmb%xe@D5e!xU>%41j$CX5(4wict4tp&}_XyV?w;n#M48laO(@E57~%7rD>PkQ3C z^AY3zcTM<-h;$tTI?7KyUUR-rdZT7QPpWjtzh_Qe_HG0C^{;d8dnqwiYqj#VK6pDz zKpHZ8jaUMm9O1=_N$Qy@f_jt`;_Z(f?m@b0hb%7mj-2ezKA>#o9e6=4Qt zz}?$ssJdG2eQG1cjY90lW`YM&+UX|2Rrbsc)ouQlhKA%tvpp5KJk-YoYxQm@>4zGR$VYm7;Fj{lK_i|C5XdYY3E{PJr0`5f>+JDS{U*?oc0=dG$F;bh~C%`gU8l~!%Pbd&#+l0ChXr- zSuSkN98p-Q7{}qSoCgh(0M}@8!#RuxzVUHdN=^Yz{F89mqNm2_&2C>{$BWTmKO(G* zEI(ChgTlrJTKlQb7bmBhy`L?X8Eik@gWCpqUSh37nMJpkKnK%9kBg1uYmzh1($2qh zP*Z}tnr(Mbo&s2v@2ZXP%>vn$zJQW_`^8^)Dceq z{43gFL#LpV$qoF=m(~W+TXZ8)E(m*b@+RNGsW#AvbCLsot8#x#G#*j34)8J?*$cX7ID$OS zs{Cj_OaGX&R<>rA@>q-EKBb*DYW}Qg{&L&*UE%;chSC}v^y6#$g1y3+Cmmq%LgJ#nFpSV%iluaIW`&&g z4-3VOKe70lzQ|dm)umrV16(X2GjUD1bkpS9IF2t<5%eG9w<(pW+)Q%n(S7M+$bQ#|B!wQLrU2H+t=dZ|~O zw*Tl326AcoO~#@++57JV&L5lrM~L7s?X|k!w>q2kh6heh-h#hL&|}~nz7 zF5%#9R^809$Na<1)(F{+IXu5vxMW=d)Q$;0mSDgUOtb4P{d%bhXxq-r1qE%Jw4@kt z1Ly^G8x9{8ys;jzw!f}Yxn;BF)pGi8Bxs2%_in0S6yQs+h)aF1CwYhe%Z6i`4h$DU zegLT{>mURaM-_R(BR(X$WlM`Ki@MhHPr;DoTksQP)kFX$oEf^A@B6uHMbX8#pNj!yHQ;%g6_I@-MwueMS+k&*H3k#>T1^>Ai?C~{2de|5Oy&q z!!r+jqFhd;a{1ZB%Hvc9>Zv}^SOf4Q`UG>Cal-=X&Z2N(L>+(b^HwFe6)m9=~+Kngc;dwV-XJC;q%Yg}tnfW_4 zC^<>!FSzfJE-Pv1YPt+GC=Z);?UJDf_?SOneIq&hlCBggyJ&KGQ~o z@dASg2L%wGHt#ET8+d*0n%4VR37=g*q771+tKS0#TMGvu2sPnq~{7c>8& z5(pkxvAtSdC7p&{MKf?If%3>K%Znsn9ztj@0NrzId!hX6ABJ@AOoYIIxX8Q3UTcS=O_;hGKNZb#dXv-o$Vlbr zXa(SK4a2+*RT+3ElY&wB0l2KRTSlY1#$X}ND8%HkPt%%wfUD{_pbb?ii7KUy7_L{V zS;~DUNQnz-8(7)!A%c+meD>!{yZZ>DwEQi&zZ*|9Rd29dUk%$AcKT}H;@E)qA=O~k zcBzr43zNR2tOJ)TLce)&>f=JJ%Z9E*YgDX4rvM38CdT&&PB0x{dlGiazJ34=J^XG^ z$Kh@+=P0zD?hAu$o|s|uLK!%`HeJckVSx+n#w6yM{q}iX^uw<;f&BgeDT-U2*+s=g{-;7W*po76uvT(%<<->3iTt z+rg7P>e;hkOOD4F10~ii=LHi3+}ZBZ9+glN0EzQ!vk8-@KV&0F<{Yjl@DupYE!Dp* zJC}^6Q1W1dXhPMsI}mEd`)u)$B9wLX5HhJ;5N&=DqP}U_nOTtw7PJ`R#z8osfy?SF z$lZ_ahrR4&kY(rY$(4Vf5MiWWA&k~AN9GSsO`uKwXwm8LD1ZgOd&idRZ1KE)|AYV% zJrHGu^b;jvh6)?W)Yk@Xr5zfd*j=npnPSZb&J+c>NvT!S8ESab1@=|tn-g$jlwb1f zdK0wHGe5o#c<>LZ@8OSeZlIC3v?g`)DcROZs5Ro|C{mZ5A(cz)h>d#RMIjXX~ z*K3)L3+u&tfZ;xS-QMvL;=9rio-E|EC^;cBJu0lNN=?BA+R#GTQmX*Jb=<_$RaCN{ zRrKTwD@HG*hG_25;hAM&IMT7`v3S~2($Z<$Z-DFf4{2~v8LhZqVOJtt#KW3e@K5Z( zBd-Ub&k_Ztg_T#3if2kw&8SEJ*pA@wJyMvc=f-uDBOqS1)JH+VSKqb-3rSzkJA+|C zNG!>RFHq4W@k=?-_)c-AuD(zW$z$f0x3b|1ME%;w;kmU5$0y}CysYUPo9U8?jAC@ zuV}AXDS1zUzC~St7*zY1Y)LGSUS)S1#F)4`9=FG-5-)$K49||rm_N6MumrxEqWdfj z@IK8Y?Vl;&lX>BC{)EZ*`m#!Pi7C!!QTQ{u%{EkZT0L~~_dAEce zc9r7tTR8u#5#+QeLz1)DW=O~6GDEgWcCSC6 z$o9Rp+9O(XN_ZZ(cEqWL!Dk2G5_8I}5lkz}I>4rZ3l$Lx)j?f(;Ljg+=(KqNAy~AF z=II5Lf}1F>kqpA5)t4g$8phEe4#`amXl!Gh(0ODF9Xd_4Hy|=ypg(S-N#Tw54Ilrs zmb1H;H+msW#@DPW02vYdao2Vi?kyZXmco`GKIBGD^?^cvzl}Rzg_0| z1RnANZM@~6kmW+Jv&VIFY!niVerMBwG}91PYRe#Lr_cK5NFymJBY$$@&%DjAUjQyN zqn}LjT-_>cN}f_K7rH1p|NY9AlCt7zTC(eJ@O#QznQFZR)CjnzQMBkpgoi3Db@Rm* z7Uv`74iL6I^B*PrFR-NxgH!zWH@FoI7yM%hC9yx;JGP>C604 zpn+oj*OqRh>4M*l7{DCn8}?@7axL94Q^(@gpB9YuP6>5yRx$fk`Jf$JzfG-zEi+x3 z2KPE)YYb(!8~B>+gY#q!^L*}gm}9fJ(W4C#iJg^rviA6DPO>?{%tWG#meUIlX7a_ie`wtJ!(~P(~y)H{eg=ZLh^}(cT zCC!7Hk{xmi;@I`%!jFy@%VD9xLGh$v)Dwy$_gPk1d*=9A`r z2cl8CTBZP_u9AjIARx;Jirr{?kMY3i7p7&Ti^zw)vvISbw&8|1kTDa8J!hi+dDFu8 zZg{Pen2OP>Xcnm_j$rcqh>EhLyNb%KV_VDHp59R8*w@E+OX zMp9@U?i6oOS(Wf6wnWfq^vCxtkA8c$Qp@i=pXaq1WbisXNy`^PrA`FCUTmh#I3(W8 zmQ8W{DgPF{v*U&7Cv^pSs~DoID1FM0F#`kOv5EptLlIH9P|JzFC-cd)qvsAF5MCbe5y3cnYv$=&5yoI2|?4xUbtk2M(5|{axzmEH%TkqIy`YK(?3!| zKCW`<;6%@i%zTmL9U_!FJ`f_#$F-WFAm*o4@KL7^s+@)P&=kVAvgY1sfkz@Gb=A;~ zF73N##F;o6OAP$PM81tFWALEl(aq# z04)Q78%~8RL3Gw2;tz*}wvMMSxcFD6xos0x(+DsjX=w>ru!FaVzXe~dSlol&IZI)K zCw>VPKoTI38stQ_`qD~Q(e{y1J^;=E z`ys6@`;}OTDb7=9(!+^7-!*W^xedUm*Z^_-KDG%y(vl*zLHp1emFYjHR(t{xZS7Ts>7s6>hs)P$uvNk%VKUkJO9ai#`e)|83Rd5hSIXD@}Ga(_*-9VtuP730npwMTZC z8%!2#nFheecZ^Xq@-y}O>jkd5Ug=dd^hdpXfnBJk9c)_P@LAlTNi^7)0)iH9kMkvA zot^J`9Hk6?k6Ur*8X88xG%kk>+NI>LeU2=`tEZ&EJxnTlUC17Q?|ar5$P7 z{B!-{S)W1&(AKsi5ey^{*2b6G<#B??0=3K(yF($hINeBvauHQOs@_tX^wd}P4|tP8 z?7?N)=r;7(N<(^BfY-Z(kN>@vB6Z`7bdi_ie%45-8PAQF9dpBTr_mjqS#hxjBGieG zm4N@D$4x=aAoeS4=nr8Db+G$s<-l|(x~cubklh9TfaNF-Zyca3W&b$`2L@2CkGfbH z7|Y#JZer7CX61y9+K9;Hx23aJkH?i5dZTi|Z4Z2+OGfh1Z8F-MbweEGv|_gz8GmHm z`tF-Mr$g`h%6^KZVnUV<2tI*jqPKG(-FJt-4XS&9&P#I2G{F?sx0}Xb?=^r5XE64M zCBMr)5xyjFMXfZf|k(Guj^bte zzEj_OrlZBgCs!(R*~tTr`ALnCO)R!5j~H^S@7D`Bpqs!2YnrnLSOc-9gnLGz5h22i zIyIZPkb1=rW6F!kGZ>SBoFqS6AW#Q={yL?WHa zGZhL9)Og)lsSybUe45u8nYSAUsRoJlb4J1C^Bw0+d#X9JohGRbvB*cGo+Y&QP3;YY zh7ZrJN_q@F$${~|N=xa4FJtMh^oSxH3~u}vaO)MD7W8!PvK&TI|5AME_#Qv3lHZO} zV;J1KyI4wN;%b6Llu3Bn{7pMr@_e^!%JWjKf)j$fTkrtE9fG_29o~Ds9~{ovo!RLw>#C=o?%CBsh4p}e zR6q|gN_5GI)u47>rDrGq$gR+!twlS2Bw`n94B3!q-sjZ8)(%DA`Dl})M}RoICXou0 z%QR!_d{78NQ>edWW0tH`@3szjO=(<(nH8;cbrPhi$bs4V$pz|pIy8Gy2@>bibZW}^jtM1dwbj+fp>b)d( z0lkk0_;9s-=J50E%Q|hJF90GO)8`lSdNR*&sxd;?ND`O*4W4iwIl@);-k`yk%KsMq zv}e2_qfSeKnwpR?1;R3h`*RUxuY0R&9~h5xSp9{uq!o{N%qT23Mrm z>=I@6Wjq|*cE~-z%bg|RqxEj3i0wGmr=3lT9RJ4=N)wykojrU`T#Hl+B?N%yVpBeY zetJ+szHe$}l=BPfd!_8-`Cn)<3|lj^3@eKNYQhoMRv}}yz(#=+ z@qf9%e0l{AJQ3HMTM#=tZB9%G!N4Mxw__&=1{0fgVWYPl_r;OYjk_fBmVe;ND7Js- zaD3!-Tq|ZeUb5gGv$=8lhE12_eB`wr3U5e2Jc?o5rNlukF4!p+ap|hzdWx%$7<+kN zJ==UM%AfbR>^k9{Ba#2^9}F4yH@9c$sI+?mWH(!hAs-C2G91u=rS#TRE*qqK?}D`p zg{m~qO&%hk6RHjTP$%U8qUkrSTbV9z_tv6 zpB$Pda9srcRvR4r`o|gU0e|yOn6(b{Zw&_Cy3g*uJZa>sL2Ki5k;=PbsAp1~tIrWi zf|lci;d-ac1hvP09^ueqsmyzg&7bk9w<2?T4WZoaj+z zXmf`Xs0GK`t$xeSfg1HGRH!8ZN&Ixh7X6kFlR9~?xZ(i}v-d&uL^u-}QA18@j<>Qg z>QQ{6%R%p6Tn;*I`6utWQsFkCb)d+}Tf}p_0u8r`YrPyOuuO}5Ci;I=79uZsl1b`? zQ-8kCbp$Sk;Ls7p<*UB3=O;JXU*IBzqIj+fk!m1g8xa2K%tMRPpd&t;y>aDt{ncG+ ztvv8(6_h-bO%&hUzlDjtyGT4cTN1qa+=yoOh&SaI*dpFsgbKfO+rn5Jg91}$>n;b1 z5nNJ^;W8e-Vo-&PDbZ`3z9D6mT1ZFsl^W+G*;8^?WH*ed1Y_j!FgQ}fjD$Z5i|2P8 zSqrR3_!I*mJk6iPt*MnII!zp@_t`1GwXSEQ_4V1I!k|{LVeUkvm!E=zlD+PJTyk*G z4Sd{qLN0d)J$6*}F$JuJlj@D_emQdyxu=9VX4UB?KU!!r zHirn?(&uXNY8k>jj4w1qcvhP2s~V23-V2`{2e3fk7MU$vPG% zVfc4`svvHgG~$ePjOm%(Rs`KO-@KL2dM_xj4|IrUYo3*00p zI8c+CrTV+Wvc_yr8DRqpy>?z%Qm}DZ?I4`>jE-OcQ6jeKa)*>0cF92c!8$J#wBZog>AmQ@WEFjX38!^JTI8qCA*d4sjN*_$^V-)57Ya5hB#U4?sde&f^CEpnC6SFlb|q}n%+ zO#3#r4!MF6yF=tSHFszoM(%G^FwG15X$Jg=NCKyDP^pC=R{d>z5j%z0U(cmAn9NIL zaEc%=D>F?`u=%)CuAEGWiD}DWLu&-h7C&`==H&DeU7Z*n$gosw@;s4glO1=D40g}4 zFXn?1(x6$V4#YUS$-$UvYGEo|`?Ur=*WU}OUBpgCj7s@%=iSlsf$*0WdxBIv*yd%P zLmx>=C=QB|h{AB2sWrB=wBHCr3ie7}4$;k>$_F~k3=Lb060;vbRR$_g#IBY~5`RN* zQac$jsoob3oOA8o3&JqAeg^9qoS*J64e*9u`d;3PaueP?>a=1PVN8FRgcG>^&Q#^d zJhSp4JckwVT1=$5(BRwT;IG=W}sHb{&~-- zKzD5R2o2uDP9!?%^L5kniS>I$GVgeFQRnk~uO~75O_k1-usDxyT93fIWm>a*|Eg`D zWls}~&@1h{ZTk+B)K7~E8O&utjUx=(F4Cdlc{P!zJ}O!$#<{Jg7rbV<1KwqnL$O*0 z_+G28)jI6cW{Hr80X*Lp`}i*Ui^ec$QnAE`#bU`7B877_=~4P3OM1JBJq9X#4z3afbv9-Q{SCTN|{1_XJndda& zAx04%mn*Z6m{Xa8qeqP9!Rlfpy&5XAh|+5{X$ehm^V|unM-~!s)0F`RpVu}x-Q3(S zQ3)Xi4S)Yk(#eAZnPTo+OhLrtlNLB2b#GMB=Piv>1{L`7wdNwIo z8o%gF`=12Tgq@*KzGA++q#2CS&-)b0UkFa(oaSKV07C}{TOIFhXYzIwAC!&oJJ+FE z@2gG1DZVZ$6sl3u@!=JP+Zf{-{wM&`FhR$b#nY_*ldZ4$jRsj}Uj~Ku28yR3sbN;F z)leakGA8gc2dPFc+`!+$ZX4)8vB%^Q?6?GN+`bZ1_Oes(bjM<%R*(D%_6t`&sfpNWjOX{>?9HCI*s(#Mf1; z;EzM2aos?WGR1=n8|HT~c^`DJGX5!(8e zR@!Ipo$N~(zE<07HVs>ACAsb`|MgQpNcP9BY@WWKr|D>@}neg?yR=KKhErtfI za@SnAf^(I+Z+ClQdkXtp{Z=>Ggp5_1?4Ks3nlHi+m!?nWe0u#yhUxtL5EXSiv+mHb zgzsfPTp(?xA17bIDh80tkM8WUp^DA|{3Xz+sjP(?e?IFw97@~zz*jW9IF7iulEBA) z3e6+uDd_3NFpGgua6T;^&tYy*Sak?LL5tE1L7!DocRvuIr}do+59phblF zl=yAg_S%?0PnRVQ#XNz~%-g-37TxE^?wFR*|R zImifh=wU-t8;;&-aFHg#nJQP>!TzwX)HS7~%syoHK>vg?X*eO#SkmGP=b{kveDm$l zSuo5y&d5vv``-F-xT1=M|3lA#vf=64c$xN5ycg0_p@@a$99hy6NErN zmSNykN!Vr89YRS;LVryliIaja>wl_JL5WfuX&KXc`2qe~SKOtA@ny~_cj*`{Bs`Q{ zde@hxOOd5=-oS-~rigCp&mu9?twnmzc(Pyfk-~y@B6Us1Z_z zl7fsVLiE|V+25D<01I&hLgdIJ+SSteZRd&P@T$Vppfs?QkNpaL|3Tp_Vv{DuGHGOo zAeA6~F9Km^hR@homEX~WpC0gIN!C;o{fxS6C`!uu2wp4atM`@bwIW~(YqME*yju4e z9w_GPzn|=5Y)HM3pq)d=8CIzuvi!7&Z%Bj#fw-BM6fl^map(8~0u_lGKE_wI7)G1p zUt=`jXV#{oSQije#2 zw55#40Kb};?MHVJUi-D^VmxOqCiU82|G)MPe`ALGMF*agh{As=O_AG!xh}n$+cN=Pt&@i4+QjJwOwTf%Z?DVKg zL?HB8PPvD5`EKYl&{{TaASJB@3F82hpy1cK)&OnpHc-nl$QVdre|dbsz{lpX3-epw zvv#{ZtAYgd{u*nr=B`OAKKK`ufKL9?ECgfyBec zUzY1k5jSJt(o-E2&`*kZwEN4iSSH8OVJyvZ6#&~|`g(wAyR%)9^?67w6Y$49CqzseCb;D){ zuhxE02Y$nPert+HHOjeA1YQnwPw&~0U0O2mk4UaLGc~) zGLaTDK@z`CI*rnnwq{ z$0rhU9p_&@Z?~pu9{ou~EO`Fob%n850to~p7O2P;AIvmfVid2hbVeTEm~D_ZpAG%AfjIu-w) zA2r&bwR|4fRVmQa7!{5Jxg~FRq7WkI1tO)AcphHUgXnhzklO~#`4-|YODt&uNCR!2 z%J#OtiX+)UCMy-qD$D|(uFQQXk-p8pY^0~Mjk6u?z88|U?$AEQRp=p<{6K74BIgNo z3;9Lt{EjN@azv6BCXfq6=QTzb1b5!;dt$V+ z$~L!;*j+~4V&(+VfV4Tb;n!p#yA&=K)C|~7Cms1l??czA?=d7HlU6}7`!GZ-ld6aj z405Z}OW_0mv|<#apa(HY7=%V%Uvk%BqZb;C^fh091NERI=oTTCtAFo&NF^GR+{88a z%jM+Qnki<-y(>w0(WM22PmkAd)dagFf1H$!I@Ci2uf7dl2XcMmb>7nvjS`E}UBj0Z ztI}Ddmb>$G%U37;> zp@O4;89uK`7}+V|;6sQzwK|lM@y5PD!lFpEGRae}mQ~WHM-r@gd=Q)i zx0|_XwUsOnO6NKn76|gv;O2E$VydIR*CPytQ9Rwma5=sXE`Zrbq{YENS)^x;Tw4E8 z3^NDcUn;s+RV%p0IRjq<0}@yAe~-6w1}p7WKOF{QB3sAEWE^v=RY(1y8I>E#DJBaoo!v3M5R=Hckt0;d%4T3 zw6euD{DqO1uoYH>oIrxlv~W#mL2Zhnrds~7Nrz6jcKPpO@IiFt5YzhvyGn&*3IfJ@ zs2?LRNfo|Wy$H;F+SG!luv)kV6n10l6Ej`Gq=@B z9F)ncuZMT%31T`a+z!6s2E3p<{gP>`o`v(ki=_96$d#XDZy(qHB6S!-b13j#`I~>G za#JKZEp7=j^ifZ|h?)zUE?(`m!TTAZZoPXSDDgVk>qnS0N^W*ekG)}|BIgy!+IdYV zNyr0op$PW0-w!_-VgUZ^{_Y|BEUd%=!Rs zv~fgo$2n4OjI5h9KX+hYNg1yH;a{D#$haFrbCtMI%|k6Z0D8Wep{Z*`6eUptN*q+3 z(FPIIi50!MrRvy^s|X30D)S?_U4L2;v1pr49yQA8B0kVGIb}u3L#fwulo_&H#cj`GF7*aY&Hu;_@x$B};ps%ReKQ&Gk z-ZBwVV4URATC_^Lxl`_Vu>?c@<&)Dpus1T)E8HT6@hm#x46El2!mcB;%X)IQa`^ly)eKU`a7V4RZA6N>Ps+%+Y~Nvd2z$ zqgeI|$(>y*Z&;%>>xa!M;&quPG<1S`n-tv4`85@2SpOpJuK!S;>BYf^3RcTFND*u& z$~Pe*5u$8*Cm|InGLdNN13ineELRe%77l7!Snxth#Zt=p_j0OYzca^ z94b@%L?WIsIp2Dc8+eZWy}a^u_Qu8cmqe2p!=Q7Mf447nU!1NUTo@synI<*dvB!+j zW;MZk2B%FOQqI~BK$CL+6Cp8v)VOkaL=KqRP^d&bvh*vNou(?rMIM)P%mh`M_sTr( zZWKEhO=yx_|CyYLUitZ>XZEW*@>Od~shW2SHRMUjYB{+X=A2dkC#5U|NymdP@OSAc ztU8N@W-#R)0|e>sX?8358-SmU2+@}D=34c;j9BNFgoM^wk_!adUz@c}S3C);$&@|V zdpsS-8x<7#Nq=mu-v76BnUKb9hn`#h+^3UgM8W+Y)2b9U#1g40B91Pt)#HfC^&cB8 zJ7OvlMOLtAH04W}WyjDd7AQUDi43%Qz%yWOe6U&bx&sR`;Ai)Y<*HHbX8x;MVk9sA z4wERAn-$8|aoBxx@d=1aUMCYmCS*9Qe*B(az_b7sqCy)+$Q1(WuPvtF(d7?3u{!O& z3|NSjzziTZ9opeszE#EKmT0390YN}lxd70>dI6vLKP~`Fhs12FF>Fam&JdWy z_$7bZtum{*GcmGpZ`G&DYW{l7=;`6PTYcsd4|#M884_Qc7{WMs82%XDd{U7@5+o%P zx`#(Z%I;ZthA#-~N6E;f&=RU_*cI&HdLsS~pGd7Knf!eVlxJdkdsHy5v=<3YFaE{w zSg0gz?-Kd?Ga{ng*)zO_Lc?CXAid!i2lRtOL72f}8ah)Ci5%*=&jc#uslzocYBeRi zvot=8HOH6Ji3UEV$|&CqQ)&3)puFuD*VoX5@(^4gNF5sQ$D#iG5X3JOqW+B5PfH#% zJ>PK}<|G`pMhyxJ%5#I9i9XBqW0@=8#+1IEBB??nJM54b?5~oB`L6Kn9uq^mb;2dE zxdk0+eWs!s+4D{4z4PkjP+NLNQTwXH>B)O|FnC8&uMjz_h%bpvudig@+gd~~^v{hr z-o&7hkvLtq2iY2Nh^n}>Te12&eG1Q)45Hbw1sx12;K}h(WcVb5K|a|MqWWOAk&dyp z(fnFZEld8$0pq`#&P4GKPRJrgUi>d}w+YF{+2iR;ZgFW#a~?((czBdE@{1|P;ra`s z-OJJUb$-8}c;%_g5Xk~gPD`8b`~c=l}}K2d^) z#zLXG6goK0tzp8X(K{Xkr~)v<#k0k;a9m^W9}cUYCYlIaFn(`*M0mPIL!DmtL67)i zNw4t1oypM0y3;r~4irjKj)yN*iKYLukKJ&L05>vJW*TKAw|bl;|sRKe4!kxdfV58+H2y1^a~j1c~g4Ip*D71InMujD@VW5Hv}xt~_P zTDsHb!G?N6SvT@2@%Y(e(1(1@8*D!TFkR>xK%mEq45$$+U-tK3)hE+`b}#rA@X zGs->`g$Q@?>C-|-Ih;L((}7fBKnt}YrZmVsKf-NSuqFvEqwoK&^Utb)Q64kNh-BF9 zn?0YPpvBX`C7t3X8>dI478+$jb;S^QkhkVumhImU5+^fW@|%TdQM<2>x2o-~;OQSq z1K&s8|nlf`6`;kTg#QNfHvMd!`I zBF8;%2XFEFw5a{Et$uys-jjmCr(%@Y#|P<-^Sv*JFCM+j$rJ-w1%(sAol{DC)u*7J z-NTT7=12y4G5v0;RSVVZ`5+#476(fTTJ3bJ)Cv_k&1Tir`{QbvdA1Nv2QvsDXEo*y zn0n_EcPuIDk;H)E5az9u%8}x*iMGOLlm59XNBmRfbo47|uHS=CJVM=i@|#B>f=q^K^Qm9@SGtrZGXBddx+47_A7gobYw!I^72zJW zRZH`fRDAy|&RlVUAb77r`FI{aMeW^y=>g6xfdz7Yhs9+1idM2--$A#p0rG$-NgTv#&k%?1GUp~STEi-RtOn%2~E^`8WWXnFgW~!ykR03RR>l_sdryAt~ge589KOV3!C-dVuJ*|zMWpi;pJWaYAtY%O?sqfj6-@69nT&&fxa6_djJ8#IzZR`1g<-aEfwBx?;OP)r1uD*Ch3gXdeb8&4)urj z=bHw@w#xyEZfEBKE2T_M`9#|{v&!IL!qP`)XEz>Xnm7&hQ_XnPG00iBRGQR zZC9G|820JpV@pOH7=K*fV*-2w1cLgNa(anvq>;Z*9o%K(c0CPu>i5FPA`U!kuKVrx2KQ7+bo+SpLb zm%-`mX(9NCw{B3xuP5Tw{XXwiMN;J_AqaraynW7ic1OKi)tp_d66bkEt6KXH5d%4Z{6Ts0 zn#q{(o@@}4>BVmFdJiI!1`@{i%eLFUgPv->^%BcMuX*G&@BB=`l$1rbwtgkslpV{z zJAHwMfB82Ys*se2&jj)?WwWY7J0-lAp7RwQ^I<)N@`*H08<-LiF-Sc%e+192$6-Nw zY)%{ep$wtog-P2NiGr>Prn{}0(#J5rsyB>x*_JVr=*}`>@>&}@`G&rqP{Bms4WQmY zTcSgAE~qvus_1meGW-m{?(b&VT&)LyC*g}r)4u*o6;i>&di>i$sXQp%jb!;Dr7io8 zA@-Q07&T0wl_zPL`gxvXMj~Hzh@C!h(wjpNrR({`->Py`V)*R#~@jVC@K8C zJHs!*^i(!)+m$i77X%>_N`*4FQru(4@%N7wM%^Mkop4HGYM_7NorTuavy8 z;-X==`Hz)d4SXd0uByvkG7uDW5m7RRt?$pscDBdeVU6);agk97y}z1k#rb)!C)m{~ zL&#UnfkxFXhZULsjw3*9`Nx)6HHi=EqY0rDFU6QW>@^|FkfDKLk2{Cf)Whx{=+w{` zX1M@K`UBmo^Ek!e3w9uzUq`WWim`x4XorQYXTIFfu8)F|(orHJXq;~SD(k^_+ura* zp|;0>ODA(aoqcTvR;>5$Mt}x6iIBR`(Jsm0#=z%jm|IpZ6fRBxNr5T**rY1*v}WR{ zB4#lzANq;qSVK|4hMJ!++y%2WKpcDtn>UQo_oMX{TvqL~7x_AJOaG;xP5G&eqT$jZ z3zJK2UFeAk3^Fb~J^a(h;EAp97mVSn%gYa%$$=hEQ7;LGOw!L;)+a-K_F-sfQ=Srf zidpMag=YjHtA2u9%;Ur~fX36?T-*D49(jzPoy+QK3~yNJ+i=8hz?W z%}>|p4;g5RhJ8TA1_CfQ9xF2_4`_25klL7=y`T8!g~=H4PTWa3jBW>Ys;Eln`3oYM z1w*9pAtPfT36aayfqYL!*oS_Q-QW16UqRAg;iC10F-Gm(#b&&TFAfFFzX3(7!#xrY zrJL_M1T;1`*9P(omLiAXiknKnq z06x~tnCjok6JMC?>SjT^((5O~C&Y~bI4H=$Q}v3Dp&nP~B4622s7Uq1Uf&s~FV~+k z{+Lh*lf{Ol<~$Q=WuC2k6NGHFGO*?p(0}@X!RLRaQL=I@eytnjT7-it`S=hXZ|4Y! z(lhkS)6NJ(G8|&F1Xb;E>SaR5{*LDl(gkIGaaLxSTt(5$hKUQ1QPY+%IR3(_AKrLi-ADVOoP-n1R$77q?dz)> zlie4oHXbk@>lj3|uinp=)nG>z*xZ~v&!F4~tII4QPq08AES-i> zu*pDaHVo`^!CBLFo}5yu3BZ=wK~V6)gKCFm$!d^IQ_AZ5`J zy5&>gH^IEpxPoRpE9>u0{CxFdc0(Zv@P~?mhN;_jhH(IrAIUI@FCcCNm2ebwS@F+vOZsaZp`WvP0J8LGS9z#&8M;MbO8?hGmd_ zL)vaO{f`#h{gtZ5*kgX4im+qDPA3g)FIp<|uJ3f7%2>*+rRnF&!BX7CKO~N$lj}@R zcHUhRL2Rwpo3BepC z%-svRCB-6pL+IT{8(1Vu+FpV}x%+*^y;IK%(jVLkh!kRcC~p3pn?H|@&8YgcVa~XY za3Nm$ZW3pbgiY=^SAw8F?hDOu>H1+bBV09C50MEYB6KRXOQc>8rN{hq#gqiS><+-^ z%oX}uy2wsKLJwy*hwy4&eh!eP+QQKg^KW|f`sOK`Z@7igfT%Du2nvgTG8f|5f<~dq zt>?0r+xVBAG*~GMMQRHTjU2^Z9tPPKlt8^+5O3r^&eQhZ{+AmT~(x#AAfB(GsCOn#x%KJATp#UxF*{A&M{80{8C<=*R zQQVL+#EvhuuJ-n!a9hB2Wc2{0L{OOnBcbh?k z;Iss5X@FYB+UV6+Ko)lH4HOg87PMQd@X^%v&xZ;j7=8WW1y-wGB{N8x+6DvbT@i+3 z;UIdAa5vw1k3f<0c)Uz70gXn!18R{Mns`&~piNM+P8~D$C4P}q{@ICs#kC8%GD)S( z2Y2E{J)gkO6k%k`>C@v#-Hm0Y;98w-LNH99BF5b-2{RN-~kdch(1b3cNdY2qs3B^nPX)R=K*O_|{tIjp!)nu?@5Mwg+< z!F@dKWY>})?3@~(iOsAR$o|zu^n};9tuNW?P$5 z&Pywy@0C0rK7f1KVfkwtJaWB0o;zJopE1t3jrS8E_Re&{ZK*rj#c+}WNm&h zetyu(q>2bH`KJfIXIIugS>$_-5xdx9LKm&`%%R1l9qUq@N$^-E`hKP88g^C!&N`s+ zMsFC?R&;8s8y}|HH|+0PkL4+9k7Y$19jSp?CsKlKd1N@l2Nm4z5yl8EyRV@%487ea zb8}kSCsa))X;h7kejUOMbu)`f^X<7RdQ_-paHhO6aFn3pkp;3Qx!s9M(RI{Z+Vq+) zfDnHb$LNpJ%f3p_D~dC1S+uThhM&Re9x0-PoS+x1^gH9^i(Wd@)+H}9_)b<@O**0D zLkF1LGg5?>UnlgDj8*b{6ER_Au;C*cpfNGkQk=9;X$Y~hk+qhrku2oYbRqiHv1+9( z7E8*YieSWfCJ+e1AjS>X*O3mDZW<2&cpFuZmgM|8JHICh!c5XkG_~tDLpzUU6>DXl zBydhc+&rr+qoH-7K+~G`j5|&Cpw0f6RA&;cs_YOz)e=uHM!?)H?5?j-*JD!^ol3R~ z?t&=z`djI zlXE*lI$!PiT3EE4;W55^nKa3r^ZjWF^8ukP7w9!e`8+kVfa**K@WdpMU_;vp)>5=Au^^3A)uBntzkO{%kbKTbe!h#_Ci6p=h{kbbYl4xk;LR zCJA3UW$i22v8y2i=E?VUL_mq*y||?hnN7LO7);0rf0Yh?xo_u)oofqje&avx^(bT5? z7MSg=%H+@{9v>c7j+j6Afu_0sH5a!wGoMA;@PPk z0CaG?RCwM2;7)`nDmF~XZ%DDkE%*4f7NT#@qNm_M$v2VUcOGRnrG?y zc(r^5!EX#}aQBwv)=VIh@C#WqMlOAmFa((0xwe6!0c;?k~XjoaPC&;g? z8aRsV#WgJt@BUsQM0WRtHgBG6TDbhf?kLeBBxwqGlrYK$LdR{FQXd^c^)qG23#%X- zcQ2|*bBYQL=#9jwD$K&o3b3O1)^c{^5`Y^B(2G=uoL+ln5RlZ7P(QkGJ{~qVt2R-w zdY+eRgBA&P^k9aziLt+b+^C_$6Q_D2%X*Wab6^IDKBL%l;11Fdm1alGF`uLI_ z5sU1sq4^dG8W9l@LjZ0f@~+-p7-k&#P39uVaO}_$WNvf#4Dv$0!&g#~RAyzm0mjmM z*6MIgEiG;1J*aB@wMKmRTI082Ht0KZ7*>dA51%ZMHn+?sE#v+-?tUCFr+z1`oD~5@ z7xqcSU`m@Hc+Ylj1rcNQqo3=)AC#1wLk581_Ocr~*ho;CZrvLZY8V&glMj`b4|}^q zi8Gw+Jn9!Ezb(oqNa1ht1_N(*^RHh=5rcPHbCnaW+N?)}SZ9dB!?ay;U*f5V|5QG% z`cIo=Uqu7}P8p@wAVz{-d$VBP94%-jQ0QKCmp^F1)!P#e2uJLrKmXyy;}c;mluWXD z$T3%~ryzEz4#>=%$EK&5Nm`{1{Qu}gX+3S)B7U8_wF{X#!&WPSh>{;95$v8bdFaMI zOaVe+?|7e|knbd$IQcV_A$lWa>~k9@7y{kzOLiy)^)*d>B9lX!n zo_&-&zz-qNJ3=KS5hD}sric-}sagV{(n=Es!OEVmB?+g@tC6$}EO7LQsLjvD}VXfL}z z<>F8$HUxup;Y0rWfk!M5gbx)N5!FqbxhV}mcIYuloY@K-30KaEf>Ycd8xJoe9WQSLOPi2LTfxLbJ`vye6oYJG6RQK3>;!@J2q@Y>= z_Mx2&1%LC=v{z4Va`rRnq0{nswFRh37D1JrijZ%W6ZX?zVL+Ax)o(n^F>UnqqkUQ6 zy)71?HrOKZ;T(l5{!ih!OlzFtuu1>e-5St{LYLgh`B zU>3}E>j%hRaR8)RuiIEDewUv_jVm7!G??|MhX8d($EEz;%$`Gwwfbtb*hHNrWV91h zG7x810qrEK8l#{B2?sX9X;$|tPCVfSLkH7Wm%tQlHagYS-xyDfU;fmwd#{8jCk|2B zk$tnP^3~-)?VPpf2{8sKqcw=eARMgq*`%MR@$o^?-QIMiuappwZ5hepmSo;98z>Xz zb%}UZ^*f zAs3w3s6_;UhHzb${V%W6j5H%&eO}y?--+$aoR6ipoE=RYQLu;***cC$=}W;HmHm$k z;9C++`5Cad?@pT~gr^v3qyh zef+{tU8L_-F3bEy3peo*LF~y3xD)Ad)*5shxsCxbvAK@ny^(?wGZHn9x3DDhdZC21 z8b9qm^8(Cv0|JgW5%lRV#eK+4&c9OS$&%1zOXvt>Ob$b(begHvUUq2aJY~ZxL zo?Em%cJJpXP#9%Y=-TMrC#D=V^E zm@&Te2;e&1`Eu>KBLGXhHWM|^y0hjYUUH#MY)uip=pIk|~XNO+$%0^dyVl=;|3#Rq{ zRGOafI|1(+yTwSL{2=gahn~N^hCNy~jQgiJZa?=@)h3VaylY?nH6xMygOg|k4XBqq z#Q5)3X_{JEcsot_`KH*KoSDW*#JKy(5lxnm4`NG#xKifVkY?mR3wV-m`O#ZkDnH(t zZ#@*QXy{hUW@6z%Tj{Tjn122J93Yt0h(M` zjULO*?r9ja{F+1@OjxU)@bxp);35VW%9drtUoeS)POx9=#MV>uSCvbnuNam+291>i zbx*@s(z|59PGWTkC8)gGD1-(%`fO^T^3H4e29plhm?Wft{x=WUS9L{Ug9Fqvb-E1f z1nyXJfX8eJlmr)S>SN!Wv_J~wY>aE;POQm5n_Egv`(Z_Cd_F`zX)aibpe&pct&P8# zRlSR|ia*^4Mce94s6KsKl=bb1yAcHl95}oI9!RoD?=&v36SOhVgXP&wW`K}q7A#25 zn&l|5-)%!8pcxGC1m(vw6LI2+tMq^aDv=i!%P>t5yAT+*k(l)~Lu4*3)<;%oyl#6Z z5B5z|QuB1Pr(yPQ5Ubw!Sx<>^IxScFmXMcU7`-KDp+* zIa%3(?&Ya9o=;eSiO~<^x-e&nVfVXQ8lMKL1NLu8wJ3UL@Ndy0&338gJa`M?PZ>MK zG$e)@o7S9Y9tzN&Fp|3}H@DlSk}kAzc7+_ksD*ntPR!2TLMYzd-7KCRN#JEw`*rys z^bPbrWDCLKLuQcfbn&{*0-^82ed>I`9>LMg)GMZ&Ud5UN0}Lc#Qk*(ATHM7221|o7 zApr+2RFe1L5QtO}Q`7cRv!QsJ22C+#zkz>N5=N(x?K$9lYx*26=sA|`aGfNHi_1sg zK}}uXD-hF?dBBzSq<5xEtiB!gz){`~sYg%8_U&t|lrSKGgZDj|T`A2$iH5rRWs1!R&EhG|QUy@w=7o?&=mAIy?9Va;WG@4p_jC!9lPnOS#vkBC z_Ldtw>VKMQ-82(4-gwe`S9K?{`b`bN9Mt`g>W+v+#Hecfu|d zludD{Gi2n__6K`^jDNGC6`iyG2Rm@ekxc^qE61m!`2#L1`zEyMNa{;b09Nb*guA7&k zv}`ajaPtA9YL?VcUcR8;4ZiItR=yaxu&XFe^}qb<?wB4Qe8|o&k;hk5H$PVExiTaNhfw0*7n=$p(7ok`xvHtL%Czv0{#>90jNr2Q$ zw0!ddAT1t;km6ks60ltUt`LI)8yc{aa;hY~WeCQy%cQ+!=z+-k$^GSR^ZKQWqtBF^ zFgX~;K1*r8Fj?y5A|eR1v?OxT3Vubvf$b1xHg3pxt$31A2oO8MdT22AI$em3-CNxGqC z*+|)XN8bI*o5%Th=@@D%bKD!PwPRkm?X|dQGLS@G)&mGk{v*1l8Q}1X4lxuNM#_OX z>D6>O314e#&u@<2i}htg!=PvGHO3<#0|)0XxS0(n-4*vALOVa)v*<4yEFVq1E$_5Q z-bhoXtg8oMZXY8fpDZ+_cOJya=J%KGVyxg#E;Q?z^;bde+0OhAz?ZijQURXVC@qe0qj)QMiyZD*~W(J^>7`mWMYyR5>LNw`z6_o(dXeD@`R8LIb>3~ z_u@9{-zL3hSWUI4nP}{6S9N>ILb6TPN;r4-=Lc|ZZRaAs! zQ%?@g$PdQG|M^=;JQ{WR23h)O^V(~PTXeqD&y9LB#`LV~mD}s2l%BCL{B{nj`EUtY zcQ=8rB1>2|YE8#?iVyviq$A@J_+cHHkk8M$eU1vdwDrNTEF6}W9Ic1c4Y}98 z=$V(4via$Nd5#o#U^>-BBXDuh*k5IzU9Jc-E;n1B5m3vK1znCX8CA0KIvO&1a6GRc z!*Hr?%#?y?8~S5U$xoJ=W84UlHOM1zX-3Um&mpH;GmUF!yEBI!?m1}rm37Nh_U1bJZ$^^p6haKMW_6zR+{uS&oWC7M-9IzMI zp+Y$VV*%dyb-#0n(&)kIH?|aNysV;9)Z_4UI^Q+eI^)K;r9UFk%IkTCc<)0z4qs%5 zMzsyf31lj_g&IzxsJZ+-XwLp5=*|}tnWO74pJDp!R&@O$Jc{!5H0tHS$+(~jp{kZ&ja&oK3*I}kW+%0}%@27}pz5C8TC;ROuQNJ~R5jEi5ecuB{rL92^zc zEx#*eAwP!1BQDhECyrH+HoLN)_$g9L$9f%I%1xEtgSWoA9bUPQ-QrB#n?N-9?O54D z$x-lIDRq+e=3G!3hnnFx5|8vZqB_e2AL#q~j7EW{d$kJxF)7c4QL0D9=wTNOH_?=r zQh7?gQs;nSxZF6kwiInrU}^Ce_UxeqM-`m=+#$;B>+q@=ST-NpBck) zfA-9%tTP0&%rMu;Hm_z$4M>{)&XP(Y>V8-7Uk##JXi=)!c2iqVSX63$tBf9~${9U@ zIiW0qk3rFwjKhm?e(0`Bf@x*q5^+Cfw9#Hi7;sw;*b@Fmfx4QC)Z2|R`*Si<`u^Sn&m*QGjWjCQ@ z0kIspGxN*szOnFdei(MIsGN<94e|W~qRKtuSq<8X*|wnJ+Z7TQE*?85wVk4bVbm`( z9Q)NWCicb;!O^rx;+UnRn;X-S-&I)|Ae;*1J6TE|3 z<{Un1@`wqIKA1n`MSSSVEh+iYSGb#&U3W_n!tT$2gh4%*=g``(1OG2-bGd1N@p1bc zMhq$}q-SH3w*G0_S2(fs+j_Og`fw&GMagQ{Q30+RJJ~&QSa<`GkgSg(}|hMWE^BW{ML)&1)&wVkQ#9$aH{uJOlXI8!m)zV@7}ukhZ4 ztJ}QmYaV7v>GvY`JfnbXo%G&RHVqJ+f=#pOGPL?MU?V^1i>Wjh*ROOUxcOX5`a6|o zdc~8-afq_mOUNL9h|EQAr&`;MzjE*)m|5NW`;(4LPyYm6M`+9-yL^;9+?V(%*S`Mu z3kw8Kfqcq+e@Od7dCht_g-X-2Ks?P#radeyp~bH;BR>gfKJz(*^mG<_U0WTCF!+n2 zN9LBQsIQ~nI^+%Y$1ctE(iDK?iF*Q<7)l&8P7uXSD!WGnKgQWvu5j*#5;yjXB(CU@ zxknav50$MzCPb(R#!i42N2LxPl+XYH4X%(pItXZJP=<~; zz(+`6@wJRsHZt5J3!*wA8;scGte*o_MJb;y>efYCeJRWL*Ys0b^|${ z%o$4!t0F7!EGa%8mfA9&aJg*5z`I2ipu77Yw8~6QFC!jTZ5|$EVeNsOh(C=7(`-+Y zjIN>9(SFv}At@?-DXV$p*TIAQ8ldoUE&(*cwOIp^vQHNU!X)uSBihc`L2hc(&nz>% zHVvoR_UAgTI_-lbK;LKqAA&K8`IVMmla{6VZx*eG(HOHb*5-M$p7DKgLSkD9Xc8^7 z;BYaKQ)1dKs8JA1I3n11Jv67UBQ0xBH!r4tXqx?pwEvzX7A!Qjt(q zaiflCRP(w(up&a=FZyqEYQWIM0Y*ZSR@RT*C&tw+@RqokpXL&i|DX}7*!URDa(_22 zK;l95AK;xI|GQZwsT76}w`fbR|7vvTtpu--8_fa&VU2+JHc7mS>sK=WNoLy!-gz>N zkw*BcNDIDK6kD~3oYQBx7V7b<*Y%ksOjJa@{Z zctIyvLxXLvHka7k#3Vgkh+~?^En0bOBRh=-7quU1pf3f9+nWpAn_So7Ci!7u$(YaI zY#~8}mh6HQC}}ul!AXGR;vyw;3jxqm%h zmT;)2z5EvOGbuH7pn=`NetD|D#5ZWIBY>fJ-!$N*N)`dT>u<3IFO_BtjvahFN)Y@b z|G7|9w?bNUCWo=cZW<@LPN#C(!YCE5J-l3u)=Ii`rZcQyZip1#AE)nJ_g=A2UX;JNIg%T%v z1&Vd`y@JQzqE%!*vMpU`D8$Nf`t~V~V{f36ttVMb??Qa~olLOks5HqWL)#?}xeIab z)Y0qH&wm5#7%URpl^{^Hz_M*1M{w&|dZ=NJ<_>`#QBwG_Lp$t%$KFZvlxcrR4rijK znV{!k#DO|kJ|if|ufg8FUtK-a&OUPX%SrNaZ%H(=dBUV!#`U?hWB$bJZ{#*4e zb4$1hBkrKzok)Irtpk{nCS1IZ2?Dw;SHRuSV6J9oZkW;Q8TseOZrXb@j%3YG(ze>V zI>E9CdxYnXyj`sMaEE6P`Mc73x%;7djjqVmQ?Tw`;@hV6Eygh^d zOfZC-j-K;`R6#1{*MSQqr4*`+3&Mh4{P-K!cdY|Qu;lHwdon!Zq(u+Xwr#~O)5ozMjr!}p^Zl3xMUuc{nK%wSn7+qMPad;(=?dnODZ!JAs zIY=UL{j>8Uplr-}+zp_E65|fu9IIyrHHym71@?ml+I`RBjJdqGGe(bjmhYE5GCWIM z7rd`9a6->+l>m~>_04eF$-9CBMS6zG&2Z^QN1sL)51>zk{bOFR?jYv`8Z!(~BWYcE zpQYxT1}K+uT4rFZzaoFILVUf^>tk!ve5a>X*vc^>@$X^v_xW(d_TF%@FPu+kflE82 z*D8?yEVyb0fJERH`!3}k(x?->$$X%9QC==C3BMxJ7y1e*#`_B2(9WADnb3q}_;dw3 z!Kb&QJMu}suZpkT{!7orbJEFV#D*ZYH3Ng1#s$l7Ry6f)YpB}OyUFj6Qnu%OpoA(z z?E%ztd&pkx*CXC$U@l-uYvi9RE5H6OdHaMgJY#$(q+3)G&iskH1q8Z?d7o1!u-t*j z8*G=)hiNqN$CFucm<{v&0I<}JcdM^=@?EQp&5I|j#iOE;3z}K|Gv0Fa{>eD^t(;!# zRPy*RlyZp#%4OA8^x=InezR%+eS-z_&W`^yN#Wa2^_o#9Ad6;kS%j(i(Ws1hSdOgR z`sO3ax2g53W`8)0ZpBi2CeTIfd({QtKKw4T_$8zlXQ-6*p;pr1SPdFAFp(`M>=GFvg&$C1sk>DbDYk| zD$x9)DanyIVVjbx0XbjU)CA(p+1e}3s+v|)jtgX5O#w~jgB27UzscNR49ztbEQhxk zCRoH+@)Y~-2i`K<6p>|bA=Ka;xlmOfZr9dz`Pw^FuGL-#c**XM+pH{A z#=YKBn)nPpb;hWcRR>kBbsAn1_EZTq7zEfn)EfKtNr{xfV1ed`b_|wCT zz~V|~qW6Fa2@lpY(BE3Uf8SfL0TQFYYAP1-9hdxsCH_Tb+Zb`3ZA8V^awT#|J%)I> z95!CS2evl2eOc}h;|{2R(0zKca%sJjT7XyDh5Sl>LU7&jeJ6?frV(l5bEVO^aiK6S z>&{G=$u=xzHS5>hve%a0pQN{QnCEIV;mo6q$u*==MLO$99g?vGk^m~y6TkFFfHLNb zuBB_CB%%v_29?`*SDU&`?BINJ0`)Ot%K^yIHOB6Nm4LG|wc_8iY4SBvS4JsRd$(`+ zML7nR+C^=y1>nls2;IM(9uFTl4BO=Wj#=uG@Ig5yJyI6+-eullfA%;_!IrG?|+sgMl~@l~|7Ja#ho_Idrl1|qcMxl8Jf7S=ZO))^xsvMW4hNKIeV z1trZhCBIlTMKz~E(66p*7SWkmne%d~ayqUN;xm-soKX&E`>A*hc$Yi#mbsjy1yM_9 zEVpx@Py6iAZ0!&4-aTgKP{z#k?jGH)SZRNdG*84@jrBkf#XoD=$?3C33T%?Xc64S1 z#EZ%d0^Z?dbVz~!8$+jrIkSU6h~E{YCA9uu@U#Np?ZB1Xq58iF{eKM>hqw7!Dh1GE z8UoW8X@GjEi7?sZTF&lK%F*fB**U7D?P|?s$Ry2ahrsa)u!tOdkPGLFMTh)6LfL=b zqY8A!Q?~aq{t)kqaH(*6x<|%Z>qj{y*dsnOXp1u-zz;4hcE-~2z2|GcV#__QY47A@;nI){fj6Z`!TML@S-@#K zbxJh;y>aJm?@Y4*@qj?*;KR(vUj8C}TG&Z2uDU$z@ng+S&W9mz4h@p{&yN-B(O*}$ zv-Xc-R!D7x-R|&&UAI1=Ek&-?uuxFf#_!~ezf*#J8skWMaYF$Z)jGYVpdI#a;<4h` zx|hp}&*1B4CAv$Lpo#Vy=1{Z9V3?>ZTF9fpO`w4!B!d)~z=*nF_FG!;{B>hj@ZZa}s9ISrFPQ zMtIY~++p_4sOJ+Z^7nT#7VVEA^hN>ObWu_2sjr3}S=rBWtfqK0%L*{G2-eq|5$IH8 z8n?1hDZ-%ib^bp$3*`oe!X^%lRsciipDE~*95b`ARkM6hYU(c*yn148>j)`vNZz{l z&xb|53#ONzOMIbyWK`Dz#%n3#ER@xoV1oE2m-cpdUC!@DPtKMiM|I34z7Fy5?C(Nx zICun4==z8Ht6F_T;~0h5s9hs>D2KoiR7hRIycEta$oj7cTre`M!UZ*BWx!h9)#42+ zDh`gTo=XtD4x>j!{TuP|TOo7lt6dyt9R1;R;*#}qwB2S%k}iEGr-bfRni?R)cUJX4 z$<&c`Bsis}mi|P%PkjFGH@0-RJ^dpi+Yp#b{``sq;o&FD41l3JU#v>a6lnGBvfZ;T z#Zr&Ng9j}WAYzF-IYdJ&fww${?AcWakn|(*DQPvkrmZBGu$ zcsd&56f}u7QzT4b_nTI6-+yRUxr1b|=MoI&u?3x7$!)8ET5 zZSA6_0{2nV54TCS7fgaZZhd0mfV&3LaBV7~xcsjgkGjbk#&TD2511Mty#iZ^ws*}N zFQN*M{Ag@)5@IHVDZi-q?TEHU%%PJ^;9Nf^j+!#Zq mS>{K;=>BJl{*M=p?+au)Z}&XMMg;-_ehM-w(v^~5g8m0+@r=R% literal 0 HcmV?d00001 diff --git a/CenRa_METABASE/tools/icons/icon.png b/CenRa_METABASE/tools/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..96a568ef98b17d32e38baa714405144eebef4c59 GIT binary patch literal 15984 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 IG@YXU4{u>E2mk;8 literal 0 HcmV?d00001 diff --git a/CenRa_METABASE/tools/images/must_be_a_file.png b/CenRa_METABASE/tools/images/must_be_a_file.png new file mode 100644 index 0000000000000000000000000000000000000000..70629956bb30312a421c2c64f7151234f9afa688 GIT binary patch literal 25798 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 GasLPEDhw|G literal 0 HcmV?d00001 diff --git a/CenRa_METABASE/tools/resources.py b/CenRa_METABASE/tools/resources.py new file mode 100644 index 0000000..a37d55b --- /dev/null +++ b/CenRa_METABASE/tools/resources.py @@ -0,0 +1,184 @@ +"""Tools to work with resource files.""" + +import configparser +import shutil +import tempfile +# import base64 +# import psycopg2 +# import psycopg2.extras +import os +from os.path import abspath, join, pardir, dirname + +from qgis.PyQt import uic + +__copyright__ = "Copyright 2019, 3Liz" +__license__ = "GPL version 3" +__email__ = "info@3liz.org" +__revision__ = "$Format:%H$" + + +def plugin_path(*args): + """Get the path to plugin root folder. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Absolute path to the plugin path. + :rtype: str + """ + path = dirname(dirname(__file__)) + path = abspath(abspath(join(path, pardir))) + for item in args: + path = abspath(join(path, item)) + + return path + + +def plugin_name(): + """Return the plugin name according to metadata.txt. + + :return: The plugin name. + :rtype: basestring + """ + metadata = metadata_config() + name = metadata["general"]["name"] + return name + + +def metadata_config() -> configparser: + """Get the INI config parser for the metadata file. + + :return: The config parser object. + :rtype: ConfigParser + """ + path = plugin_path("metadata.txt") + config = configparser.ConfigParser() + config.read(path, encoding='utf8') + return config + + +def plugin_test_data_path(*args, copy=False): + """Get the path to the plugin test data path. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :param copy: If the file must be copied into a temporary directory first. + :type copy: bool + + :return: Absolute path to the resources folder. + :rtype: str + """ + path = abspath(abspath(join(plugin_path(), "test", "data"))) + for item in args: + path = abspath(join(path, item)) + + if copy: + temp = tempfile.mkdtemp() + shutil.copy(path, temp) + return join(temp, args[-1]) + else: + return path + + +def resources_path(*args): + """Get the path to our resources folder. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Absolute path to the resources folder. + :rtype: str + """ + path = abspath(abspath(join(plugin_path(), "CenRa_METABASE\\tools"))) + for item in args: + path = abspath(join(path, item)) + return path + + +def load_ui(*args): + """Get compile UI file. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Compiled UI file. + """ + ui_class, _ = uic.loadUiType(resources_path("ui", *args)) + + return ui_class + + +def pyperclip(): + dst = dirname(dirname(__file__)) + "\\tools\\" + if os.access('N:/', os.R_OK): + src = 'N:/SI_Systeme d information/Z_QGIS/PLUGIN/PythonSQL.py' + try: + shutil.copy(src, dst) + except FileNotFoundError: + print('404') + except UnboundLocalError: + print('404') + + +def send_issues(url, titre, body, labels): + import requests + import urllib.request + import json + # import os + # import qgis + + # usr = os.environ['USERNAME'] + token = '9d0a4e0bea561710e0728f161f7edf4e5201e112' + url = url + '?token=' + token + + headers = {'Authorization': 'token ' + token, 'accept': 'application/json', 'Content-Type': 'application/json'} + + payload = {'title': titre, 'body': body, 'labels': labels} + try: + urllib.request.urlopen('https://google.com') + binar = True + except ValueError: + binar = False + r = '' + if binar: + r = requests.post(url, data=json.dumps(payload), headers=headers) + return r + + +def maj_verif(NAME): + import qgis + import urllib.request + iface = qgis.utils.iface + from qgis.core import Qgis + + # url = qgis.utils.pluginMetadata(NAME, 'repository') + # URL = url+'/raw/branch/main/plugins.xml' + URL = 'https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/plugins.xml' + # print(URL) + version = qgis.utils.pluginMetadata(NAME, 'version') + len_version = len(version) + try: + urllib.request.urlopen('https://google.com') + binar = True + except urllib.error.URLError: + binar = False + if binar: + try: + version_web = str(urllib.request.urlopen(URL).read()) + plugin_num = version_web.find(NAME) + valeur_version_web = version_web.find('', plugin_num) + 9 + version_plugin = version_web[valeur_version_web:valeur_version_web + len_version] + if version_plugin != version: + iface.messageBar().pushMessage("MAJ :", "Des mise à jour de plugin sont disponibles.", level=Qgis.Info, duration=30) + except urllib.error.URLError: + print("error gitea version ssl") + else: + iface.messageBar().pushMessage("WiFi :", "Pas de connection à internet.", level=Qgis.Warning, duration=30) + + +def devlog(NAME): + import qgis + devmaj = '' + devmaj = devmaj + qgis.utils.pluginMetadata(NAME, 'changelog') + return devmaj diff --git a/CenRa_METABASE/tools/ui/CenRa_IssuesSend.ui b/CenRa_METABASE/tools/ui/CenRa_IssuesSend.ui new file mode 100644 index 0000000..14d923e --- /dev/null +++ b/CenRa_METABASE/tools/ui/CenRa_IssuesSend.ui @@ -0,0 +1,332 @@ + + + CenRa_IssuesSend + + + + 0 + 0 + 810 + 587 + + + + CEN-RA Metabase + + + + icon.svgicon.svg + + + + + 0 + 550 + 811 + 31 + + + + + + + Annuler + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Envoyer + + + + + + + + + 10 + 10 + 791 + 531 + + + + Issues + + + + + 240 + 40 + 321 + 41 + + + + Qt::AlignCenter + + + + + + 10 + 101 + 571 + 421 + + + + + + + 589 + 100 + 191 + 431 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 9 + 9 + 341 + 411 + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Bug + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Aide + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Question + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Amélioration + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Autre + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 250 + 20 + 51 + 21 + + + + + Arial + 14 + + + + Titre: + + + + + + 20 + 70 + 91 + 31 + + + + + Arial + 12 + + + + Messages: + + + + + + 600 + 70 + 91 + 31 + + + + + Arial + 12 + + + + Sujet: + + + + + + ok_button + annuler_button + + + + diff --git a/CenRa_METABASE/tools/ui/CenRa_Metabase_dockwidget_base.ui b/CenRa_METABASE/tools/ui/CenRa_Metabase_dockwidget_base.ui new file mode 100644 index 0000000..78010ec --- /dev/null +++ b/CenRa_METABASE/tools/ui/CenRa_Metabase_dockwidget_base.ui @@ -0,0 +1,74 @@ + + + CenRa_MetabaseDockWidgetBase + + + + 0 + 0 + 329 + 515 + + + + CenRa MetaBase + + + + + + + + + ... + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + ... + + + Qt::NoArrow + + + + + + + ... + + + + + + + help + + + + + + + + + + + + + + diff --git a/CenRa_METABASE/tools/ui/CenRa_Metabase_editorwidget_base.ui b/CenRa_METABASE/tools/ui/CenRa_Metabase_editorwidget_base.ui new file mode 100644 index 0000000..ac91920 --- /dev/null +++ b/CenRa_METABASE/tools/ui/CenRa_Metabase_editorwidget_base.ui @@ -0,0 +1,1946 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 818 + 741 + + + + CEN-RA Metabase + + + + icon.svgicon.svg + + + + + 0 + 0 + 821 + 711 + + + + + Myriad Pro Black + 10 + 75 + false + true + + + + Qt::DefaultContextMenu + + + Qt::LeftToRight + + + false + + + QTabWidget::North + + + QTabWidget::Rounded + + + 0 + + + + 40 + 40 + + + + true + + + false + + + false + + + false + + + false + + + + Identification + + + + + 30 + 110 + 751 + 99 + + + + + + + Description + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Myriad Pro Black'; font-size:10pt; font-weight:600; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400;"><br /></p></body></html> + + + + + + + + + 30 + 220 + 751 + 101 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + Categories : + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + true + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectItems + + + + + + + + + 30 + 330 + 751 + 101 + + + + + + + Thèmes : + + + + + + + Qt::Horizontal + + + + 10 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + 30 + 440 + 751 + 101 + + + + + + + + + + Mots-clés : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 550 + 751 + 51 + + + + + + + Dernier mise à jour : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 24 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 30 + 751 + 61 + + + + + + + + + + Titre : + + + + + + + + + 30 + 620 + 751 + 51 + + + + + + + Langue : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Spatial properties + + + + + 220 + 20 + 540 + 39 + + + + + + + 34 + 20 + 170 + 39 + + + + Niveau : + + + + + + 34 + 70 + 170 + 39 + + + + Echelle minimum : + + + + + + 220 + 70 + 540 + 39 + + + + + + + 34 + 120 + 170 + 39 + + + + Echelle maximum : + + + + + + 220 + 120 + 540 + 39 + + + + + + + 34 + 170 + 170 + 39 + + + + Nombre d'entités : + + + + + false + + + + 220 + 170 + 540 + 39 + + + + + + + 34 + 220 + 170 + 39 + + + + Type de géométrie : + + + + + false + + + + 220 + 220 + 540 + 39 + + + + + + false + + + + 220 + 320 + 540 + 39 + + + + + + + 34 + 270 + 170 + 39 + + + + Nom de projection : + + + + + + 34 + 370 + 170 + 39 + + + + Emprise : + + + + + + 34 + 320 + 170 + 39 + + + + ID de projection : + + + + + false + + + + 220 + 270 + 540 + 39 + + + + + + false + + + + 221 + 370 + 540 + 39 + + + + + + + Publication + + + + + 30 + 390 + 751 + 61 + + + + + + + Restriction : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 210 + 751 + 61 + + + + + + + Licence : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 30 + 751 + 61 + + + + + + + Date : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 22 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 300 + 751 + 61 + + + + + + + Licence attribué : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 120 + 751 + 61 + + + + + + + Fréquence de mise à jour : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Lien + + + + + 10 + 120 + 791 + 511 + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + 20 + 20 + 771 + 61 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Taille : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Type : + + + + + + + + + + + + + URL : + + + + + + + Type MIME : + + + + + + + Format : + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Ajouter + + + + + + + + + + + + + + + 10 + 640 + 791 + 31 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Delete + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 10 + 90 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 20 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + 800 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + Contacts + + + + + 20 + 20 + 771 + 61 + + + + + + + Nom : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Ajouter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Email : + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Organisation : + + + + + + + Telephone + + + + + + + Rôle : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + + + 10 + 120 + 791 + 511 + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + 10 + 640 + 791 + 31 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Delete + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 800 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + 10 + 20 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 90 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + Metadata + + + + + 30 + 30 + 751 + 61 + + + + + + + Table : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + + + + + + 30 + 300 + 751 + 61 + + + + + + + Date de modification : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 23 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 390 + 751 + 61 + + + + + + + Encodage : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 30 + 210 + 751 + 61 + + + + + + + Date de création : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 23 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 120 + 751 + 61 + + + + + + + Schema : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + + + + + + 30 + 480 + 751 + 61 + + + + + + + UUID : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + + + + + + + + 0 + 710 + 821 + 31 + + + + + + + Annuler + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + + + 780 + 20 + 25 + 19 + + + + ... + + + + 32 + 32 + + + + Qt::NoArrow + + + + + + 780 + 2 + 25 + 19 + + + + ... + + + + 32 + 32 + + + + Qt::NoArrow + + + + + true + + + + 550 + 10 + 41 + 41 + + + + ... + + + + 32 + 32 + + + + Qt::NoArrow + + + + + titre_line + description_text + ok_button + annuler_button + tabWidget + langue_box + niveau_plain + echelle_min_plain + echelle_max_plain + nbr_layers + typegeom_plaintext + crscode_plaintext + crsname_plaintext + extend_plaintext + restriction_box + licence_box + licence_attrib_box + frequence_box + table_lien + add_lien_button + format_box + mime_box + type_box + delete_lien_button + organisation_box + add_contact_button + role_box + table_contact + delete_contact_button + table_ligne + encodage_box + schema_ligne + uuid_ligne + mots_cles_text + + + + diff --git a/CenRa_METABASE/tools/ui/CenRa_about_form.ui b/CenRa_METABASE/tools/ui/CenRa_about_form.ui new file mode 100644 index 0000000..6ec4843 --- /dev/null +++ b/CenRa_METABASE/tools/ui/CenRa_about_form.ui @@ -0,0 +1,81 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 471 + 594 + + + + Journal des modifications + + + + ../../CenRa_Metabase/tools/ui/icon.svg../../CenRa_Metabase/tools/ui/icon.svg + + + + + + true + + + Qt::NoFocus + + + QFrame::NoFrame + + + true + + + + + 0 + 0 + 453 + 570 + + + + + + 0 + 0 + 451 + 541 + + + + DevLog + + + + + 10 + 20 + 431 + 511 + + + + + + + + + + + QDialogButtonBox::NoButton + + + + + + + + diff --git a/CenRa_METABASE/tools/xml/dcat.xml b/CenRa_METABASE/tools/xml/dcat.xml new file mode 100644 index 0000000..852508d --- /dev/null +++ b/CenRa_METABASE/tools/xml/dcat.xml @@ -0,0 +1,26 @@ + + + + + CEN-RA DCAT RDF catalog + {language} + CEN-RA Metadata + + + + {content} + + + + + + diff --git a/CenRa_METABASE/tools/xml/distribution.xml b/CenRa_METABASE/tools/xml/distribution.xml new file mode 100644 index 0000000..2ff86b0 --- /dev/null +++ b/CenRa_METABASE/tools/xml/distribution.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/CenRa_METABASE/tools/xml/publisher.xml b/CenRa_METABASE/tools/xml/publisher.xml new file mode 100644 index 0000000..1cda931 --- /dev/null +++ b/CenRa_METABASE/tools/xml/publisher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CenRa_PAGERENDER/CenRa_PageRender.py b/CenRa_PAGERENDER/CenRa_PageRender.py new file mode 100644 index 0000000..46e9d24 --- /dev/null +++ b/CenRa_PAGERENDER/CenRa_PageRender.py @@ -0,0 +1,141 @@ +__copyright__ = "Copyright 2021, 3Liz" +__license__ = "GPL version 3" +__email__ = "info@3liz.org" + + +from qgis.core import QgsApplication +from qgis.PyQt.QtCore import QUrl, QSettings +from qgis.PyQt.QtGui import QDesktopServices, QIcon +from qgis.PyQt.QtWidgets import QAction +from qgis.utils import iface +import qgis + + +# include +''' +from pg_metadata.connection_manager import ( + store_connections, + validate_connections_names, +) + + +from pg_metadata.locator import LocatorFilter +from pg_metadata.processing.provider import PgMetadataProvider +from pg_metadata.qgis_plugin_tools.tools.custom_logging import setup_logger +''' +import os +from .tools.resources import ( + # plugin_path, + resources_path, + maj_verif, +) +from .canvas_editor import PageRender_Editor +from .about_form import AboutDialog + + +class PgPageRender: + def __init__(self): + """ Constructor. """ + self.canvas_editor = None +# self.issues = None + self.provider = None + self.locator_filter = None + self.dock_action = None + self.help_action = None + plugin_dir = os.path.dirname(__file__) + end_find = plugin_dir.rfind('\\') + 1 + global NAME + NAME = plugin_dir[end_find:] + maj_verif(NAME) + + # Display About window on first use + version = qgis.utils.pluginMetadata('CenRa_PAGERENDER', 'version') + s = QSettings() + versionUse = s.value("pagerender/version", 1, type=str) + if str(versionUse) != str(version): + s.setValue("pagerender/version", str(version)) + print(versionUse, version) + self.open_about_dialog() + + def initGui(self): + """ Build the plugin GUI. """ + + self.toolBar = iface.addToolBar("CenRa_PAGERENDER") + self.toolBar.setObjectName("CenRa_PAGERENDER") + + icon = QIcon(resources_path('icons', 'icon.png')) + + # Open the online help + self.help_action = QAction(icon, 'CenRa_PAGERENDER', iface.mainWindow()) + iface.pluginHelpMenu().addAction(self.help_action) + self.help_action.triggered.connect(self.open_help) + if not self.canvas_editor: + self.canvas_editor = PageRender_Editor() + + self.pagerender_action = QAction(icon, 'CenRa_PAGERENDER', None) + self.toolBar.addAction(self.pagerender_action) + self.pagerender_action.triggered.connect(self.open_editor) + ''' + if not self.locator_filter: + self.locator_filter = LocatorFilter(iface) + iface.registerLocatorFilter(self.locator_filter) + + @staticmethod + def check_invalid_connection_names(): + """ Check for invalid connection names in the QgsSettings. """ + valid, invalid = validate_connections_names() + n_invalid = len(invalid) + + if n_invalid == 0: + return + + invalid_text = ', '.join(invalid) + msg = QMessageBox() + msg.setIcon(QMessageBox.Warning) + msg.setWindowTitle(tr('PgMetadata: Database connection(s) not available')) + msg.setText(tr( + f'{n_invalid} connection(s) listed in PgMetadata’s settings are invalid or ' + f'no longer available: {invalid_text}')) + msg.setInformativeText(tr( + 'Do you want to remove these connection(s) from the PgMetadata settings? ' + '(You can also do this later with the “Set Connections” tool.)')) + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + clicked = msg.exec() + + if clicked == QMessageBox.Yes: + iface.messageBar().pushSuccess('PgMetadata', tr(f'{n_invalid} invalid connection(s) removed.')) + store_connections(valid) + if clicked == QMessageBox.No: + iface.messageBar().pushInfo('PgMetadata', tr(f'Keeping {n_invalid} invalid connections.')) + ''' + def open_about_dialog(self): + """ + About dialog + """ + dialog = AboutDialog(iface) + dialog.exec() + + def open_help(): + """ Open the online help. """ + QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/')) + + def open_editor(self): + self.canvas_editor.show() + self.canvas_editor.raise_() + + def unload(self): + """ Unload the plugin. """ + if self.canvas_editor: + iface.removePluginMenu('CenRa_PAGERENDER', self.pagerender_action) + + if self.provider: + QgsApplication.processingRegistry().removeProvider(self.provider) + del self.provider + + if self.locator_filter: + iface.deregisterLocatorFilter(self.locator_filter) + del self.locator_filter + + if self.help_action: + iface.pluginHelpMenu().removeAction(self.help_action) + del self.help_action diff --git a/CenRa_PAGERENDER/README.md b/CenRa_PAGERENDER/README.md new file mode 100644 index 0000000..80ccffe --- /dev/null +++ b/CenRa_PAGERENDER/README.md @@ -0,0 +1 @@ +# CenRa_AutoMap \ No newline at end of file diff --git a/CenRa_PAGERENDER/__init__.py b/CenRa_PAGERENDER/__init__.py new file mode 100644 index 0000000..365e090 --- /dev/null +++ b/CenRa_PAGERENDER/__init__.py @@ -0,0 +1,10 @@ +__copyright__ = "Copyright 2021, 3Liz" +__license__ = "GPL version 3" +__email__ = "info@3liz.org" + + +# noinspection PyPep8Naming +def classFactory(iface): # pylint: disable=invalid-name + _ = iface + from CenRa_PAGERENDER.CenRa_PageRender import PgPageRender + return PgPageRender() diff --git a/CenRa_PAGERENDER/about_form.py b/CenRa_PAGERENDER/about_form.py new file mode 100644 index 0000000..8828a44 --- /dev/null +++ b/CenRa_PAGERENDER/about_form.py @@ -0,0 +1,46 @@ +import os.path + +from pathlib import Path + +from qgis.PyQt import uic +# from qgis.PyQt.QtGui import QPixmap +from qgis.PyQt.QtWidgets import QDialog + +from .tools.resources import devlog + +ABOUT_FORM_CLASS, _ = uic.loadUiType( + os.path.join( + str(Path(__file__).resolve().parent), + 'tools/ui', + 'CenRa_about_form.ui' + ) +) + + +class AboutDialog(QDialog, ABOUT_FORM_CLASS): + + """ About - Let the user display the about dialog. """ + + def __init__(self, iface, parent=None): + super().__init__(parent) + self.iface = iface + self.setupUi(self) + + self.viewer.setHtml(devlog('CenRa_PAGERENDER')) + + self.rejected.connect(self.onReject) + self.buttonBox.rejected.connect(self.onReject) + self.buttonBox.accepted.connect(self.onAccept) + + def onAccept(self): + """ + Save options when pressing OK button + """ + self.accept() + + def onReject(self): + """ + Run some actions when + the user closes the dialog + """ + self.close() diff --git a/CenRa_PAGERENDER/canvas_editor.py b/CenRa_PAGERENDER/canvas_editor.py index 01fb22e..66bba0e 100644 --- a/CenRa_PAGERENDER/canvas_editor.py +++ b/CenRa_PAGERENDER/canvas_editor.py @@ -11,7 +11,6 @@ from qgis.core import QgsSettings from qgis.PyQt.QtCore import Qt # from qgis.PyQt.QtPrintSupport import QPrinter # from qgis.PyQt.QtWebKitWidgets import QWebPage -# test de push from qgis.PyQt.QtWidgets import ( QDialog, QFileDialog, diff --git a/CenRa_PAGERENDER/demoV2.py b/CenRa_PAGERENDER/demoV2.py new file mode 100644 index 0000000..df678af --- /dev/null +++ b/CenRa_PAGERENDER/demoV2.py @@ -0,0 +1,169 @@ + +from qgis.core import ( + QgsLayoutSize, + QgsUnitTypes, + QgsLayoutPoint, +) + + +def fletch_canvas(self): + if self.radioButton_6.isChecked(): + values_page = 'A4' + else: + values_page = 'A3' + if self.radioButton_7.isChecked(): + page_rotate = 'Portrait' + else: + page_rotate = 'Landscape' + + if page_rotate == 'Portrait': + if values_page == 'A4': + self.template_parameters['Carte_size'] = QgsLayoutSize(200.0, 200, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_locals'] = QgsLayoutPoint(6, 6, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_rotate'] = 0 + self.template_parameters['Carte_2_size'] = QgsLayoutSize(85.71428571428571, 69, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(209, 3, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_rotate'] = 0 + self.template_parameters['Legande_size'] = QgsLayoutSize(85.71428571428571, 131, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_locals'] = QgsLayoutPoint(209, 74, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_rotate'] = 0 + self.template_parameters['Arrow_size'] = QgsLayoutSize(14.285714285714286, 14, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_locals'] = QgsLayoutPoint(189, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_rotate'] = 0 + self.template_parameters['Echelle_size'] = QgsLayoutSize(51.42857142857143, 7, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_locals'] = QgsLayoutPoint(9, 197, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_rotate'] = 0 + self.template_parameters['Logo_size'] = QgsLayoutSize(45.714285714285715, 11, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_locals'] = QgsLayoutPoint(3, 3, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_rotate'] = 0 + self.template_parameters['Titre_size'] = QgsLayoutSize(154.28571428571428, 11, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_locals'] = QgsLayoutPoint(51, 3, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_rotate'] = 0 + self.template_parameters['Credit_size'] = QgsLayoutSize(51.42857142857143, 6, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_locals'] = QgsLayoutPoint(151, 197, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_rotate'] = 0 + self.template_parameters['Source_size'] = QgsLayoutSize(51.42857142857143, 6, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_locals'] = QgsLayoutPoint(229, 197, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_rotate'] = 0 + self.template_parameters['Sous_titre_size'] = QgsLayoutSize(125.71428571428571, 14, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(60, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_rotate'] = 0 + self.template_parameters['Echelle_2_size'] = QgsLayoutSize(51.42857142857143, 13, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(9, 184, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_rotate'] = 0 + self.template_parameters['Logo_2_size'] = QgsLayoutSize(28.571428571428573, 29, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(9, 151, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_rotate'] = 0 + if values_page == 'A3': + self.template_parameters['Carte_size'] = QgsLayoutSize(282, 282, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_locals'] = QgsLayoutPoint(8, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_rotate'] = 0 + self.template_parameters['Carte_2_size'] = QgsLayoutSize(121, 97, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(294, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_rotate'] = 0 + self.template_parameters['Legande_size'] = QgsLayoutSize(121, 185, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_locals'] = QgsLayoutPoint(294, 105, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_rotate'] = 0 + self.template_parameters['Arrow_size'] = QgsLayoutSize(20, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_locals'] = QgsLayoutPoint(266, 28, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_rotate'] = 0 + self.template_parameters['Echelle_size'] = QgsLayoutSize(73, 10, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_locals'] = QgsLayoutPoint(12, 278, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_rotate'] = 0 + self.template_parameters['Logo_size'] = QgsLayoutSize(64, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_locals'] = QgsLayoutPoint(4, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_rotate'] = 0 + self.template_parameters['Titre_size'] = QgsLayoutSize(218, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_locals'] = QgsLayoutPoint(73, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_rotate'] = 0 + self.template_parameters['Credit_size'] = QgsLayoutSize(73, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_locals'] = QgsLayoutPoint(214, 278, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_rotate'] = 0 + self.template_parameters['Source_size'] = QgsLayoutSize(73, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_locals'] = QgsLayoutPoint(322, 278, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_rotate'] = 0 + self.template_parameters['Sous_titre_size'] = QgsLayoutSize(177, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(85, 28, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_rotate'] = 0 + self.template_parameters['Echelle_2_size'] = QgsLayoutSize(73, 18, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(12, 260, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_rotate'] = 0 + self.template_parameters['Logo_2_size'] = QgsLayoutSize(40, 40, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(12, 214, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_rotate'] = 0 + if page_rotate == 'Landscape': + if values_page == 'A4': + self.template_parameters['Carte_size'] = QgsLayoutSize(200.0, 200, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_locals'] = QgsLayoutPoint(6, 6, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_rotate'] = 0 + self.template_parameters['Carte_2_size'] = QgsLayoutSize(85.71428571428571, 69, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(209, 3, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_rotate'] = 0 + self.template_parameters['Legande_size'] = QgsLayoutSize(85.71428571428571, 131, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_locals'] = QgsLayoutPoint(209, 74, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_rotate'] = 0 + self.template_parameters['Arrow_size'] = QgsLayoutSize(14.285714285714286, 14, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_locals'] = QgsLayoutPoint(189, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_rotate'] = 0 + self.template_parameters['Echelle_size'] = QgsLayoutSize(51.42857142857143, 7, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_locals'] = QgsLayoutPoint(9, 197, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_rotate'] = 0 + self.template_parameters['Logo_size'] = QgsLayoutSize(45.714285714285715, 11, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_locals'] = QgsLayoutPoint(3, 3, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_rotate'] = 0 + self.template_parameters['Titre_size'] = QgsLayoutSize(154.28571428571428, 11, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_locals'] = QgsLayoutPoint(51, 3, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_rotate'] = 0 + self.template_parameters['Credit_size'] = QgsLayoutSize(51.42857142857143, 6, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_locals'] = QgsLayoutPoint(151, 197, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_rotate'] = 0 + self.template_parameters['Source_size'] = QgsLayoutSize(51.42857142857143, 6, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_locals'] = QgsLayoutPoint(229, 197, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_rotate'] = 0 + self.template_parameters['Sous_titre_size'] = QgsLayoutSize(125.71428571428571, 14, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(60, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_rotate'] = 0 + self.template_parameters['Echelle_2_size'] = QgsLayoutSize(51.42857142857143, 13, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(9, 184, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_rotate'] = 0 + self.template_parameters['Logo_2_size'] = QgsLayoutSize(28.571428571428573, 29, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(9, 151, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_rotate'] = 0 + if values_page == 'A3': + self.template_parameters['Carte_size'] = QgsLayoutSize(282, 282, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_locals'] = QgsLayoutPoint(8, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_rotate'] = 0 + self.template_parameters['Carte_2_size'] = QgsLayoutSize(121, 97, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(294, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Carte_2_rotate'] = 0 + self.template_parameters['Legande_size'] = QgsLayoutSize(121, 185, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_locals'] = QgsLayoutPoint(294, 105, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Legande_rotate'] = 0 + self.template_parameters['Arrow_size'] = QgsLayoutSize(20, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_locals'] = QgsLayoutPoint(266, 28, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Arrow_rotate'] = 0 + self.template_parameters['Echelle_size'] = QgsLayoutSize(73, 10, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_locals'] = QgsLayoutPoint(12, 278, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_rotate'] = 0 + self.template_parameters['Logo_size'] = QgsLayoutSize(64, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_locals'] = QgsLayoutPoint(4, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_rotate'] = 0 + self.template_parameters['Titre_size'] = QgsLayoutSize(218, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_locals'] = QgsLayoutPoint(73, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Titre_rotate'] = 0 + self.template_parameters['Credit_size'] = QgsLayoutSize(73, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_locals'] = QgsLayoutPoint(214, 278, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Credit_rotate'] = 0 + self.template_parameters['Source_size'] = QgsLayoutSize(73, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_locals'] = QgsLayoutPoint(322, 278, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Source_rotate'] = 0 + self.template_parameters['Sous_titre_size'] = QgsLayoutSize(177, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(85, 28, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Sous_titre_rotate'] = 0 + self.template_parameters['Echelle_2_size'] = QgsLayoutSize(73, 18, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(12, 260, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Echelle_2_rotate'] = 0 + self.template_parameters['Logo_2_size'] = QgsLayoutSize(40, 40, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(12, 214, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['Logo_2_rotate'] = 0 + return self.template_parameters diff --git a/CenRa_PAGERENDER/icon.png b/CenRa_PAGERENDER/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a910fea37e4930c40122d285e6ea9fdc75ba7 GIT binary patch literal 4977 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 literal 0 HcmV?d00001 diff --git a/CenRa_PAGERENDER/issues.py b/CenRa_PAGERENDER/issues.py new file mode 100644 index 0000000..0d6416a --- /dev/null +++ b/CenRa_PAGERENDER/issues.py @@ -0,0 +1,89 @@ +import os +plugin_dir = os.path.dirname(__file__) +end_find = plugin_dir.rfind('\\')+1 + +NAME = plugin_dir[end_find:] +#print(NAME) + +from qgis.gui import * + +from qgis.core import ( + NULL, + QgsApplication, + QgsDataSourceUri, + QgsProject, + QgsProviderConnectionException, + QgsProviderRegistry, + QgsRasterLayer, + QgsSettings, + QgsVectorLayer, + QgsGeometry, +) +from qgis.PyQt.QtWidgets import ( + QDialog, + QAction, + QDockWidget, + QFileDialog, + QInputDialog, + QMenu, + QToolButton, + QTableWidget, + QTableWidgetItem, +) +from qgis.utils import iface + + +from .tools.resources import ( + load_ui, + resources_path, + send_issues, +) + +EDITOR_CLASS = load_ui('CenRa_IssuesSend.ui') + +class CenRa_Issues(QDialog, EDITOR_CLASS): + + def __init__(self, parent=None): + _ = parent + super().__init__() + self.setupUi(self) + self.settings = QgsSettings() + + #place connect here + self.annuler_button.clicked.connect(self.close) + self.ok_button.clicked.connect(self.run_sendissues) + + def run_sendissues(self): + text_titre = self.titre_line.text() + text_message = self.messages_plain.toPlainText() + statu_bug = self.check_bug.isChecked() + statu_aide = self.check_aide.isChecked() + statu_question = self.check_question.isChecked() + statu_amelioration = self.check_amelioration.isChecked() + statu_autre = self.check_autre.isChecked() + + statu = [] + if statu_bug == True : statu = statu + [1] + if statu_aide == True : statu = statu + [3] + if statu_question == True : statu = statu + [5] + if statu_amelioration == True : statu = statu + [2] + if statu_autre == True : statu = statu + [6] + + if len(statu) >= 1: + import qgis + url = qgis.utils.pluginMetadata(NAME,'tracker') + print(text_message) + send_info = send_issues(url,text_titre,text_message,statu) + code = send_info.status_code + print(code) + else: + code = 423 + if code == 201: + iface.messageBar().pushMessage("Envoyer :", "Votre messages à bien été envoyer.", level=Qgis.Success, duration=20) + self.close() + elif code == 422: + iface.messageBar().pushMessage("Erreur :", "Erreur dans le contenu du messages.", level=Qgis.Critical, duration=20) + elif code == 423: + iface.messageBar().pushMessage("Erreur :", "Pas de sujet sélectionné.", level=Qgis.Critical, duration=20) + elif code == 404: + iface.messageBar().pushMessage("Missing :", "Le serveur de messagerie est injoignable.", level=Qgis.Warning, duration=20) diff --git a/CenRa_PAGERENDER/tools/icons/CEN_RA.png b/CenRa_PAGERENDER/tools/icons/CEN_RA.png new file mode 100644 index 0000000000000000000000000000000000000000..95ead1cf7313bc03e4637c9bb20945373f27ddca GIT binary patch literal 8893 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 LNkvXXu0mjfe10PI literal 0 HcmV?d00001 diff --git a/CenRa_PAGERENDER/tools/icons/icon.png b/CenRa_PAGERENDER/tools/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..63569ff1341213be87e81a3265877e25b7031aa0 GIT binary patch literal 45060 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 literal 0 HcmV?d00001 diff --git a/CenRa_PAGERENDER/tools/resources.py b/CenRa_PAGERENDER/tools/resources.py new file mode 100644 index 0000000..bdd8c41 --- /dev/null +++ b/CenRa_PAGERENDER/tools/resources.py @@ -0,0 +1,174 @@ +"""Tools to work with resource files.""" + +import configparser +import shutil +import tempfile +# import base64 +# import psycopg2 +# import psycopg2.extras +from os.path import abspath, join, pardir, dirname +from qgis.PyQt.QtWidgets import QApplication +from qgis.PyQt import uic + +__copyright__ = "Copyright 2019, 3Liz" +__license__ = "GPL version 3" +__email__ = "info@3liz.org" +__revision__ = "$Format:%H$" + + +def plugin_path(*args): + """Get the path to plugin root folder. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Absolute path to the plugin path. + :rtype: str + """ + path = dirname(dirname(__file__)) + path = abspath(abspath(join(path, pardir))) + for item in args: + path = abspath(join(path, item)) + + return path + + +def plugin_name(): + """Return the plugin name according to metadata.txt. + + :return: The plugin name. + :rtype: basestring + """ + metadata = metadata_config() + name = metadata["general"]["name"] + return name + + +def metadata_config() -> configparser: + """Get the INI config parser for the metadata file. + + :return: The config parser object. + :rtype: ConfigParser + """ + path = plugin_path("metadata.txt") + config = configparser.ConfigParser() + config.read(path, encoding='utf8') + return config + + +def plugin_test_data_path(*args, copy=False): + """Get the path to the plugin test data path. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :param copy: If the file must be copied into a temporary directory first. + :type copy: bool + + :return: Absolute path to the resources folder. + :rtype: str + """ + path = abspath(abspath(join(plugin_path(), "test", "data"))) + for item in args: + path = abspath(join(path, item)) + + if copy: + temp = tempfile.mkdtemp() + shutil.copy(path, temp) + return join(temp, args[-1]) + else: + return path + + +def resources_path(*args): + """Get the path to our resources folder. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Absolute path to the resources folder. + :rtype: str + """ + path = abspath(abspath(join(plugin_path(), "CenRa_PAGERENDER\\tools"))) + for item in args: + path = abspath(join(path, item)) + return path + + +def load_ui(*args): + """Get compile UI file. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Compiled UI file. + """ + ui_class, _ = uic.loadUiType(resources_path("ui", *args)) + + return ui_class + + +def send_issues(url, titre, body, labels): + import requests + import urllib.request + import json + # import os + + # usr = os.environ['USERNAME'] + token = '9d0a4e0bea561710e0728f161f7edf4e5201e112' + url = url + '?token=' + token + + headers = {'Authorization': 'token ' + token, 'accept': 'application/json', 'Content-Type': 'application/json'} + + payload = {'title': titre, 'body': body, 'labels': labels} + try: + urllib.request.urlopen('https://google.com') + binar = True + except urllib.requests.URLError: + binar = False + r = '' + if binar: + r = requests.post(url, data=json.dumps(payload), headers=headers) + return r + + +def maj_verif(NAME): + import qgis + import urllib.request + iface = qgis.utils.iface + from qgis.core import Qgis + + # url = qgis.utils.pluginMetadata(NAME, 'repository') + # URL = url+'/raw/branch/main/plugins.xml' + URL = 'https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/plugins.xml' +# print(URL) + version = qgis.utils.pluginMetadata(NAME, 'version') + len_version = len(version) + try: + urllib.request.urlopen('https://google.com') + binar = True + except urllib.requests.URLError: + binar = False + if binar: + try: + version_web = str(urllib.request.urlopen(URL).read()) + plugin_num = version_web.find(NAME) + valeur_version_web = version_web.find('', plugin_num) + 9 + version_plugin = version_web[valeur_version_web:valeur_version_web + len_version] + if version_plugin != version: + iface.messageBar().pushMessage("MAJ :", "Des mise à jour de plugin sont disponibles.", level=Qgis.Info, duration=30) + except urllib.requests.URLError: + print("error gitea version ssl") + else: + iface.messageBar().pushMessage("WiFi :", "Pas de connection à internet.", level=Qgis.Warning, duration=30) + + +def tr(text, context="@default"): + return QApplication.translate(context, text) + + +def devlog(NAME): + import qgis + devmaj = '' + devmaj = devmaj + qgis.utils.pluginMetadata(NAME, 'changelog') + return devmaj diff --git a/CenRa_PAGERENDER/tools/ui/CenRa_IssuesSend.ui b/CenRa_PAGERENDER/tools/ui/CenRa_IssuesSend.ui new file mode 100644 index 0000000..14d923e --- /dev/null +++ b/CenRa_PAGERENDER/tools/ui/CenRa_IssuesSend.ui @@ -0,0 +1,332 @@ + + + CenRa_IssuesSend + + + + 0 + 0 + 810 + 587 + + + + CEN-RA Metabase + + + + icon.svgicon.svg + + + + + 0 + 550 + 811 + 31 + + + + + + + Annuler + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Envoyer + + + + + + + + + 10 + 10 + 791 + 531 + + + + Issues + + + + + 240 + 40 + 321 + 41 + + + + Qt::AlignCenter + + + + + + 10 + 101 + 571 + 421 + + + + + + + 589 + 100 + 191 + 431 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 9 + 9 + 341 + 411 + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Bug + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Aide + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Question + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Amélioration + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Autre + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 250 + 20 + 51 + 21 + + + + + Arial + 14 + + + + Titre: + + + + + + 20 + 70 + 91 + 31 + + + + + Arial + 12 + + + + Messages: + + + + + + 600 + 70 + 91 + 31 + + + + + Arial + 12 + + + + Sujet: + + + + + + ok_button + annuler_button + + + + diff --git a/CenRa_PAGERENDER/tools/ui/CenRa_PageRender_base.ui b/CenRa_PAGERENDER/tools/ui/CenRa_PageRender_base.ui index 3c96170..884a749 100644 --- a/CenRa_PAGERENDER/tools/ui/CenRa_PageRender_base.ui +++ b/CenRa_PAGERENDER/tools/ui/CenRa_PageRender_base.ui @@ -78,7 +78,7 @@ 296 - Qt::Orientation::Horizontal + Qt::Horizontal @@ -100,7 +100,7 @@ 0 - Qt::Orientation::Vertical + Qt::Vertical true @@ -118,12 +118,6 @@ QFrame#frame{background-color: rgb(255, 255, 255, 170);} - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - @@ -139,24 +133,9 @@ background-color: rgba(10, 10, 10, 50) - - QFrame::Shape::NoFrame - - - QFrame::Shadow::Plain - - - 5 - - - 2 - - - Qt::AlignmentFlag::AlignCenter - 5 @@ -176,9 +155,6 @@ background-color: rgba(10, 10, 10, 50) - - QFrame::Shadow::Plain - @@ -277,27 +253,12 @@ background-color: rgba(10, 10, 10, 50) - - QFrame::Shape::NoFrame - - - QFrame::Shadow::Raised - - - -1 - - - 0 - false - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTop|Qt::AlignmentFlag::AlignTrailing - false @@ -364,27 +325,12 @@ background-color: rgba(10, 10, 10, 50) - - QFrame::Shape::NoFrame - - - QFrame::Shadow::Raised - - - -1 - - - 0 - false - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTop|Qt::AlignmentFlag::AlignTrailing - false @@ -446,12 +392,6 @@ QFrame#frame_2{background-color: rgb(255, 255, 255, 170);} - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - @@ -465,13 +405,13 @@ 1 - Qt::ScrollBarPolicy::ScrollBarAlwaysOff + Qt::ScrollBarAsNeeded - QAbstractScrollArea::SizeAdjustPolicy::AdjustToContentsOnFirstShow + QAbstractScrollArea::AdjustIgnored - QAbstractItemView::EditTrigger::NoEditTriggers + QAbstractItemView::NoEditTriggers false @@ -483,19 +423,19 @@ false - QAbstractItemView::DragDropMode::NoDragDrop + QAbstractItemView::NoDragDrop - Qt::DropAction::IgnoreAction + Qt::IgnoreAction true - QAbstractItemView::SelectionMode::SingleSelection + QAbstractItemView::NoSelection - QAbstractItemView::SelectionBehavior::SelectRows + QAbstractItemView::SelectItems @@ -504,7 +444,7 @@ - Qt::TextElideMode::ElideMiddle + Qt::ElideLeft true @@ -590,13 +530,13 @@ 1 - Qt::ScrollBarPolicy::ScrollBarAlwaysOff + Qt::ScrollBarAsNeeded - QAbstractScrollArea::SizeAdjustPolicy::AdjustToContentsOnFirstShow + QAbstractScrollArea::AdjustIgnored - QAbstractItemView::EditTrigger::DoubleClicked + QAbstractItemView::NoEditTriggers false @@ -608,19 +548,19 @@ false - QAbstractItemView::DragDropMode::NoDragDrop + QAbstractItemView::NoDragDrop - Qt::DropAction::IgnoreAction + Qt::IgnoreAction true - QAbstractItemView::SelectionMode::SingleSelection + QAbstractItemView::NoSelection - QAbstractItemView::SelectionBehavior::SelectRows + QAbstractItemView::SelectItems @@ -629,7 +569,7 @@ - Qt::TextElideMode::ElideMiddle + Qt::ElideLeft true @@ -707,16 +647,16 @@ - Qt::FocusPolicy::NoFocus + Qt::NoFocus - Qt::LayoutDirection::LeftToRight + Qt::LeftToRight false - Qt::InputMethodHint::ImhNone + Qt::ImhNone @@ -741,7 +681,7 @@ - QAbstractSpinBox::ButtonSymbols::NoButtons + QAbstractSpinBox::UpDownArrows @@ -763,7 +703,7 @@ - QAbstractSpinBox::ButtonSymbols::NoButtons + QAbstractSpinBox::UpDownArrows @@ -812,9 +752,6 @@ 40 - - Qt::Orientation::Vertical - true diff --git a/CenRa_PAGERENDER/tools/ui/CenRa_about_form.ui b/CenRa_PAGERENDER/tools/ui/CenRa_about_form.ui new file mode 100644 index 0000000..6ec4843 --- /dev/null +++ b/CenRa_PAGERENDER/tools/ui/CenRa_about_form.ui @@ -0,0 +1,81 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 471 + 594 + + + + Journal des modifications + + + + ../../CenRa_Metabase/tools/ui/icon.svg../../CenRa_Metabase/tools/ui/icon.svg + + + + + + true + + + Qt::NoFocus + + + QFrame::NoFrame + + + true + + + + + 0 + 0 + 453 + 570 + + + + + + 0 + 0 + 451 + 541 + + + + DevLog + + + + + 10 + 20 + 431 + 511 + + + + + + + + + + + QDialogButtonBox::NoButton + + + + + + + + diff --git a/CenRa_PAGERENDER/tools/ui/rotate.png b/CenRa_PAGERENDER/tools/ui/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..85826ed9201a8b6304cb199c936d63588369663d GIT binary patch literal 19524 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 {mfjO_<@UGaSCs{RS;huF{u zgPsjGKxL>MF3mc%Oog6ho3hpzZXbVcI3}Tzv(y=v07NPbH2C!A4}AXDS!vqz>3B9E zL{r8)DhTh`u%o<;bd`X&mXuY0Wdxof6k~juMyQM9|IRG=Pc&YhZ9S9I_Nucn0PEDP z<$ibHnF$B@SI{#`@4We2`?khKBIaeFaaq5kT$tDv6BH-LNRs`cfa}xlJVct~r(vt=h=!@7Meb5JKVJ80*{`A*>VNI7Fza=6+f0L6n z`wvOp$xuoQ&AsY8mw<2G1m6o`$krd9ybrs^n|fb+{k4JrPJtjWHy=xkoiaevFFQNC zo-$>+L6g4-27HX^9R=C+q6M!XycuK$t8_GtGujc&r!U-wOaq@AJF>+}ENoJ90YM^C zP2g7>E0M-@>Dm4ke1fGqZv%SIt>;^#lEn5b?mG^bALSviuW*Sw4DoUwk$QcDeqwdQ zrVQ3ZaO*}s+Zb{OSF(DN-)*?hEKO(R%;GTNo&zwfRdz!$t*r_hD)SVEwT>?)stACT z5&&doS>%F9T%cs2!>BxaW1|TKeSj^)N189D#Km^vHG@yS1_@!F1;g63?*7JgY+wrZ{7mmxa7&_ zFI5hcVO;`Ev1$SiiU9au%=YL$NHwPTC&+#T0ZqBj(Jwv83{J`Wb2pdHKO)Ip(g7S? z=oh59z)RYVm_NP=e+!jD%2Q!WM0;psw42xl_M#N1=H@>yrQkED%2W)$FYGw=pWmtZ zI;1o!2Ey3c*R>zo!s*IDe+1|}`Gg6+JNCmZQ)Z+3D5r}hQcW0rOGJc6 zx@plF`v$bD@E*FvyUgY0HyfrY(=-0?NguT{Ewp}o!$}S)>4R0S_ zZGLn2{dR+pi-o#zot8xezh8%~@LhX9_ZNf12HDkQpEQcwo@J;I5m!?iSSS8yOB#Il zd7u7dHtFwY-85%hKGeHE}ju5s~b-;5sK#yy5X#I zaSGOmTjZRoa=);o1k@Kni__H4^%1@zqx!dlgQ$%vS5;PumDPckn-Wz4oBsuX(iX{D zpE_O{$qBynL_&gVF%(^pj3-4R74rVePvTQQnRx!6pKu{2-L`M0(W^nW`V_0y4=z2HzL$n&&W4K+k6nr5^IIa0XfTlSSKSv8ZkeP&} z%kGtt;_Gh+wiqkj=VQypn*S-VYS`FFA`qOmPS-)URmjb((vj0jYwAf`2gd$wF}gkA zN!&A`+P&voyP>eJ_~Hf2pI!6yb=KigrToHhEgcnu*W@W z_^O#Ju-jqhBzsjlmZyP?QMa#gB;CSE!||xsP-uLJgHpGo+GVZTDifn6ew&}4pY`R- zTP<6b{}(v~#`~dAIb~(#1cM>U%F4&y`~4;O{Ut0|5XA2|VBjqA z_%N|pAN~E8A{OhVudiq9=doDt*zZP0Ml$v1%k*_)k59i1q}-+=UZVm)uBHHZ40s+` z>^K*h2A|JIAP^jTUs@WVpy0p#poWG9iO1uNj*jZlx!f=ayaK!c3^>k3M6y^B)*R$C zHjk)KD7+cNz#CY<6p^b^Ygn0#BsPcm7B-By4l4>o#2ez+z8?<*AClh<&t#G`1t8N= z4s6AGh3kQL5qDC+r&x>gHpjV$NFG^;EfgHY{m`dEkx!8XJ|^?Kq>6}4NhQ`;}Ys*TRF--wTCWWwVmbYS~10s?cBUsDc?Le#JTtq}BbS>}<)@{u79g{+l z&2a&E7id5v!!!aQv#AK!jCCMe>o^yYY|;z7jy=oY<2V-)kr}xeo4Xvr{auwp;ng^b zjh@X%L?p*F0Iy=*$y}do6$&pz3iukh2aU?g9MYFfTnPYMfTz%Y1CpQmfp@UZeMcPU zB6&y!fOx@rtkv)qAiK7`6PdcbSl7M}upSyBPN)D7FIfaU4m<%YcbkexMxDVP<9ieM z)p0H&fC>QduJzbXgpXpahefhY3iuIwj8Av_;yEe+#Ovk*4`L$&x1$ZL#QS~+-pA(m z|8$&-$b?h?NH!@49>PWjHlpvZct;<$DbIVr57_E{5l_>KTqXV0OGPmhSmPi5nu#5f|*kgN|)0dp10zmRb zAvQg5A8;?wjK2SJ$zQ+@;5*K;kI&fDymN?Bu=GqW8oWCO-t!~p1 znR_Y#L`(!L1a1Rv0czc*BN;Y;J)XBS9Y3Q5e3Iu>0Ek@KVyqC@2;7QoSfmAo*`pKK zgLUHDh0WuSIL%1JV^jc$OwIzVJ@E~|hIG_9%}6df2kZxa!Y=xIumV6tu0jQX$n;&0 z6$ER6HQ2(!W!Qp4nH{IGi~YXK;uyAaUqq%r1%OCq6=Tx{%|H{@rLYlOWT?Vm@_K%e=*w9$9{LIiR1?r z03z=BfJ&?wSOQc5)xaVkoc>)U5OR~=lnnq~*xhvQ3m1!k(#t+$9&p_RpFac)U-teikO2P1F4lwTIEUS#pBWdu z*aiQ>jQ&ay5fKp)5fKp)5fKp)5fKp)5fKp)nb<#k{c(({k-EiAy5cvmzraJM-RB6p5}CvT_xYy=C+%m3@uu zQRcO-T=R0>`#-+F$N%xD2kv>l&v~8KKCkn9-IoTpwAc^x90mZeqqVOa0>A)&WdMhm z;E(mkeLL_6%Oh=bZvZ&H?f*yo^vJb`AD;HnH1oOR;o#$c&+7s3_xG1^c6af%yZ7jU zjE9$FDoKS006~Dhe%0vlyX7(eYO4n|wAEenGKbCa77i8>EE+3#TSxHh4b9_6l_PzQ z9X%j^*yOrWrFZDV@8SG8Vb3_802bro_fO9pxx#}ypB{UQB}@2h%Xn}9+OE)nYYQ@R zYlRAHdsazFqCpOyd7q7TeOXMaxCsn9=oi%*Cv)s`lcuEYbSrP36F62AF6^F~;{3u& z!=7h}{6v&J_Wcu4*=l(+Lsv=q?#2{44M%o)_rbNNRKcdo%|ZCfY(g5&ICo>If996={7n{i{h8D;W<;Pa88lNh6@H^N`d4!0 z8)wTFt!kHN_`kTyc=`3;bo=ge=&mBFhvnT_eceiR^rfoF8VVXGHE2&iE&GgvrCfpu zWWEj_erC1xr)I=LB}%-65q zoBxFw`ab`g@E2QP2S8v8WS4E=*+3WE_G5nmj}NQ3A84KD_KNJcG>yk> zw|}D2{~Ti|4ux+#q*evF8kR5EkOE`cx8fIg$EC*)jiqmANE9k>pJcE&%?K|-|zW`n~>=m8&`bvXKa(ET&EGi!1ElnO<32ddd+Lu zGNbk|J=mbh>7e7a(b0Ny_Kxh`zb(=w|eE3qXsj> z4%~lo=~AL8w+z1{{=d)(i z$%x(U4(`#4{A_hP)_TZfxjH>*6@y%mK5F_wl}T# z{CI68zz@;$0s-=RLfS_B*UwYp@pjFm5cvp4YcwMDmf`iS8SDf77Qy(5LZl{g$#tlVf{+Nk%RI*TQ;II z%oS2qB>g{)@lGguyKbBm{;ZR+y!gSapG}F;Hs#MtmG`IWzX2@2W#HnrH2EdQyr<<@ z#`crr=CiX&qBh&;xhGq)Yu#hKn4+>y&}KdX21aBh&bSpJ~y4tkv(;ZNCiKj@D@0GCze&6jmaGO8w}D`>TI zKKvj=QJ*YO&aGwrRp@1jC=>W{b*p1aZMtV3=f|3MP`!iNW@YPv+WtE6oa5>GU4RwN zd%RX{eQdr_Bt*sMB-r>nTcwF6O>c%ds+>Tw{$~fAJSE-vlt=Sx1kj=7`15cHUsL(D zvSG3tsxoGxQQqg&vu}X#KA5~6?76tWJ(ew?qqhGP`_}tpdhzG&MDHPiebuor7|@$i zJ3sG=u6x$WASe~5N_>+s>iH+k|9R)rANPUN*|E#f6IW+ZzFRC=Wk8!dX~Lmq8vmM+ zKba57$`gjjJh(l*N+EsDpNL(m^Mc0DC|FTzrI=^;OZ4N&?n=Qkj<6j#jaQrdaLAUK zUy1INh9e@DofP!5JBTdvMxj*GSQTBRpm&}t*xu+YVzGZHn0x1Rq>{FYG^XJeW?2v8!6e(}zl05=5{Wy~4VH6_s<(J@IlEyIC-c5%L zF8TyR?%6m!S#jEbq7l@UsI0O~#q%#kyF=DSHn+ZGM4TTJr9evmHT1;NmFcgN8q8Pe z7lHj~q_bUwWF_m(&6fmoP|lR(?itf?;UD32S9s^s20QSp_{8Ne%Xj4(wR>hEL!6{V zrElS7+29N=8je>dE&%)3efKH3pw@9y?0F|c=8T?mQDTD=mw@d_?j2r>~#tBym-fZCXUm3~q;$5`+rZ@UIApqQEKhY98YBTmXLdEJl z?+>`lyB#C>5GgIly?+05aJx=+X5d|L$nE=E8KI;8C z;Vp-e+VY5`+X8ukBgv|LKl##xyT{^D z*pqVS$iyP+ffZT};i|=HNr2e)(5g6*h)Mk3;#I>?~I4$S*1t332 zcKN{`>x~BjuAKn;FuRgF|^0Sp%g=30JW_Td^K&gg(D%j8fyu00VF4|SC^_{t^F9I+LqSVxAA>q6uCO_`r%?| z&f2lK*KCkGms;fO-6*ly%Y!h|YB}Fv1HONHZ+MujQ=@U?+>n0zmyg3omle?(`x_K3 zyHM)X_}_PChi4o;QiBJ~gscaa8uTaq>fi=*BR(I~CoR>wFYRhDJD)57ed=4jcAH5f z@-4&vd%5ZwIc$UzvmKKaX3r-H_WFFs2KC#rdBrin=>-BeX7R;g>FfR&qdLmRR&LW} z)-MNt1!|Vl*@Kts3Lke2>W6dS9i;}do{1p@OHQ^v%Ssk{3_HjZSpTSnkCbC$O~3!}QM zkG0%pgy>!)K?#7x^|DQURq8U~Z0S=~pxWo#K|+0?A_RXo{Pyh_yrU8E>#zw3#Ol*P zET6;9t&zW+W%@2cr-0)7$IF8&HBpN?AXenVong4wb;8A-SBSfewI5%rYWB!pn}ZpB zO5M;)zKlTPd&1S8NW@*$+K;5r(rL$Mod`fI%TIpoy4&|{;5i2lig1wt7tC(=eZIZR z2+U0rsf0}-{u%|J*z&AD{RUqGw;0E$fu2FO!0DujX3N#(2-Hp;ob?&vu7dTQpTSL| zp+Ya2cY(UM`ClEie$VM_e>m?+Hc%vCt-6`^a@`S~1`P)++(+Z5!=4KXq#Z?S^IQPh z3$r?AERZCx2^i1mBXQ4JH1VdY#m!_tTle2FRzZ zjO|S}wT<~cOIGnoIbz{=Ff(X@gz}ot-512YxAXrfALg=Vyt7 z2Z%}0t}#Znn(-)bH^fS4&66aGs#9p-A3VmWesO%-Dz0A0hXbhB)~pv!e&BO_-r0Rf z4+VVmhn5eZe?~yb{yMB&veDQ9t&)jt^`Dk|In|(2e3tJJ0gVr1^x}ypTLpjt zbJ!QdWK!=9|8NdNNj*6bpKm>ajg_e@h z!r`&o4wbvJ+csGMm{=(|JTu-XMyKw_7AKadv3xt_*P+2SM8Ul`P?5yMC0?Id6GN|X z!qA;|J;40uZ0YMP!=Da@uX%$MttxWuzmDNdHN?gPt8PB&$v&wYF(!p~JlFD^35( zane1Af+25O5KTpA&=Q(8vl$xJ$^Xdh1&s56`yc^xl{QS^D& z6l~-fK!OS0+5NXh538?6mM{lRUJma>WGcR2R>MAJLvcL}6mYXzpHuijsB9`v?s!mbMDbLc?0^ z9C zeYeUx#7tfqTGAw*Or|G(6_2AR}me6C!@8S4O z7i>=3jYc8#x^Vze7(A31_z^-&H6Qsf*|lt1lTkd`WBrls3aO;=`Rh`dJS)UM^zL`` zF}=k2{oLNod^eVG)Ik5Xn$J`Dm*=Wl)B=Jf=pXQ2;Jn*f&t;Kl)-*=-S{*?$5uB7_d>n{Ju0~bu z{%4IkJFjt84jlTl({wOj&Ci#3NCUAgXhZb$uWftih@2z`q;;pE<( zRpo~FPSeaM{;jd>M7i;)R=8|UV)#Vn$w$OE$sTWQ6-(>Q7N}J>N1k0lVSUQ7>Lj-M z!;ZVvRTZr1Wld#rw_?;ZTclv#anIe-f9thhPy79B{WJClGtEfUOEa8zLxQ{Q@}&ZA z)@qgNX|*U~KDqwsFa1xjCB?PtQD~-@vc6M8qs)4rUvuRqmxu!ORyDgV;-9YH8KZ(( zN1fr)?l~r`k+_cpy`&|w@(dRe-BHXy5Q`f2n&Dg87PEDpM)Rt9`I)j#9EZ95Z-sl5 z?5^;{{8dxlke={DAeBb#mp&}fj+4)QGk5U+CR&}9qLVYs5X5W|H{+4=(-7_NZfuZhaIU zMKC?JeSCFZK>gEuYKdp6&)k=LK?t5w<|bMGdh?R|-roVpJn>nA{yC+Q+E!J@oSBhW zE)qS&N{BsyCFO@ePk}Y*yEYS(a>}Zef{wm&dyE;Ng8D>fcMR*h7(t!}C7W|}!x-h^ z<5=HyXA6sJP2ihlE1wyKvFFOA0-xc=d1JtG4Zlq}QR)Foxq;_L$*U-Ct z8-9Dfs*f*Dc)l79z%gU{uTs|Jn}!D)%4edObyIALxcb}8MK)_)*C|2g%)g~?Hw*_f^J9^ZoZAcw zmye(a`WD_+?0x)JKbv|S2%b2c*1Cc+uk_t%o5%<sOcF3mYLs1X&QHN3FUjOm!fgXP(TTe4Pig+2f3H4N1l3}}JIsXOOJ+2Q z+q8~W-0*VQrxx&ME}A4ibhP5iNq}dXiHY|da-=r?WGiScd05I)EES?tsQ1uQ3TQuP zTi)E7<2Rx7E3~4fZ>T^<_WmJb7Y?A4wzkwO%n{m4)fQ)%f#F#@URu8dM!w?v@}R|; zj}wgQTNFFLcnW{TAx7}^HceY8uCZ$OOLz88(7RAhkZ2TR%I7Z52H3SILcHyGyPcre zPG_wfebV=%t-`Z<`9DQl)p^qCM_^W5(WWv!KwC%`;tTfcL>; z&%ay(xV||t*$tP2P3^B2x^@wQ)lj0$2DD%4G`~j~%z!@hI!u^;9dnBVT)j>Eb!jV% z`lUN9BqS(<8B1>3K7!^82|>^~ak!~;?S_Y2 zPkMcb05|~6gx16=j*%Bhs$co7yH?+`cmjJ(N$GpXL-LWcAh%8`fnKI(NRtBcZ|8<} zW*CL7M^pVbvVJWS#v7Rd!+9SG%#oRx*|`wntPMK|g$}09d1XBP0N{B|)^ed_W;Bj` zs1ML6V#0bUAk~*>%&~s)C=2}ttHSjK(wBNm#09>-Iu$^;3qOr-;~;h{22q{IyZC>b z=u}fUvB#ktCaivv=Wby?JK3Uwj8fC&%Le1Pw;mtNBvLqa7S=SF;qeJ7v%pPCc8>4K zPn50A_2&BO14mY;QD7dXs5tzu_j`fV;q(T=G5X_)NubVmo7UuFH9i#rRCz$8BMEuq z!}1P43s}ICnfupgCza}!`{KAaUAZz%w-O3$UxLgJrImkIKAaTCC?c5V5?UK@w2G2} z4X1-m_5vjTb09atIDD2x%Cp%y5IuKO)@1gxK&;apF5{*qC$8_QmAAI7NO zf~&v0$pdnETLp-pa&sq{F8}i=9_^^`cUuGMFhZy|njLd1{&u;Vgp_NY%>WgVSkgex2 znKqkd6P*1uEChHMsfj7F9L&yvDew)3H$|_ znMZWhcZJbxjvstlNGsi8Vj#SStRA>StN+1|HM%IWcn0)az*JFa6ox~0q6bM&SXcAo`dC%XfpG)mLz7MrP5iC!g^*wvM2jX#!O!*9kUM= zwIQDog17&JQPb}{M(~R-8*q`{NL_S`Ml)v4KXCgtu`VisaX;|vceP?E!=K*xIM;z6 znhb<;lMu4N4GN?9g&$(|C2JG^q9&(o(d)J?&#x?zA@Jd{L*3<;l1~+b{y31hwYJcM1M+HxcE;(sdk%rHi zAvf!nv0SKElm|xsN4EeI!4ir<%)#l~M0uBjFGUw88)(?DetJms8;@V7{pOgVq5B|( zpu714@uxx;NcuAmzmC>FAlM7dRsYLdvi{i&UsH{)B$bVU@N~}l>EWTh4Sh-xJ18P? zO!LBvyVv@(Jd==hQ3Y4khM+tgefN%C=ktbzr5#G{-%p{d!y-WU{cS5cGr`X7^v*PW zT|+{j{?5oXjhrNmnLR2(rq~U#>8JQOST;X~@NzzB2$i{0`xm)GG^irco-4wi_<1 z`wRRPHx8xO@1$iK8qLhc<#_q;bv{Y)TpOsRZRla$3ji3rphj^tBo9jG)23RHXNHU^ zWBxN;YK9SZ*|+*j7z7;wC=LxKca<+>=-=5WYK&LO>p-+w=Z^-L;>6rPcdQZwi~K{R z(4^8H=V3J~L6DbNp-<~QPp_!S-?EXycvgA|>^*V)GaG{HVU;tcY+!z6U`oR&gi}Sf zq|0b>#w#9+(rwD4Cjf6^3Db{uf;*-aGezcWjYb*P_@@b0a4xKl1kZct)0Rzj_#3Wz z@$bYLADp>dwxY7*C53*_SzCWT}6v9rp@r;d8P-NeVZc!NZ zBrV*)g*?x$r~|RL;92%qd)#Go5eFbu8V_CpPv29YB>uG+qDaaj-pT>+Ig-q55s9|c z!BOA^N)KyW)O~J2Lf|m;cPbh)80i_#K6S(M9%Cncr2`-6!bKOMr!zSr-PKqeRDLY% z|6>6Hj?Ya>YltECV;Z4{Ea7oNOeZ|0n*9Rd(j`+`Mh^7}kM6XF-6zphuY@O9bW5`2TCZ|Os+8tOAYmpj~_tI5l=R2UD26ID`xX1Fsxc9J- z3vz{81)6wns$KC?N&;91O$wtKv)qWh;?`GJh65=EiLDsK45vJZMEtmuFiLU!_SQl2dE505Ev8UmB!}kt?Uk6$R)ZJ$8 zdvo$JG=-P@N~n=1U&YhI@~t+^PtS1TZG`i9kO#0EkUi9SU3(!v&NTaMlLS--^~ufL zO8_`SHsogL2*Z2xSVcJJPW}xX6t43%_;I6-RNlEw1jBr64mm@g!kGL(atj#2qH$)z z3}*k}byngHor7t zj<}^o#=!FRfs%8$>H|Rj%nYZXp#Ngz%^!yWK^s!gbdD1FYlfQ2E`Jyf9UKh~kfPkL zfh9Tl#satPIvklfC2>giP1{LW$CR&!sYF#474dA2+lW^HDXayzi>&a_qYTN?wCu`C1Jcuxc)}^W&L~2$jAH_4CEkrsJI+5 zDjjO~O+)m_8v)I%8qA248rgQQf{B;RZQYjUWH)RHP0)W5` zXIKibu}}bSQM~epV_{Vnd$ZIr2M#B7aPl(!It8D|&BYubjFjHgp~uz>d-9 zogESEm*%zB{BXTz4Q1Nh#2AU;EnaxGFQEHA=NLLE^uY2}{P@M&H9dz#wybj&Y{hiP zisYr-MJu36CO*J`A=BKQV000NB)d0fnW)QiMC$0y_wZ;FQryS3%E5*eW^)=Y|1!q3 zg{x{n#!T*S911&IQvNTF&MQ@4%OHsM>cEw|fA9rMazO!0#diWm{)8HYwpwEl8yx`brM)ezml~eJ`M5C66joxyBTaL%;?e2HP zq$=(6woYETjRu9puN_~Y3f?w0NMVmlvKf$Gc;l-Ls_sm0($ihr_!j)AeN%83q7{Jy zjcNd&2Z^K?6cN0>A^>;EHu#dH1qXvgrLP9 zcMDH1!VvGhc42PJ=keRMeoJUrQ*z}?(7_PJygy^WzcY;L7Upv&?{)It{hdX!k)*HN zE<=ymr&Ck=!k!(RJTY`gw8bzTaD+(@{FWwk~QdOQrmibwWWnH1u{pnfcjNJuyx;wPB z=(qeBD&;jN&VYmstT zJ!>sbOjtV4YW6ogq)^Yg28n>ntr{u<^cQE~B*Z?v;poc))%1Euc#w9mX|ATJ!?2r%}Tga&UyiY*Sbrf07qagK*GmH2bfn_8LuS^n@(B#d z3-UEk@FRYOQ9WyT57ko(?M5C38c=_`L!@Owas4Sf2k`sxG)Y+1s#jax0}@TpRs7cZ zuI#Z!(cm8-h?W_%sZ&>%-5+pqZ|EkC{}NRf*P;4d-gR(0m(^vldJAhVL05t#tiL!m zLIlO#C$Ntnc~#*HQ-m1;^Xu=dvOp%Ur_07j@;0Wf++YT&@*gcrH^$M2a+M%;JMAaN z?#;DJxi9(h@&VzN;HiOQ`{yS_rtMAD#ieKxA{LL&pD@3LTCo*g*Zmc=D!(ua;|wes zfcZG#7J)!=E&pdwp0?L#hwCEQ3g2afJI~OjFse6Jr$0owY{sbuIL9zy6P7NAbTGQY zgaar{R;{lmsPcoG5Gk|_w`L&MAH}%{KbVXhJ3F7CCc@DFoXm{1u;AfzURkZ$3@m3c zz%9K?ZYG=hZ^xx_kSt~F4eQ+x#8;3rZo&XoKQV&;sjC{|DZ2@@-FJLf)_{xCiV-yc zZt!8tnENs;D=2_z<9c($n2)S?r6EW9H1Z52HXat)z|us5{>jqDO&P9#67czj|8ho_ zP1kHl9YKK#pg<*Rg0Q#+_TPv$U#YA4nF>r>Bx`Dxx&v@t^&zr5XWRT4+K0m%S)tk{ z8@9|%+E~+*c8VG9I(FEcr>Md*i$x#Q$Nh9Em$U9$C}o8^aJSH=2oy~BiY$*+ZJi6+ zsXjm$&)Z&05?7wVu)!Q5$ZB9~#;tyWQBXW%x-iaYzAdQxoXzeuO2!8l4b|1&Ox(6( z%h|&wg9#`*&Ynx6=gF>UvhGXmY&+H8Z@kfFsV!*tF^l@80VDM8=Efc|#~>911&K8k zB+!dqL-%EG@}8K|&`_lhH8x(hp!#+XxuHQoFBd8dH{6L+?96j&>B!E`tQsfSjC$TS zGd{F^l?(w5YFQClJY>& z`Zw)Nwk;!8IN-hRiOm}ohn_%nFc?+!*Tiu4tROP?zL?V!eLOHRVQg?Of`W9HT_w4U zg_YYosz4hzD*L&`Gd2{;?7&HDlc?-<7p^}N6#FLMncPJmbZXz^W3vePeHSu=p0X7ImDZPx>I+ z;5*1A?Sosy_ZEDg92nI{;QF!i=@xvP;@uZvu>ouJPkE#>mGb!WYm+!t@TuD82|DOE z`RyUez^=cz->$a`U|B}J%v+PYkNg;xcn?Pw$_9CbX zf+w-oZB=pT^afJV0tSxE-)~2fH;{f~OxV%HGWWzGt_`G`1uGmlxF=UNvoz7S_-Dfs z@fQDmOuuMgwHpaH`uP{W7nXSf`5M(yfo(#OtKS2qt)4Bt;ScF^&MeY9A|L~1_D)v| z57uxqTUmD9>Dy5B@ca9!)I7vb_B{o95sL&Z8f&V}2rs=LkF*sKUB?2A`KD#_NyLtdeQALY)Kg7I(Qay8_jJd+*y*xy)AYa=Q{crD?R- zvHk}iO;_m?FuM#LO1Ut}Y4isroE`YhzH7deHj%q_RvFG6D~!s%ok7cC;sChgb2@O< z;a}e8#{M@_f2L}&;6{4!*&tw2vX&lN68zt<-Uo_#Z{{?SlmccW)m@lE1ADrgW2Zau z0U6#9X&av5q~_qCN2|&9?EB6E6@jF+ImI13yEP(KcweV;xNf97{ODz{OcWzi=tk=$ zvf;N3Efa9-tx@D=)*Mam8GY1gMCb^&O~baK<$r_|3^T5^^(-U&Q0 z#}h-e!f)Ni$f7(#n%&D!@vc1~ z90h$DZSU#D$9=6HG68g}t^AgUj2>qiJkyTMtHPV+T)8CMgvLkxV_Dt>GACe2OVVFT zJ+ZbY;(715^w-K$GMXhupP#*E$dm~-S1Sw^^NCc*c?jjSgd6gHuyYljg1=oak-z&0 zlCkjp!9)e?Nfkci&lGq+u5G9iJS{7ddK9UZ|7c`z*2IZ34XB4uRU7R)m9jJnbR}R0 z;^WxN#V4D02C4h7SY>oHQu3M@Fz~kV+~U$0U%_Y?Rx#gA_%EkSKt=#XW zOY2oB_)fNQOeR>=duy$88U~{ryQ-j6^p*|;3mvoCRiAmiSF^;o`~22ZU-O3REh{nx z~?Y=)+h4i zjHODyOwhy7eZW*(CS|~Is*bs0D7gS+lNmP>bS|axp60Q8*~Cd{<2)% zg@)kqb%N5vEb)EoWhd@L;>Gr%jq;K~@}~1UfyCn#J@Sm$v_>a$g%&<3XEad?U_X>q zr+hkd|ISGnPCmTJrAC%VdI?>w-dM?6bG_{WCUEG#4qvC>2Y&qPysQXYX={NvpKx_-~fJ}vfXWBf&Ly&n>fZxG7crbDSOI`R`nQC7oh z5H+g4Sq)DlR-tv)Yd7zx`F<8Rg>GNQ{GZ`{zZb&p4IF^@**#fcxL`(BVfAp6L_&6@ zYHLR!gsebRr@Nok-$WhP(AGs#;tnMD&1IHPMdFglyI2lp%;-f`G!)0OIxg z{FJrGLBei4P!@ukH+7F~)enDY$4L3a-*A4Z3qFNUmkGW%z+YJr={Uwo_ z|5$e!VV0(AqV{m4O%I9OpL42aNP!|b$L}m%d+tmG$B{@hiBAJ%Xz^ z`ePdd$1`R^V_(%BWKicipDO=`Y|G2ogq;4^Ne>h8dxqE9*Fm*UDZAaPzt`MZ`GliS zfqtQMEY`PKudX%I)8@i9B!t#6j)4l$tQ05{y za1I5)_4?n1nz@>Jmwg@wE-A;;e_RCX>VFpk9Cc{f``A_9jWB9o0E(6G94kCNvCarp z?j_=T_pPL$w~KsdE=1YqMZw*JncVRAy_+9Ao}2|ED`s3STl)?U zf~=a<29vkQl>)-m(r`p(jD*&!D?MW}rmQH#(}3Yq?Rw3B3Tv`(M^UH1P8K=OO{|tG zfu=w%W;VySFaO#e4j6z`8?%8uBc0J&VYECt~;7O5=AajWx^th^VV!$ONMRw_9pC4Ym)2} zV8uthSQp$mNia`2ngkYpiF`WKu)H-xQ(fKS0fDU#{2m4`e-U^)o%Ky#QYQ}~!Bw^Q zD%JLU-VwMq-m0Ztjn`J$Lx(8X0i)T~){J2iqYjQ&n0;Rf3>O|G3*Z|4zNSG8KLZn% zN#fR^Uy{{yqo=by)Sy^V(T+li;iBc*8ai8A&OVO+t^TPR-{$<)Fb%f3?B-iyafl`tGJcrf`wzs|K3kJ#T` zm~Y*B&VS{Uq;QU&{8NBIQtwnlkbQTwjGMqd-=6BO*&_=cjZqsTI(u4S3q}(se?x$X zfVK2|_WtYEHKE*XD7RkjFUOHOpX`7(OH#ol&k>K-J+b>9OxW2eFM7b2#i#Ugw9d5% z*k!O_#4)nT<*ueVDht%t%pQ{MCg)k*5Az);g70RLG_<~ma1TY}{9x}4*!f9MxL%{N z9g5kx0Pykpr-scpD$DGVGH^>ot^v)O*W>}$*8gT8+!c1AiJL09em{H3`n>bnz9L4P zY+Ghs-B>Gv*F=jyK`cV;-gLilk(H?P1RTCAM0+O}^5cW-W2Da!*Hf?z~u7aX}~<$Ca5Z?CrvzqIqd!%2Cqn}UmyPa%8o7XbOJ*0bL@x z*F3r=Ew<5agw9k?Tp>CmdnnC9=aAsk(^i~ zOLuaSX3fEsOlqotB#{0t_Ue?)=Y@~B*M}k6G{3sNuq$AO*KexK8@BA(T>#~og5z>=YWKMQ?)A;xLzk){WfB& zT$BlWa*o-x(O5wyLtkjOv#COs>^G5QTfa3AU3jC(iQNcn?&ylCtHa!H403iRUeLbG1lHdQ6gOvn zA8!052=JY)ld{dIvWfN}C7)CFjEo@At>Wq*OPnHm8ne^A&ag97T`o6`p;Sp1F z3=LKtJGO;2e=|ociw#wY)GPb&XTEHgukz0J+C8{gm)s1SIM18{2HZ1Y5z7zIK9SSR zFMi%)4DpSacARz(m{p8Z@i`^W%>?=q1ZtO4B@bukNlcIRnb2pYl-)_{09;Q{w|iM`g)J?ejOE$aUoM(_D#Sy%;U;<u=ImT&$bOFW#${5cF2eDsyT1=pXE^Jd<=1^5nVc05im@r(HmbCqMI zf4cv#_4LR)jQyu4zbhX*sv=6E%TfdhK5x45FNhBHTo7?IeffuiN-4m@C(p^e; zf@Qx4)IV&0{dQSj0@iY2U*h$A+*0CnQv6ovmV3k&tWd%x}xRi8p`Y%`fetNmVmQ#l0{+40Ps4 z40Pd>ferNHG~D+s-`)t3pp5Msh<>-^n;3C5D1{eJIao{S6SWj$$_s$3tZ1vyY}LO78&<`0?_wH_XA@@bgq$We9g+A54RnPXdceY7tcs3I48C_ z)(+j&U60r5Zm(XD+o=1P;lLu0D*zz@f)gGidb;VaezjD|4Je}VM`wp`%zkTklT6}F zkT)_sj&zX~!JSNYeUmC1KO*OzB2Y71SDq=6YI*+q+VZSYlm_!bixco9;iYy}Nm>9| zj<3vmvuhBi7)LoG$BsTGaNhxbNy7WTR2`_2Ct>)YIQPzRxq^Pm%B(5^egD1G>)1uNHllir) b=$u{?%ydOp8!7nJ5df`u>w4j}yHEcgvJ=nu literal 0 HcmV?d00001 diff --git a/CenRa_PAGERENDER/tools/ui/size_0.png b/CenRa_PAGERENDER/tools/ui/size_0.png new file mode 100644 index 0000000000000000000000000000000000000000..571076b6f92768593a24c462652b7f5de0f7d3ce GIT binary patch literal 17730 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