Skip to content

Commit 38d09d6

Browse files
authored
[Fixes #12998] Metadata editor: improve return info when updating data (#13004)
1 parent 9ec0e00 commit 38d09d6

File tree

3 files changed

+44
-9
lines changed

3 files changed

+44
-9
lines changed

geonode/metadata/api/views.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from geonode.base.utils import remove_country_from_languagecode
3939
from geonode.base.views import LinkedResourcesAutocomplete, RegionAutocomplete, HierarchicalKeywordAutocomplete
4040
from geonode.groups.models import GroupProfile
41+
from geonode.metadata.i18n import get_localized_label
4142
from geonode.metadata.manager import metadata_manager
4243
from geonode.people.utils import get_available_users
4344

@@ -96,32 +97,35 @@ def schema(self, request, pk=None):
9697
def schema_instance(self, request, pk=None):
9798
try:
9899
resource = ResourceBase.objects.get(pk=pk)
100+
lang = request.query_params.get("lang", get_language_from_request(request)[:2])
99101

100102
if request.method == "GET":
101-
lang = request.query_params.get("lang", get_language_from_request(request)[:2])
102103
schema_instance = metadata_manager.build_schema_instance(resource, lang)
103104
return JsonResponse(
104105
schema_instance, content_type="application/schema-instance+json", json_dumps_params={"indent": 3}
105106
)
106107

107-
elif request.method in ("PUT"):
108+
elif request.method == "PUT":
108109
logger.debug(f"handling request {request.method}")
109110
# try:
110111
# logger.debug(f"handling content {json.dumps(request.data, indent=3)}")
111112
# except Exception as e:
112113
# logger.warning(f"Can't parse JSON {request.data}: {e}")
113114
errors = metadata_manager.update_schema_instance(resource, request.data)
114115

116+
msg_t = (
117+
("m_metadata_update_error", "Some errors were found while updating the resource")
118+
if errors
119+
else ("m_metadata_update_ok", "The resource was updated successfully")
120+
)
121+
msg = get_localized_label(lang, msg_t[0]) or msg_t[1]
122+
115123
response = {
116-
"message": (
117-
"Some errors were found while updating the resource"
118-
if errors
119-
else "The resource was updated successfully"
120-
),
124+
"message": msg,
121125
"extraErrors": errors,
122126
}
123127

124-
return Response(response, status=400 if errors else 200)
128+
return Response(response, status=422 if errors else 200)
125129

126130
except ResourceBase.DoesNotExist:
127131
result = {"message": "The dataset was not found"}

geonode/metadata/i18n.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from django.db import connection
44

5+
from geonode.base.models import ThesaurusKeywordLabel
6+
57
logger = logging.getLogger(__name__)
68

79
I18N_THESAURUS_IDENTIFIER = "labels-i18n"
@@ -54,3 +56,13 @@ def get_localized_tkeywords(lang, thesaurus_identifier: str):
5456

5557
def get_localized_labels(lang, key="about"):
5658
return {i[key]: i["label"] for i in get_localized_tkeywords(lang, I18N_THESAURUS_IDENTIFIER)}
59+
60+
61+
def get_localized_label(lang, about):
62+
return (
63+
ThesaurusKeywordLabel.objects.filter(
64+
keyword__thesaurus__identifier=I18N_THESAURUS_IDENTIFIER, keyword__about=about, lang=lang
65+
)
66+
.values_list("label", flat=True)
67+
.first()
68+
)

geonode/metadata/tests/tests.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,32 @@ def test_put_patch_schema_instance_with_errors(self, mock_has_permission, mock_u
245245
mock_update_schema_instance.return_value = errors
246246

247247
response = self.client.put(url, data=fake_payload, format="json")
248-
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
248+
self.assertEqual(response.status_code, status.HTTP_422_UNPROCESSABLE_ENTITY)
249249
self.assertJSONEqual(
250250
response.content,
251251
{"message": "Some errors were found while updating the resource", "extraErrors": errors},
252252
)
253253
mock_update_schema_instance.assert_called_with(self.resource, fake_payload)
254254

255+
@patch("geonode.metadata.manager.metadata_manager.update_schema_instance")
256+
@patch("geonode.base.api.permissions.UserHasPerms.has_permission", return_value=True)
257+
def test_put_patch_schema_instance_with_bad_payload(self, mock_has_permission, mock_update_schema_instance):
258+
"""
259+
Test the PUT method with an invalid json payload
260+
"""
261+
262+
url = reverse("metadata-schema_instance", kwargs={"pk": self.resource.pk})
263+
fake_payload = "I_AM_BAD"
264+
265+
# Set fake errors
266+
errors = {"fake_error_1": "Field 'title' is required", "fake_error_2": "Invalid value for 'type'"}
267+
mock_update_schema_instance.return_value = errors
268+
269+
response = self.client.put(url, data=fake_payload, format="json")
270+
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
271+
272+
mock_update_schema_instance.assert_called_with(self.resource, fake_payload)
273+
255274
@patch("geonode.base.api.permissions.UserHasPerms.has_permission", return_value=True)
256275
def test_resource_not_found(self, mock_has_permission):
257276
"""

0 commit comments

Comments
 (0)