|
|
@@ -3,14 +3,18 @@
|
|
|
|
|
|
@author: olivier.massot, sept. 2018
|
|
|
'''
|
|
|
-from qgis.core import QgsProject #@UnresolvedImport
|
|
|
+import logging
|
|
|
+from qgis.core import QgsProject
|
|
|
|
|
|
-from core import constants
|
|
|
from core.cerberus_extend import CerberusErrorHandler, \
|
|
|
_translate_messages, ExtendedValidator
|
|
|
+from core.model import QgsModel
|
|
|
from core.validation_errors import CRITICAL, DataError, GeomTypeError, BoundingBoxError, \
|
|
|
MissingLayer, WrongSrid
|
|
|
|
|
|
+
|
|
|
+logger = logging.getLogger("mncheck")
|
|
|
+
|
|
|
class ValidatorInterruption(BaseException):
|
|
|
pass
|
|
|
|
|
|
@@ -19,28 +23,6 @@ class Checkpoint():
|
|
|
self.name = name
|
|
|
self.valid = valid
|
|
|
|
|
|
-
|
|
|
-########### MODELES ################
|
|
|
-
|
|
|
-class BaseModel():
|
|
|
- filename = ""
|
|
|
- pk = ""
|
|
|
- schema = {}
|
|
|
- def __init__(self, **kwargs):
|
|
|
- self.__dict__.update(kwargs)
|
|
|
-
|
|
|
-class QgsModel():
|
|
|
- layername = ""
|
|
|
- pk = ""
|
|
|
- geom_type = 0
|
|
|
- bounding_box = (0,0,1,1)
|
|
|
- schema = {}
|
|
|
-
|
|
|
- def __init__(self, qgs_feature):
|
|
|
- self.__dict__.update(qgs_feature.__dict__)
|
|
|
-
|
|
|
-########### VALIDATION ################
|
|
|
-
|
|
|
class BaseValidator():
|
|
|
schema_name = ""
|
|
|
models = {}
|
|
|
@@ -88,7 +70,7 @@ class BaseValidator():
|
|
|
# Controle la structure des données (champs, formats et types)
|
|
|
self._structure_validation()
|
|
|
self.checkpoint("Contrôle de la structure des données")
|
|
|
-
|
|
|
+
|
|
|
# Validation technique
|
|
|
try:
|
|
|
self._technical_validation()
|
|
|
@@ -128,30 +110,34 @@ class BaseValidator():
|
|
|
|
|
|
for item in self.dataset[model]:
|
|
|
|
|
|
+ # geom valid
|
|
|
+ if not item.is_geometry_valid():
|
|
|
+ self.log_error(GeomTypeError("La géométrie de l'objet est invalide".format(), layername=model.layername, field="geom"))
|
|
|
+
|
|
|
# geom type
|
|
|
- if item.geom_type != model.geom_type:
|
|
|
- self.log_error(GeomTypeError("Type de géométrie invalide: {} (attendu: {})".format(item.geom_name, constants.GEOM_NAMES[model.geom_type]), filename=model.filename, field="geom"))
|
|
|
+ if item.get_geom_type() != model.geom_type:
|
|
|
+ self.log_error(GeomTypeError("Type de géométrie invalide: {} (attendu: {})".format(item.geom_name, QgsModel.GEOM_NAMES[model.geom_type]), layername=model.layername, field="geom"))
|
|
|
|
|
|
# bounding box
|
|
|
- x1, y1, x2, y2 = item.bounding_box
|
|
|
+ x1, y1, x2, y2 = item.get_bounding_box()
|
|
|
if any(x < xmin or x > xmax for x in (x1, x2)) or \
|
|
|
any(y < ymin or y > ymax for y in (y1, y2)):
|
|
|
- self.log_error(BoundingBoxError("Situé hors de l'emprise autorisée", filename=model.filename, field="geom"))
|
|
|
+ self.log_error(BoundingBoxError("Situé hors de l'emprise autorisée", layername=model.layername, field="geom"))
|
|
|
|
|
|
v.validate(item.__dict__)
|
|
|
-
|
|
|
+
|
|
|
for field, verrors in v.errors.items():
|
|
|
for err in verrors:
|
|
|
- self.log_error(DataError(_translate_messages(err), filename=model.filename, field=field))
|
|
|
+ self.log_error(DataError(_translate_messages(err), layername=model.layername, field=field))
|
|
|
|
|
|
@classmethod
|
|
|
def _technical_validation(cls):
|
|
|
raise NotImplementedError()
|
|
|
|
|
|
- def build_report(self, schema, filename):
|
|
|
+ def build_report(self, schema, layername):
|
|
|
report = {}
|
|
|
report["schema"] = schema
|
|
|
- report["filename"] = filename
|
|
|
+ report["reportname"] = ""
|
|
|
report["checkpoints"] = [{"name": chk.name, "valid": chk.valid} for chk in self.checkpoints]
|
|
|
|
|
|
report["errors"] = {}
|
|
|
@@ -160,7 +146,7 @@ class BaseValidator():
|
|
|
if not err.name in report["errors"]:
|
|
|
report["errors"][err.name] = {"help": err.help, "order_": err.order_, "list": []}
|
|
|
|
|
|
- err_report = {"filename": err.filename or "-",
|
|
|
+ err_report = {"layername": err.layername or "-",
|
|
|
"field": err.field or "-",
|
|
|
"message": err.message}
|
|
|
if err_report not in report["errors"][err.name]["list"]:
|