diff --git a/src/server/services/wms/qgswmsrendercontext.cpp b/src/server/services/wms/qgswmsrendercontext.cpp index fd12debe2a8..38bba05a7e8 100644 --- a/src/server/services/wms/qgswmsrendercontext.cpp +++ b/src/server/services/wms/qgswmsrendercontext.cpp @@ -287,6 +287,19 @@ bool QgsWmsRenderContext::isValidLayer( const QString &nickname ) const return layer( nickname ) != nullptr; } +QList QgsWmsRenderContext::layersFromGroup( const QString &nickname ) const +{ + QList layers; + if ( mLayerGroups.contains( nickname ) ) + { + for ( QgsMapLayer *layer : mLayerGroups[nickname] ) + { + layers.append( layer ); + } + } + return layers; +} + bool QgsWmsRenderContext::isValidGroup( const QString &name ) const { return mLayerGroups.contains( name ); diff --git a/src/server/services/wms/qgswmsrendercontext.h b/src/server/services/wms/qgswmsrendercontext.h index ab14a1b784b..e1257857133 100644 --- a/src/server/services/wms/qgswmsrendercontext.h +++ b/src/server/services/wms/qgswmsrendercontext.h @@ -178,6 +178,12 @@ namespace QgsWms */ bool isValidLayer( const QString &nickname ) const; + /** + * Returns the group's layers list corresponding to the nickname, or + * an empty list if not found. + */ + QList layersFromGroup( const QString &nickname ) const; + /** * Returns true if \a name is a group. */ diff --git a/src/server/services/wms/qgswmsrenderer.cpp b/src/server/services/wms/qgswmsrenderer.cpp index b1446e6162a..a5c6c656073 100644 --- a/src/server/services/wms/qgswmsrenderer.cpp +++ b/src/server/services/wms/qgswmsrenderer.cpp @@ -611,15 +611,38 @@ namespace QgsWms QList layerSet; for ( auto layer : cMapParams.mLayers ) { - QgsMapLayer *mlayer = mContext.layer( layer.mNickname ); - - if ( ! mlayer ) + if ( mContext.isValidGroup( layer.mNickname ) ) { - continue; - } + QList layersFromGroup; - setLayerStyle( mlayer, layer.mStyle ); - layerSet << mlayer; + for ( QgsMapLayer *layer : mContext.layersFromGroup( layer.mNickname ) ) + { + + if ( ! layer ) + { + continue; + } + + layersFromGroup.push_front( layer ); + } + + if ( !layersFromGroup.isEmpty() ) + { + layerSet.append( layersFromGroup ); + } + } + else + { + QgsMapLayer *mlayer = mContext.layer( layer.mNickname ); + + if ( ! mlayer ) + { + continue; + } + + setLayerStyle( mlayer, layer.mStyle ); + layerSet << mlayer; + } } layerSet << externalLayers( cMapParams.mExternalLayers ); diff --git a/tests/src/python/test_qgsserver_wms_getprint.py b/tests/src/python/test_qgsserver_wms_getprint.py index 0c4f5d59a82..d60405d462c 100644 --- a/tests/src/python/test_qgsserver_wms_getprint.py +++ b/tests/src/python/test_qgsserver_wms_getprint.py @@ -362,6 +362,7 @@ class TestQgsServerWMSGetPrint(QgsServerTestBase): "VERSION": "1.1.1", "REQUEST": "GetPrint", "TEMPLATE": "layoutA4", + "FORMAT": "png", "map0:EXTENT": "-33626185.498,-13032965.185,33978427.737,16020257.031", "map0:LAYERS": "Country_Diagrams,Country_Labels,Country", "CRS": "EPSG:3857" @@ -375,12 +376,13 @@ class TestQgsServerWMSGetPrint(QgsServerTestBase): "VERSION": "1.1.1", "REQUEST": "GetPrint", "TEMPLATE": "layoutA4", + "FORMAT": "png", "map0:EXTENT": "-33626185.498,-13032965.185,33978427.737,16020257.031", "map0:LAYERS": "CountryGroup", "CRS": "EPSG:3857" }.items())]) - r_group, _ = self._result(self._execute_request(qs)) + r_group, h = self._result(self._execute_request(qs)) """ Debug check: f = open('grouped.png', 'wb+') @@ -393,6 +395,8 @@ class TestQgsServerWMSGetPrint(QgsServerTestBase): self.assertEqual(r_individual, r_group, 'Individual layers query and group layers query results should be identical') + self._img_diff_error(r_group, h, "WMS_GetPrint_Group") + def test_wms_getprint_legend(self): qs = "?" + "&".join(["%s=%s" % i for i in list({ "MAP": urllib.parse.quote(self.projectPath), diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Group/WMS_GetPrint_Group_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Group/WMS_GetPrint_Group_mask.png new file mode 100644 index 00000000000..d11a89c5d55 Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Group/WMS_GetPrint_Group_mask.png differ