diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bc27c3b..375bb67f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +* Add `FILTER_TYPE` to the `GETSUBSETSTRING` request with different values : `SQL` default value, `SAFESQL` or `EXPRESSION` + ## 2.7.0 - 2023-03-16 * Always provide a name with the version 'not found' when fetching the list of plugin diff --git a/lizmap_server/lizmap_service.py b/lizmap_server/lizmap_service.py index 3419f2fd..33ab1d4b 100755 --- a/lizmap_server/lizmap_service.py +++ b/lizmap_server/lizmap_service.py @@ -142,12 +142,22 @@ def polygon_filter( return try: + filter_type_param = params.get('FILTER_TYPE', '').upper() + if filter_type_param == 'SQL': + filter_type = FilterType.PlainSqlQuery + elif filter_type_param == 'SAFESQL': + filter_type = FilterType.SafeSqlQuery + elif filter_type_param == 'EXPRESSION': + filter_type = FilterType.QgisExpression + else: + filter_type = FilterType.PlainSqlQuery + edition_context = is_editing_context(self.server_iface.requestHandler()) filter_polygon_config = FilterByPolygon( cfg.get("filter_by_polygon"), layer, edition_context, - filter_type=FilterType.PlainSqlQuery, + filter_type=filter_type, ) if filter_polygon_config.is_filtered(): if not filter_polygon_config.is_valid(): diff --git a/test/test_lizmap_service.py b/test/test_lizmap_service.py index ca7ef756..84f855fd 100755 --- a/test/test_lizmap_service.py +++ b/test/test_lizmap_service.py @@ -61,7 +61,7 @@ def test_lizmap_getserversettings(client): def test_lizmap_service_filter_polygon_with_user(client): - """ Test get polygon filter with the Lizmap service with a user. """ + """ Test get polygon filter with the Lizmap service with a user as SQL or QGIS expression. """ project_file = "test_filter_layer_data_by_polygon_for_groups.qgs" qs = ( @@ -70,7 +70,8 @@ def test_lizmap_service_filter_polygon_with_user(client): "REQUEST=GETSUBSETSTRING&" "MAP=france_parts.qgs&" "LAYER=shop_bakery&" - "LIZMAP_USER_GROUPS=montferrier-sur-lez" + # "FILTER_TYPE=SQL&" SQL must be the default value when not provided + "LIZMAP_USER_GROUPS=montferrier-sur-lez&" ) rv = client.get(qs, project_file) assert rv.status_code == 200 @@ -79,10 +80,22 @@ def test_lizmap_service_filter_polygon_with_user(client): b = json.loads(rv.content.decode('utf-8')) + # SQL as output, the default format assert b['filter'] == '"id" IN ( 68 )' assert b['status'] == 'success' assert b['polygons'].startswith('SRID=3857;MultiPolygon') + # QGIS expression + qs += 'FILTER_TYPE=expression&' + rv = client.get(qs, project_file) + assert rv.status_code == 200 + assert rv.headers.get('Content-Type', '').find('application/json') == 0 + b = json.loads(rv.content.decode('utf-8')) + # geom_from_wkt is a QGIS expression subset + assert 'geom_from_wkt' in b['filter'] + assert b['status'] == 'success' + assert b['polygons'].startswith('SRID=3857;MultiPolygon') + def test_lizmap_service_filter_polygon_without_user(client): """ Test get polygon filter with the Lizmap service without a user. """