Browse Source

Enregistrement des préférences et corrections

omassot 7 years ago
parent
commit
225097cfed
7 changed files with 77 additions and 27 deletions
  1. 1 1
      core/checking.py
  2. 8 3
      core/constants.py
  3. 14 0
      core/mncheck.py
  4. 3 2
      schemas/mn1_rec.py
  5. 3 2
      schemas/mn2_rec.py
  6. 7 1
      ui/dlg_contact.py
  7. 41 18
      ui/dlg_main.py

+ 1 - 1
core/checking.py

@@ -80,7 +80,7 @@ class TestResult():
     def handle_exception(self, exc_info):
         self._status = ERROR
         typ, value, trace = exc_info
-        error = TestError("Une erreur inconnue s'est produite, veuillez consulter les fichiers de journalisation.", 
+        error = TestError("Une erreur inconnue s'est produite", 
                           {"exc_info": "{}\n{}\n{}".format(typ.__name__, value, ''.join(traceback.format_tb(trace)))})
         self.errors.append(error)
 

+ 8 - 3
core/constants.py

@@ -11,9 +11,14 @@ VERSION = "0.4.0"
 
 MAIN = Path(__file__).parent.parent.abspath()
 
-RSCDIR = MAIN / "ui" / "rsc"
+CONTACT = "sig@manchenumerique.fr"
 
-LOGDIR = Path("%appdata%").expandvars() / "mncheck"
-LOGDIR.mkdir_p()
+RSCDIR = MAIN / "ui" / "rsc"
 
 LOGCONF = MAIN / "core" / "logging.yaml"
+
+USER_DIR = Path("%appdata%").expandvars() / "mncheck"
+USER_DIR.mkdir_p()
+
+LOGDIR = USER_DIR
+USER_DATA = USER_DIR / 'user.yaml'

+ 14 - 0
core/mncheck.py

@@ -9,8 +9,10 @@ import pkgutil
 from qgis.core import QgsProject, QgsWkbTypes, QgsGeometry, QgsPoint
 
 from PyQt5.QtCore import QVariant
+import yaml
 
 from core.checking import BaseChecker
+from core.constants import USER_DATA
 from plugins import processing
 
 
@@ -28,6 +30,18 @@ def get_checkers(schema):
     return [cls for _, cls in inspect.getmembers(schema, predicate=inspect.isclass) \
             if issubclass(cls, BaseChecker) and not cls is BaseChecker]
 
+def get_user_data():
+    try:
+        with open(USER_DATA, 'r') as f:
+            return yaml.load(f.read()) or {}
+    except FileNotFoundError:
+        return {}
+
+def dump_user_data(conf):
+    with open(USER_DATA, 'w+') as f:
+        return yaml.dump(conf, f)
+
+
 class QgsModel():
     
     GEOM_UNKNOWN = 0

+ 3 - 2
schemas/mn1_rec.py

@@ -198,8 +198,9 @@ class Mn1Checker(BaseChecker):
         for model in models:
             layername = model.layername
             
-            layer = next((l for l in QgsProject.instance().mapLayers().values() if l.name().lower() == layername.lower()))
-            if not layer:
+            try:
+                layer = next((l for l in QgsProject.instance().mapLayers().values() if l.name().lower() == layername.lower()))
+            except StopIteration:
                 self.log_critical("Couche manquante", model=model)
                 continue
             

+ 3 - 2
schemas/mn2_rec.py

@@ -235,8 +235,9 @@ class Mn2Checker(BaseChecker):
         for model in models:
             layername = model.layername
             
-            layer = next((l for l in QgsProject.instance().mapLayers().values() if l.name().lower() == layername.lower()))
-            if not layer:
+            try:
+                layer = next((l for l in QgsProject.instance().mapLayers().values() if l.name().lower() == layername.lower()))
+            except StopIteration:
                 self.log_critical("Couche manquante", model=model)
                 continue
             

+ 7 - 1
ui/dlg_contact.py

@@ -7,9 +7,10 @@ import subprocess
 
 from PyQt5 import QtWidgets
 from PyQt5 import uic
+from PyQt5.QtCore import Qt
 from PyQt5.QtGui import QIcon, QPixmap
 
-from core.constants import MAIN, LOGDIR, RSCDIR
+from core.constants import MAIN, LOGDIR, RSCDIR, CONTACT
 from path import Path
 
 
@@ -33,6 +34,11 @@ class DlgContact(QtWidgets.QDialog):
         self.ui.lbl_mn_logo.setPixmap(QPixmap(RSCDIR / "mn_logo_mini.png"))
         self.ui.lbl_warning_logo.setPixmap(QPixmap(RSCDIR / "warning_16.png"))
         
+        self.ui.lbl_mail.setText(f"<a href=\"mailto:{CONTACT}\">{CONTACT}</a>")
+        self.ui.lbl_mail.setTextFormat(Qt.RichText)
+        self.ui.lbl_mail.setTextInteractionFlags(Qt.TextBrowserInteraction)
+        self.ui.lbl_mail.setOpenExternalLinks(True)
+        
         self.ui.btn_open_log_dir.clicked.connect(self.open_log_dir)
     
     def open_log_dir(self):

+ 41 - 18
ui/dlg_main.py

@@ -2,7 +2,8 @@
 """
 from core import mncheck, checking
 import logging
-from qgis.core import QgsProject, QgsVectorLayer
+from qgis.core import QgsProject
+import sys
 
 from PyQt5 import QtWidgets
 from PyQt5 import uic
@@ -37,6 +38,7 @@ class DlgMain(QtWidgets.QDialog):
         self.available_schemas = mncheck.list_schemas()        
         self.iface = iface
         self.schema_lib = None
+        self.user_conf = {}
         
         self.createWidgets()
 
@@ -45,6 +47,8 @@ class DlgMain(QtWidgets.QDialog):
         self.ui = Ui_Main()
         self.ui.setupUi(self)
         
+        self.user_conf = mncheck.get_user_data()
+        
         self.setWindowTitle(f"MnCheck v{VERSION}")
         self.setWindowIcon(QIcon(MAIN / "icon.png"))
         
@@ -63,6 +67,9 @@ class DlgMain(QtWidgets.QDialog):
             except AttributeError:
                 self.ui.cbb_schemas.addItem(schema_name, i)
             
+            if 'current_schema' in self.user_conf and self.user_conf['current_schema'] == schema_name:
+                self.ui.cbb_schemas.setCurrentIndex(i)
+            
         self.ui.cbb_schemas.currentIndexChanged.connect(self.update_layers_list)
         
         self.ui.progress_bar.setVisible(False)
@@ -71,22 +78,22 @@ class DlgMain(QtWidgets.QDialog):
         self.ui.tree_report.itemClicked.connect(self.tree_item_clicked)
         self.ui.tree_report.expanded.connect(self.tree_item_expanded)
         
+        QgsProject.instance().layersAdded.connect(self.update_layers_list)
+        QgsProject.instance().layersRemoved.connect(self.update_layers_list)
+        
         self.update_layers_list()
     
     def tree_item_expanded(self, _):
         self.tree_auto_resize()
-    
+
     def tree_auto_resize(self):
         self.ui.tree_report.resizeColumnToContents(1)
         self.ui.tree_report.resizeColumnToContents(2)
         self.ui.tree_report.setColumnWidth(1, self.ui.tree_report.columnWidth(1) + 20)
         self.ui.tree_report.setColumnWidth(2, self.ui.tree_report.columnWidth(2) + 20)
     
-    def current_schema(self):
-        schema_name = self.available_schemas[int(self.ui.cbb_schemas.itemData(self.ui.cbb_schemas.currentIndex()))]
-        logger.info("Selected schema: %s", schema_name)
-    
-        return mncheck.get_schema(schema_name)
+    def current_schema_name(self):
+        return self.available_schemas[int(self.ui.cbb_schemas.itemData(self.ui.cbb_schemas.currentIndex()))]
     
     def init_progress_bar(self, value=0, minimum=0, maximum=100):
         self.ui.progress_bar.setMinimum(minimum)
@@ -98,12 +105,20 @@ class DlgMain(QtWidgets.QDialog):
     
     def test_ended(self, test):
         logger.debug("* %s - %s", test.name, test.status_str)
+        if test.status == checking.ERROR:
+            try:
+                logger.debug("%s", "\n".join([e.info['exc_info'] for e in test.errors]))
+            except KeyError:
+                pass
         self.ui.progress_bar.setValue(self.ui.progress_bar.value() + 1)
         self.ui.progress_bar.update()
     
     def update_layers_list(self):
         
-        schema = self.current_schema()
+        schema_name = self.current_schema_name()
+        logger.info("Selected schema: %s", schema_name)
+        
+        schema = mncheck.get_schema(schema_name)
         
         expected = [model.layername for model in schema.models]
         logger.info("Expected layers: %s", str(expected))
@@ -138,7 +153,9 @@ class DlgMain(QtWidgets.QDialog):
         self.ui.tree_report.clear()
         
         try:
-            schema = self.current_schema()
+            schema_name = self.current_schema_name()
+            
+            schema = mncheck.get_schema(schema_name)
             if not schema:
                 logger.error("Aucun schéma sélectionné - Opération annulée")
                 return
@@ -199,19 +216,18 @@ class DlgMain(QtWidgets.QDialog):
                 
                 msg = err.message
                 
+                erritem.setText(1, msg)
+                
                 if "exc_info" in err.info:
-                    logger.debug("%s", err.message, err.info["exc_info"])
-                    erritem.setData(1, Qt.UserRole, err.info["exc_info"])
+                    erritem.setData(1, Qt.UserRole, err)
                     
                 elif "model" in err.info:
                     data = err.info["model"]
-                    erritem.setText(1, msg)
                     erritem.setText(2, f"{data.layername}".upper())
                     erritem.setData(1, Qt.UserRole, data)
                     
                 elif "item" in err.info:
                     data = err.info["item"]
-                    erritem.setText(1, msg)
                     erritem.setText(2, f"{data}")
                     erritem.setData(1, Qt.UserRole, data)
                 
@@ -229,7 +245,7 @@ class DlgMain(QtWidgets.QDialog):
         if not data:
             return
         
-        if hasattr(data, "_feature"):
+        elif hasattr(data, "_feature"):
             self.zoom_to_feature(data.layer, data._feature)
             
         elif hasattr(data, "layer"):
@@ -252,8 +268,15 @@ class DlgMain(QtWidgets.QDialog):
     def show_help(self):
         pass
     
-    def show_settings(self):
-        pass
-
-
+    def store_config(self):
+        user_conf = mncheck.get_user_data()
+        
+        user_conf["current_schema"] = self.current_schema_name()
+        
+        mncheck.dump_user_data(user_conf)
+    
+    def closeEvent(self, event):
+        self.store_config()
+        
+        super().closeEvent(event)