''' 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]