Skip to content

Commit b28b8cb

Browse files
committed
Pass custom json payload to be handled by metadata storers
1 parent 306a958 commit b28b8cb

File tree

15 files changed

+75
-60
lines changed

15 files changed

+75
-60
lines changed

geonode/resource/manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ def delete(self, uuid: str, /, instance: ResourceBase = None) -> int:
258258
ResourceBase.objects.filter(uuid=uuid).delete()
259259
return 0
260260

261-
def create(self, uuid: str, /, resource_type: typing.Optional[object] = None, defaults: dict = {}) -> ResourceBase:
261+
def create(self, uuid: str, /, resource_type: typing.Optional[object] = None, defaults: dict = {}, *args, **kwargs) -> ResourceBase:
262262
if resource_type.objects.filter(uuid=uuid).exists():
263263
return resource_type.objects.filter(uuid=uuid).get()
264264
uuid = uuid or str(uuid4())
@@ -286,7 +286,7 @@ def create(self, uuid: str, /, resource_type: typing.Optional[object] = None, de
286286
uuid, resource_type=resource_type, defaults=resource_dict
287287
)
288288
_resource.save()
289-
resourcebase_post_save(_resource.get_real_instance())
289+
resourcebase_post_save(_resource.get_real_instance(), **kwargs)
290290
_resource.set_processing_state(enumerations.STATE_PROCESSED)
291291
except Exception as e:
292292
logger.exception(e)

geonode/settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2220,7 +2220,8 @@ def get_geonode_catalogue_service():
22202220
List of modules that implement custom metadata storers that will be called when the metadata of a resource is saved
22212221
"""
22222222
METADATA_STORERS = [
2223-
# 'geonode.resource.regions_storer.spatial_predicate_region_assignor',
2223+
# "geonode.resource.regions_storer.spatial_predicate_region_assignor",
2224+
# "geonode.upload.handlers.common.metadata_storer.store_metadata",
22242225
]
22252226

22262227

geonode/upload/api/serializer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class Meta:
3535
"store_spatial_files",
3636
"skip_existing_layers",
3737
"action",
38+
"custom",
3839
)
3940

4041
base_file = serializers.FileField()
@@ -43,6 +44,7 @@ class Meta:
4344
store_spatial_files = serializers.BooleanField(required=False, default=True)
4445
skip_existing_layers = serializers.BooleanField(required=False, default=False)
4546
action = serializers.CharField(required=True)
47+
custom = serializers.JSONField(required=False, default={})
4648

4749

4850
class OverwriteImporterSerializer(ImporterSerializer):

geonode/upload/celery_tasks.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,20 +352,23 @@ def create_geonode_resource(
352352

353353
handler = import_string(handler_module_path)()
354354
_overwrite = _exec.input_params.get("overwrite_existing_layer")
355+
_custom = _exec.input_params.get("custom")
355356

356357
if _overwrite:
357358
resource = handler.overwrite_geonode_resource(
358359
layer_name=layer_name,
359360
alternate=alternate,
360361
execution_id=execution_id,
361362
asset=_asset,
363+
custom=_custom,
362364
)
363365
else:
364366
resource = handler.create_geonode_resource(
365367
layer_name=layer_name,
366368
alternate=alternate,
367369
execution_id=execution_id,
368370
asset=_asset,
371+
custom=_custom,
369372
)
370373

371374
# assign geonode resource to ExectionRequest

geonode/upload/handlers/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class BaseVectorFileHandler(BaseHandler):
159159
return
160160

161161
def overwrite_geonode_resource(
162-
self, layer_name: str, alternate: str, execution_id: str, resource_type: Dataset = Dataset, asset=None
162+
self, layer_name: str, alternate: str, execution_id: str, resource_type: Dataset = Dataset, asset=None, custom={}
163163
):
164164
"""
165165
Base function to override the resource into geonode. Each handler can specify

geonode/upload/handlers/base.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,16 @@ def extract_params_from_data(_data):
148148
Remove from the _data the params that needs to save into the executionRequest object
149149
all the other are returned
150150
"""
151-
return []
151+
return {
152+
"resource_pk": _data.pop("resource_pk", None),
153+
"dataset_title": _data.pop("dataset_title", None),
154+
"original_zip_name": _data.pop("original_zip_name", None),
155+
"skip_existing_layers": _data.pop("skip_existing_layers", "False"),
156+
"overwrite_existing_layer": _data.pop("overwrite_existing_layer", False),
157+
"store_spatial_file": _data.pop("store_spatial_files", "True"),
158+
"action": _data.pop("action", "upload"),
159+
"custom": _data.pop("custom", {}),
160+
}, _data
152161

153162
@staticmethod
154163
def perform_last_step(execution_id):
@@ -253,7 +262,9 @@ def publish_resources(resources: List[str], catalog, store, workspace):
253262
"""
254263
return NotImplementedError
255264

256-
def create_geonode_resource(self, layer_name, alternate, execution_id, resource_type: Dataset = Dataset):
265+
def create_geonode_resource(
266+
self, layer_name, alternate, execution_id, resource_type: Dataset = Dataset, custom={}
267+
):
257268
"""
258269
Base function to create the resource into geonode. Each handler can specify
259270
and handle the resource in a different way

geonode/upload/handlers/common/metadata.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,7 @@ def extract_params_from_data(_data, action=None):
5252
Remove from the _data the params that needs to save into the executionRequest object
5353
all the other are returned
5454
"""
55-
return {
56-
"dataset_title": _data.pop("dataset_title", None),
57-
"skip_existing_layers": _data.pop("skip_existing_layers", "False"),
58-
"overwrite_existing_layer": _data.pop("overwrite_existing_layer", False),
59-
"resource_pk": _data.pop("resource_pk", None),
60-
"store_spatial_file": _data.pop("store_spatial_files", "True"),
61-
"action": _data.pop("action"),
62-
}, _data
55+
return BaseHandler.extract_params_from_data(_data)
6356

6457
@staticmethod
6558
def perform_last_step(execution_id):
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import logging
2+
from geonode.resource.manager import update_resource
3+
4+
logger = logging.getLogger(__name__)
5+
6+
7+
def store_metadata(instance, custom=None):
8+
if not custom:
9+
return instance
10+
try:
11+
return update_resource(instance, vals=custom)
12+
except Exception as e:
13+
logger.exception(e)
14+
logger.error(f"Failed to update instance with custom payload: {custom}")
15+
return instance

geonode/upload/handlers/common/raster.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,7 @@ def extract_params_from_data(_data, action=None):
117117
title = json.loads(_data.get("defaults"))
118118
return {"title": title.pop("title"), "store_spatial_file": True}, _data
119119

120-
return {
121-
"skip_existing_layers": _data.pop("skip_existing_layers", "False"),
122-
"overwrite_existing_layer": _data.pop("overwrite_existing_layer", False),
123-
"resource_pk": _data.pop("resource_pk", None),
124-
"store_spatial_file": _data.pop("store_spatial_files", "True"),
125-
"action": _data.pop("action", "upload"),
126-
}, _data
120+
return BaseHandler.extract_params_from_data(_data)
127121

128122
@staticmethod
129123
def publish_resources(resources: List[str], catalog, store, workspace):
@@ -321,6 +315,7 @@ def create_geonode_resource(
321315
execution_id: str,
322316
resource_type: Dataset = Dataset,
323317
asset=None,
318+
custom: object = {},
324319
):
325320
"""
326321
Base function to create the resource into geonode. Each handler can specify
@@ -357,6 +352,7 @@ def create_geonode_resource(
357352
owner=_exec.user,
358353
asset=asset,
359354
),
355+
custom=custom,
360356
)
361357

362358
saved_dataset.refresh_from_db()
@@ -378,6 +374,7 @@ def overwrite_geonode_resource(
378374
execution_id: str,
379375
resource_type: Dataset = Dataset,
380376
asset=None,
377+
custom={},
381378
):
382379

383380
_exec = self._get_execution_request_object(execution_id)
@@ -391,7 +388,7 @@ def overwrite_geonode_resource(
391388
if dataset.exists() and _overwrite:
392389
dataset = dataset.first()
393390

394-
dataset = resource_manager.update(dataset.uuid, instance=dataset)
391+
dataset = resource_manager.update(dataset.uuid, instance=dataset, vals=custom)
395392

396393
self.handle_xml_file(dataset, _exec)
397394
self.handle_sld_file(dataset, _exec)
@@ -403,7 +400,7 @@ def overwrite_geonode_resource(
403400
logger.warning(
404401
f"The dataset required {alternate} does not exists, but an overwrite is required, the resource will be created"
405402
)
406-
return self.create_geonode_resource(layer_name, alternate, execution_id, resource_type, asset)
403+
return self.create_geonode_resource(layer_name, alternate, execution_id, resource_type, asset, custom)
407404
elif not dataset.exists() and not _overwrite:
408405
logger.warning("The resource does not exists, please use 'create_geonode_resource' to create one")
409406
return

geonode/upload/handlers/common/remote.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,15 @@ def extract_params_from_data(_data, action=None):
104104
title = json.loads(_data.get("defaults"))
105105
return {"title": title.pop("title"), "store_spatial_file": True}, _data
106106

107-
return {
108-
"action": _data.pop("action", "upload"),
109-
"title": _data.pop("title", None),
110-
"url": _data.pop("url", None),
111-
"type": _data.pop("type", None),
112-
"overwrite_existing_layer": _data.pop("overwrite_existing_layer", False),
113-
}, _data
107+
return (
108+
BaseHandler.extract_params_from_data(_data)[0]
109+
| {
110+
"title": _data.pop("title", None),
111+
"url": _data.pop("url", None),
112+
"type": _data.pop("type", None),
113+
},
114+
_data,
115+
)
114116

115117
def pre_validation(self, files, execution_id, **kwargs):
116118
"""
@@ -199,6 +201,7 @@ def create_geonode_resource(
199201
execution_id: str,
200202
resource_type: ResourceBase = ResourceBase,
201203
asset=None,
204+
custom: object = {},
202205
):
203206
"""
204207
Creating geonode base resource
@@ -213,6 +216,7 @@ def create_geonode_resource(
213216
None,
214217
resource_type=resource_type,
215218
defaults=self.generate_resource_payload(layer_name, alternate, asset, _exec, None, **params),
219+
custom=custom,
216220
)
217221
resource_manager.set_thumbnail(None, instance=resource)
218222

@@ -268,6 +272,7 @@ def overwrite_geonode_resource(
268272
execution_id: str,
269273
resource_type: Dataset = ResourceBase,
270274
asset=None,
275+
custom={},
271276
):
272277
_exec = self._get_execution_request_object(execution_id)
273278
resource = resource_type.objects.filter(alternate__icontains=alternate, owner=_exec.user)
@@ -278,15 +283,15 @@ def overwrite_geonode_resource(
278283
if resource.exists() and _overwrite:
279284
resource = resource.first()
280285

281-
resource = resource_manager.update(resource.uuid, instance=resource)
286+
resource = resource_manager.update(resource.uuid, instance=resource, vals=custom)
282287
resource_manager.set_thumbnail(resource.uuid, instance=resource, overwrite=True)
283288
resource.refresh_from_db()
284289
return resource
285290
elif not resource.exists() and _overwrite:
286291
logger.warning(
287292
f"The dataset required {alternate} does not exists, but an overwrite is required, the resource will be created"
288293
)
289-
return self.create_geonode_resource(layer_name, alternate, execution_id, resource_type, asset)
294+
return self.create_geonode_resource(layer_name, alternate, execution_id, resource_type, asset, custom)
290295
elif not resource.exists() and not _overwrite:
291296
logger.warning("The resource does not exists, please use 'create_geonode_resource' to create one")
292297
return

0 commit comments

Comments
 (0)