Skip to content

Commit 1a8c909

Browse files
committed
Some improvements/fixes related to previous metadata commits
1 parent 0019ecc commit 1a8c909

File tree

4 files changed

+15
-63
lines changed

4 files changed

+15
-63
lines changed

geonode/metadata/api/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ def schema_instance(self, request, pk=None):
117117
if request.method == "PUT"
118118
else metadata_manager.update_schema_instance_partial(resource, request.data, request.user, lang)
119119
)
120+
resource.refresh_from_db()
120121
resource.save() # we want to trigger all the post_save signals
121122
except Exception as e:
122123
logger.warning(f"Error while updating schema instance: {e}")

geonode/metadata/handlers/doi.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ def get_jsonschema_instance(self, resource, field_name, context, errors, lang=No
4646
return resource.doi
4747

4848
def update_resource(self, resource, field_name, json_instance, context, errors, **kwargs):
49-
resource.doi = json_instance.get(field_name, None)
50-
context.setdefault("base", {})[field_name] = json_instance.get(field_name, None)
49+
doi_value = json_instance.get(field_name, None)
50+
resource.doi = doi_value
51+
context.setdefault("base", {})[field_name] = doi_value

geonode/metadata/manager.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919

2020
import logging
2121
import copy
22+
from types import SimpleNamespace
2223

2324
from django.utils.translation import gettext as _
2425

26+
from geonode.base.models import ResourceBase
2527
from geonode.metadata.handlers.abstract import MetadataHandler
2628
from geonode.metadata.exceptions import UnsetFieldException
2729
from geonode.metadata.i18n import I18nCache
@@ -136,8 +138,7 @@ def update_schema_instance(self, resource, request_obj, lang=None, partial=None)
136138
if partial:
137139
if fieldname not in partial:
138140
continue
139-
else:
140-
logger.debug(f"Storing partial field {fieldname}")
141+
logger.debug(f"Storing partial field {fieldname}")
141142
handler = self.handlers[subschema["geonode:handler"]]
142143
try:
143144
handler.update_resource(resource, fieldname, json_instance, context, errors)
@@ -164,12 +165,12 @@ def update_schema_instance(self, resource, request_obj, lang=None, partial=None)
164165
),
165166
)
166167
try:
167-
resource.get_real_concrete_instance_class().objects.filter(id=resource.id).update(
168-
**context.setdefault("base")
169-
)
170-
resource.refresh_from_db()
168+
if basefields := context.get("base", None):
169+
ResourceBase.objects.filter(id=resource.id).update(**basefields)
170+
resource.get_real_concrete_instance_class().objects.filter(id=resource.id).update(**basefields)
171+
resource.refresh_from_db()
171172
except Exception as e:
172-
logger.warning(f"Error while updating schema instance: {e}")
173+
logger.warning(f"Error while updating schema instance: {e}", exc_info=e)
173174
MetadataHandler._set_error(
174175
errors, [], MetadataHandler.localize_message(context, "metadata_error_save", {"exc": e})
175176
)
@@ -193,13 +194,13 @@ def update_schema_instance(self, resource, request_obj, lang=None, partial=None)
193194
return errors
194195

195196
def update_schema_instance_partial(self, resource, json_instance, user, lang=None) -> dict:
197+
if not json_instance:
198+
return {}
196199
# We can't loop on the payload's field, since post_ or pre_ methods may rely on the whole instance
197200
# Let's create a full instance by using the old one, merged with the payload
198201
old_instance = self.build_schema_instance(resource, lang)
199202
old_instance.update(json_instance)
200-
fake_req = lambda: None
201-
fake_req.data = old_instance
202-
fake_req.user = user
203+
fake_req = SimpleNamespace(data=old_instance, user=user)
203204
return self.update_schema_instance(resource, fake_req, lang, partial=json_instance.keys())
204205

205206

geonode/metadata/tests/tests.py

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -918,8 +918,6 @@ def test_update_schema_instance_no_errors(self, mock_get_schema):
918918
expected_context = {"labels": {}, "user": self.test_user_1}
919919

920920
mock_get_schema.return_value = self.fake_schema
921-
# Mock the save method
922-
self.resource.save = MagicMock()
923921

924922
with patch.dict(metadata_manager.handlers, self.fake_handlers, clear=True):
925923

@@ -945,9 +943,6 @@ def test_update_schema_instance_no_errors(self, mock_get_schema):
945943
# Assert no errors were raised
946944
self.assertEqual(errors, {})
947945

948-
# Check that resource.save() is called
949-
self.resource.save.assert_called_once()
950-
951946
@patch("geonode.metadata.manager.metadata_manager.get_schema")
952947
@patch("geonode.metadata.manager.MetadataHandler.localize_message")
953948
def test_update_schema_instance_with_handler_error(self, mock_localize_message, mock_get_schema):
@@ -959,9 +954,6 @@ def test_update_schema_instance_with_handler_error(self, mock_localize_message,
959954

960955
mock_get_schema.return_value = self.fake_schema
961956

962-
# Mock the save method
963-
self.resource.save = MagicMock()
964-
965957
# Mock localize_message to return a custom error message
966958
mock_localize_message.side_effect = lambda context, msg_id, data: f"Error in handler: {data['exc']}"
967959

@@ -984,46 +976,3 @@ def test_update_schema_instance_with_handler_error(self, mock_localize_message,
984976
self.handler1.update_resource.assert_called()
985977
self.handler2.update_resource.assert_called()
986978
self.handler3.update_resource.assert_called()
987-
988-
# Assert that resource.save() was called
989-
self.resource.save.assert_called_once()
990-
991-
# Assert resource.save was called
992-
self.resource.save.assert_called_once()
993-
994-
@patch("geonode.metadata.manager.metadata_manager.get_schema")
995-
@patch("geonode.metadata.manager.MetadataHandler.localize_message")
996-
def test_update_schema_instance_with_db_error(self, mock_localize_message, mock_get_schema):
997-
998-
# Fake request with data and user
999-
mock_request = MagicMock()
1000-
mock_request.data = {"field1": "new_value1", "new_field2": "new_value2"}
1001-
mock_request.user = self.test_user_1
1002-
1003-
mock_get_schema.return_value = self.fake_schema
1004-
1005-
mock_localize_message.side_effect = (
1006-
lambda context, msg_id, data: f"Error while saving the resource: {data['exc']}"
1007-
)
1008-
1009-
# Mock save method with an exception
1010-
self.resource.save = MagicMock(side_effect=Exception("Error during the resource save"))
1011-
1012-
with patch.dict(metadata_manager.handlers, self.fake_handlers, clear=True):
1013-
1014-
self.handler1.update_resource.side_effect = None
1015-
self.handler2.update_resource.side_effect = None
1016-
self.handler3.update_resource.side_effect = None
1017-
1018-
# Call the method under test
1019-
errors = metadata_manager.update_schema_instance(self.resource, mock_request)
1020-
1021-
# Assert that update_resource was called for each handler
1022-
self.handler1.update_resource.assert_called()
1023-
self.handler2.update_resource.assert_called()
1024-
self.handler3.update_resource.assert_called()
1025-
1026-
# Assert that save raised an error and was recorded
1027-
self.resource.save.assert_called_once()
1028-
self.assertIn("__errors", errors)
1029-
self.assertEqual(errors["__errors"], ["Error while saving the resource: Error during the resource save"])

0 commit comments

Comments
 (0)