diff --git a/geonode/geoserver/helpers.py b/geonode/geoserver/helpers.py index d27ca3e5f32..ba235b0dce6 100755 --- a/geonode/geoserver/helpers.py +++ b/geonode/geoserver/helpers.py @@ -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) + _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) diff --git a/geonode/geoserver/tasks.py b/geonode/geoserver/tasks.py index a0c8b8f7c9f..f109002a04d 100644 --- a/geonode/geoserver/tasks.py +++ b/geonode/geoserver/tasks.py @@ -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: diff --git a/geonode/geoserver/tests/test_tasks.py b/geonode/geoserver/tests/test_tasks.py index 9b84df07798..a091a541328 100644 --- a/geonode/geoserver/tests/test_tasks.py +++ b/geonode/geoserver/tests/test_tasks.py @@ -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 @@ -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)