Skip to content

Commit

Permalink
[Fixes #9960] Unable to edit style for cloned datasets (#9974)
Browse files Browse the repository at this point in the history
Co-authored-by: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com>
  • Loading branch information
afabiani and mattiagiupponi authored Sep 7, 2022
1 parent ede30bf commit b702756
Showing 1 changed file with 61 additions and 22 deletions.
83 changes: 61 additions & 22 deletions geonode/geoserver/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import os
import re
import sys
import copy
import time
import uuid
import json
Expand Down Expand Up @@ -1129,8 +1130,8 @@ def set_attributes_from_geoserver(layer, overwrite=False):
)


def set_styles(layer, gs_catalog):
style_set = []
def get_dataset(layer, gs_catalog):
gs_catalog.reset()
gs_dataset = None
try:
gs_dataset = gs_catalog.get_layer(layer.name)
Expand All @@ -1145,26 +1146,56 @@ def set_styles(layer, gs_catalog):
tb = traceback.format_exc()
logger.error(tb)
logger.exception("No GeoServer Dataset found!")
return gs_dataset

if gs_dataset:
default_style = None
if gs_dataset.default_style and gs_dataset.default_style.name:
default_style = gs_catalog.get_style(

def clean_styles(layer, gs_catalog):
try:
# Cleanup Styles without a Workspace
gs_catalog.reset()
gs_dataset = get_dataset(layer, gs_catalog)
gs_catalog.delete(
gs_catalog.get_style(
name=gs_dataset.default_style.name,
workspace=gs_dataset.default_style.workspace)
workspace=None,
recursive=True),
purge=True,
recurse=False)
except Exception:
tb = traceback.format_exc()
logger.debug(tb)


def set_styles(layer, gs_catalog):
style_set = []
gs_dataset = get_dataset(layer, gs_catalog)
if gs_dataset:
default_style = gs_dataset.get_full_default_style()
if default_style:
# make sure we are not using a default SLD (which won't be editable)
layer.default_style = save_style(default_style, layer)
layer.default_style, _gs_default_style = save_style(default_style, layer)
try:
if default_style.name != _gs_default_style.name or default_style.workspace != _gs_default_style.workspace:
gs_dataset.default_style = _gs_default_style
gs_catalog.save(gs_dataset)
gs_catalog.delete(
gs_catalog.get_style(
name=default_style.name,
workspace=None,
recursive=True),
purge=True,
recurse=False)
except Exception as e:
logger.exception(e)
style_set.append(layer.default_style)

try:
if gs_dataset.styles:
alt_styles = gs_dataset.styles
for alt_style in alt_styles:
if alt_style and alt_style:
_s = save_style(alt_style, layer)
if _s != layer.default_style:
style_set.append(_s)
if alt_style and alt_style.name and alt_style.name != layer.default_style.name and alt_style.workspace != layer.default_style.workspace:
_s, _ = save_style(alt_style, layer)
style_set.append(_s)
except Exception as e:
logger.exception(e)

Expand All @@ -1173,6 +1204,8 @@ def set_styles(layer, gs_catalog):
style_set = list(dict.fromkeys(style_set))
layer.styles.set(style_set)

clean_styles(layer, gs_catalog)

# Update default style to database
to_update = {
'default_style': layer.default_style
Expand Down Expand Up @@ -1217,27 +1250,33 @@ def set_styles(layer, gs_catalog):
def save_style(gs_style, layer):
style_name = os.path.basename(
urlparse(gs_style.body_href).path).split('.')[0]
sld_name = gs_style.name
sld_body = gs_style.sld_body
sld_name = copy.copy(gs_style.name)
sld_body = copy.copy(gs_style.sld_body)
_gs_style = None
if not gs_style.workspace:
gs_style = gs_catalog.create_style(
style_name, sld_body,
_gs_style = gs_catalog.create_style(
layer.name, sld_body,
raw=True, overwrite=True,
workspace=layer.workspace)
else:
_gs_style = gs_catalog.get_style(
name=sld_name,
workspace=layer.workspace
)

style = None
try:
style, created = Style.objects.get_or_create(name=style_name)
style.workspace = gs_style.workspace
style.sld_title = gs_style.sld_title if gs_style.style_format != 'css' and gs_style.sld_title else sld_name
style.sld_body = gs_style.sld_body
style.sld_url = gs_style.body_href
style, _ = Style.objects.get_or_create(name=style_name)
style.workspace = _gs_style.workspace
style.sld_title = _gs_style.sld_title if _gs_style.style_format != 'css' and _gs_style.sld_title else sld_name
style.sld_body = _gs_style.sld_body
style.sld_url = _gs_style.body_href
style.save()
except Exception as e:
tb = traceback.format_exc()
logger.debug(tb)
raise e
return style
return (style, _gs_style)


def is_dataset_attribute_aggregable(store_type, field_name, field_type):
Expand Down

0 comments on commit b702756

Please sign in to comment.