Skip to content

Commit 3732dc1

Browse files
committed
Merge branch 'develop'
2 parents baa0815 + 0d9a4cf commit 3732dc1

12 files changed

+302
-106
lines changed

README.rst

+58-5
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ Rest Framework.
9494
Settings
9595
^^^^^^^^
9696

97-
One can either add ``rest_framework_ember.parsers.EmberJSONParser`` and
97+
One can either add ``rest_framework_ember.parsers.JSONParser`` and
9898
``rest_framework_ember.renderers.JSONRenderer`` to each ``ViewSet`` class, or
9999
override ``settings.REST_FRAMEWORK``::
100100

@@ -104,9 +104,9 @@ override ``settings.REST_FRAMEWORK``::
104104
'PAGINATE_BY_PARAM': 'page_size',
105105
'MAX_PAGINATE_BY': 100,
106106
'DEFAULT_PAGINATION_SERIALIZER_CLASS':
107-
'rest_framework_ember.pagination.EmberPaginationSerializer',
107+
'rest_framework_ember.pagination.PaginationSerializer',
108108
'DEFAULT_PARSER_CLASSES': (
109-
'rest_framework_ember.parsers.EmberJSONParser',
109+
'rest_framework_ember.parsers.JSONParser',
110110
'rest_framework.parsers.FormParser',
111111
'rest_framework.parsers.MultiPartParser'
112112
),
@@ -116,8 +116,6 @@ override ``settings.REST_FRAMEWORK``::
116116
),
117117
}
118118

119-
120-
121119
If ``PAGINATE_BY`` is set the renderer will return a ``meta`` object with
122120
record count and the next and previous links. Django Rest Framework looks
123121
for the ``page`` GET parameter by default allowing you to make requests for
@@ -141,6 +139,61 @@ the ``resource_name`` property is required on the class::
141139
permission_classes = (permissions.IsAuthenticated, )
142140

143141

142+
Ember Data <-> Rest Framework Format Conversion
143+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
144+
*(camelization/underscore/pluralize)*
145+
146+
This package includes the optional ability to automatically convert json requests
147+
and responses from the Ember Data camelCase to python/rest_framework's preferred
148+
underscore. Additionally resource names can be pluralized if more than one object
149+
is included in a serialized response as Ember Data expects. To hook this up,
150+
include the following in your project settings::
151+
152+
REST_EMBER_FORMAT_KEYS = True
153+
REST_EMBER_PLURALIZE_KEYS = True
154+
155+
156+
Example - Without format conversion::
157+
158+
{
159+
"identity": [
160+
{
161+
"id": 1,
162+
"username": "john",
163+
"first_name": "John",
164+
"last_name": "Coltrane"
165+
},
166+
{
167+
"id": 2,
168+
"username": "frodo",
169+
"first_name": "Bilbo",
170+
"last_name": "Baggins"
171+
},
172+
],
173+
...
174+
}
175+
176+
Example - With format conversion::
177+
178+
{
179+
"identities": [
180+
{
181+
"id": 1,
182+
"username": "john",
183+
"firstName": "John",
184+
"lastName": "Coltrane"
185+
},
186+
{
187+
"id": 2,
188+
"username": "frodo",
189+
"firstName": "Bilbo",
190+
"lastName": "Baggins"
191+
},
192+
],
193+
...
194+
}
195+
196+
144197
Managing the trailing slash
145198
^^^^^^^^^^^^^^^^^^^^^^^^^^^
146199

example/api/api.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,15 @@ class UserEmber(User):
6262
resource_name = 'data'
6363

6464
renderer_classes = (renderers.JSONRenderer, )
65-
parser_classes = (parsers.EmberJSONParser, )
65+
parser_classes = (parsers.JSONParser, )
6666

6767

6868
class EmberUserModelViewSet(viewsets.ModelViewSet):
69-
model = auth_models.User
69+
queryset = auth_models.User.objects.all()
7070
serializer_class = IdentitySerializer
7171
allowed_methods = ['GET', 'POST', 'PUT', ]
7272
renderer_classes = (renderers.JSONRenderer, )
73-
parser_classes = (parsers.EmberJSONParser, )
73+
parser_classes = (parsers.JSONParser, )
7474

7575

7676
class MultipleIDMixinUserModelViewSet(mixins.MultipleIDMixin,

example/settings.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@
3838
'PAGINATE_BY_PARAM': 'page_size',
3939
'MAX_PAGINATE_BY': 100,
4040
'DEFAULT_PAGINATION_SERIALIZER_CLASS':
41-
'rest_framework_ember.pagination.EmberPaginationSerializer',
41+
'rest_framework_ember.pagination.PaginationSerializer',
4242
'DEFAULT_PARSER_CLASSES': (
43-
# 'rest_framework_ember.parsers.EmberJSONParser',
43+
# 'rest_framework_ember.parsers.JSONParser',
4444
'rest_framework.parsers.FormParser',
4545
'rest_framework.parsers.MultiPartParser'
4646
),
@@ -49,7 +49,6 @@
4949
'rest_framework.renderers.JSONRenderer',
5050
'rest_framework.renderers.BrowsableAPIRenderer',
5151
),
52-
'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',
5352
}
5453

5554

example/tests/test_format_keys.py

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import json
2+
3+
from example.tests import TestBase
4+
5+
from django.contrib.auth import get_user_model
6+
from django.core.urlresolvers import reverse, reverse_lazy
7+
from django.conf import settings
8+
9+
10+
class FormatKeysSetTests(TestBase):
11+
"""
12+
Test that camelization and underscoring of key names works if they are activated.
13+
"""
14+
list_url = reverse_lazy('user-list')
15+
16+
def setUp(self):
17+
super(FormatKeysSetTests, self).setUp()
18+
self.detail_url = reverse('user-detail', kwargs={'pk': self.miles.pk})
19+
20+
# Set the format keys settings.
21+
setattr(settings, 'REST_EMBER_FORMAT_KEYS', True)
22+
setattr(settings, 'REST_EMBER_PLURALIZE_KEYS', True)
23+
24+
def tearDown(self):
25+
# Remove the format keys settings.
26+
delattr(settings, 'REST_EMBER_FORMAT_KEYS')
27+
delattr(settings, 'REST_EMBER_PLURALIZE_KEYS')
28+
29+
30+
def test_camelization(self):
31+
"""
32+
Test that camelization works.
33+
"""
34+
response = self.client.get(self.list_url)
35+
self.assertEqual(response.status_code, 200)
36+
37+
user = get_user_model().objects.all()[0]
38+
expected = {
39+
u'user': [{
40+
u'id': user.pk,
41+
u'firstName': user.first_name,
42+
u'lastName': user.last_name,
43+
u'email': user.email
44+
}]
45+
}
46+
47+
json_content = json.loads(response.content)
48+
meta = json_content.get('meta')
49+
50+
self.assertEquals(expected.get('user'), json_content.get('user'))
51+
self.assertEqual('http://testserver/user-viewset/?page=2', meta.get('nextLink'))
52+
53+
def test_pluralization(self):
54+
"""
55+
Test that the key name is pluralized.
56+
"""
57+
response = self.client.get(self.list_url, {'page_size': 2})
58+
self.assertEqual(response.status_code, 200)
59+
60+
users = get_user_model().objects.all()
61+
expected = {
62+
u'users': [{
63+
u'id': users[0].pk,
64+
u'firstName': users[0].first_name,
65+
u'lastName': users[0].last_name,
66+
u'email': users[0].email
67+
},{
68+
u'id': users[1].pk,
69+
u'firstName': users[1].first_name,
70+
u'lastName': users[1].last_name,
71+
u'email': users[1].email
72+
}]
73+
}
74+
75+
json_content = json.loads(response.content)
76+
self.assertEquals(expected.get('users'), json_content.get('users'))

example/tests/test_generic_viewset.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import json
32
from example.tests import TestBase
43
from django.core.urlresolvers import reverse
@@ -49,3 +48,4 @@ def test_ember_expected_renderer(self):
4948
}
5049
)
5150

51+

0 commit comments

Comments
 (0)