Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fixes #10070] Let the resource manager handle also raw sld #10071

Merged
merged 8 commits into from
Oct 4, 2022
15 changes: 5 additions & 10 deletions geonode/geoserver/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -407,17 +407,12 @@ def set_dataset_style(saved_dataset, title, sld, base_file=None):
except Exception as e:
logger.exception(e)
else:
style = gs_catalog.get_style(saved_dataset.name, workspace=saved_dataset.workspace) or \
gs_catalog.get_style(saved_dataset.name)
try:
if not style:
style = gs_catalog.create_style(
saved_dataset.name, sld,
overwrite=True, raw=True,
workspace=saved_dataset.workspace)
elif sld:
style.style_format = _extract_style_version_from_sld(sld)
style.update_body(sld)
mattiagiupponi marked this conversation as resolved.
Show resolved Hide resolved
_sld_format = _extract_style_version_from_sld(sld)
style = gs_catalog.create_style(
saved_dataset.name, sld,
overwrite=True, raw=True, style_format=_sld_format,
workspace=saved_dataset.workspace)
except Exception as e:
logger.exception(e)

Expand Down
9 changes: 8 additions & 1 deletion geonode/geoserver/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,19 @@ def geoserver_set_style(
if lock.acquire() is True:
log_lock.debug(f"geoserver_set_style: Acquired lock {lock_id} for {instance.name}")
try:
sld = open(base_file, "rb").read()
sld = None
if os.path.exists(base_file):
sld = open(base_file, "rb").read()
else:
sld = base_file
base_file = None

set_dataset_style(
instance,
instance.alternate,
sld,
base_file=base_file)

except Exception as e:
logger.exception(e)
finally:
Expand Down
39 changes: 38 additions & 1 deletion geonode/geoserver/tests/test_tasks.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from unittest.mock import create_autospec, patch

from geonode.base.populate_test_data import all_public, create_models, remove_models
from geonode.geoserver.tasks import geoserver_create_style
from geonode.geoserver.tasks import geoserver_create_style, geoserver_set_style
from geonode.geoserver.signals import geoserver_automatic_default_style_set
from geonode.layers.models import Dataset
from geonode.layers.populate_datasets_data import create_dataset_data
Expand Down Expand Up @@ -54,3 +54,40 @@ def test_geoserver_style_visual_mode_automatically_without_sld_file(self):
geoserver_automatic_default_style_set.connect(handler)
geoserver_create_style(dataset.id, dataset.name, sld_file=None, tempdir=None)
handler.assert_called_once_with(signal=geoserver_automatic_default_style_set, sender=dataset, instance=dataset)

@patch("geonode.geoserver.tasks.set_dataset_style")
def test_geoserver_set_style_with_real_file(self, mocked_set_dataset_style):
dataset = Dataset.objects.first()
sld_file = "geonode/base/fixtures/test_sld.sld"
geoserver_set_style(
instance_id=dataset.id,
base_file=sld_file
)
mocked_set_dataset_style.assert_called_once()

args_list = mocked_set_dataset_style.call_args_list[0].args
kwargs_list = mocked_set_dataset_style.call_args_list[0].kwargs
self.assertEqual(args_list[0].id, dataset.id)
self.assertEqual(args_list[1], dataset.alternate)
self.assertIsInstance(args_list[2], bytes)

self.assertDictEqual({"base_file": sld_file}, kwargs_list)

@patch("geonode.geoserver.tasks.set_dataset_style")
def test_geoserver_set_style_with_xml(self, mocked_set_dataset_style):
dataset = Dataset.objects.first()

with open("geonode/base/fixtures/test_sld.sld", 'r+') as _file:
geoserver_set_style(
instance_id=dataset.id,
base_file=_file.read()
)
mocked_set_dataset_style.assert_called_once()

args_list = mocked_set_dataset_style.call_args_list[0].args
kwargs_list = mocked_set_dataset_style.call_args_list[0].kwargs
self.assertEqual(args_list[0].id, dataset.id)
self.assertEqual(args_list[1], dataset.alternate)
self.assertIsInstance(args_list[2], str)

self.assertDictEqual({"base_file": None}, kwargs_list)