diff --git a/geonode/api/resourcebase_api.py b/geonode/api/resourcebase_api.py index f3c902c2a98..ede45cb577d 100644 --- a/geonode/api/resourcebase_api.py +++ b/geonode/api/resourcebase_api.py @@ -94,6 +94,7 @@ class CommonMetaApi: 'owner': ALL_WITH_RELATIONS, 'date': ALL, 'purpose': ALL, + 'uuid': ALL_WITH_RELATIONS, 'abstract': ALL } ordering = ['date', 'title', 'popular_count'] diff --git a/geonode/layers/models.py b/geonode/layers/models.py index 4b3ea1af8f6..3c6d518878d 100644 --- a/geonode/layers/models.py +++ b/geonode/layers/models.py @@ -616,8 +616,14 @@ def pre_save_layer(instance, sender, **kwargs): if instance.owner is None: instance.owner = get_valid_user() - if instance.uuid == '': - instance.uuid = str(uuid.uuid1()) + logger.debug("handling UUID In pre_save_layer") + if hasattr(settings, 'LAYER_UUID_HANDLER') and settings.LAYER_UUID_HANDLER != '': + logger.debug("using custom uuid handler In pre_save_layer") + from geonode.layers.utils import get_uuid_handler + instance.uuid = get_uuid_handler()(instance).create_uuid() + else: + if instance.uuid == '': + instance.uuid = str(uuid.uuid1()) logger.debug("In pre_save_layer") if instance.alternate is None: diff --git a/geonode/layers/tests.py b/geonode/layers/tests.py index 88edb200197..e4ccf347b20 100644 --- a/geonode/layers/tests.py +++ b/geonode/layers/tests.py @@ -18,7 +18,7 @@ # ######################################################################### from geonode.tests.base import GeoNodeBaseTestSupport - +from django.test import TestCase import io import os import json @@ -1544,3 +1544,39 @@ def test_that_only_users_with_permissions_can_view_maps_in_layer_view(self): self.client.login(username='admin', password='admin') response = self.client.get(reverse('layer_detail', args=(self.layer.alternate,))) self.assertEqual(response.context['map_layers'], [self.map_layer]) + + +''' +Smoke test to explain how the uuidhandler will override the uuid for the layers +Documentation of the handler is available here: +https://github.com/GeoNode/documentation/blob/703cc6ba92b7b7a83637a874fb449420a9f8b78a/basic/settings/index.rst#uuid-handler +''' + + +class DummyUUIDHandler(): + def __init__(self, instance): + self.instance = instance + + def create_uuid(self): + return f'abc:{self.instance.uuid}' + + +class TestCustomUUidHandler(TestCase): + def setUp(self): + User = get_user_model() + self.user = User.objects.create(username='test', email='test@test.com') + self.sut = Layer.objects.create( + name="testLayer", owner=self.user, title='test', is_approved=True, uuid='abc-1234-abc' + ) + + def test_layer_will_maintain_his_uud_if_no_handler_is_definded(self): + expected = "abc-1234-abc" + self.assertEqual(expected, self.sut.uuid) + + @override_settings(LAYER_UUID_HANDLER="geonode.layers.tests.DummyUUIDHandler") + def test_layer_will_override_the_uuid_if_handler_is_defined(self): + self.sut.keywords.add(*["updating", "values"]) + self.sut.save() + expected = "abc:abc-1234-abc" + actual = Layer.objects.get(id=self.sut.id) + self.assertEqual(expected, actual.uuid) diff --git a/geonode/layers/utils.py b/geonode/layers/utils.py index ec3c4086939..e6890626894 100644 --- a/geonode/layers/utils.py +++ b/geonode/layers/utils.py @@ -1388,3 +1388,8 @@ def set_layers_permissions(permissions_name, resources_names=None, if verbose: logger.info("Permissions successfully updated!") print("Permissions successfully updated!") + + +def get_uuid_handler(): + from django.utils.module_loading import import_string + return import_string(settings.LAYER_UUID_HANDLER) diff --git a/geonode/settings.py b/geonode/settings.py index 8124b23afc5..cd1b389ecca 100644 --- a/geonode/settings.py +++ b/geonode/settings.py @@ -2122,3 +2122,4 @@ def get_geonode_catalogue_service(): # -- END Settings for MONITORING plugin CATALOG_METADATA_TEMPLATE = os.getenv("CATALOG_METADATA_TEMPLATE", "catalogue/full_metadata.xml") +