Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions geonode/geoapps/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ def _create_and_update(self, payload, instance=None, notify: bool = True, reques

payload = copy.deepcopy(payload)
extent = payload.pop("extent", None)
blob = payload.pop("blob", {})
missing_blob = object()
blob = payload.pop("blob", missing_blob)

created = False
if not instance:
Expand All @@ -53,7 +54,8 @@ def _create_and_update(self, payload, instance=None, notify: bool = True, reques
logger.exception(f"Error while creating or updating GeoApp instance with exception {e}")
raise GeneralGeoAppException("An error occurred while saving the GeoApp.")

payload["blob"] = blob
if blob is not missing_blob:
payload["blob"] = blob
instance = super().update(instance.uuid, instance=instance, vals=payload, notify=notify)
if extent or request_user:
# Mirrors ResourceBaseSerializer.save() (extent + role defaults); could be moved to the API,
Expand Down
2 changes: 2 additions & 0 deletions geonode/geoapps/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ def test_geoapp_category_is_correctly_assigned_in_metadata_upload(self):

def test_geoapp_copy(self):
self.client.login(username="admin", password="admin")
self.geoapp.blob = {"test_data": {"test": ["test_1", "test_2", "test_3"]}}
geoapp_copy = None
try:
# owner must be whoever triggers the clone (self.bobby), not self.geoapp's own owner (self.user)
Expand All @@ -91,6 +92,7 @@ def test_geoapp_copy(self):
self.assertIsNotNone(geoapp_copy)
self.assertEqual(geoapp_copy.title, "Testing GeoApp 2")
self.assertEqual(geoapp_copy.owner, self.bobby)
self.assertEqual(self.geoapp.blob, geoapp_copy.blob)
finally:
if geoapp_copy:
geoapp_copy.delete()
Expand Down
9 changes: 8 additions & 1 deletion geonode/upload/handlers/common/remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,11 +346,18 @@ def copy_geonode_resource(self, alternate, resource, _exec, data_to_update, new_
if resource.sourcetype:
defaults["sourcetype"] = resource.sourcetype

return resource_manager_registry.get_for_instance(resource).copy(
new_resource = resource_manager_registry.get_for_instance(resource).copy(
resource,
owner=_exec.user,
defaults=defaults,
)
for link in Link.objects.filter(resource=resource, asset__isnull=True, link_type="data"):
link.pk = None
link.resource = new_resource
link.name = new_alternate
link.save()

return new_resource

def create_link(self, resource, params: dict, name):
link = Link(
Expand Down
38 changes: 37 additions & 1 deletion geonode/upload/handlers/common/test_remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
from geonode.upload.orchestrator import orchestrator
from geonode.base.populate_test_data import create_single_dataset
from geonode.resource.models import ExecutionRequest
from geonode.base.models import ResourceBase
from geonode.base.models import ResourceBase, Link
from geonode.security.auth_handlers import BasicAuthHandler
from geonode.security.models import AuthConfig

Expand Down Expand Up @@ -144,6 +144,42 @@ def test_create_geonode_resource_rollback_should_delete_created_auth_config(self

self.assertFalse(AuthConfig.objects.filter(pk=auth_config.pk).exists())

def test_copy_geonode_resource_should_copy_remote_data_link(self):
exec_id = orchestrator.create_execution_request(
user=self.owner,
func_name="funct1",
step="step",
input_params={
"url": "http://example.com",
"title": "Remote Title",
"type": "3dtiles",
},
)
exec_obj = orchestrator.get_execution_object(exec_id)

resource = self.handler.create_geonode_resource(
"layername",
"layeralternate",
execution_id=exec_id,
resource_type=ResourceBase,
asset=None,
)

new_resource = self.handler.copy_geonode_resource(
alternate=resource.alternate,
resource=resource,
_exec=exec_obj,
data_to_update={"title": "Cloned Remote Title"},
new_alternate="layeralternate_copy",
)

link = Link.objects.get(resource=new_resource, asset__isnull=True, link_type="data")
self.assertEqual("http://example.com", link.url)
self.assertEqual("3dtiles", link.extension)
self.assertEqual("layeralternate_copy", link.name)
self.assertEqual(resource.subtype, new_resource.subtype)
self.assertEqual(resource.sourcetype, new_resource.sourcetype)

@patch("geonode.upload.handlers.common.remote.import_orchestrator")
def test_import_resource_should_work(self, patch_upload):
patch_upload.apply_async.side_effect = MagicMock()
Expand Down
Loading