Skip to content

Commit 0fc8bb0

Browse files
committed
Merge branch 'develop' of github.com:django-json-api/django-rest-framework-json-api into feature/parsers
2 parents d47d0af + 36b3a1b commit 0fc8bb0

File tree

4 files changed

+47
-24
lines changed

4 files changed

+47
-24
lines changed

docs/usage.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ JSON_API_FORMAT_KEYS = 'dasherize'
6969
Possible values:
7070

7171
* dasherize
72-
* camelize
72+
* camelize (first letter is lowercase)
73+
* capitalize (camelize but with first letter uppercase)
7374
* underscore
74-
* pluralize
7575

7676
Note: due to the way the inflector works `address_1` can camelize to `address1`
7777
on output but it cannot convert `address1` back to `address_1` on POST or PUT. Keep

example/tests/test_format_keys.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def test_camelization(self):
3737
expected = {
3838
'data': [
3939
{
40-
'type': 'Users',
40+
'type': 'users',
4141
'id': encoding.force_text(user.pk),
4242
'attributes': {
4343
'firstName': user.first_name,

example/tests/test_utils.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22

3+
from django.conf import settings
34
from django.contrib.auth import get_user_model
45
from rest_framework import serializers
56
from rest_framework.response import Response
@@ -8,7 +9,7 @@
89

910
pytestmark = pytest.mark.django_db
1011

11-
class Resource(APIView):
12+
class ResourceView(APIView):
1213
pass
1314

1415
class ResourceSerializer(serializers.ModelSerializer):
@@ -17,9 +18,15 @@ class Meta():
1718
model = get_user_model()
1819

1920
def test_get_resource_name():
20-
view = Resource()
21+
view = ResourceView()
2122
context = {'view': view}
22-
assert 'resources' == utils.get_resource_name(context), 'derived from view'
23+
setattr(settings, 'JSON_API_FORMAT_KEYS', None)
24+
assert 'ResourceViews' == utils.get_resource_name(context), 'not formatted'
25+
26+
view = ResourceView()
27+
context = {'view': view}
28+
setattr(settings, 'JSON_API_FORMAT_KEYS', 'dasherize')
29+
assert 'resource-views' == utils.get_resource_name(context), 'derived from view'
2330

2431
view.model = get_user_model()
2532
assert 'users' == utils.get_resource_name(context), 'derived from view model'
@@ -33,7 +40,7 @@ def test_get_resource_name():
3340
view.response = Response(status=500)
3441
assert 'errors' == utils.get_resource_name(context), 'handles 500 error'
3542

36-
view = Resource()
43+
view = ResourceView()
3744
context = {'view': view}
3845
view.serializer_class = ResourceSerializer
3946
assert 'users' == utils.get_resource_name(context), 'derived from serializer'
@@ -50,6 +57,9 @@ def test_format_keys():
5057
output = {'firstName': 'a', 'lastName': 'b'}
5158
assert utils.format_keys(underscored, 'camelize') == output
5259

60+
output = {'FirstName': 'a', 'LastName': 'b'}
61+
assert utils.format_keys(underscored, 'capitalize') == output
62+
5363
output = {'first-name': 'a', 'last-name': 'b'}
5464
assert utils.format_keys(underscored, 'dasherize') == output
5565

@@ -60,12 +70,14 @@ def test_format_keys():
6070
assert utils.format_keys([underscored], 'dasherize') == output
6171

6272
def test_format_value():
63-
assert utils.format_value('first_name', 'camelize') == 'FirstName'
73+
assert utils.format_value('first_name', 'camelize') == 'firstName'
74+
assert utils.format_value('first_name', 'capitalize') == 'FirstName'
6475
assert utils.format_value('first_name', 'dasherize') == 'first-name'
6576
assert utils.format_value('first-name', 'underscore') == 'first_name'
6677

6778
def test_format_relation_name():
68-
assert utils.format_relation_name('first_name', 'camelize') == 'FirstNames'
79+
assert utils.format_relation_name('first_name', 'capitalize') == 'FirstNames'
80+
assert utils.format_relation_name('first_name', 'camelize') == 'firstNames'
6981

7082
def test_build_json_resource_obj():
7183
resource = {

rest_framework_json_api/utils.py

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ def get_resource_name(context):
6767
if not isinstance(resource_name, six.string_types):
6868
return resource_name
6969

70-
resource_name = inflection.pluralize(resource_name.lower())
71-
7270
resource_name = format_value(resource_name)
7371

72+
resource_name = inflection.pluralize(resource_name)
73+
7474
return resource_name
7575

7676

@@ -91,17 +91,22 @@ def format_keys(obj, format_type=None):
9191
if format_type is None:
9292
format_type = getattr(settings, 'JSON_API_FORMAT_KEYS', False)
9393

94-
if format_type in ('dasherize', 'camelize', 'underscore'):
94+
if format_type in ('dasherize', 'camelize', 'underscore', 'capitalize'):
9595

9696
if isinstance(obj, dict):
9797
formatted = OrderedDict()
9898
for key, value in obj.items():
9999
if format_type == 'dasherize':
100+
# inflection can't dasherize camelCase
101+
key = inflection.underscore(key)
100102
formatted[inflection.dasherize(key)] \
101103
= format_keys(value, format_type)
102104
elif format_type == 'camelize':
103105
formatted[inflection.camelize(key, False)] \
104106
= format_keys(value, format_type)
107+
elif format_type == 'capitalize':
108+
formatted[inflection.camelize(key)] \
109+
= format_keys(value, format_type)
105110
elif format_type == 'underscore':
106111
formatted[inflection.underscore(key)] \
107112
= format_keys(value, format_type)
@@ -118,8 +123,12 @@ def format_value(value, format_type=None):
118123
if format_type is None:
119124
format_type = getattr(settings, 'JSON_API_FORMAT_KEYS', False)
120125
if format_type == 'dasherize':
126+
# inflection can't dasherize camelCase
127+
value = inflection.underscore(value)
121128
value = inflection.dasherize(value)
122129
elif format_type == 'camelize':
130+
value = inflection.camelize(value, False)
131+
elif format_type == 'capitalize':
123132
value = inflection.camelize(value)
124133
elif format_type == 'underscore':
125134
value = inflection.underscore(value)
@@ -130,6 +139,9 @@ def format_relation_name(value, format_type=None):
130139
if format_type is None:
131140
format_type = getattr(settings, 'JSON_API_FORMAT_RELATION_KEYS', False)
132141

142+
if not format_type:
143+
return value
144+
133145
# format_type will never be None here so we can use format_value
134146
value = format_value(value, format_type)
135147

@@ -153,7 +165,9 @@ def build_json_resource_obj(fields, resource, resource_instance, resource_name):
153165

154166

155167
def get_related_resource_type(relation):
156-
if hasattr(relation, 'get_queryset') and relation.get_queryset() is not None:
168+
if hasattr(relation, '_meta'):
169+
relation_model = relation._meta.model
170+
elif hasattr(relation, 'get_queryset') and relation.get_queryset() is not None:
157171
relation_model = relation.get_queryset().model
158172
else:
159173
parent_serializer = relation.parent
@@ -265,11 +279,10 @@ def extract_relationships(fields, resource, resource_instance):
265279

266280
if isinstance(field, ManyRelatedField):
267281
relation_data = list()
268-
related_object = field.child_relation
269-
relation_type = get_related_resource_type(related_object)
270282
for related_object in relation_instance_or_manager.all():
283+
related_object_type = get_related_resource_type(related_object)
271284
relation_data.append(OrderedDict([
272-
('type', relation_type),
285+
('type', related_object_type),
273286
('id', encoding.force_text(related_object.pk))
274287
]))
275288
data.update({
@@ -284,20 +297,18 @@ def extract_relationships(fields, resource, resource_instance):
284297

285298
if isinstance(field, ListSerializer):
286299
relation_data = list()
287-
serializer = field.child
288-
relation_model = serializer.Meta.model
289-
relation_type = format_relation_name(relation_model.__name__)
290300

291301
serializer_data = resource.get(field_name)
292302
resource_instance_queryset = relation_instance_or_manager.all()
293303
if isinstance(serializer_data, list):
294304
for position in range(len(serializer_data)):
295305
nested_resource_instance = resource_instance_queryset[position]
296-
relation_data.append(
297-
OrderedDict(
298-
[('type', relation_type), ('id', encoding.force_text(nested_resource_instance.pk))]
299-
)
300-
)
306+
nested_resource_instance_type = get_related_resource_type(
307+
nested_resource_instance)
308+
relation_data.append(OrderedDict([
309+
('type', nested_resource_instance_type),
310+
('id', encoding.force_text(nested_resource_instance.pk))
311+
]))
301312

302313
data.update({field_name: {'data': relation_data}})
303314
continue

0 commit comments

Comments
 (0)