Skip to content

Commit 6a35b17

Browse files
committed
Merge branch 'master' of github.com:ngenworks/rest_framework_ember
2 parents 9891dab + 97431a3 commit 6a35b17

File tree

10 files changed

+218
-1
lines changed

10 files changed

+218
-1
lines changed

.travis.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
language: python
2+
python:
3+
- "2.7"
4+
install:
5+
- pip install -e .
6+
script: django-admin.py test --settings=example.settings
7+

README.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
Ember Data and Django Rest Framework
33
===============================
44

5+
.. image:: https://travis-ci.org/ngenworks/rest_framework_ember.svg?branch=master
6+
:target: https://travis-ci.org/ngenworks/rest_framework_ember
7+
58
The default Ember Data REST Adapter conventions differ from the default
69
Django Rest Framework JSON request and response format. Instead of adding
710
a Django specific adapter to Ember Data we use this adapter in Django to

example/__init__.py

Whitespace-only changes.

example/api/__init__.py

Whitespace-only changes.

example/api/api.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""
2+
Test Serializer and Resource
3+
"""
4+
from django.contrib.auth import models as auth_models
5+
6+
from rest_framework import serializers, generics
7+
from rest_framework.response import Response
8+
9+
from rest_framework_ember import renderers, parsers
10+
11+
12+
class IdentitySerializer(serializers.ModelSerializer):
13+
"""
14+
Identity Serializer
15+
"""
16+
class Meta:
17+
model = auth_models.User
18+
fields = (
19+
'id', 'first_name', 'last_name', 'email', )
20+
21+
22+
class User(generics.GenericAPIView):
23+
"""
24+
Current user's identity endpoint.
25+
26+
GET /me
27+
"""
28+
serializer_class = IdentitySerializer
29+
allowed_methods = ['GET']
30+
31+
def get_queryset(self):
32+
return auth_models.User.objects.all()
33+
34+
def get(self, request, pk=None):
35+
"""
36+
GET request
37+
"""
38+
obj = self.get_object()
39+
serializer = self.serializer_class(obj)
40+
return Response(serializer.data)
41+
42+
43+
class UserEmber(User):
44+
"""
45+
Use the rest_framework_ember Renderer/Parser
46+
"""
47+
resource_name = 'data'
48+
49+
renderer_classes = (renderers.JSONRenderer, )
50+
parser_classes = (parsers.EmberJSONParser, )
51+

example/api/urls.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"""
2+
Example app URLs
3+
"""
4+
from django.conf.urls import patterns, include, url
5+
from .api import User, UserEmber
6+
7+
urlpatterns = patterns('',
8+
url(r'^user-default/(?P<pk>\d+)/$', User.as_view(), name='user-default'),
9+
url(r'^user-ember/(?P<pk>\d+)/$', UserEmber.as_view(), name='user-ember'),
10+
11+
)
12+

example/settings.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import os
2+
3+
SITE_ID = 1
4+
5+
MEDIA_ROOT = os.path.normcase(os.path.dirname(os.path.abspath(__file__)))
6+
MEDIA_URL = '/media/'
7+
8+
DATABASE_ENGINE = 'sqlite3'
9+
10+
DATABASES = {
11+
'default': {
12+
'ENGINE': 'django.db.backends.sqlite3',
13+
'NAME': ':memory:',
14+
}
15+
}
16+
17+
INSTALLED_APPS = [
18+
'django.contrib.contenttypes',
19+
'django.contrib.sites',
20+
'django.contrib.auth',
21+
'django.contrib.admin',
22+
'rest_framework',
23+
'example.api',
24+
]
25+
26+
ROOT_URLCONF = 'example.api.urls'
27+
28+
SECRET_KEY = 'abc123'
29+
30+
PASSWORD_HASHERS = ('django.contrib.auth.hashers.UnsaltedMD5PasswordHasher', )
31+
32+
33+
REST_FRAMEWORK = {
34+
'DEFAULT_PARSER_CLASSES': (
35+
# 'rest_framework_ember.parsers.EmberJSONParser',
36+
'rest_framework.parsers.FormParser',
37+
'rest_framework.parsers.MultiPartParser'
38+
),
39+
'DEFAULT_RENDERER_CLASSES': (
40+
# 'rest_framework_ember.renderers.JSONRenderer',
41+
'rest_framework.renderers.JSONRenderer',
42+
'rest_framework.renderers.BrowsableAPIRenderer',
43+
),
44+
'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',
45+
}
46+
47+
48+

example/tests/__init__.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
from django.contrib.auth import get_user_model
3+
from rest_framework.test import APITestCase
4+
5+
6+
class TestBase(APITestCase):
7+
"""
8+
Test base class to setup a couple users.
9+
"""
10+
def setUp(self):
11+
"""
12+
Create those users
13+
"""
14+
super(TestBase, self).setUp()
15+
self.create_users()
16+
17+
def create_user(self, username, email, password="pw",
18+
first_name='', last_name=''):
19+
"""
20+
Helper method to create a user
21+
"""
22+
User = get_user_model()
23+
24+
user = User.objects.create_user(
25+
username, email, password=password
26+
)
27+
if first_name or last_name:
28+
user.first_name = first_name
29+
user.last_name = last_name
30+
user.save()
31+
return user
32+
33+
def create_users(self):
34+
"""
35+
Create a couple users
36+
"""
37+
self.john = self.create_user(
38+
'trane', '[email protected]',
39+
first_name='John', last_name="Coltrane")
40+
self.miles = self.create_user(
41+
'miles', '[email protected]',
42+
first_name="Miles", last_name="Davis")
43+

example/tests/test_generic_viewset.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
import json
3+
from example.tests import TestBase
4+
from django.core.urlresolvers import reverse
5+
from django.conf import settings
6+
7+
8+
class GenericViewSet(TestBase):
9+
"""
10+
Test expected responses coming from a Generic ViewSet
11+
"""
12+
def test_default_rest_framework_behavior(self):
13+
"""
14+
This is more of an example really, showing default behavior
15+
"""
16+
url = reverse('user-default', kwargs={'pk': self.miles.pk})
17+
18+
response = self.client.get(url)
19+
20+
self.assertEqual(200, response.status_code)
21+
self.assertEqual(
22+
json.loads(response.content),
23+
{
24+
'id': 2,
25+
'first_name': u'Miles',
26+
'last_name': u'Davis',
27+
'email': u'[email protected]'
28+
}
29+
)
30+
31+
def test_ember_expected_renderer(self):
32+
"""
33+
The :class:`UserEmber` ViewSet has the ``resource_name`` of 'data'
34+
so that should be the key in the JSON response.
35+
"""
36+
url = reverse('user-ember', kwargs={'pk': self.miles.pk})
37+
38+
response = self.client.get(url)
39+
self.assertEqual(200, response.status_code)
40+
self.assertEqual(
41+
json.loads(response.content),
42+
{
43+
'data': {
44+
'id': 2,
45+
'first_name': u'Miles',
46+
'last_name': u'Davis',
47+
'email': u'[email protected]'
48+
}
49+
}
50+
)
51+

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
author="nGen Works",
99
author_email='[email protected]',
1010
url='http://www.ngenworks.com',
11+
license='BSD',
12+
keywords="EmberJS Django REST",
1113
packages=find_packages(),
12-
package_data={'rest_framework_ember': []},
14+
install_requires=['django', 'djangorestframework' ],
1315
)
1416

0 commit comments

Comments
 (0)