Skip to content

Commit

Permalink
- Correct management of SLDs / Add GWC filterParameter to SLDs
Browse files Browse the repository at this point in the history
  • Loading branch information
afabiani committed May 15, 2018
1 parent 4c10a85 commit 7b32bb1
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 46 deletions.
65 changes: 53 additions & 12 deletions geonode/geoserver/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,6 @@ def fixup_style(cat, resource, style):
lyr.default_style = style
logger.info("Saving changes to %s", lyr)
cat.save(lyr)

# Invalidate GeoWebCache for the updated resource
_invalidate_geowebcache_layer(resource)

logger.info("Successfully updated %s", lyr)


Expand Down Expand Up @@ -363,9 +359,6 @@ def set_layer_style(saved_layer, title, sld, base_file=None):
except Exception as e:
logger.exception(e)

# Invalidate GeoWebCache for the updated resource
_invalidate_geowebcache_layer(saved_layer.alternate)


def cascading_delete(cat, layer_name):
resource = None
Expand Down Expand Up @@ -924,22 +917,27 @@ def set_styles(layer, gs_catalog):

if not default_style:
try:
default_style = gs_catalog.get_style(layer.name, workspace=settings.DEFAULT_WORKSPACE) \
default_style = gs_catalog.get_style(layer.name, workspace=layer.workspace) \
or gs_catalog.get_style(layer.name)
gs_layer.default_style = default_style
gs_catalog.save(gs_layer)
except:
logger.exception("GeoServer Layer Default Style issues!")

if default_style:
layer.default_style = save_style(default_style)
# make sure we are not using a defaul SLD (which won't be editable)
if not default_style.workspace or default_style.workspace != layer.workspace:
sld_body = default_style.sld_body
gs_catalog.create_style(layer.name, sld_body, raw=True, workspace=layer.workspace)
style = gs_catalog.get_style(layer.name, workspace=layer.workspace)
else:
style = default_style
layer.default_style = save_style(style)
# FIXME: This should remove styles that are no longer valid
style_set.append(layer.default_style)

try:
if gs_layer.styles:
alt_styles = gs_layer.styles

for alt_style in alt_styles:
if alt_style:
style_set.append(save_style(alt_style))
Expand All @@ -955,7 +953,6 @@ def set_styles(layer, gs_catalog):

Layer.objects.filter(id=layer.id).update(**to_update)
layer.refresh_from_db()
return layer


def save_style(gs_style):
Expand Down Expand Up @@ -1472,6 +1469,49 @@ def wps_execute_layer_attribute_statistics(layer_name, field):
# exml = etree.fromstring(response)


def _stylefilterparams_geowebcache_layer(layer_name):
http = httplib2.Http()
username, password = ogc_server_settings.credentials
auth = base64.encodestring(username + ':' + password)
# http.add_credentials(username, password)
headers = {
"Content-Type": "text/xml",
"Authorization": "Basic " + auth
}
url = '%sgwc/rest/layers/%s.xml' % (ogc_server_settings.LOCATION, layer_name)

# read GWC configuration
method = "GET"
response, _ = http.request(url, method, headers=headers)
if response.status != 200:
line = "Error {0} reading Style Filter Params GeoWebCache at {1}".format(
response.status, url
)
logger.error(line)
return

# check/write GWC filter parameters
import xml.etree.ElementTree as ET
body = None
tree = ET.fromstring(_)
param_filters = tree.findall('parameterFilters')
if param_filters and len(param_filters) > 0:
if not param_filters[0].findall('styleParameterFilter'):
style_filters_xml = "<styleParameterFilter><key>STYLES</key>\
<defaultValue></defaultValue></styleParameterFilter>"
style_filters_elem = ET.fromstring(style_filters_xml)
param_filters[0].append(style_filters_elem)
body = ET.tostring(tree)
if body:
method = "POST"
response, _ = http.request(url, method, body=body, headers=headers)
if response.status != 200:
line = "Error {0} writing Style Filter Params GeoWebCache at {1}".format(
response.status, url
)
logger.error(line)


def _invalidate_geowebcache_layer(layer_name, url=None):
http = httplib2.Http()
username, password = ogc_server_settings.credentials
Expand Down Expand Up @@ -1549,6 +1589,7 @@ def style_update(request, url):

# Invalidate GeoWebCache so it doesn't retain old style in tiles
try:
_stylefilterparams_geowebcache_layer(layer_name)
_invalidate_geowebcache_layer(layer_name)
except:
pass
Expand Down
70 changes: 41 additions & 29 deletions geonode/geoserver/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,17 @@
from geonode import GeoNodeException
from geonode.decorators import on_ogc_backend
from geonode.geoserver.ows import wcs_links, wfs_links, wms_links
from geonode.geoserver.helpers import cascading_delete, set_attributes_from_geoserver
from geonode.geoserver.helpers import set_styles, gs_catalog
from geonode.geoserver.helpers import ogc_server_settings
from geonode.geoserver.helpers import create_gs_thumbnail
from geonode.geoserver.upload import geoserver_upload
from geonode.base.models import ResourceBase
from geonode.base.models import Link
from geonode.geoserver.helpers import (cascading_delete,
set_attributes_from_geoserver,
set_styles,
set_layer_style,
gs_catalog,
ogc_server_settings,
create_gs_thumbnail,
_stylefilterparams_geowebcache_layer,
_invalidate_geowebcache_layer)
from geonode.base.models import ResourceBase, Link
from geonode.people.models import Profile
from geonode.layers.models import Layer
from geonode.social.signals import json_serializer_producer
Expand Down Expand Up @@ -172,30 +176,26 @@ def geoserver_post_save_local(instance, *args, **kwargs):
e.args = (msg,)
logger.exception(e)

gs_layer = gs_catalog.get_layer(instance.name)

if not gs_layer:
gs_layer = gs_catalog.get_layer(instance.alternate)

if gs_layer and instance.poc:
# Update Attribution link
if instance.poc:
# gsconfig now utilizes an attribution dictionary
gs_layer.attribution = {'title': str(instance.poc),
'width': None,
'height': None,
'href': None,
'url': None,
'type': None}
gs_resource.attribution = {'title': str(instance.poc),
'width': None,
'height': None,
'href': None,
'url': None,
'type': None}
profile = Profile.objects.get(username=instance.poc.username)
gs_layer.attribution_link = settings.SITEURL[
gs_resource.attribution_link = settings.SITEURL[
:-1] + profile.get_absolute_url()
# gs_layer should only be called if
# gs_resource should only be called if
# ogc_server_settings.BACKEND_WRITE_ENABLED == True
if getattr(ogc_server_settings, "BACKEND_WRITE_ENABLED", True):
try:
gs_catalog.save(gs_layer)
gs_catalog.save(gs_resource)
except geoserver.catalog.FailedRequestError as e:
msg = ('Error while trying to save layer named %s in GeoServer, '
'try to use: "%s"' % (gs_layer, str(e)))
'try to use: "%s"' % (gs_resource, str(e)))
e.args = (msg,)
logger.exception(e)

Expand All @@ -205,6 +205,24 @@ def geoserver_post_save_local(instance, *args, **kwargs):
else:
return

# Save layer attributes
set_attributes_from_geoserver(instance)

# Save layer styles
set_styles(instance, gs_catalog)

# set SLD
sld = instance.default_style.sld_body
if sld:
set_layer_style(instance, instance.alternate, sld)

# Invalidate GeoWebCache for the updated resource
try:
_stylefilterparams_geowebcache_layer(instance.alternate)
_invalidate_geowebcache_layer(instance.alternate)
except:
pass

if instance.storeType == "remoteStore":
# Save layer attributes
set_attributes_from_geoserver(instance)
Expand All @@ -219,7 +237,7 @@ def geoserver_post_save_local(instance, *args, **kwargs):
* Download links (WMS, WCS or WFS and KML)
* Styles (SLD)
"""
# instance.name = instance.name or gs_layer.name
# instance.name = instance.name or gs_resource.name
# instance.title = instance.title or gs_resource.title
instance.abstract = gs_resource.abstract or ''
instance.workspace = gs_resource.store.workspace.name
Expand Down Expand Up @@ -564,12 +582,6 @@ def command_url(command):
if created:
Link.objects.filter(pk=link.pk).update(url=tile_url)

# Save layer attributes
set_attributes_from_geoserver(instance)

# Save layer styles
set_styles(instance, gs_catalog)

# NOTTODO by simod: we should not do this!
# need to be removed when fixing #2015
catalogue_post_save(instance, Layer)
Expand Down
2 changes: 1 addition & 1 deletion geonode/geoserver/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ def layer_style_manage(request, layername):
cat.save(gs_layer)

# Save to Django
layer = set_styles(layer, cat)
set_styles(layer, cat)

# Invalidate GeoWebCache for the updated resource
_invalidate_geowebcache_layer(layer.alternate)
Expand Down
6 changes: 3 additions & 3 deletions geonode/layers/templates/layers/layer_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -624,12 +624,12 @@ <h4>{% trans "Styles" %}</h4>
{% for style in resource.styles.all %}
<li>
{% if resource.default_style == style %}
<input type="radio" checked name="style" id="{{ style.name }}" value="{{ style.title }}"/>
<input type="radio" checked name="style" id="{{ style.name }}" value="{{ style.sld_title|default_if_none:style.name }}"/>
(default style)
{% else %}
<input type="radio" name="style" id="{{ style.name }}" value="{{ style.title }}"/>
<input type="radio" name="style" id="{{ style.name }}" value="{{ style.sld_title|default_if_none:style.name }}"/>
{% endif %}
<a href="{{ GEOSERVER_BASE_URL }}{{ style.absolute_url }}" >{{ style.sld_title }}</a>
<a href="{{ GEOSERVER_BASE_URL }}{{ style.absolute_url }}" >{{ style.sld_title|default_if_none:style.name }}</a>
</li>
{% empty %}
<li>{% trans "No styles associated with this layer" %}</li>
Expand Down
3 changes: 2 additions & 1 deletion geonode/layers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -737,10 +737,11 @@ def load_layer_data(request, template='layers/layer_detail.html'):

# loop the dictionary based on the values on the list and add the properties
# in the dictionary (if doesn't exist) together with the value
from collections import Iterable
for i in range(len(decoded_features)):
for key, value in decoded_features[i]['properties'].iteritems():
if value != '' and isinstance(value, (string_types, int, float)) and (
'/load_layer_data' not in value):
(isinstance(value, Iterable) and '/load_layer_data' not in value) or value):
properties[key].append(value)

for key in properties:
Expand Down

0 comments on commit 7b32bb1

Please sign in to comment.