Skip to content

Commit

Permalink
[Fixes #4418] General SLD management misbehavior
Browse files Browse the repository at this point in the history
  • Loading branch information
afabiani committed May 20, 2019
1 parent efdf156 commit d87e505
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 85 deletions.
67 changes: 44 additions & 23 deletions geonode/geoserver/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,30 +337,27 @@ def set_layer_style(saved_layer, title, sld, base_file=None):
if match is None:
try:
cat.create_style(
saved_layer.name, sld, overwrite=False, raw=True, workspace=settings.DEFAULT_WORKSPACE)
saved_layer.name, sld, overwrite=False, raw=True, workspace=saved_layer.workspace)
style = cat.get_style(saved_layer.name, workspace=saved_layer.workspace) or \
cat.get_style(saved_layer.name)
except Exception as e:
logger.exception(e)
style = cat.get_style(saved_layer.name, workspace=settings.DEFAULT_WORKSPACE) or \
cat.get_style(saved_layer.name)
if layer and style:
layer.default_style = style
cat.save(layer)
saved_layer.default_style = save_style(style)
set_geowebcache_invalidate_cache(saved_layer.alternate)
else:
style = cat.get_style(saved_layer.name, workspace=settings.DEFAULT_WORKSPACE) or \
style = cat.get_style(saved_layer.name, workspace=saved_layer.workspace) or \
cat.get_style(saved_layer.name)
# style.update_body(sld)
try:
cat.create_style(saved_layer.name, sld, overwrite=True, raw=True,
workspace=settings.DEFAULT_WORKSPACE)
style = cat.get_style(saved_layer.name, workspace=settings.DEFAULT_WORKSPACE) or \
cat.get_style(saved_layer.name)
if layer and style:
layer.default_style = style
cat.save(layer)
saved_layer.default_style = save_style(style)
set_geowebcache_invalidate_cache(saved_layer.alternate)
workspace=saved_layer.workspace)
style = cat.get_style(saved_layer.name, workspace=saved_layer.workspace)
except Exception as e:
logger.exception(e)

if layer and style:
try:
layer.default_style = style
cat.save(layer)
set_styles(saved_layer, cat)
except Exception as e:
logger.exception(e)

Expand Down Expand Up @@ -1024,7 +1021,7 @@ def set_styles(layer, gs_catalog):
logger.exception("GeoServer Layer Default Style issues!")

if default_style:
# make sure we are not using a defaul SLD (which won't be editable)
# make sure we are not using a default SLD (which won't be editable)
if not default_style.workspace or default_style.workspace != layer.workspace:
sld_body = default_style.sld_body
try:
Expand All @@ -1037,19 +1034,25 @@ def set_styles(layer, gs_catalog):
else:
style = default_style
if style:
layer.default_style = save_style(style)
style_set.append(layer.default_style)
layer.default_style = save_style(style, layer)
if layer.default_style not in style_set:
style_set.append(layer.default_style)
gs_layer.default_style = style
gs_catalog.save(gs_layer)

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))
style_set.append(save_style(alt_style, layer))
except BaseException:
tb = traceback.format_exc()
logger.debug(tb)
pass

# Remove duplicates
style_set = list(dict.fromkeys(style_set))
layer.styles = style_set

# Update default style to database
Expand All @@ -1059,12 +1062,30 @@ def set_styles(layer, gs_catalog):

Layer.objects.filter(id=layer.id).update(**to_update)
layer.refresh_from_db()
try:
set_geowebcache_invalidate_cache(layer.alternate)
except BaseException as e:
logger.exception(e)


def save_style(gs_style, layer):

if not gs_style.workspace or gs_style.workspace != layer.workspace:
sld_body = gs_style.sld_body
try:
gs_catalog.create_style(gs_style.name, sld_body, raw=True, workspace=layer.workspace)
except BaseException:
tb = traceback.format_exc()
logger.debug(tb)
pass
style = gs_catalog.get_style(gs_style.name, workspace=layer.workspace)

def save_style(gs_style):
style, created = Style.objects.get_or_create(name=gs_style.name)
if not style.workspace:
style.workspace = layer.workspace

try:
style.sld_title = gs_style.sld_title
style.sld_title = gs_style.sld_title or gs_style.sld_name
except BaseException:
tb = traceback.format_exc()
logger.debug(tb)
Expand Down
23 changes: 3 additions & 20 deletions geonode/geoserver/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
from geonode.geoserver.helpers import (cascading_delete,
set_attributes_from_geoserver,
set_styles,
set_layer_style,
gs_catalog,
ogc_server_settings,
create_gs_thumbnail,
Expand All @@ -43,7 +42,6 @@
from geonode.people.models import Profile
from geonode.layers.models import Layer
from geonode.social.signals import json_serializer_producer
from geonode.catalogue.models import catalogue_post_save
from geonode.services.enumerations import CASCADED

import geoserver
Expand Down Expand Up @@ -89,6 +87,8 @@ def geoserver_post_save(instance, sender, created, **kwargs):
instance.set_dirty_state()

if instance.storeType != 'remoteStore' and created:
logger.info("... Creating Default Resource Linkks for Layer [%s]" % (instance.alternate))
set_resource_default_links(instance, sender, prune=True)
logger.info("... Creating Thumbnail for Layer [%s]" % (instance.alternate))
try:
create_gs_thumbnail(instance, overwrite=True, check_bbox=True)
Expand Down Expand Up @@ -217,11 +217,6 @@ def geoserver_post_save_local(instance, *args, **kwargs):
# Save layer styles
set_styles(instance, gs_catalog)

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

# Invalidate GeoWebCache for the updated resource
try:
_stylefilterparams_geowebcache_layer(instance.alternate)
Expand All @@ -230,8 +225,6 @@ def geoserver_post_save_local(instance, *args, **kwargs):
pass

if instance.storeType == "remoteStore":
# Save layer attributes
set_attributes_from_geoserver(instance)
return

if gs_resource:
Expand All @@ -251,10 +244,8 @@ def geoserver_post_save_local(instance, *args, **kwargs):
instance.store = gs_resource.store.name

try:
logger.debug(" -------------------------------------------------- ")
bbox = gs_resource.native_bbox
logger.debug(bbox)
logger.debug(" -------------------------------------------------- ")

# Set bounding box values
instance.bbox_x0 = bbox[0]
instance.bbox_x1 = bbox[1]
Expand Down Expand Up @@ -342,10 +333,6 @@ def geoserver_post_save_local(instance, *args, **kwargs):
if gs_resource:
instance.gs_resource = gs_resource

# Refresh and create the instance default links
layer = Layer.objects.get(id=instance.id)
set_resource_default_links(instance, layer, prune=True)

# some thumbnail generators will update thumbnail_url. If so, don't
# immediately re-generate the thumbnail here. use layer#save(update_fields=['thumbnail_url'])
if gs_resource:
Expand All @@ -354,10 +341,6 @@ def geoserver_post_save_local(instance, *args, **kwargs):
logger.info("... Creating Thumbnail for Layer [%s]" % (instance.alternate))
create_gs_thumbnail(instance, overwrite=True)

# NOTTODO by simod: we should not do this!
# need to be removed when fixing #2015
catalogue_post_save(instance, Layer)

# Updating HAYSTACK Indexes if needed
if settings.HAYSTACK_SEARCH:
from django.core.management import call_command
Expand Down
43 changes: 8 additions & 35 deletions geonode/geoserver/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,13 @@
from geonode.geoserver.signals import gs_catalog
from .tasks import geoserver_update_layers
from geonode.utils import json_response, _get_basic_auth_info
from geoserver.catalog import FailedRequestError, ConflictingDataError
from geoserver.catalog import FailedRequestError
from .helpers import (get_stores,
ogc_server_settings,
extract_name_from_sld,
set_styles,
style_update,
set_layer_style,
_stylefilterparams_geowebcache_layer,
_invalidate_geowebcache_layer)

Expand Down Expand Up @@ -175,42 +176,13 @@ def respond(*args, **kw):
respond(errors="The uploaded SLD file is not valid XML: {}".format(e))

name = data.get('name') or sld_name
if data['update']:
match = None
styles = list(layer.styles) + [layer.default_style]
for style in styles:
if style.sld_name == name:
match = style
break
if match is None:
return respond(errors="Cannot locate style : " + name)
match.update_body(sld)
else:
try:
cat = gs_catalog
cat.create_style(
name,
sld,
raw=True,
workspace=settings.DEFAULT_WORKSPACE)
layer.styles = layer.styles + \
[type('style', (object,), {'name': name})]
cat.save(layer.publishing)
except ConflictingDataError:
return respond(errors="""A layer with this name exists. Select
the update option if you want to update.""")

# Invalidate GeoWebCache for the updated resource
try:
_stylefilterparams_geowebcache_layer(layer.alternate)
_invalidate_geowebcache_layer(layer.alternate)
except BaseException:
pass
set_layer_style(layer, data.get('title') or name, sld)

return respond(
body={
'success': True,
'style': name,
'style': data.get('title') or name,
'updated': data['update']})


Expand Down Expand Up @@ -241,8 +213,9 @@ def layer_style_manage(request, layername):
sld_title = style.sld_title
try:
gs_sld = cat.get_style(style.name,
workspace=settings.DEFAULT_WORKSPACE) or cat.get_style(style.name)
workspace=layer.workspace) or cat.get_style(style.name)
if gs_sld:
sld_title = gs_sld.sld_title
gs_styles.append((style.name, sld_title))
else:
style.delete()
Expand Down Expand Up @@ -305,7 +278,7 @@ def layer_style_manage(request, layername):
"error": msg
}
)
elif request.method == 'POST':
elif request.method in ('POST', 'PUT', 'DELETE'):
try:
selected_styles = request.POST.getlist('style-select')

Expand Down Expand Up @@ -553,7 +526,7 @@ def strip_prefix(path, prefix):
url.geturl())
affected_layers = style_update(request, raw_url)
elif downstream_path == 'rest/layers':
logger.info(
logger.debug(
"[geoserver_proxy] Updating Layer ---> url %s" %
url.geturl())
try:
Expand Down
10 changes: 5 additions & 5 deletions geonode/layers/templates/layers/layer_style_manage.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ <h4>{% trans "Layer Default Style" %}</h4>
<div class="col-md-6">
<select id='default_style' name='default_style' required='required'>
{% for style in layer_styles %}
{% if style == layer.default_style %}
<option value="{{ style.0 }}" selected>{{ style.1 }}</option>
{% if style.0 == layer.default_style.name or style.0 == layer.default_style.name or style.1 == layer.default_style.sld_title %}
<option value="{{ style.0 }}" selected>{% if style.1 %}{{ style.1 }}{% else %}{{ style.0 }}{% endif %}</option>
{% else %}
<option value="{{ style.0 }}">{{ style.1 }}</option>
<option value="{{ style.0 }}">{% if style.1 %}{{ style.1 }}{% else %}{{ style.0 }}{% endif %}</option>
{% endif %}
{% endfor %}
</select>
Expand All @@ -51,9 +51,9 @@ <h4>{% trans "Available styles" %}</h4>
<select multiple="multiple" id="style-select" name="style-select">
{% for style in gs_styles %}
{% if style.0 in layer_style_names %}
<option value='{{ style.0 }}' selected>{{ style.1 }}</option>
<option value='{{ style.0 }}' selected>{% if style.1 %}{{ style.1 }}{% else %}{{ style.0 }}{% endif %}</option>
{% else %}
<option value='{{ style.0 }}'>{{ style.1 }}</option>
<option value='{{ style.0 }}'>{% if style.1 %}{{ style.1 }}{% else %}{{ style.0 }}{% endif %}</option>
{% endif %}
{% endfor %}
</select>
Expand Down
1 change: 1 addition & 0 deletions geonode/layers/templates/layers/layer_style_upload.html
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ <h4>{% trans "Files to be uploaded" %}</h4>
</section>

<section>
<div class="btn-danger"><strong>{% trans "WARNING" %}: </strong>{% trans "This will most probably overwrite the current default style!" %}</div>
<a href="{% url "layer_sld_upload" resource.alternate %}" id="clear-button" class="btn btn-default">{% trans "Clear" %}</a>
<a href="#" id="upload-button" class="btn btn-danger">{% trans "Upload files" %}</a>
</section>
Expand Down
2 changes: 1 addition & 1 deletion geonode/security/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1252,7 +1252,7 @@ def test_save_and_delete_signals(self):
self.assertIsNotNone(test_perm_layer.bbox)
self.assertIsNotNone(test_perm_layer.srid)
self.assertIsNotNone(test_perm_layer.link_set)
self.assertEquals(len(test_perm_layer.link_set.all()), 9)
self.assertEquals(len(test_perm_layer.link_set.all()), 17)

# Layer Manipulation
from geonode.geoserver.upload import geoserver_upload
Expand Down
1 change: 0 additions & 1 deletion geonode/tests/integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -1026,7 +1026,6 @@ def test_layer_replace(self):

if not response_dict['success'] and 'unknown encoding' in \
response_dict['errors']:
# print(response_dict['errors'])
pass
else:
self.assertEquals(response.status_code, 200)
Expand Down

0 comments on commit d87e505

Please sign in to comment.