Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3d7637b

Browse files
author
Oliver Sauder
committed
Preserve values from being formatted
Introduce `JSON_API_FORMAT_FIELD_NAMES` which preserves keys of values. `JSON_API_FORMAT_KEYS` still exists but is deprecated.
1 parent 028f191 commit 3d7637b

File tree

15 files changed

+144
-35
lines changed

15 files changed

+144
-35
lines changed

‎CHANGELOG.md‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
v2.5.0 - [unreleased]
22
* Add new pagination classes based on JSON:API query parameter *recommendations*:
3-
* JsonApiPageNumberPagination and JsonApiLimitOffsetPagination. See [usage docs](docs/usage.md#pagination).
4-
* Deprecates PageNumberPagination and LimitOffsetPagination.
5-
* Add ReadOnlyModelViewSet extension with prefetch mixins.
3+
* `JsonApiPageNumberPagination` and `JsonApiLimitOffsetPagination`. See [usage docs](docs/usage.md#pagination).
4+
* Deprecates `PageNumberPagination` and `LimitOffsetPagination`.
5+
* Add `ReadOnlyModelViewSet` extension with prefetch mixins.
66
* Add support for Django REST Framework 3.8.x
7+
* Introduce `JSON_API_FORMAT_FIELD_NAMES` option replacing `JSON_API_FORMAT_KEYS` but in comparision preserving
8+
values from being formatted as attributes can contain any [json value](http://jsonapi.org/format/#document-resource-object-attributes).
9+
* `JSON_API_FORMAT_KEYS` still works as before (formating all json value keys also nested) but is marked as deprecated.
710

811
v2.4.0 - Released January 25, 2018
912

‎docs/usage.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,13 @@ multiple endpoints. Setting the `resource_name` on views may result in a differe
149149

150150
### Inflecting object and relation keys
151151

152-
This package includes the ability (off by default) to automatically convert json
153-
requests and responses from the python/rest_framework's preferred underscore to
152+
This package includes the ability (off by default) to automatically convert [json
153+
api field names](http://jsonapi.org/format/#document-resource-object-fields) of requests and responses from the python/rest_framework's preferred underscore to
154154
a format of your choice. To hook this up include the following setting in your
155155
project settings:
156156

157157
``` python
158-
JSON_API_FORMAT_KEYS = 'dasherize'
158+
JSON_API_FORMAT_FIELD_NAMES = 'dasherize'
159159
```
160160

161161
Possible values:

‎example/api/resources/identity.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def posts(self, request):
3737
encoding.force_text('identities'): IdentitySerializer(identities, many=True).data,
3838
encoding.force_text('posts'): PostSerializer(posts, many=True).data,
3939
}
40-
return Response(utils.format_keys(data, format_type='camelize'))
40+
return Response(utils.format_field_names(data, format_type='camelize'))
4141

4242
@detail_route()
4343
def manual_resource_name(self, request, *args, **kwargs):

‎example/settings/dev.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565

6666
INTERNAL_IPS = ('127.0.0.1', )
6767

68-
JSON_API_FORMAT_KEYS = 'camelize'
68+
JSON_API_FORMAT_FIELD_NAMES = 'camelize'
6969
JSON_API_FORMAT_TYPES = 'camelize'
7070
REST_FRAMEWORK = {
7171
'PAGE_SIZE': 5,

‎example/settings/test.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
ROOT_URLCONF = 'example.urls_test'
1111

12-
JSON_API_FORMAT_KEYS = 'camelize'
12+
JSON_API_FIELD_NAMES = 'camelize'
1313
JSON_API_FORMAT_TYPES = 'camelize'
1414
JSON_API_PLURALIZE_TYPES = True
1515
REST_FRAMEWORK.update({

‎example/tests/test_generic_viewset.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from example.tests import TestBase
55

66

7-
@override_settings(JSON_API_FORMAT_KEYS='dasherize')
7+
@override_settings(JSON_API_FORMAT_FIELD_NAMES='dasherize')
88
class GenericViewSet(TestBase):
99
"""
1010
Test expected responses coming from a Generic ViewSet

‎example/tests/test_model_viewsets.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from example.tests import TestBase
88

99

10-
@override_settings(JSON_API_FORMAT_KEYS='dasherize')
10+
@override_settings(JSON_API_FORMAT_FIELD_NAMES='dasherize')
1111
class ModelViewSetTests(TestBase):
1212
"""
1313
Test usage with ModelViewSets, also tests pluralization, camelization,

‎example/tests/test_parsers.py‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
from io import BytesIO
33

4-
from django.test import TestCase
4+
from django.test import TestCase, override_settings
55
from rest_framework.exceptions import ParseError
66

77
from rest_framework_json_api.parsers import JSONParser
@@ -22,7 +22,10 @@ def __init__(self):
2222
data = {
2323
'data': {
2424
'id': 123,
25-
'type': 'Blog'
25+
'type': 'Blog',
26+
'attributes': {
27+
'json-value': {'JsonKey': 'JsonValue'}
28+
},
2629
},
2730
'meta': {
2831
'random_key': 'random_value'
@@ -31,13 +34,25 @@ def __init__(self):
3134

3235
self.string = json.dumps(data)
3336

34-
def test_parse_include_metadata(self):
37+
@override_settings(JSON_API_FORMAT_KEYS='camelize')
38+
def test_parse_include_metadata_format_keys(self):
3539
parser = JSONParser()
3640

3741
stream = BytesIO(self.string.encode('utf-8'))
3842
data = parser.parse(stream, None, self.parser_context)
3943

4044
self.assertEqual(data['_meta'], {'random_key': 'random_value'})
45+
self.assertEqual(data['json_value'], {'json_key': 'JsonValue'})
46+
47+
@override_settings(JSON_API_FORMAT_FIELD_NAMES='dasherize')
48+
def test_parse_include_metadata_format_field_names(self):
49+
parser = JSONParser()
50+
51+
stream = BytesIO(self.string.encode('utf-8'))
52+
data = parser.parse(stream, None, self.parser_context)
53+
54+
self.assertEqual(data['_meta'], {'random_key': 'random_value'})
55+
self.assertEqual(data['json_value'], {'JsonKey': 'JsonValue'})
4156

4257
def test_parse_invalid_data(self):
4358
parser = JSONParser()

‎example/tests/unit/test_renderers.py‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import json
2+
13
from rest_framework_json_api import serializers, views
24
from rest_framework_json_api.renderers import JSONRenderer
35

@@ -19,9 +21,14 @@ class DummyTestSerializer(serializers.ModelSerializer):
1921
related_models = RelatedModelSerializer(
2022
source='comments', many=True, read_only=True)
2123

24+
json_field = serializers.SerializerMethodField()
25+
26+
def get_json_field(self, entry):
27+
return {'JsonKey': 'JsonValue'}
28+
2229
class Meta:
2330
model = Entry
24-
fields = ('related_models',)
31+
fields = ('related_models','json_field')
2532

2633
class JSONAPIMeta:
2734
included_resources = ('related_models',)
@@ -61,3 +68,22 @@ def test_simple_reverse_relation_included_read_only_viewset():
6168
ReadOnlyDummyTestViewSet)
6269

6370
assert rendered
71+
72+
73+
def test_render_format_field_names(settings):
74+
"""Test that json field is kept untouched."""
75+
settings.JSON_API_FORMAT_FIELD_NAMES = 'dasherize'
76+
rendered = render_dummy_test_serialized_view(DummyTestViewSet)
77+
78+
result = json.loads(rendered.decode())
79+
assert result['data']['attributes']['json-field'] == {'JsonKey': 'JsonValue'}
80+
81+
82+
def test_render_format_keys(settings):
83+
"""Test that json field value keys are formated."""
84+
delattr(settings, 'JSON_API_FORMAT_FILED_NAMES')
85+
settings.JSON_API_FORMAT_KEYS = 'dasherize'
86+
rendered = render_dummy_test_serialized_view(DummyTestViewSet)
87+
88+
result = json.loads(rendered.decode())
89+
assert result['data']['attributes']['json-field'] == {'json-key': 'JsonValue'}

‎example/tests/unit/test_settings.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ def test_settings_default():
1313

1414

1515
def test_settings_override(settings):
16-
settings.JSON_API_FORMAT_KEYS = 'dasherize'
17-
assert json_api_settings.FORMAT_KEYS == 'dasherize'
16+
settings.JSON_API_FORMAT_FIELD_NAMES = 'dasherize'
17+
assert json_api_settings.FORMAT_FIELD_NAMES == 'dasherize'

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /