Skip to content

Commit 9851d9e

Browse files
committed
Merge pull request #5 from abarax/master
Ember Rest Adapter multi-ID support
2 parents 63a448d + 31c1984 commit 9851d9e

File tree

4 files changed

+88
-2
lines changed

4 files changed

+88
-2
lines changed

example/api/api.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from rest_framework import serializers, generics, viewsets
77
from rest_framework.response import Response
88

9-
from rest_framework_ember import renderers, parsers
9+
from rest_framework_ember import renderers, parsers, mixins
1010

1111

1212
class IdentitySerializer(serializers.ModelSerializer):
@@ -58,3 +58,5 @@ class EmberUserModelViewSet(viewsets.ModelViewSet):
5858
parser_classes = (parsers.EmberJSONParser, )
5959

6060

61+
class EmberDataMixinUserModelViewSet(mixins.EmberDataModelMixin, EmberUserModelViewSet):
62+
queryset = auth_models.User.objects.all()

example/api/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
Example app URLs
33
"""
44
from django.conf.urls import patterns, include, url
5-
from .api import User, UserEmber, EmberUserModelViewSet
5+
from .api import User, UserEmber, EmberUserModelViewSet, EmberDataMixinUserModelViewSet
66

77
from rest_framework import routers
88

99
urlpatterns = patterns('',
1010
url(r'^user-default/(?P<pk>\d+)/$', User.as_view(), name='user-default'),
1111
url(r'^user-ember/(?P<pk>\d+)/$', UserEmber.as_view(), name='user-ember'),
12+
url(r'^user-mixin-viewset/$', EmberDataMixinUserModelViewSet.as_view({'get': 'list'}),
13+
name='mixin-user-list'),
1214
url(r'^user-viewset/$', EmberUserModelViewSet.as_view({'get': 'list'}),
1315
name='user-list'),
1416
url(r'^user-viewset/(?P<pk>\d+)/$',
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
2+
3+
import json
4+
from example.tests import TestBase
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 EmberDataModelMixinTests(TestBase):
11+
"""
12+
Test usage with EmberDataModelMixin
13+
14+
[<RegexURLPattern user-list ^user-viewsets/$>, <RegexURLPattern user-detail ^user-viewsets/(?P<pk>[^/]+)/$>]
15+
"""
16+
list_url = reverse_lazy('user-list')
17+
18+
def setUp(self):
19+
super(EmberDataModelMixinTests, self).setUp()
20+
21+
def test_single_id_in_query_params(self):
22+
"""
23+
Ensure single ID in query params returns correct result
24+
"""
25+
url = '/user-mixin-viewset/?ids[]=%s' % self.miles.pk
26+
response = self.client.get(url)
27+
self.assertEqual(response.status_code, 200)
28+
29+
expected = {
30+
'user': [{
31+
'id': self.miles.pk,
32+
'first_name': self.miles.first_name,
33+
'last_name': self.miles.last_name,
34+
'email': self.miles.email
35+
}]
36+
}
37+
38+
json_content = json.loads(response.content)
39+
meta = json_content.get("meta")
40+
41+
self.assertEquals(expected.get('user'), json_content.get('user'))
42+
self.assertEquals(meta.get('count', 0), 1)
43+
self.assertEquals(meta.get("next"), None)
44+
self.assertEqual(None, meta.get("next_link"))
45+
self.assertEqual(meta.get("page"), 1)
46+
47+
def test_multiple_ids_in_query_params(self):
48+
"""
49+
Ensure multiple IDs in query params return correct result
50+
"""
51+
url = '/user-mixin-viewset/?ids[]=%s&ids[]=%s' % (self.miles.pk, self.john.pk)
52+
response = self.client.get(url)
53+
self.assertEqual(response.status_code, 200)
54+
55+
expected = {
56+
'user': [{
57+
'id': self.john.pk,
58+
'first_name': self.john.first_name,
59+
'last_name': self.john.last_name,
60+
'email': self.john.email
61+
}]
62+
}
63+
64+
json_content = json.loads(response.content)
65+
meta = json_content.get("meta")
66+
67+
self.assertEquals(expected.get('user'), json_content.get('user'))
68+
self.assertEquals(meta.get('count', 0), 2)
69+
self.assertEquals(meta.get("next"), 2)
70+
self.assertEqual('http://testserver/user-mixin-viewset/?ids%5B%5D=2&ids%5B%5D=1&page=2', meta.get("next_link"))
71+
self.assertEqual(meta.get("page"), 1)

rest_framework_ember/mixins.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
3+
class EmberDataModelMixin(object):
4+
"""
5+
Override get_queryset for multiple id support
6+
"""
7+
def get_queryset(self):
8+
ids = dict(self.request.QUERY_PARAMS).get('ids[]')
9+
if ids:
10+
self.queryset = self.queryset.filter(id__in=ids)
11+
return self.queryset

0 commit comments

Comments
 (0)