flake8 metabase

This commit is contained in:
Tom LAVEILLE 2025-07-29 16:56:54 +02:00
parent fd5d516f14
commit d7267c0542
5 changed files with 384 additions and 425 deletions

View File

@ -4,13 +4,12 @@ __email__ = "info@3liz.org"
from qgis.core import QgsApplication
from qgis.PyQt.QtCore import QCoreApplication, Qt, QTranslator, QUrl
from qgis.PyQt.QtCore import Qt, QUrl, QSettings
from qgis.PyQt.QtGui import QDesktopServices, QIcon
from qgis.PyQt.QtWidgets import QAction, QMessageBox
from qgis.PyQt.QtWidgets import QAction
from qgis.utils import iface
import qgis
# include <QSettings>
'''
from pg_metadata.connection_manager import (
@ -24,8 +23,9 @@ 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,
# plugin_path,
pyperclip,
resources_path,
maj_verif,
@ -33,10 +33,8 @@ from .tools.resources import (
pyperclip()
from .dock import CenRa_Metabase
from .editor import Metabase_Editor
from .about_form import MetabaseAboutDialog
#from CenRa_Metabase.issues import CenRa_Issues
from qgis.PyQt.QtCore import *
# from CenRa_Metabase.issues import CenRa_Issues
class PgMetadata:
@ -100,7 +98,6 @@ class PgMetadata:
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)
@ -159,6 +156,7 @@ class PgMetadata:
"""
dialog = MetabaseAboutDialog(iface)
dialog.exec()
def open_help():
""" Open the online help. """
QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/'))
@ -202,7 +200,6 @@ class PgMetadata:
iface.pluginMenu().removeAction(self.dock_action)
del self.dock_action
@staticmethod
def run_tests(pattern='test_*.py', package=None):
"""Run the test inside QGIS."""

View File

@ -3,7 +3,7 @@ import os.path
from pathlib import Path
from qgis.PyQt import uic
from qgis.PyQt.QtGui import QPixmap
# from qgis.PyQt.QtGui import QPixmap
from qgis.PyQt.QtWidgets import QDialog
from .tools.resources import devlog
@ -16,6 +16,7 @@ ABOUT_FORM_CLASS, _ = uic.loadUiType(
)
)
class MetabaseAboutDialog(QDialog, ABOUT_FORM_CLASS):
""" About - Let the user display the about dialog. """

View File

@ -14,48 +14,31 @@ from pathlib import Path
from xml.dom.minidom import parseString
from qgis.core import (
NULL,
QgsApplication,
QgsDataSourceUri,
QgsProject,
QgsProviderConnectionException,
QgsProviderRegistry,
QgsRasterLayer,
QgsSettings,
QgsVectorLayer,
)
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 (
QDialog,
QAction,
QDockWidget,
QFileDialog,
QInputDialog,
QMenu,
QToolButton,
)
from qgis.gui import *
from qgis.utils import iface
import qgis
'''
from pg_metadata.connection_manager import (
check_pgmetadata_is_installed,
connections_list,
settings_connections_names,
)
'''
try:
from .tools.PythonSQL import login_base
except:
print('Pas de fichier PythonSQL')
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')
@ -150,11 +133,11 @@ class CenRa_Metabase(QDockWidget, DOCK_CLASS):
# 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:
except ValueError:
# qgis.utils.plugins['CenRa_METABASE'].initGui()
qgis.utils.plugins['CenRa_METABASE'].unload()
# self.default_html_content_not_pg_layer()
@ -231,43 +214,15 @@ class CenRa_Metabase(QDockWidget, DOCK_CLASS):
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 + (
'<dcat:distribution>'+
'<dcat:Distribution>'+
'<dct:title>{data}</dct:title>'.format(data=y[0])+
'<dcat:downloadURL>{data}</dcat:downloadURL>'.format(data=y[1])+
'<dcat:mediaType>{data}</dcat:mediaType>'.format(data=y[2])+
'<dct:format>{data}</dct:format>'.format(data=y[3])+
'<dct:bytesize>{data}</dct:bytesize>'.format(data=y[4])+
'</dcat:Distribution>'+
'</dcat:distribution>')
distribution = distribution + ('<dcat:distribution>' + '<dcat:Distribution>' + '<dct:title>{data}</dct:title>'.format(data=y[0]) + '<dcat:downloadURL>{data}</dcat:downloadURL>'.format(data=y[1]) + '<dcat:mediaType>{data}</dcat:mediaType>'.format(data=y[2]) + '<dct:format>{data}</dct:format>'.format(data=y[3]) + '<dct:bytesize>{data}</dct:bytesize>'.format(data=y[4]) + '</dcat:Distribution>' + '</dcat:distribution>')
publisher = ''
for z in dataall[2]:
publisher = publisher + (
'<dct:publisher>'+
'<foaf:Organization>'+
'<foaf:name>{data}</foaf:name>'.format(data=z[1])+
'<foaf:mbox>{data}</foaf:mbox>'.format(data=z[3])+
'</foaf:Organization>'+
'</dct:publisher>')
data_str = [[dataall[0][26],
'<dct:identifier>{data}</dct:identifier>'.format(data=dataall[0][1])+
'<dct:title>{data}</dct:title>'.format(data=dataall[0][4])+
'<dct:description>{data}</dct:description>'.format(data=dataall[0][5])+
'<dct:language>{data}</dct:language>'.format(data=dataall[0][26])+
'<dct:spatial>{data}</dct:spatial>'.format(data=dataall[0][28])+
'<dct:created rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">{data}</dct:created>'.format(data=dataall[0][20])+
'<dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">{data}</dct:issued>'.format(data=dataall[0][11])+
'<dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">{data}</dct:modified>'.format(data=dataall[0][21])+
'<dct:license>{data}</dct:license>'.format(data=dataall[0][13])+
distribution+
publisher+
'<dcat:theme>{data}</dcat:theme>'.format(data=", ".join(str(x) for x in dataall[0][24]))+
'<dcat:keyword>{data}</dcat:keyword>'.format(data=", ".join(str(x) for x in dataall[0][6]))+
'<dct:accrualPeriodicity>{data}</dct:accrualPeriodicity>'.format(data=dataall[0][12])]]
publisher = publisher + ('<dct:publisher>' + '<foaf:Organization>' + '<foaf:name>{data}</foaf:name>'.format(data=z[1]) + '<foaf:mbox>{data}</foaf:mbox>'.format(data=z[3]) + '</foaf:Organization>' + '</dct:publisher>')
data_str = [[dataall[0][26], '<dct:identifier>{data}</dct:identifier>'.format(data=dataall[0][1]) + '<dct:title>{data}</dct:title>'.format(data=dataall[0][4]) + '<dct:description>{data}</dct:description>'.format(data=dataall[0][5]) + '<dct:language>{data}</dct:language>'.format(data=dataall[0][26]) + '<dct:spatial>{data}</dct:spatial>'.format(data=dataall[0][28]) + '<dct:created rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">{data}</dct:created>'.format(data=dataall[0][20]) + '<dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">{data}</dct:issued>'.format(data=dataall[0][11]) + '<dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">{data}</dct:modified>'.format(data=dataall[0][21]) + '<dct:license>{data}</dct:license>'.format(data=dataall[0][13]) + distribution + publisher + '<dcat:theme>{data}</dcat:theme>'.format(data=", ".join(str(x) for x in dataall[0][24])) + '<dcat:keyword>{data}</dcat:keyword>'.format(data=", ".join(str(x) for x in dataall[0][6])) + '<dct:accrualPeriodicity>{data}</dct:accrualPeriodicity>'.format(data=dataall[0][12])]]
return data_str
@ -292,7 +247,6 @@ publisher+
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. """
'''
@ -337,7 +291,7 @@ publisher+
def set_html_content(self, title=None, body=None):
""" Set the content in the dock. """
#link_logo=resources_path('icons', 'CEN_RA.png')
# 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()
@ -356,13 +310,13 @@ publisher+
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)#, base_url)
# 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:
except AttributeError:
self.default_html_content_not_pg_layer()
self.save_button.setEnabled(False)
uri = ''
@ -392,7 +346,7 @@ publisher+
data_url = dataall[1]
data_contact = dataall[2]
# print(len(data_url))
data_collonne=[field.name() for field in layer.dataProvider().fields()]
# data_collonne = [field.name() for field in layer.dataProvider().fields()]
body += '<div><h3>Identification</h3><table class="table table-condensed">'
body += '<tr><th>Titre</th><td>{data[4]}</td></tr>'.format(data=data)
@ -457,10 +411,12 @@ publisher+
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.'))
@ -495,4 +451,3 @@ publisher+
data_contact = cur.fetchall()
cur.close()
return data_general[0], data_url, data_contact

View File

@ -1,60 +1,47 @@
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 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 (
NULL,
QgsApplication,
QgsDataSourceUri,
QgsProject,
QgsProviderConnectionException,
QgsProviderRegistry,
QgsRasterLayer,
QgsSettings,
QgsVectorLayer,
QgsGeometry,
QgsWkbTypes,
)
from qgis.PyQt import QtGui
from qgis.PyQt.QtCore import QLocale, QUrl, QDateTime
from qgis.PyQt.QtGui import QDesktopServices, QIcon
from qgis.PyQt.QtPrintSupport import QPrinter
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,
QAction,
QDockWidget,
QFileDialog,
QInputDialog,
QMenu,
QToolButton,
QTableWidget,
QTableWidgetItem,
)
from qgis.utils import iface
try:
from .tools.PythonSQL import login_base
except:
except ValueError:
print('Pas de fichier PythonSQL')
from .tools.resources import (
load_ui,
resources_path,
send_issues,
# send_issues,
)
from .issues import CenRa_Issues
# from .issues import CenRa_Issues
EDITOR_CLASS = load_ui('CenRa_Metabase_editorwidget_base.ui')
LOGGER = logging.getLogger('CenRa_Metabase')
LOGGEr = logging.getLogger('CenRa_Metabase')
class Metabase_Editor(QDialog, EDITOR_CLASS):
def __init__(self, parent=None):
_ = parent
super().__init__()
@ -74,7 +61,7 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
self.auto_adding.show()
self.auto_adding.clicked.connect(self.auto_run)
self.issues_app.clicked.connect(self.issues_open)
# 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)
@ -102,6 +89,7 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
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()
@ -250,12 +238,12 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
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)
iface.messageBar().pushMessage("Information:", "Cette couche n'est pas stockée dans PostgreSQL", level=1, duration=30)
def is_in_psql(self, layer):
try:
uri = layer.dataProvider().uri()
except:
except AttributeError:
uri = ''
return False
if uri != '':
@ -324,7 +312,6 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
role_list = all_list[10]
organisation_list = all_list[11]
# langue_box
self.langue_box.clear()
self.langue_box.addItem('')
@ -392,7 +379,6 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
crs_code = str(layer.crs().authid())
self.crscode_plaintext.setPlainText(crs_code)
self.frequence_box.addItem('')
self.restriction_box.addItem('')
self.licence_box.addItem('')
@ -461,7 +447,7 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
try:
in_index = sql_dataload[6].index(categorie_select_data[0])
in_index = False
except:
except ValueError:
in_index = True
if in_index:
self.categories_select_view.setItem(i, 0, QTableWidgetItem(categorie_select_data[0]))
@ -471,7 +457,7 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
try:
in_index = sql_dataload[24].index(themes_select_data[0])
in_index = False
except:
except ValueError:
in_index = True
if in_index:
self.themes_select_view.setItem(i, 0, QTableWidgetItem(themes_select_data[0]))
@ -586,6 +572,7 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
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())
@ -597,6 +584,7 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
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())
@ -617,10 +605,10 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
cur.execute(sql_sizefile)
boolean = True
except:
except psycopg2.errors.UndefinedTable:
boolean = False
if boolean == True:
if boolean is True:
size_file = (cur.fetchall())[0][0]
else:
size_file = ''
@ -658,9 +646,12 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
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()
@ -684,12 +675,18 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
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()
@ -713,10 +710,11 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
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()
@ -770,6 +768,7 @@ class Metabase_Editor(QDialog, EDITOR_CLASS):
folder = folder[0]
if folder[len(folder) - 4:] == '.xml':
print('is .xml')
def issues_open(self):
self.issues = CenRa_Issues()
self.issues.show()
# def issues_open(self):
# self.issues = CenRa_Issues()
# self.issues.show()

View File

@ -3,9 +3,12 @@
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.QtWidgets import QApplication
from qgis.PyQt import uic
__copyright__ = "Copyright 2019, 3Liz"
@ -92,14 +95,6 @@ def resources_path(*args):
path = abspath(join(path, item))
return path
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:
print('404')
def load_ui(*args):
"""Get compile UI file.
@ -113,37 +108,51 @@ def load_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
# import os
# import qgis
usr = os.environ['USERNAME']
# 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:
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 = 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)
@ -152,7 +161,7 @@ def maj_verif(NAME):
try:
urllib.request.urlopen('https://google.com')
binar = True
except:
except urllib.error.URLError:
binar = False
if binar:
try:
@ -162,13 +171,11 @@ def maj_verif(NAME):
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:
except urllib.error.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