Ejemplo n.º 1
0
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())
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
    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))
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
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