dlg_main.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. """
  2. """
  3. import importlib
  4. import logging
  5. from qgis.core import QgsProject # @UnresolvedImport
  6. from PyQt5 import QtWidgets
  7. from PyQt5 import uic
  8. from PyQt5.Qt import QIcon, QPixmap, Qt, QTableWidgetItem, QHeaderView
  9. from PyQt5.QtWidgets import QApplication
  10. from core.constants import MAIN, RSCDIR
  11. logger = logging.getLogger("mncheck")
  12. Ui_Main, _ = uic.loadUiType(MAIN / 'ui'/ 'dlg_main.ui')
  13. Ui_ChkFrame, _ = uic.loadUiType(MAIN / 'ui'/ 'checkframe.ui')
  14. SCHEMAS = ["mn1_rec", "mn2_rec", "mn3_pro", "mn3_exe", "mn3_rec"]
  15. class DlgMain(QtWidgets.QDialog):
  16. def __init__(self, iface, parent=None):
  17. super(DlgMain, self).__init__(parent)
  18. self.createWidgets()
  19. self.iface = iface
  20. self.schema_lib = None
  21. def createWidgets(self):
  22. """ set up the interface """
  23. self.ui = Ui_Main()
  24. self.ui.setupUi(self)
  25. self.ui.btn_run.setIcon(QIcon(RSCDIR / "play.png"))
  26. self.ui.btn_run.clicked.connect(self.run)
  27. self.ui.btn_help.setIcon(QIcon(RSCDIR / "question.png"))
  28. self.ui.btn_help.clicked.connect(self.show_help)
  29. self.ui.btn_settings.setIcon(QIcon(RSCDIR / "settings.png"))
  30. self.ui.btn_settings.clicked.connect(self.show_settings)
  31. self.ui.tbl_layers.horizontalHeaderItem(1).setTextAlignment(Qt.AlignLeft)
  32. self.ui.cbb_schemas.addItem("Schéma MN v1 REC", 0)
  33. self.ui.cbb_schemas.addItem("Schéma MN v2 REC", 1)
  34. # self.ui.cbb_schemas.addItem("Schéma MN v3 PRO", 2)
  35. # self.ui.cbb_schemas.addItem("Schéma MN v3 EXE", 3)
  36. # self.ui.cbb_schemas.addItem("Schéma MN v3 REC", 4)
  37. self.ui.cbb_schemas.currentIndexChanged.connect(self.update_layers_list)
  38. self.update_layers_list()
  39. def clear_layers_table(self):
  40. while self.ui.tbl_layers.rowCount():
  41. self.ui.tbl_layers.removeRow(0)
  42. def selected_validator(self):
  43. schema_lib_name = SCHEMAS[int(self.ui.cbb_schemas.itemData(self.ui.cbb_schemas.currentIndex()))]
  44. logger.info("Selected schema: %s", schema_lib_name)
  45. schema_lib = importlib.import_module("schemas." + schema_lib_name)
  46. return schema_lib.Validator
  47. def update_layers_list(self):
  48. validator = self.selected_validator()
  49. expected = [model.layername for model in validator.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.clear_layers_table()
  55. for layername in expected:
  56. cur_row = self.ui.tbl_layers.rowCount()
  57. self.ui.tbl_layers.insertRow(cur_row)
  58. lbl_icon, lbl_layer, lbl_message = QTableWidgetItem(), QTableWidgetItem(), QTableWidgetItem()
  59. lbl_layer.setText(layername)
  60. if layername.lower() in found:
  61. lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / "ok_16.png")))
  62. else:
  63. lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / "error_16.png")))
  64. lbl_message.setText("La couche est introuvable")
  65. self.ui.btn_run.setEnabled(False)
  66. self.ui.tbl_layers.setItem(cur_row, 0, lbl_icon)
  67. self.ui.tbl_layers.setItem(cur_row, 1, lbl_layer)
  68. self.ui.tbl_layers.setItem(cur_row, 2, lbl_message)
  69. self.ui.tbl_layers.horizontalHeader().setSectionResizeMode(0, QHeaderView.Fixed)
  70. self.ui.tbl_layers.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
  71. self.ui.tbl_layers.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
  72. def run(self):
  73. QApplication.setOverrideCursor(Qt.WaitCursor)
  74. self.clear_layers_table()
  75. validator = self.selected_validator()
  76. if not validator:
  77. logger.info("Aucun schéma sélectionné - Opération annulée")
  78. return
  79. report = validator.submit(self.iface)
  80. logger.debug(report)
  81. for chk in report["checkpoints"]:
  82. cur_row = self.ui.tbl_layers.rowCount()
  83. self.ui.tbl_layers.insertRow(cur_row)
  84. lbl_icon, lbl_checkpoint = QTableWidgetItem(), QTableWidgetItem()
  85. lbl_checkpoint.setText(chk["name"])
  86. lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / ("ok_16.png" if chk["valid"] else "error_16.png"))))
  87. self.ui.tbl_layers.setItem(cur_row, 0, lbl_icon)
  88. self.ui.tbl_layers.setItem(cur_row, 1, lbl_checkpoint)
  89. if not chk["valid"]:
  90. self.ui.tbl_layers.setItem(cur_row, 2, QTableWidgetItem("Des erreurs ont été trouvées"))
  91. for type_err in report["errors"]:
  92. for err in report["errors"][type_err]["list"]:
  93. cur_row = self.ui.tbl_layers.rowCount()
  94. self.ui.tbl_layers.insertRow(cur_row)
  95. lbl_icon, lbl_field, lbl_err = QTableWidgetItem(), QTableWidgetItem(), QTableWidgetItem()
  96. lbl_field.setText(f"{err['layername']}.{err['field']}")
  97. lbl_err.setText(f"{type_err}: {err['message']}")
  98. # lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / "error_16.png")))
  99. # self.ui.tbl_layers.setItem(cur_row, 0, lbl_icon)
  100. self.ui.tbl_layers.setItem(cur_row, 1, lbl_field)
  101. self.ui.tbl_layers.setItem(cur_row, 2, lbl_err)
  102. QApplication.restoreOverrideCursor()
  103. def show_help(self):
  104. pass
  105. def show_settings(self):
  106. pass