From 8ff8c2bbf501db104f00d82cc30e228182c17ff4 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 7 Apr 2020 11:37:25 +0200 Subject: [PATCH] opengis: make query_layer config parameter optional (#41414) --- passerelle/apps/opengis/models.py | 41 ++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/passerelle/apps/opengis/models.py b/passerelle/apps/opengis/models.py index 42350e8b..910e860b 100644 --- a/passerelle/apps/opengis/models.py +++ b/passerelle/apps/opengis/models.py @@ -58,7 +58,12 @@ class OpenGIS(BaseResource): category = _('Geographic information system') wms_service_url = models.URLField(_('Web Map Service (WMS) URL'), max_length=256, blank=True) wfs_service_url = models.URLField(_('Web Feature Service (WFS) URL'), max_length=256, blank=True) - query_layer = models.CharField(_('Query Layer'), max_length=256) + query_layer = models.CharField( + _('Query Layer'), + max_length=256, + help_text=_('Corresponds to a WMS layer name and/or a WFS feature type.'), + blank=True, + ) projection = models.CharField(_('GIS projection'), choices=PROJECTIONS, default='EPSG:3857', max_length=16) search_radius = models.IntegerField(_('Radius for point search'), default=5) @@ -148,7 +153,7 @@ class OpenGIS(BaseResource): 'version': self.get_wfs_service_version(), 'service': 'WFS', 'request': 'GetFeature', - self.get_typename_label(): typename, + self.get_typename_label(): typename or self.query_layer, 'propertyName': property_name, 'outputFormat': self.get_output_format(), } @@ -159,7 +164,8 @@ class OpenGIS(BaseResource): @endpoint(perm='can_access', description='Get features', parameters={ 'type_names': { - 'description': _('Type of feature to query'), + 'description': _('Type of feature to query. Defaults to globally defined ' + 'query layer'), 'example_value': 'feature' }, 'property_name': { @@ -183,7 +189,7 @@ class OpenGIS(BaseResource): 'example_value': 'true' } }) - def features(self, request, type_names, property_name, cql_filter=None, + def features(self, request, property_name, type_names=None, cql_filter=None, filter_property_name=None, q=None, **kwargs): if cql_filter: if filter_property_name and q: @@ -253,8 +259,9 @@ class OpenGIS(BaseResource): parameters={ 'lat': {'description': _('Latitude'), 'example_value': '45.79689'}, 'lon': {'description': _('Longitude'), 'example_value': '4.78414'}, + 'query_layer': {'description': _('Defaults to globally defined query layer')}, }) - def feature_info(self, request, lat, lon): + def feature_info(self, request, lat, lon, query_layer=None): try: lat, lon = float(lat), float(lon) except ValueError: @@ -269,8 +276,8 @@ class OpenGIS(BaseResource): 'i': '24', 'J': '24', # pixel in the middle of 'height': '50', 'WIDTH': '50', # a 50x50 square 'crs': self.projection, - 'layers': self.query_layer, - 'query_layers': self.query_layer, + 'layers': query_layer or self.query_layer, + 'query_layers': query_layer or self.query_layer, 'bbox': bbox, } response = self.requests.get(self.wms_service_url, params=params) @@ -284,8 +291,9 @@ class OpenGIS(BaseResource): 'zoom': {'description': _('Zoom Level'), 'example_value': '16'}, 'tile_x': {'description': _('X Coordinate'), 'example_value': '33650'}, 'tile_y': {'description': _('Y Coordinate'), 'example_value': '23378'}, + 'query_layer': {'description': _('Defaults to globally defined query layer')}, }) - def tile(self, request, zoom, tile_x, tile_y): + def tile(self, request, zoom, tile_x, tile_y, query_layer=None): zoom = int(zoom) tile_x = int(tile_x) @@ -302,7 +310,7 @@ class OpenGIS(BaseResource): 'version': '1.3.0', 'service': 'wMS', 'request': 'getMap', - 'layers': self.query_layer, + 'layers': query_layer or self.query_layer, 'styles': '', 'format': 'image/png', 'transparent': 'false', @@ -317,12 +325,21 @@ class OpenGIS(BaseResource): cache_duration=300) return HttpResponse(response.content, content_type='image/png') - @endpoint(perm='can_access', description=_('Get feature info')) - def reverse(self, request, lat, lon, **kwargs): + @endpoint(perm='can_access', description=_('Get feature info'), + parameters={ + 'lat': {'description': _('Latitude'), 'example_value': '45.79689'}, + 'lon': {'description': _('Longitude'), 'example_value': '4.78414'}, + 'type_names': { + 'description': _('Type of feature to query. Defaults to globally defined ' + 'query layer'), + 'example_value': 'feature' + }, + }) + def reverse(self, request, lat, lon, type_names=None): lon, lat = self.convert_coordinates(lon, lat) cql_filter = 'DWITHIN(the_geom,Point(%.6f %.6f),%s,meters)' % (lon, lat, self.search_radius) - params = self.build_get_features_params(typename=self.query_layer, cql_filter=cql_filter) + params = self.build_get_features_params(typename=type_names, cql_filter=cql_filter) response = self.requests.get(self.wfs_service_url, params=params) if not response.ok: raise APIError('Webservice returned status code %s' % response.status_code) -- 2.20.1