From 8e09e25c7918e9506a51e1e62e86ed6969edfa95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Wr=C3=B3bel?= Date: Sun, 17 Mar 2019 18:38:57 -0400 Subject: [PATCH 1/3] Fix pointer used by Http404 exception. --- example/tests/test_model_viewsets.py | 18 ++++++++++++++++++ rest_framework_json_api/utils.py | 7 +++++++ 2 files changed, 25 insertions(+) diff --git a/example/tests/test_model_viewsets.py b/example/tests/test_model_viewsets.py index 185ebcdc..6f2554fa 100644 --- a/example/tests/test_model_viewsets.py +++ b/example/tests/test_model_viewsets.py @@ -212,6 +212,24 @@ def test_key_in_post(self): get_user_model().objects.get(pk=self.miles.pk).email, 'miles@trumpet.org') + def test_404_error_pointer(self): + """ + Ensure 404 uses '/data' pointer + """ + self.client.login(username='miles', password='pw') + not_found_url = reverse('user-detail', kwargs={'pk': 12345}) + errors = { + 'errors': [ + {'detail': 'Not found.', 'status': '404'} + ] + } + + with override_settings(JSON_API_FORMAT_FIELD_NAMES='dasherize'): + response = self.client.get(not_found_url) + + assert 404 == response.status_code + assert errors == response.json() + @pytest.mark.django_db def test_patch_allow_field_type(author, author_type_factory, client): diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index 600bf358..ff299772 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -11,6 +11,7 @@ ManyToManyDescriptor, ReverseManyToOneDescriptor ) +from django.http import Http404 from django.utils import encoding from django.utils.module_loading import import_string as import_class_from_dotted_path from django.utils.translation import ugettext_lazy as _ @@ -405,6 +406,12 @@ def format_drf_errors(response, context, exc): # see if they passed a dictionary to ValidationError manually if isinstance(error, dict): errors.append(error) + elif isinstance(exc, Http404) and isinstance(error, str): + # 404 errors don't have a pointer + errors.append({ + 'detail': error, + 'status': encoding.force_text(response.status_code), + }) elif isinstance(error, str): classes = inspect.getmembers(exceptions, inspect.isclass) # DRF sets the `field` to 'detail' for its own exceptions From 9b96011ef105e5354d9d71b9546abe3bf26ae002 Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Fri, 9 Aug 2019 22:43:40 +0200 Subject: [PATCH 2/3] Remove not needed overwriting of settings --- example/tests/test_model_viewsets.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/example/tests/test_model_viewsets.py b/example/tests/test_model_viewsets.py index 6f2554fa..1fe191c1 100644 --- a/example/tests/test_model_viewsets.py +++ b/example/tests/test_model_viewsets.py @@ -213,9 +213,6 @@ def test_key_in_post(self): 'miles@trumpet.org') def test_404_error_pointer(self): - """ - Ensure 404 uses '/data' pointer - """ self.client.login(username='miles', password='pw') not_found_url = reverse('user-detail', kwargs={'pk': 12345}) errors = { @@ -224,9 +221,7 @@ def test_404_error_pointer(self): ] } - with override_settings(JSON_API_FORMAT_FIELD_NAMES='dasherize'): - response = self.client.get(not_found_url) - + response = self.client.get(not_found_url) assert 404 == response.status_code assert errors == response.json() From 061ffd571e8849e9d787b839f428cb29b06a715b Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Fri, 9 Aug 2019 22:43:47 +0200 Subject: [PATCH 3/3] Add changelog entry --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e0c83dd..53778252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,11 @@ any parts of the framework not mentioned in the documentation should generally b * Removed support for Django REST Framework <=3.8. * Removed support for Django 2.0. +### Fixed + +* Avoid printing invalid pointer when api returns 404 + + ## [2.8.0] - 2019-06-13 This is the last release supporting Python 2.7, Python 3.4, Django Filter 1.1, Django REST Framework <=3.8 and Django 2.0.