Skip to content

Commit

Permalink
[Fixes #3954] [GeoServer 2.14.x Upgrade] Layer Capabilities 1.3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
afabiani committed Oct 3, 2018
1 parent 9f5c263 commit 9316137
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 20 deletions.
26 changes: 14 additions & 12 deletions geonode/geoserver/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -722,14 +722,13 @@ def layer_acls(request):


# capabilities
def get_layer_capabilities(layer, version='1.1.0', access_token=None, tolerant=False):
def get_layer_capabilities(layer, version='1.3.0', access_token=None, tolerant=False):
"""
Retrieve a layer-specific GetCapabilities document
"""
workspace, layername = layer.alternate.split(":") if ":" in layer.alternate else (None, layer.alternate)
if not layer.remote_service:
# TODO implement this for 1.3.0 too
wms_url = '%s%s/%s/ows?service=wms&version=%s&request=GetCapabilities'\
wms_url = '%s%s/%s/wms?service=wms&version=%s&request=GetCapabilities'\
% (ogc_server_settings.LOCATION, workspace, layername, version)
if access_token:
wms_url += ('&access_token=%s' % access_token)
Expand All @@ -739,7 +738,6 @@ def get_layer_capabilities(layer, version='1.1.0', access_token=None, tolerant=F

http = httplib2.Http()
response, getcap = http.request(wms_url)
# TODO this is to bypass an actual bug of GeoServer 2.12.x
if tolerant and ('ServiceException' in getcap or response.status == 404):
# WARNING Please make sure to have enabled DJANGO CACHE as per
# https://docs.djangoproject.com/en/2.0/topics/cache/#filesystem-caching
Expand All @@ -754,18 +752,19 @@ def get_layer_capabilities(layer, version='1.1.0', access_token=None, tolerant=F
return getcap


def format_online_resource(workspace, layer, element):
def format_online_resource(workspace, layer, element, namespaces):
"""
Replace workspace/layer-specific OnlineResource links with the more
generic links returned by a site-wide GetCapabilities document
"""
layerName = element.find('.//Name')
if not layerName:
layerName = element.find('.//wms:Capability/wms:Layer/wms:Layer/wms:Name',
namespaces)
if layerName is None:
return

layerName.text = workspace + ":" + layer if workspace else layer
layerresources = element.findall('.//OnlineResource')
if not layerresources:
layerresources = element.findall('.//wms:OnlineResource', namespaces)
if layerresources is None:
return

for resource in layerresources:
Expand Down Expand Up @@ -820,13 +819,16 @@ def get_capabilities(request, layerid=None, user=None,
tolerant=tolerant)
if layercap: # 1st one, seed with real GetCapabilities doc
try:
namespaces = {'wms': 'http://www.opengis.net/wms',
'xlink': 'http://www.w3.org/1999/xlink',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}
layercap = etree.fromstring(layercap)
rootdoc = etree.ElementTree(layercap)
format_online_resource(workspace, layername, rootdoc)
service_name = rootdoc.find('.//Service/Name')
format_online_resource(workspace, layername, rootdoc, namespaces)
service_name = rootdoc.find('.//wms:Service/wms:Name', namespaces)
if service_name:
service_name.text = cap_name
rootdoc = rootdoc.find('.//Capability/Layer/Layer')
rootdoc = rootdoc.find('.//wms:Capability/wms:Layer/wms:Layer', namespaces)
except Exception as e:
import traceback
traceback.print_exc()
Expand Down
21 changes: 13 additions & 8 deletions geonode/tests/integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -1470,33 +1470,38 @@ def test_capabilities(self):
overwrite=True,
)
try:
namespaces = {'wms': 'http://www.opengis.net/wms',
'xlink': 'http://www.w3.org/1999/xlink',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}

# 0. test capabilities_layer
url = reverse('capabilities_layer', args=[layer1.id])
resp = self.client.get(url)
layercap = etree.fromstring(resp.content)
rootdoc = etree.ElementTree(layercap)
layernodes = rootdoc.findall('./[Name]')
layernodes = rootdoc.findall('./[wms:Name]', namespaces)
layernode = layernodes[0]

self.assertEquals(1, len(layernodes))
self.assertEquals(layernode.find('Name').text, layer1.name)
self.assertEquals(layernode.find('wms:Name', namespaces).text,
'%s:%s' % ('geonode', layer1.name))

# 1. test capabilities_user
url = reverse('capabilities_user', args=[norman.username])
resp = self.client.get(url)
layercap = etree.fromstring(resp.content)
rootdoc = etree.ElementTree(layercap)
layernodes = rootdoc.findall('./[Name]')
layernodes = rootdoc.findall('./[wms:Name]', namespaces)

# norman has 2 layers
self.assertEquals(1, len(layernodes))

# the norman two layers are named layer1 and layer2
count = 0
for layernode in layernodes:
if layernode.find('Name').text == layer1.name:
if layernode.find('wms:Name', namespaces).text == '%s:%s' % ('geonode', layer1.name):
count += 1
elif layernode.find('Name').text == layer2.name:
elif layernode.find('wms:Name', namespaces).text == '%s:%s' % ('geonode', layer2.name):
count += 1
self.assertEquals(1, count)

Expand All @@ -1505,17 +1510,17 @@ def test_capabilities(self):
resp = self.client.get(url)
layercap = etree.fromstring(resp.content)
rootdoc = etree.ElementTree(layercap)
layernodes = rootdoc.findall('./[Name]')
layernodes = rootdoc.findall('./[wms:Name]', namespaces)

# category is in two layers
self.assertEquals(1, len(layernodes))

# the layers for category are named layer1 and layer3
count = 0
for layernode in layernodes:
if layernode.find('Name').text == layer1.name:
if layernode.find('wms:Name', namespaces).text == '%s:%s' % ('geonode', layer1.name):
count += 1
elif layernode.find('Name').text == layer3.name:
elif layernode.find('wms:Name', namespaces).text == '%s:%s' % ('geonode', layer3.name):
count += 1
self.assertEquals(1, count)

Expand Down
25 changes: 25 additions & 0 deletions geonode/tests/smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import os
import math
from django.conf import settings
from django.test import override_settings
from django.core.urlresolvers import reverse
from django.contrib.auth import get_user_model
Expand Down Expand Up @@ -49,6 +50,30 @@ def setUp(self):
def tearDown(self):
pass

# Contrib Apps #

def test_default_contrib_apps_loaded(self):
if 'geonode.contrib.metadataxsl' in settings.INSTALLED_APPS:
try:
import geonode.contrib.metadataxsl # noqa
self.assertTrue(True)
except BaseException:
self.assertTrue(False)

if 'geonode.contrib.api_basemaps' in settings.INSTALLED_APPS:
try:
import geonode.contrib.api_basemaps # noqa
self.assertTrue(True)
except BaseException:
self.assertTrue(False)

if 'geonode.contrib.ows_api' in settings.INSTALLED_APPS:
try:
import geonode.contrib.ows_api # noqa
self.assertTrue(True)
except BaseException:
self.assertTrue(False)

# Basic Pages #

def test_home_page(self):
Expand Down

0 comments on commit 9316137

Please sign in to comment.