dlg_main.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. logger = logging.getLogger("mncheck")
  14. Ui_Main, _ = uic.loadUiType(MAIN / 'ui'/ 'dlg_main.ui')
  15. # SCHEMAS = ["mn1_rec", "mn2_rec", "mn3_pro", "mn3_exe", "mn3_rec"]
  16. class DlgMain(QtWidgets.QDialog):
  17. def __init__(self, iface, parent=None):
  18. super(DlgMain, self).__init__(parent)
  19. self.available_schemas = mncheck.list_schemas()
  20. self.iface = iface
  21. self.schema_lib = None
  22. self.createWidgets()
  23. def createWidgets(self):
  24. """ set up the interface """
  25. self.ui = Ui_Main()
  26. self.ui.setupUi(self)
  27. self.ui.btn_run.setIcon(QIcon(RSCDIR / "play.png"))
  28. self.ui.btn_run.clicked.connect(self.run)
  29. self.ui.btn_help.setIcon(QIcon(RSCDIR / "question.png"))
  30. self.ui.btn_help.clicked.connect(self.show_help)
  31. self.ui.btn_settings.setIcon(QIcon(RSCDIR / "settings.png"))
  32. self.ui.btn_settings.clicked.connect(self.show_settings)
  33. for i, schema_name in enumerate(self.available_schemas):
  34. s = mncheck.get_schema(schema_name)
  35. try:
  36. self.ui.cbb_schemas.addItem(s.SCHEMA_NAME, i)
  37. except AttributeError:
  38. self.ui.cbb_schemas.addItem(schema_name, i)
  39. self.ui.cbb_schemas.currentIndexChanged.connect(self.update_layers_list)
  40. self.ui.tree_report.setColumnWidth(0, 35)
  41. self.ui.tree_report.itemClicked.connect(self.tree_item_clicked)
  42. self.update_layers_list()
  43. def current_schema(self):
  44. schema_name = self.available_schemas[int(self.ui.cbb_schemas.itemData(self.ui.cbb_schemas.currentIndex()))]
  45. logger.info("Selected schema: %s", schema_name)
  46. return mncheck.get_schema(schema_name)
  47. def update_layers_list(self):
  48. schema = self.current_schema()
  49. expected = [model.layername for model in schema.models]
  50. logger.info("Expected layers: %s", str(expected))
  51. found = [layer.name().lower() for layer in QgsProject.instance().mapLayers().values()]
  52. logger.info("Found layers: %s", str(found))
  53. self.ui.btn_run.setEnabled(True)
  54. self.ui.tree_report.clear()
  55. for layername in expected:
  56. item = QTreeWidgetItem()
  57. if layername.lower() in found:
  58. item.setIcon(0, QIcon(QPixmap(RSCDIR / "ok_16.png")))
  59. item.setText(1, layername)
  60. else:
  61. item.setIcon(0, QIcon(QPixmap(RSCDIR / "error_16.png")))
  62. item.setText(1, f"{layername}: La couche est introuvable")
  63. self.ui.btn_run.setEnabled(False)
  64. self.ui.tree_report.addTopLevelItem(item)
  65. def run(self):
  66. QApplication.setOverrideCursor(Qt.WaitCursor)
  67. self.ui.tree_report.clear()
  68. try:
  69. schema = self.current_schema()
  70. if not schema:
  71. logger.error("Aucun schéma sélectionné - Opération annulée")
  72. return
  73. checkers = mncheck.get_checkers(schema)
  74. if not checkers:
  75. logger.error("Aucun testeur trouvé dans le schéma")
  76. return
  77. for checker in checkers:
  78. logger.info(f"Execution du checker {checker.__name__}")
  79. self._run(checker)
  80. except:
  81. raise
  82. finally:
  83. QApplication.restoreOverrideCursor()
  84. def _run(self, checker):
  85. results = checker().run()
  86. for result in results:
  87. topitem = QTreeWidgetItem()
  88. if result.status == checking.SUCCESS:
  89. topitem.setIcon(0, QIcon(QPixmap(RSCDIR / "ok_16.png")))
  90. topitem.setText(1, f"{result.title}")
  91. elif result.status == checking.FAILURE:
  92. topitem.setIcon(0, QIcon(QPixmap(RSCDIR / "error_16.png")))
  93. topitem.setText(1, f"{result.title} ({len(result.errors)})")
  94. elif result.status == checking.ERROR:
  95. topitem.setIcon(0, QIcon(QPixmap(RSCDIR / "warning_16.png")))
  96. topitem.setText(1, f"{result.title} [Erreur inconnue]")
  97. else:
  98. topitem.setText(1, f"{result.title} [Résultat manquant]")
  99. self.ui.tree_report.addTopLevelItem(topitem)
  100. for err in result.errors:
  101. treeitem = QTreeWidgetItem()
  102. treeitem.setText(1, err.message)
  103. if "exc_info" in err.info:
  104. logger.debug("* %s\n%s", err.message, err.info["exc_info"])
  105. treeitem.setData(1, Qt.UserRole, err.info["exc_info"])
  106. topitem.addChild(treeitem)
  107. def tree_item_clicked(self, item, col):
  108. data = item.data(1, Qt.UserRole)
  109. def show_help(self):
  110. pass
  111. def show_settings(self):
  112. pass