Skip to content

Commit cc31088

Browse files
author
Alessio Fabiani
authored
[Fixes GeoNode#7603] RemoteServices legend urls do not contain 'sld_service' param (GeoNode#7604)
* [Fixes GeoNode#7603] RemoteServices legend urls do not contain 'sld_service' param * - Test fix
1 parent 4715cc5 commit cc31088

File tree

3 files changed

+70
-50
lines changed

3 files changed

+70
-50
lines changed

geonode/services/serviceprocessors/wms.py

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,15 @@
4141
from django.template.defaultfilters import slugify
4242
from django.utils.translation import ugettext as _
4343

44-
from geonode.base.models import Link, TopicCategory
44+
from geonode.base.models import (
45+
Link,
46+
ResourceBase,
47+
TopicCategory)
4548
from geonode.layers.models import Layer
4649
from geonode.layers.utils import resolve_regions
4750
from geonode.thumbs.thumbnails import create_thumbnail
4851
from geonode.geoserver.helpers import set_attributes_from_geoserver
49-
from geonode.utils import http_client
52+
from geonode.utils import http_client, get_legend_url
5053
from geonode.base.bbox_utils import BBOXHelper
5154

5255
from owslib.map import wms111, wms130
@@ -322,34 +325,32 @@ def _create_layer_legend_link(self, geonode_layer):
322325
creating the legend by making a request directly to the original
323326
service.
324327
"""
328+
cleaned_url, service, version, request = WmsServiceHandler.get_cleaned_url_params(self.url)
325329
_p_url = urlparse(self.url)
326-
_q_separator = "&" if _p_url.query else "?"
327-
params = {
328-
"service": "WMS",
329-
"version": self.parsed_service.version,
330-
"request": "GetLegendGraphic",
331-
"format": "image/png",
332-
"width": 20,
333-
"height": 20,
334-
"layer": geonode_layer.name,
335-
"legend_options": (
336-
"fontAntiAliasing:true;fontSize:12;forceLabels:on")
337-
}
338-
kvp = "&".join("{}={}".format(*item) for item in params.items())
339-
legend_url = f"{geonode_layer.remote_service.service_url}{_q_separator}{kvp}"
340-
logger.debug(f"legend_url: {legend_url}")
341-
Link.objects.get_or_create(
342-
resource=geonode_layer.resourcebase_ptr,
343-
url=legend_url,
344-
name='Legend',
345-
defaults={
346-
"extension": 'png',
347-
"name": 'Legend',
348-
"url": legend_url,
349-
"mime": 'image/png',
350-
"link_type": 'image',
351-
}
330+
legend_url = get_legend_url(
331+
geonode_layer, "",
332+
service_url=f"{_p_url.scheme}://{_p_url.netloc}{_p_url.path}",
333+
layer_name=geonode_layer.name,
334+
version=version,
335+
params=_p_url.query
352336
)
337+
logger.debug(f"legend_url: {legend_url}")
338+
try:
339+
Link.objects.get_or_create(
340+
resource=geonode_layer.resourcebase_ptr,
341+
url=legend_url,
342+
name='Legend',
343+
defaults={
344+
"extension": 'png',
345+
"name": 'Legend',
346+
"url": legend_url,
347+
"mime": 'image/png',
348+
"link_type": 'image',
349+
}
350+
)
351+
except ResourceBase.DoesNotExist as e:
352+
logger.exception(e)
353+
return legend_url
353354

354355
def _create_layer_service_link(self, geonode_layer):
355356
ogc_wms_url = geonode_layer.ows_url

geonode/services/tests.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,8 @@ def test_get_resources(self, mock_wms):
681681
Layer.objects.filter(remote_service=geonode_service).delete()
682682
self.assertEqual(HarvestJob.objects.filter(service=geonode_service,
683683
resource_id=geonode_layer.alternate).count(), 0)
684+
legend_url = handler._create_layer_legend_link(geonode_layer)
685+
self.assertTrue('sld_version=1.1.0' in str(legend_url))
684686
except Service.DoesNotExist as e:
685687
# In the case the Service URL becomes inaccessible for some reason
686688
logger.error(e)

geonode/utils.py

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,14 +1615,24 @@ def slugify_zh(text, separator='_'):
16151615
return text
16161616

16171617

1618-
def get_legend_url(instance, style_name):
1618+
def get_legend_url(
1619+
instance, style_name, /,
1620+
service_url=None,
1621+
layer_name=None,
1622+
version='1.3.0',
1623+
sld_version='1.1.0',
1624+
width=20,
1625+
height=20,
1626+
params=None):
16191627
from geonode.geoserver.helpers import ogc_server_settings
16201628

1621-
return(f"{ogc_server_settings.PUBLIC_LOCATION}ows?"
1622-
"service=WMS&request=GetLegendGraphic&format=image/png&WIDTH=20&HEIGHT=20&"
1623-
f"LAYER={instance.alternate}&STYLE={style_name}&version=1.3.0&"
1624-
"sld_version=1.1.0&legend_options=fontAntiAliasing:true;fontSize:12;forceLabels:on"
1625-
)
1629+
_service_url = service_url or f"{ogc_server_settings.PUBLIC_LOCATION}ows"
1630+
_layer_name = layer_name or instance.alternate
1631+
_params = f"&{params}" if params else ""
1632+
return(f"{_service_url}?"
1633+
f"service=WMS&request=GetLegendGraphic&format=image/png&WIDTH={width}&HEIGHT={height}&"
1634+
f"LAYER={_layer_name}&STYLE={style_name}&version={version}&"
1635+
f"sld_version={sld_version}&legend_options=fontAntiAliasing:true;fontSize:12;forceLabels:on{_params}")
16261636

16271637

16281638
def set_resource_default_links(instance, layer, prune=False, **kwargs):
@@ -1847,24 +1857,31 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
18471857
# Legend link
18481858
logger.debug(" -- Resource Links[Legend link]...")
18491859
try:
1850-
for style in set(list(instance.styles.all()) + [instance.default_style, ]):
1851-
if style:
1852-
style_name = os.path.basename(
1853-
urlparse(style.sld_url).path).split('.')[0]
1854-
legend_url = get_legend_url(instance, style_name)
1855-
1856-
if Link.objects.filter(resource=instance.resourcebase_ptr, url=legend_url).count() < 2:
1857-
Link.objects.update_or_create(
1858-
resource=instance.resourcebase_ptr,
1859-
name='Legend',
1860-
url=legend_url,
1861-
defaults=dict(
1862-
extension='png',
1860+
if instance.storeType != 'remoteStore':
1861+
for style in set(list(instance.styles.all()) + [instance.default_style, ]):
1862+
if style:
1863+
style_name = os.path.basename(
1864+
urlparse(style.sld_url).path).split('.')[0]
1865+
legend_url = get_legend_url(instance, style_name)
1866+
if Link.objects.filter(resource=instance.resourcebase_ptr, url=legend_url).count() < 2:
1867+
Link.objects.update_or_create(
1868+
resource=instance.resourcebase_ptr,
1869+
name='Legend',
18631870
url=legend_url,
1864-
mime='image/png',
1865-
link_type='image',
1871+
defaults=dict(
1872+
extension='png',
1873+
url=legend_url,
1874+
mime='image/png',
1875+
link_type='image',
1876+
)
18661877
)
1867-
)
1878+
else:
1879+
from geonode.services.serviceprocessors.handler import get_service_handler
1880+
handler = get_service_handler(
1881+
instance.remote_service.base_url, service_type=instance.remote_service.type)
1882+
if hasattr(handler, '_create_layer_legend_link'):
1883+
handler._create_layer_legend_link(instance)
1884+
18681885
logger.debug(" -- Resource Links[Legend link]...done!")
18691886
except Exception as e:
18701887
logger.debug(f" -- Resource Links[Legend link]...error: {e}")

0 commit comments

Comments
 (0)