def get_toc(project, info): """Get the WMS TOC information for the project""" use_ids = QgsServerProjectUtils.wmsUseLayerIds(project) wmsRestrictedLayers = QgsServerProjectUtils.wmsRestrictedLayers(project) def _harvest(node, parent_id=None): node_name = node.name() if parent_id is not None else 'root' rec = { 'title': node_name, # Override with title for layers 'name': node_name, 'expanded': node.isExpanded(), 'visible': node.isVisible(), } try: rec['id'] = node.layerId() rec['queryable'] = node.layerId() in info['wms_layers_queryable'] rec['searchable'] = node.layerId() in info['wms_layers_searchable'] rec['wfs_enabled'] = node.layerId( ) in info['capabilities']['wfsLayerIds'] short_name = node.layer().shortName() if node.layer().shortName( ) else node.layer().name() rec['typename'] = node.layer().id() if use_ids else short_name # Override title if node.layer().title(): rec['title'] = node.layer().title() if node.layer().type() not in (QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer): raise Exception rec['layer_type'] = 'vector' if node.layer().type( ) == QgsMapLayerType.VectorLayer else 'raster' rec['has_scale_based_visibility'] = node.layer( ).hasScaleBasedVisibility() if rec['has_scale_based_visibility']: rec['min_scale'] = node.layer().minimumScale() rec['max_scale'] = node.layer().maximumScale() rec['is_layer'] = True except AttributeError: rec['is_layer'] = False rec['tree_id'] = (parent_id + '.' + rec['title']) if parent_id is not None else 'root' rec['tree_id_hash'] = hashlib.md5( rec['tree_id'].encode('utf8')).hexdigest() children = [] for cn in [ n for n in node.children() if n.name() not in wmsRestrictedLayers ]: try: children.append(_harvest(cn, rec['tree_id'])) except: pass rec['children'] = children return rec return _harvest(project.layerTreeRoot())
def test_wmsrestrictedlayers(self): # retrieve entry from project result = QgsServerProjectUtils.wmsRestrictedLayers(self.prj) expected = [] expected.append('points') # layer expected.append('group1') # local group expected.append('groupEmbedded') # embedded group self.assertListEqual(sorted(expected), sorted(result))
def test_wmsrestrictedlayers(self): # retrieve entry from project result = QgsServerProjectUtils.wmsRestrictedLayers(self.prj) expected = [] expected.append('points') # layer expected.append('group1') # local group expected.append('groupEmbedded') # embedded group self.assertListEqual(sorted(expected), sorted(result))
def validatLayers( self, project: QgsProject ) -> bool: """ Check layers If layers are excluded do not count them as bad layers see https://github.com/qgis/QGIS/pull/33668 """ if self.badLayerNames: restricteds = set(QgsServerProjectUtils.wmsRestrictedLayers(project)) return self.badLayerNames.issubset(restricteds) return True
def project_wms(project, crs): """Calculate the extent from WMS advertized (if defined) or from WMS published layers. :param project: [description] :type project: [type] :returns: a tuple with WMS extent and list of published WMS typenames :rtype: tuple """ wms_typenames = [] extent = '' restricted_wms = QgsServerProjectUtils.wmsRestrictedLayers(project) use_ids = QgsServerProjectUtils.wmsUseLayerIds(project) for l in project.mapLayers().values(): if l.name() not in restricted_wms: lid = l.id() if use_ids else l.name() wms_typenames.append(lid) extent = QgsServerProjectUtils.wmsExtent(project) if extent.isNull(): target_crs = QgsCoordinateReferenceSystem.fromEpsgId( int(crs.split(':')[1])) for l in project.mapLayers().values(): if l.name() not in restricted_wms: l_extent = l.extent() if l.crs() != target_crs: ct = QgsCoordinateTransform(l.crs(), target_crs, project.transformContext()) l_extent = ct.transform(l_extent) if extent.isNull(): extent = l_extent else: extent.combineExtentWith(l_extent) else: if crs != project.crs().authid(): target_crs = QgsCoordinateReferenceSystem.fromEpsgId( int(crs.split(':')[1])) ct = QgsCoordinateTransform(project.crs(), target_crs, project.transformContext()) extent = ct.transform(extent) return extent, wms_typenames