فهرست منبع

Corrections diverses

omassot 7 سال پیش
والد
کامیت
d0fe48df7b
3فایلهای تغییر یافته به همراه44 افزوده شده و 7 حذف شده
  1. 0 0
      core/cerberus_.py
  2. 32 1
      core/model.py
  3. 12 6
      core/validator.py

+ 0 - 0
core/cerberus_extend.py → core/cerberus_.py


+ 32 - 1
core/model.py

@@ -4,7 +4,7 @@
 '''
 
 import logging
-from qgis.core import QgsWkbTypes
+from qgis.core import QgsWkbTypes, QgsGeometry, QgsPoint
 
 from PyQt5.QtCore import QVariant
 
@@ -43,6 +43,8 @@ class QgsModel():
         
         self.geom = qgs_feature.geometry()
         
+        self.points = self._extract_points()
+        
     def is_geometry_valid(self):
         return self._feature.geometry().isGeosValid()
         
@@ -53,5 +55,34 @@ class QgsModel():
         bb = self._feature.geometry().boundingBox()
         return (bb.xMinimum(), bb.yMinimum(), bb.xMaximum(), bb.yMaximum())
     
+    def _extract_points(self):
+        if self.geom.isNull():
+            return []
         
+        multi_geom = QgsGeometry()
+        temp_geom = []
         
+        if self.geom.type() == 0: # it's a point
+            if self.geom.isMultipart():
+                temp_geom = self.geom.asMultiPoint()
+            else:
+                temp_geom.append(self.geom.asPoint())
+        elif self.geom.type() == 1: # it's a line
+            if self.geom.isMultipart():
+                multi_geom = self.geom.asMultiPolyline() #multi_geog is a multiline
+                for i in multi_geom: #i is a line
+                    temp_geom.extend( i )
+            else:
+                temp_geom = self.geom.asPolyline()
+        elif self.geom.type() == 2: # it's a polygon
+            if self.geom.isMultipart():
+                multi_geom = self.geom.asMultiPolygon() #multi_geom is a multipolygon
+                for i in multi_geom: #i is a polygon
+                    for j in i: #j is a line
+                        temp_geom.extend( j )
+            else:
+                multi_geom = self.geom.asPolygon() #multi_geom is a polygon
+                for i in multi_geom: #i is a line
+                    temp_geom.extend( i )
+                
+        return [QgsPoint(p) for p in temp_geom]

+ 12 - 6
core/validator.py

@@ -6,11 +6,11 @@
 import logging
 from qgis.core import QgsProject
 
-from core.cerberus_extend import CerberusErrorHandler, \
+from core.cerberus_ import CerberusErrorHandler, \
     _translate_messages, ExtendedValidator
 from core.model import QgsModel
 from core.validation_errors import CRITICAL, DataError, GeomTypeError, BoundingBoxError, \
-    MissingLayer, WrongSrid
+    MissingLayer, WrongSrid, InvalidGeometry, TechnicalValidationError
 
 
 logger = logging.getLogger("mncheck")
@@ -36,13 +36,15 @@ class BaseValidator():
         self.dt = 0
     
     def checkpoint(self, title):
+        logger.info(f"Checkpoint: {title}")
         self.checkpoints.append(Checkpoint(title, self._current_checkpoint_valid))
         self._current_checkpoint_valid = True
         if self.errors:
             self.valid = False
             if self.critical_happened():
+                logger.info("Contrôle de données interrompu en raison d'une erreur critique dans les données")
                 raise ValidatorInterruption()
-             
+            
     def critical_happened(self):
         return any([err.level == CRITICAL for err in self.errors])
              
@@ -78,6 +80,9 @@ class BaseValidator():
         except ValidatorInterruption:
             raise
         except:
+#             logger.error("".join(traceback.format_exception(*sys.exc_info())))
+            logger.exception("Une erreur s'est produite")
+            self.log_error(TechnicalValidationError("Contrôle des données interrompu"))
             self.checkpoint("Validation Métier [interrompu]")
     
     def _load_layers(self):
@@ -100,8 +105,9 @@ class BaseValidator():
                 item = model(feature)
                 
                 self.dataset[model].append(item)
-                        
+
     
+
     def _structure_validation(self):
         
         for model in self.models:
@@ -112,7 +118,7 @@ class BaseValidator():
 
                 # 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"))
+                    self.log_error(InvalidGeometry("La géométrie de l'objet est invalide: {}".format(item), layername=model.layername, field="geom"))
 
                 # geom type
                 if item.get_geom_type() != model.geom_type:
@@ -144,7 +150,7 @@ class BaseValidator():
         
         for err in self.errors:
             if not err.name in report["errors"]:
-                report["errors"][err.name] = {"help": err.help, "order_": err.order_, "list": []}
+                report["errors"][err.name] = {"help": err.help, "order_": err.order_, "level": err.level, "list": []}
             
             err_report = {"layername": err.layername or "-",
                           "field": err.field or "-",