Skip to content

Commit 20c7fb5

Browse files
committed
Merge branch 'develop' of github.com:django-json-api/django-rest-framework-json-api into feature/parsers
2 parents 854a8e0 + a4ae22c commit 20c7fb5

File tree

4 files changed

+24
-12
lines changed

4 files changed

+24
-12
lines changed

requirements-development.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-e .
2-
pytest
2+
pytest==2.7.2
33
pytest-django
44
pytest-factoryboy
55
tox

rest_framework_json_api/exceptions.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from django.utils import encoding
1+
import inspect
2+
from django.utils import six, encoding
23
from django.utils.translation import ugettext_lazy as _
3-
from rest_framework import status
4-
from rest_framework.exceptions import APIException
4+
from rest_framework import status, exceptions
55
from rest_framework.views import exception_handler as drf_exception_handler
66

77
from rest_framework_json_api.utils import format_value
@@ -32,11 +32,17 @@ def exception_handler(exc, context):
3232
# see if they passed a dictionary to ValidationError manually
3333
if isinstance(error, dict):
3434
errors.append(error)
35-
# or a string in case of AuthenticationError
36-
elif isinstance(error, str):
37-
# An error MUST be a JSON object in JSON API spec
35+
elif isinstance(error, six.string_types):
36+
classes = inspect.getmembers(exceptions, inspect.isclass)
37+
# DRF sets the `field` to 'detail' for its own exceptions
38+
if isinstance(exc, tuple(x[1] for x in classes)):
39+
pointer = '/data'
3840
errors.append({
39-
'detail': error
41+
'detail': error,
42+
'source': {
43+
'pointer': pointer,
44+
},
45+
'status': encoding.force_text(response.status_code),
4046
})
4147
elif isinstance(error, list):
4248
for message in error:
@@ -49,7 +55,7 @@ def exception_handler(exc, context):
4955
})
5056
else:
5157
errors.append({
52-
'detail': message,
58+
'detail': error,
5359
'source': {
5460
'pointer': pointer,
5561
},
@@ -62,6 +68,7 @@ def exception_handler(exc, context):
6268
return response
6369

6470

65-
class Conflict(APIException):
71+
class Conflict(exceptions.APIException):
6672
status_code = status.HTTP_409_CONFLICT
6773
default_detail = _('Conflict.')
74+

rest_framework_json_api/metadata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ def get_field_info(self, field, serializer):
8686
else:
8787
field_info['type'] = self.type_lookup[field]
8888

89-
serializer_model = getattr(serializer.Meta, 'model')
9089
try:
90+
serializer_model = getattr(serializer.Meta, 'model')
9191
field_info['relationship_type'] = self.relation_type_lookup[getattr(serializer_model, field.field_name)]
9292
except KeyError:
9393
pass

rest_framework_json_api/renderers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,12 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
9999
if isinstance(data, dict) and data.get('links'):
100100
render_data['links'] = data.get('links')
101101

102-
render_data['data'] = json_api_data
102+
# format the api root link list
103+
if view.__class__ and view.__class__.__name__ == 'APIRoot':
104+
render_data['data'] = None
105+
render_data['links'] = json_api_data
106+
else:
107+
render_data['data'] = json_api_data
103108

104109
if len(json_api_included) > 0:
105110
# Iterate through compound documents to remove duplicates

0 commit comments

Comments
 (0)