Skip to content

Commit 9f576b6

Browse files
authoredFeb 25, 2019
Merge pull request #9204 from troopa81/wms_filters
Add possbility to define one filter for several layers
2 parents 2f305c5 + 9aa0023 commit 9f576b6

File tree

4 files changed

+49
-5
lines changed

4 files changed

+49
-5
lines changed
 

‎src/server/services/wms/qgswmsparameters.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,15 +1332,19 @@ namespace QgsWms
13321332
}
13331333
else if ( !f.isEmpty() )
13341334
{
1335-
// filter format: "LayerName:filterString;LayerName2:filterString2;..."
1335+
// filter format: "LayerName,LayerName2:filterString;LayerName3:filterString2;..."
13361336
// several filters can be defined for one layer
13371337
const QStringList splits = f.split( ':' );
13381338
if ( splits.size() == 2 )
13391339
{
1340-
QgsWmsParametersFilter filter;
1341-
filter.mFilter = splits[1];
1342-
filter.mType = QgsWmsParametersFilter::SQL;
1343-
filters.insert( splits[0], filter );
1340+
const QStringList layers = splits[0].split( ',' );
1341+
for ( const QString &layer : layers )
1342+
{
1343+
QgsWmsParametersFilter filter;
1344+
filter.mFilter = splits[1];
1345+
filter.mType = QgsWmsParametersFilter::SQL;
1346+
filters.insert( layer, filter );
1347+
}
13441348
}
13451349
else
13461350
{

‎tests/src/python/test_qgsserver_wms_getmap.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,46 @@ def test_wms_getmap_filter(self):
798798
r, h = self._result(self._execute_request(qs))
799799
self._img_diff_error(r, h, "WMS_GetMap_Filter4")
800800

801+
# display multiple features filtered from multiple layers with same filter for some
802+
qs = "?" + "&".join(["%s=%s" % i for i in list({
803+
"MAP": urllib.parse.quote(self.projectPath),
804+
"SERVICE": "WMS",
805+
"VERSION": "1.1.1",
806+
"REQUEST": "GetMap",
807+
"LAYERS": "Country,Country_Diagrams,Hello",
808+
"STYLES": "",
809+
"FORMAT": "image/png",
810+
"BBOX": "1017529,-4226661,11271098,17063190",
811+
"HEIGHT": "500",
812+
"WIDTH": "500",
813+
"CRS": "EPSG:3857",
814+
"FILTER": "Country,Country_Diagrams: \"name\" IN ( 'africa' , 'eurasia' );Hello: \"color\" IN ( 'magenta' , 'cerese' )"
815+
}.items())])
816+
817+
r, h = self._result(self._execute_request(qs))
818+
self._img_diff_error(r, h, "WMS_GetMap_Filter5")
819+
820+
# Error in filter (missing quote after africa) with multiple layer filter
821+
qs = "?" + "&".join(["%s=%s" % i for i in list({
822+
"MAP": urllib.parse.quote(self.projectPath),
823+
"SERVICE": "WMS",
824+
"VERSION": "1.1.1",
825+
"REQUEST": "GetMap",
826+
"LAYERS": "Country,Country_Diagrams,Hello",
827+
"STYLES": "",
828+
"FORMAT": "image/png",
829+
"BBOX": "1017529,-4226661,11271098,17063190",
830+
"HEIGHT": "500",
831+
"WIDTH": "500",
832+
"CRS": "EPSG:3857",
833+
"FILTER": "Country,Country_Diagrams: \"name\" IN ( 'africa , 'eurasia' );Hello: \"color\" IN ( 'magenta' , 'cerese' )"
834+
}.items())])
835+
836+
expected = self.strip_version_xmlns(b'<ServiceExceptionReport >\n <ServiceException code="Filter string rejected">The filter string "name" IN ( \'africa , \'eurasia\' ) has been rejected because of security reasons. Note: Text strings have to be enclosed in single or double quotes. A space between each word / special character is mandatory. Allowed Keywords and special characters are AND,OR,IN,&lt;,>=,>,>=,!=,\',\',(,),DMETAPHONE,SOUNDEX. Not allowed are semicolons in the filter expression.</ServiceException>\n</ServiceExceptionReport>\n')
837+
r, h = self._result(self._execute_request(qs))
838+
839+
self.assertEqual(self.strip_version_xmlns(r), expected)
840+
801841
def test_wms_getmap_filter_ogc(self):
802842
filter = "<Filter><PropertyIsEqualTo><PropertyName>name</PropertyName>" + \
803843
"<Literal>eurasia</Literal></PropertyIsEqualTo></Filter>"
Loading
Loading

0 commit comments

Comments
 (0)
Please sign in to comment.