Skip to content

Commit 991914f

Browse files
committed
Moved the root object formatting to a function
1 parent aaca0a1 commit 991914f

File tree

3 files changed

+36
-34
lines changed

3 files changed

+36
-34
lines changed

example/tests/test_model_viewsets.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from example.tests import TestBase
44

55
from django.contrib.auth import get_user_model
6+
from django.utils import encoding
67
from django.core.urlresolvers import reverse
78
from django.conf import settings
89

@@ -32,7 +33,7 @@ def test_key_in_list_result(self):
3233
expected = {
3334
u'data': [{
3435
u'type': u'users',
35-
u'id': user.pk,
36+
u'id': encoding.force_text(user.pk),
3637
u'attributes': {
3738
u'first-name': user.first_name,
3839
u'last-name': user.last_name,
@@ -44,10 +45,8 @@ def test_key_in_list_result(self):
4445
json_content = json.loads(response.content.decode('utf8'))
4546
links = json_content.get('links')
4647
meta = json_content.get('meta').get('pagination')
47-
48-
self.assertEquals(sorted(expected.get('data')), sorted(
49-
json_content.get('data')))
50-
self.assertEquals(meta.get('total'), 2)
48+
self.assertEquals(expected.get('data'), json_content.get('data'))
49+
self.assertEquals(meta.get('pages'), 2)
5150
self.assertEquals(meta.get('count', 0),
5251
get_user_model().objects.count())
5352
self.assertEqual(u'http://testserver/identities?page=2',
@@ -66,7 +65,7 @@ def test_page_two_in_list_result(self):
6665
expected = {
6766
u'data': [{
6867
u'type': u'users',
69-
u'id': user.pk,
68+
u'id': encoding.force_text(user.pk),
7069
u'attributes': {
7170
u'first-name': user.first_name,
7271
u'last-name': user.last_name,
@@ -141,7 +140,7 @@ def test_key_in_detail_result(self):
141140
expected = {
142141
u'data': {
143142
u'type': u'users',
144-
u'id': self.miles.pk,
143+
u'id': encoding.force_text(self.miles.pk),
145144
u'attributes': {
146145
u'first-name': self.miles.first_name,
147146
u'last-name': self.miles.last_name,

rest_framework_json_api/renderers.py

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -66,35 +66,22 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
6666

6767
json_api_data = []
6868
for resource in results:
69-
resource_data = [
70-
('type', resource_name),
71-
('id', utils.extract_id(fields, resource)),
72-
('attributes', utils.extract_attributes(fields, resource)),
73-
('relationships', utils.extract_relationships(fields, resource)),
74-
]
75-
# Add 'self' link if field is present and valid
76-
if api_settings.URL_FIELD_NAME in resource and \
77-
isinstance(fields[api_settings.URL_FIELD_NAME], RelatedField):
78-
resource_data.append(('links', {'self': resource[api_settings.URL_FIELD_NAME]}))
79-
json_api_data.append(OrderedDict(resource_data))
69+
json_api_data.append(
70+
utils.build_root(fields, resource, resource_name))
8071
else:
81-
result_id = data.pop('id', None)
82-
json_api_data = {
83-
'type': resource_name,
84-
'id': result_id,
85-
'attributes': utils.format_keys(data),
86-
}
72+
fields = data.serializer.fields
73+
json_api_data = utils.build_root(fields, data, resource_name)
8774

88-
# remove results from the dict
89-
data.pop('results', None)
90-
if renderer_context.get('view').action == 'list':
91-
# allow top level data to be added from list views
92-
rendered_data = data
93-
else:
94-
# on detail views we don't render anything but serializer data
95-
rendered_data = {}
96-
rendered_data['data'] = json_api_data
75+
render_data = {
76+
'data': json_api_data
77+
}
78+
79+
if data.get('meta'):
80+
render_data['meta'] = data.get('meta')
81+
82+
if data.get('links'):
83+
render_data['links'] = data.get('links')
9784

9885
return super(JSONRenderer, self).render(
99-
rendered_data, accepted_media_type, renderer_context
86+
render_data, accepted_media_type, renderer_context
10087
)

rest_framework_json_api/utils.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,22 @@ def format_keys(obj, format_type=None):
115115
return obj
116116

117117

118+
def build_root(fields, resource, resource_name):
119+
resource_data = [
120+
('type', resource_name),
121+
('id', extract_id(fields, resource)),
122+
('attributes', extract_attributes(fields, resource)),
123+
]
124+
relationships = extract_relationships(fields, resource)
125+
if relationships:
126+
resource_data.append(('relationships', relationships))
127+
# Add 'self' link if field is present and valid
128+
if api_settings.URL_FIELD_NAME in resource and \
129+
isinstance(fields[api_settings.URL_FIELD_NAME], RelatedField):
130+
resource_data.append(('links', {'self': resource[api_settings.URL_FIELD_NAME]}))
131+
return OrderedDict(resource_data)
132+
133+
118134
def extract_id_from_url(url):
119135
http_prefix = url.startswith(('http:', 'https:'))
120136
if http_prefix:

0 commit comments

Comments
 (0)