diff --git a/python/server/auto_generated/qgsserverparameters.sip.in b/python/server/auto_generated/qgsserverparameters.sip.in index abe75bfacddc..3c5cbf88cc32 100644 --- a/python/server/auto_generated/qgsserverparameters.sip.in +++ b/python/server/auto_generated/qgsserverparameters.sip.in @@ -48,11 +48,12 @@ Returns true if the parameter is valid, false otherwise. Converts the parameter into a string. %End - QStringList toStringList( char delimiter = ',' ) const; + QStringList toStringList( char delimiter = ',', bool skipEmptyParts = true ) const; %Docstring -Converts the parameter into a list of strings. +Converts the parameter into a list of strings :param delimiter: The character used for delimiting +:param skipEmptyParts: To use QString.SkipEmptyParts for splitting :return: A list of strings %End diff --git a/src/server/qgsserverparameters.cpp b/src/server/qgsserverparameters.cpp index bb0521b075a8..b49b264263ea 100644 --- a/src/server/qgsserverparameters.cpp +++ b/src/server/qgsserverparameters.cpp @@ -66,9 +66,21 @@ QString QgsServerParameterDefinition::toString() const return mValue.toString(); } -QStringList QgsServerParameterDefinition::toStringList( const char delimiter ) const +QStringList QgsServerParameterDefinition::toStringList( const char delimiter, const bool skipEmptyParts ) const { - return toString().split( delimiter, QString::SkipEmptyParts ); + if ( skipEmptyParts ) + { + return toString().split( delimiter, QString::SkipEmptyParts ); + } + else + { + QStringList list; + if ( !toString().isEmpty() ) + { + list = toString().split( delimiter, QString::KeepEmptyParts ); + } + return list; + } } QList QgsServerParameterDefinition::toGeomList( bool &ok, const char delimiter ) const diff --git a/src/server/qgsserverparameters.h b/src/server/qgsserverparameters.h index 1704660cbfb8..99510c1d8586 100644 --- a/src/server/qgsserverparameters.h +++ b/src/server/qgsserverparameters.h @@ -65,11 +65,12 @@ class SERVER_EXPORT QgsServerParameterDefinition QString toString() const; /** - * Converts the parameter into a list of strings. + * Converts the parameter into a list of strings * \param delimiter The character used for delimiting + * \param skipEmptyParts To use QString::SkipEmptyParts for splitting * \returns A list of strings */ - QStringList toStringList( char delimiter = ',' ) const; + QStringList toStringList( char delimiter = ',', bool skipEmptyParts = true ) const; /** * Converts the parameter into a list of integers. diff --git a/src/server/services/wms/qgswmsparameters.cpp b/src/server/services/wms/qgswmsparameters.cpp index b44ea0327a1e..f866300a142d 100644 --- a/src/server/services/wms/qgswmsparameters.cpp +++ b/src/server/services/wms/qgswmsparameters.cpp @@ -45,6 +45,11 @@ namespace QgsWms QgsServerParameterDefinition::raiseError( msg ); } + QStringList QgsWmsParameter::toStyleList( const char delimiter ) const + { + return QgsServerParameterDefinition::toStringList( delimiter, false ); + } + QList QgsWmsParameter::toGeomList( const char delimiter ) const { bool ok = true; @@ -1287,8 +1292,8 @@ namespace QgsWms QStringList QgsWmsParameters::allStyles() const { - QStringList style = mWmsParameters[ QgsWmsParameter::STYLE ].toStringList(); - const QStringList styles = mWmsParameters[ QgsWmsParameter::STYLES ].toStringList(); + QStringList style = mWmsParameters[ QgsWmsParameter::STYLE ].toStyleList(); + const QStringList styles = mWmsParameters[ QgsWmsParameter::STYLES ].toStyleList(); return style << styles; } @@ -1550,7 +1555,7 @@ namespace QgsWms wmsParam = idParameter( QgsWmsParameter::STYLES, mapId ); if ( wmsParam.isValid() ) { - styles = wmsParam.toStringList(); + styles = wmsParam.toStyleList(); } QList lParams; diff --git a/src/server/services/wms/qgswmsparameters.h b/src/server/services/wms/qgswmsparameters.h index 657542350f49..1ea00ff78a90 100644 --- a/src/server/services/wms/qgswmsparameters.h +++ b/src/server/services/wms/qgswmsparameters.h @@ -192,6 +192,15 @@ namespace QgsWms */ bool isValid() const override; + /** + * Converts the parameter into a list of strings and keeps empty parts + * Default style value is an empty string + * \param delimiter The character used for delimiting + * \returns A list of strings + * \since QGIS 3.8 + */ + QStringList toStyleList( const char delimiter = ',' ) const; + /** * Converts the parameter into a list of geometries. * \param delimiter The character delimiting string geometries diff --git a/tests/src/python/test_qgsserver_wms_getmap.py b/tests/src/python/test_qgsserver_wms_getmap.py index 66ac433d9859..2f0c09ec53d1 100644 --- a/tests/src/python/test_qgsserver_wms_getmap.py +++ b/tests/src/python/test_qgsserver_wms_getmap.py @@ -723,6 +723,58 @@ def test_wms_getmap_style(self): r, h = self._result(self._execute_request(qs)) self._img_diff_error(r, h, "WMS_GetMap_StyleCustom") + # mixed custom and default style with STYLES parameter + qs = "?" + "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetMap", + "LAYERS": "Country_Labels,Hello", + "STYLES": "custom,", + "FORMAT": "image/png", + "BBOX": "-16817707,-4710778,5696513,14587125", + "HEIGHT": "500", + "WIDTH": "500", + "CRS": "EPSG:3857" + }.items())]) + + r, h = self._result(self._execute_request(qs)) + self._img_diff_error(r, h, "WMS_GetMap_StyleMixed") + + qs = "?" + "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetMap", + "LAYERS": "Hello,Country_Labels", + "STYLES": "default,custom", + "FORMAT": "image/png", + "BBOX": "-16817707,-4710778,5696513,14587125", + "HEIGHT": "500", + "WIDTH": "500", + "CRS": "EPSG:3857" + }.items())]) + + r, h = self._result(self._execute_request(qs)) + self._img_diff_error(r, h, "WMS_GetMap_StyleMixed_LayerOrder") + + qs = "?" + "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetMap", + "LAYERS": "Hello,Country_Labels", + "STYLES": ",custom", + "FORMAT": "image/png", + "BBOX": "-16817707,-4710778,5696513,14587125", + "HEIGHT": "500", + "WIDTH": "500", + "CRS": "EPSG:3857" + }.items())]) + + r, h = self._result(self._execute_request(qs)) + self._img_diff_error(r, h, "WMS_GetMap_StyleMixed_LayerOrder") + def test_wms_getmap_filter(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_GetMap_StyleMixed/WMS_GetMap_StyleMixed.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed/WMS_GetMap_StyleMixed.png new file mode 100644 index 000000000000..85753c154884 Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed/WMS_GetMap_StyleMixed.png differ diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed/WMS_GetMap_StyleMixed_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed/WMS_GetMap_StyleMixed_mask.png new file mode 100644 index 000000000000..1379e8e2a2e1 Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed/WMS_GetMap_StyleMixed_mask.png differ diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed_LayerOrder/WMS_GetMap_StyleMixed_LayerOrder.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed_LayerOrder/WMS_GetMap_StyleMixed_LayerOrder.png new file mode 100644 index 000000000000..07212b70ab7a Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed_LayerOrder/WMS_GetMap_StyleMixed_LayerOrder.png differ diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed_LayerOrder/WMS_GetMap_StyleMixed_LayerOrder_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed_LayerOrder/WMS_GetMap_StyleMixed_LayerOrder_mask.png new file mode 100644 index 000000000000..fe91234036d7 Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleMixed_LayerOrder/WMS_GetMap_StyleMixed_LayerOrder_mask.png differ