|
|
@@ -0,0 +1,121 @@
|
|
|
+'''
|
|
|
+
|
|
|
+ Schéma de validation des données MN2
|
|
|
+
|
|
|
+@author: olivier.massot, 2018
|
|
|
+'''
|
|
|
+
|
|
|
+import logging
|
|
|
+from qgis.core import QgsProject
|
|
|
+
|
|
|
+from core.cerberus_ import is_positive_int, is_positive_float
|
|
|
+from core.checking import BaseChecker
|
|
|
+from core.mncheck import QgsModel
|
|
|
+
|
|
|
+
|
|
|
+logger = logging.getLogger("mncheck")
|
|
|
+
|
|
|
+SCHEMA_NAME = "Schéma MN v3 APD"
|
|
|
+
|
|
|
+XMIN, XMAX, YMIN, YMAX = 1341999, 1429750, 8147750, 8294000
|
|
|
+CRS = 'EPSG:3949' # Coordinate Reference System
|
|
|
+
|
|
|
+TOLERANCE = 0.5
|
|
|
+
|
|
|
+STATUTS = ['ETUDE PRELIMINAIRE', 'ETUDE DE DIAGNOSTIC', 'AVANT-PROJET PROJET', 'PROJET', 'PASSATION DES MARCHES DE TRAVAUX',
|
|
|
+ 'ETUDE D EXECUTION', 'TRAVAUX' , 'RECOLEMENT', 'MAINTIEN EN CONDITIONS OPERATIONNELLES']
|
|
|
+
|
|
|
+##### Modeles
|
|
|
+
|
|
|
+class SiteTelecom(QgsModel):
|
|
|
+ layername = "SITE_TELECOM"
|
|
|
+ geom_type = QgsModel.GEOM_POINT
|
|
|
+ bounding_box = (XMIN,YMIN,XMAX,YMAX)
|
|
|
+ pk = "ST_CODE"
|
|
|
+ schema = {'ST_CODE': {'type': 'string', 'empty': False},
|
|
|
+ 'ST_NOM': {'type': 'string', 'empty': False},
|
|
|
+ 'ST_TYPFCT': {'type': 'string', 'empty': False, 'allowed': ['SITE HEBERGEMENT',
|
|
|
+ 'NOEUD RACCORDEMENT OPTIQUE',
|
|
|
+ 'SOUS-REPARTITEUR OPTIQUE',
|
|
|
+ 'SOUS-REPARTITEUR OPTIQUE COLOCALISE',
|
|
|
+ 'NOEUD RACCORDEMENT D ABONNES',
|
|
|
+ 'NOEUD RACCORDEMENT D ABONNES - HAUT DEBIT',
|
|
|
+ 'NOEUD RACCORDEMENT D ABONNES - MONTEE EN DEBIT']},
|
|
|
+ 'ST_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]},
|
|
|
+ 'ST_NBPRISE': {'empty': False, 'validator': is_positive_int}
|
|
|
+ }
|
|
|
+
|
|
|
+class SiteClient(QgsModel):
|
|
|
+ layername = "SITE_CLIENT"
|
|
|
+ geom_type = QgsModel.GEOM_POINT
|
|
|
+ bounding_box = (XMIN,YMIN,XMAX,YMAX)
|
|
|
+ schema = {'SC_TYPFON': {'type': 'string', 'empty': False, 'allowed': ['RESIDENTIEL', 'PROFESSIONNEL', 'OPERATEUR', 'TECHNIQUE']},
|
|
|
+ 'SC_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]},
|
|
|
+ 'SC_NBPRISE': {'empty': False, 'validator': is_positive_int},
|
|
|
+ 'SC_NBPRHAB': {'empty': False, 'validator': is_positive_int},
|
|
|
+ 'SC_NBPRPRO': {'empty': False, 'validator': is_positive_int},
|
|
|
+ 'SC_ID_SITE': {'type': 'string', 'empty': False},
|
|
|
+ 'SC_NUM_RUE': {'type': 'string', 'empty': False},
|
|
|
+ 'SC_REPET': {'type': 'string', 'empty': False},
|
|
|
+ 'SC_DNUBAT': {'type': 'string', 'empty': False},
|
|
|
+ 'SC_DESC': {'type': 'string', 'empty': False},
|
|
|
+ 'SC_NOM_RUE': {'type': 'string', 'empty': False},
|
|
|
+ 'SC_NOM_COM': {'type': 'string', 'empty': False},
|
|
|
+ 'SC_ETAT': {'type': 'string', 'empty': False, 'allowed': ['VALIDE', 'OBSOLETE', 'NOUVEAU', 'FUTUR']},
|
|
|
+ 'SC_ATT_PTO': {'empty': False, 'validator': is_positive_float}
|
|
|
+ }
|
|
|
+
|
|
|
+class Cable(QgsModel):
|
|
|
+ layername = "CABLE"
|
|
|
+ geom_type = QgsModel.GEOM_LINE
|
|
|
+ bounding_box = (XMIN,YMIN,XMAX,YMAX)
|
|
|
+ schema = {'CA_TYPFON': {'type': 'string', 'empty': False, 'allowed': ['COLLECTE TRANSPORT DISTRIBUTION', 'COLLECTE', 'COLLECTE TRANSPORT', 'COLLECTE DISTRIBUTION', 'TRANSPORT DISTRIBUTION', 'TRANSPORT', 'DISTRIBUTION', 'RACCORDEMENT FINAL', 'BOUCLE METROPOLITAINE', 'LONGUE DISTANCE (LONG HAUL)', 'NON COMMUNIQUE']},
|
|
|
+ 'CA_TYPSTR': {'type': 'string', 'empty': False, 'allowed': ['CONDUITE', 'AERIEN', 'COLONNE MONTANTE', 'IMMERGE', 'FACADE']},
|
|
|
+ 'CA_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]},
|
|
|
+ 'CA_CAPFO': {'empty': False, 'validator': is_positive_int},
|
|
|
+ 'CA_MODULO': {'empty': False, 'validator': is_positive_int},
|
|
|
+ 'CA_SUPPORT': {'type': 'string', 'empty': False, 'allowed': ['0', '1']}
|
|
|
+ }
|
|
|
+
|
|
|
+class Zapbo(QgsModel):
|
|
|
+ layername = "ZAPBO"
|
|
|
+ geom_type = QgsModel.GEOM_POLYGON
|
|
|
+ bounding_box = (XMIN,YMIN,XMAX,YMAX)
|
|
|
+ schema = {'ZP_NBPRISE': {'empty': False, 'validator': is_positive_int},
|
|
|
+ 'ZP_ISOLE': {'type': 'string', 'empty': False, 'allowed': ['0', '1']},
|
|
|
+ 'ZP_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]}
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+class Zasro(QgsModel):
|
|
|
+ layername = "ZASRO"
|
|
|
+ geom_type = QgsModel.GEOM_POLYGON
|
|
|
+ bounding_box = (XMIN,YMIN,XMAX,YMAX)
|
|
|
+ schema = {'ZS_CODE': {'type': 'string', 'empty': False},
|
|
|
+ 'ZS_NBPRISE': {'empty': False, 'validator': is_positive_int}
|
|
|
+ }
|
|
|
+
|
|
|
+class Adduction(QgsModel):
|
|
|
+ layername = "ADDUCTION"
|
|
|
+ geom_type = QgsModel.GEOM_LINE
|
|
|
+ bounding_box = (XMIN,YMIN,XMAX,YMAX)
|
|
|
+ schema = {'AD_ISOLE': {'type': 'string', 'empty': False, 'allowed': ['0', '1']},
|
|
|
+ 'AD_LONG': {'empty': False, 'validator': is_positive_float}
|
|
|
+ }
|
|
|
+models = []
|
|
|
+
|
|
|
+####### Validateur
|
|
|
+
|
|
|
+
|
|
|
+class Mn3ApdChecker(BaseChecker):
|
|
|
+
|
|
|
+ def setUp(self):
|
|
|
+
|
|
|
+ self.dataset = {}
|
|
|
+ for model in models:
|
|
|
+ model.layer = next((l for l in QgsProject.instance().mapLayers().values() \
|
|
|
+ if l.name().lower() == model.layername.lower()), None)
|
|
|
+ self.dataset[model] = [model(f) for f in model.layer.getFeatures()] if model.layer else []
|
|
|
+
|
|
|
+
|
|
|
+checkers = [Mn3ApdChecker]
|