dlg_main.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. """
  2. """
  3. from core import mncheck, checking
  4. import importlib
  5. import logging
  6. from qgis.core import QgsProject # @UnresolvedImport
  7. from PyQt5 import QtWidgets
  8. from PyQt5 import uic
  9. from PyQt5.Qt import Qt
  10. from PyQt5.QtGui import QIcon, QPixmap
  11. from PyQt5.QtWidgets import QApplication, QTreeWidgetItem
  12. from core.constants import MAIN, RSCDIR
  13. from core.mncheck import QgsModel
  14. logger = logging.getLogger("mncheck")
  15. Ui_Main, _ = uic.loadUiType(MAIN / 'ui'/ 'dlg_main.ui')
  16. # SCHEMAS = ["mn1_rec", "mn2_rec", "mn3_pro", "mn3_exe", "mn3_rec"]
  17. class DlgMain(QtWidgets.QDialog):
  18. def __init__(self, iface, parent=None):
  19. super(DlgMain, self).__init__(parent)
  20. self.available_schemas = mncheck.list_schemas()
  21. self.iface = iface
  22. self.schema_lib = None
  23. self.createWidgets()
  24. def createWidgets(self):
  25. """ set up the interface """
  26. self.ui = Ui_Main()
  27. self.ui.setupUi(self)
  28. self.ui.btn_run.setIcon(QIcon(RSCDIR / "play.png"))
  29. self.ui.btn_run.clicked.connect(self.run)
  30. self.ui.btn_help.setIcon(QIcon(RSCDIR / "question.png"))
  31. self.ui.btn_help.clicked.connect(self.show_help)
  32. self.ui.btn_settings.setIcon(QIcon(RSCDIR / "settings.png"))
  33. self.ui.btn_settings.clicked.connect(self.show_settings)
  34. for i, schema_name in enumerate(self.available_schemas):
  35. s = mncheck.get_schema(schema_name)
  36. try:
  37. self.ui.cbb_schemas.addItem(s.SCHEMA_NAME, i)
  38. except AttributeError:
  39. self.ui.cbb_schemas.addItem(schema_name, i)
  40. self.ui.cbb_schemas.currentIndexChanged.connect(self.update_layers_list)
  41. self.ui.tree_report.setColumnWidth(0, 35)
  42. self.ui.tree_report.itemClicked.connect(self.tree_item_clicked)
  43. self.update_layers_list()
  44. def current_schema(self):
  45. schema_name = self.available_schemas[int(self.ui.cbb_schemas.itemData(self.ui.cbb_schemas.currentIndex()))]
  46. logger.info("Selected schema: %s", schema_name)
  47. return mncheck.get_schema(schema_name)
  48. def update_layers_list(self):
  49. schema = self.current_schema()
  50. expected = [model.layername for model in schema.models]
  51. logger.info("Expected layers: %s", str(expected))
  52. found = [layer.name().lower() for layer in QgsProject.instance().mapLayers().values()]
  53. logger.info("Found layers: %s", str(found))
  54. self.ui.btn_run.setEnabled(True)
  55. self.ui.tree_report.clear()
  56. for layername in expected:
  57. item = QTreeWidgetItem()
  58. if layername.lower() in found:
  59. item.setIcon(0, QIcon(QPixmap(RSCDIR / "ok_16.png")))
  60. item.setText(1, layername)
  61. else:
  62. item.setIcon(0, QIcon(QPixmap(RSCDIR / "error_16.png")))
  63. item.setText(1, f"{layername}: La couche est introuvable")
  64. self.ui.btn_run.setEnabled(False)
  65. self.ui.tree_report.addTopLevelItem(item)
  66. def run(self):
  67. QApplication.setOverrideCursor(Qt.WaitCursor)
  68. self.ui.tree_report.clear()
  69. try:
  70. schema = self.current_schema()
  71. if not schema:
  72. logger.error("Aucun schéma sélectionné - Opération annulée")
  73. return
  74. checkers = mncheck.get_checkers(schema)
  75. if not checkers:
  76. logger.error("Aucun testeur trouvé dans le schéma")
  77. return
  78. for checker in checkers:
  79. logger.info(f"Execution du checker {checker.__name__}")
  80. self._run(checker)
  81. except:
  82. raise
  83. finally:
  84. QApplication.restoreOverrideCursor()
  85. def _run(self, checker):
  86. results = checker().run()
  87. for result in results:
  88. topitem = QTreeWidgetItem()
  89. if result.status == checking.SUCCESS:
  90. topitem.setIcon(0, QIcon(QPixmap(RSCDIR / "ok_16.png")))
  91. topitem.setText(1, f"{result.title}")
  92. elif result.status == checking.FAILURE:
  93. topitem.setIcon(0, QIcon(QPixmap(RSCDIR / "error_16.png")))
  94. topitem.setText(1, f"{result.title} ({len(result.errors)})")
  95. elif result.status == checking.ERROR:
  96. topitem.setIcon(0, QIcon(QPixmap(RSCDIR / "warning_16.png")))
  97. topitem.setText(1, f"{result.title} [Erreur inconnue]")
  98. else:
  99. topitem.setText(1, f"{result.title} [Résultat manquant]")
  100. self.ui.tree_report.addTopLevelItem(topitem)
  101. for err in result.errors:
  102. erritem = QTreeWidgetItem()
  103. msg = err.message
  104. data = None
  105. if "exc_info" in err.info:
  106. data = err.info["exc_info"]
  107. logger.debug("%s", err.message, err.info["exc_info"])
  108. elif "model" in err.info:
  109. data = err.info["model"]
  110. msg = f"{data.layername} - {msg}"
  111. elif "item" in err.info:
  112. data = err.info["item"]
  113. msg = f"{data} - {msg}"
  114. erritem.setText(1, msg)
  115. erritem.setData(1, Qt.UserRole, data)
  116. topitem.addChild(erritem)
  117. def tree_item_clicked(self, item, _):
  118. data = item.data(1, Qt.UserRole)
  119. if not data:
  120. return
  121. logger.debug("error clicked (data: %s)", data)
  122. if hasattr(data, "_feature"):
  123. self.zoom_to_feature(data.layer, data._feature)
  124. elif hasattr(data, "layer"):
  125. self.select_layer(data.layer)
  126. else:
  127. logger.error(f"Data unknown: {data}")
  128. def select_layer(self, layer):
  129. self.iface.setActiveLayer(layer)
  130. def zoom_to_feature(self, layer, feature):
  131. self.iface.setActiveLayer(layer)
  132. self.iface.mapCanvas().zoomToFeatureExtent(feature.geometry().boundingBox())
  133. layer.select(feature.id())
  134. def show_help(self):
  135. pass
  136. def show_settings(self):
  137. pass