From af8a362d6b513b71de45109b441f79ed7d1b103c Mon Sep 17 00:00:00 2001
From: Nicolas Delaby
Date: Mon, 7 Apr 2014 14:59:27 +0200
Subject: reset stored credentials when call client.logout()
---
rest_framework/test.py | 4 ++++
rest_framework/tests/test_testing.py | 11 +++++++++++
2 files changed, 15 insertions(+)
diff --git a/rest_framework/test.py b/rest_framework/test.py
index df5a5b3b..79982cb0 100644
--- a/rest_framework/test.py
+++ b/rest_framework/test.py
@@ -154,6 +154,10 @@ class APIClient(APIRequestFactory, DjangoClient):
kwargs.update(self._credentials)
return super(APIClient, self).request(**kwargs)
+ def logout(self):
+ self._credentials = {}
+ return super(APIClient, self).logout()
+
class APITransactionTestCase(testcases.TransactionTestCase):
client_class = APIClient
diff --git a/rest_framework/tests/test_testing.py b/rest_framework/tests/test_testing.py
index a55d4b22..b16d1962 100644
--- a/rest_framework/tests/test_testing.py
+++ b/rest_framework/tests/test_testing.py
@@ -99,6 +99,17 @@ class TestAPITestClient(TestCase):
self.assertEqual(response.status_code, 403)
self.assertEqual(response.data, expected)
+ def test_can_logout(self):
+ """
+ `logout()` reset stored credentials
+ """
+ self.client.credentials(HTTP_AUTHORIZATION='example')
+ response = self.client.get('/view/')
+ self.assertEqual(response.data['auth'], 'example')
+ self.client.logout()
+ response = self.client.get('/view/')
+ self.assertEqual(response.data['auth'], b'')
+
class TestAPIRequestFactory(TestCase):
def test_csrf_exempt_by_default(self):
--
cgit v1.2.3
From b4c7717cb80cb13a2f13aae8855e226685306880 Mon Sep 17 00:00:00 2001
From: Walt Javins
Date: Fri, 13 Jun 2014 22:26:00 -0700
Subject: Refactor login template to extend base.
While experimenting with extending DRF, I found that the login page
1) had no title, and 2) duplicated
info from base.html.
This change adds a new {% block body %} to the base.html template
which allows override of the entire html . login_base.html
has its duplicated head info stripped, and now extends base.html
to share common html templating.
As part of this change, pretify.css is unnecessarily added to
login_base.html. If this is deemed a problem, it will be easy to
block that css out, and have login_base.html override the block.
Ideally, I would have liked to create a new api_base.html that extends
base.html, move the api specific logic into that template, and leave
base.html content agnostic, to truely be a unifying base for all DRF
pages. But this change would break current apps that override
api.html and expect base.html to be the immediate super template. :/
This change is benificial because it:
- removes duplication of header declarations (mostly css includes)
- adds a html title to the login page
- standardizes html header info across all DRF pages
Docs are updated to reflect the new structure.
---
docs/topics/browsable-api.md | 1 +
rest_framework/templates/rest_framework/base.html | 2 ++
rest_framework/templates/rest_framework/login_base.html | 15 +++------------
3 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/docs/topics/browsable-api.md b/docs/topics/browsable-api.md
index e32db695..ffa0b07d 100644
--- a/docs/topics/browsable-api.md
+++ b/docs/topics/browsable-api.md
@@ -69,6 +69,7 @@ For more specific CSS tweaks than simply overriding the default bootstrap theme
All of the blocks available in the browsable API base template that can be used in your `api.html`.
+* `body` - The entire html ``.
* `bodyclass` - Class attribute for the `` tag, empty by default.
* `bootstrap_theme` - CSS for the Bootstrap theme.
* `bootstrap_navbar_variant` - CSS class for the navbar.
diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html
index 7067ee2f..1f3def8f 100644
--- a/rest_framework/templates/rest_framework/base.html
+++ b/rest_framework/templates/rest_framework/base.html
@@ -24,6 +24,7 @@
{% endblock %}
+ {% block body %}
-
+ {% endblock %}
--
cgit v1.2.3
From 18eab53e892f2f579fd0bb4e1ca3cb47a074accc Mon Sep 17 00:00:00 2001
From: Emmanouil
Date: Wed, 9 Jul 2014 15:53:31 +0100
Subject: Updated quick start project set up order
---
docs/tutorial/quickstart.md | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/docs/tutorial/quickstart.md b/docs/tutorial/quickstart.md
index 8bf8c7f5..04792c69 100644
--- a/docs/tutorial/quickstart.md
+++ b/docs/tutorial/quickstart.md
@@ -6,8 +6,8 @@ We're going to create a simple API to allow admin users to view and edit the use
Create a new Django project named `tutorial`, then start a new app called `quickstart`.
- # Set up a new project
- django-admin.py startproject tutorial
+ # Create the project directory
+ mkdir tutorial
cd tutorial
# Create a virtualenv to isolate our package dependencies locally
@@ -18,6 +18,9 @@ Create a new Django project named `tutorial`, then start a new app called `quick
pip install django
pip install djangorestframework
+ # Set up a new project
+ django-admin.py startproject tutorial
+
# Create a new app
python manage.py startapp quickstart
--
cgit v1.2.3
From 05882cc5999088ac232788ae62717c061e74ad12 Mon Sep 17 00:00:00 2001
From: Ron Cohen
Date: Fri, 25 Jul 2014 10:55:53 +0000
Subject: Sending "Bearer" and "Bearer " resulted in a 500.
---
rest_framework/authentication.py | 14 +++++++-------
rest_framework/tests/test_authentication.py | 9 +++++++++
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/rest_framework/authentication.py b/rest_framework/authentication.py
index da9ca510..887ef5d7 100644
--- a/rest_framework/authentication.py
+++ b/rest_framework/authentication.py
@@ -310,6 +310,13 @@ class OAuth2Authentication(BaseAuthentication):
auth = get_authorization_header(request).split()
+ if len(auth) == 1:
+ msg = 'Invalid bearer header. No credentials provided.'
+ raise exceptions.AuthenticationFailed(msg)
+ elif len(auth) > 2:
+ msg = 'Invalid bearer header. Token string should not contain spaces.'
+ raise exceptions.AuthenticationFailed(msg)
+
if auth and auth[0].lower() == b'bearer':
access_token = auth[1]
elif 'access_token' in request.POST:
@@ -319,13 +326,6 @@ class OAuth2Authentication(BaseAuthentication):
else:
return None
- if len(auth) == 1:
- msg = 'Invalid bearer header. No credentials provided.'
- raise exceptions.AuthenticationFailed(msg)
- elif len(auth) > 2:
- msg = 'Invalid bearer header. Token string should not contain spaces.'
- raise exceptions.AuthenticationFailed(msg)
-
return self.authenticate_credentials(request, access_token)
def authenticate_credentials(self, request, access_token):
diff --git a/rest_framework/tests/test_authentication.py b/rest_framework/tests/test_authentication.py
index a1c43d9c..cf8415ed 100644
--- a/rest_framework/tests/test_authentication.py
+++ b/rest_framework/tests/test_authentication.py
@@ -549,6 +549,15 @@ class OAuth2Tests(TestCase):
response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth)
self.assertEqual(response.status_code, 401)
+ @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed')
+ def test_get_form_with_wrong_authorization_header_token_missing(self):
+ """Ensure that a wrong token lead to the correct HTTP error status code"""
+ auth = "Bearer"
+ response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth)
+ self.assertEqual(response.status_code, 401)
+ response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth)
+ self.assertEqual(response.status_code, 401)
+
@unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed')
def test_get_form_passing_auth(self):
"""Ensure GETing form over OAuth with correct client credentials succeed"""
--
cgit v1.2.3
From e3aff6a5678d48a2e328c9bb44b7c3de81caffd5 Mon Sep 17 00:00:00 2001
From: Ron Cohen
Date: Fri, 25 Jul 2014 13:38:42 +0000
Subject: Updated test docstring related to missing bearer token.
---
rest_framework/tests/test_authentication.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rest_framework/tests/test_authentication.py b/rest_framework/tests/test_authentication.py
index cf8415ed..34bf2910 100644
--- a/rest_framework/tests/test_authentication.py
+++ b/rest_framework/tests/test_authentication.py
@@ -551,7 +551,7 @@ class OAuth2Tests(TestCase):
@unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed')
def test_get_form_with_wrong_authorization_header_token_missing(self):
- """Ensure that a wrong token lead to the correct HTTP error status code"""
+ """Ensure that a missing token lead to the correct HTTP error status code"""
auth = "Bearer"
response = self.csrf_client.get('/oauth2-test/', {}, HTTP_AUTHORIZATION=auth)
self.assertEqual(response.status_code, 401)
--
cgit v1.2.3
From 48b02f016a827bc254aba2aedb81b472189c2165 Mon Sep 17 00:00:00 2001
From: Kyle Valade
Date: Sun, 27 Jul 2014 14:01:43 -0700
Subject: Issue #1707: Add documentation to api-docs.viewsets notifying users
that they should use the get_queryset() method when overriding a ModelViewSet
method, such as list(). Otherwise, since queryset is a static property, the
value will be cached for every instance of that ViewSet.
---
docs/api-guide/viewsets.md | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/docs/api-guide/viewsets.md b/docs/api-guide/viewsets.md
index 23b16575..774e11b7 100644
--- a/docs/api-guide/viewsets.md
+++ b/docs/api-guide/viewsets.md
@@ -70,6 +70,21 @@ There are two main advantages of using a `ViewSet` class over using a `View` cla
Both of these come with a trade-off. Using regular views and URL confs is more explicit and gives you more control. ViewSets are helpful if you want to get up and running quickly, or when you have a large API and you want to enforce a consistent URL configuration throughout.
+## Overriding ModelViewSet Methods
+
+Overriding the ModelViewSet is the same as overriding anything else, except you will need to remember to clone `self.queryset` before you use it, which you can do by using the built-in `get_queryset` method. For example:
+
+ class UserViewSet(viewsets.ModelViewSet):
+ """
+ A viewset for viewing and editing user instances.
+ """
+ queryset = User.objects.all()
+
+ def list(self, request):
+ queryset = self.get_queryset()
+ serializer = UserSerializer(queryset, many=True)
+ return Response(serializer.data)
+
## Marking extra methods for routing
The default routers included with REST framework will provide routes for a standard set of create/retrieve/update/destroy style operations, as shown below:
@@ -142,7 +157,7 @@ The `@action` decorator will route `POST` requests by default, but may also acce
@action(methods=['POST', 'DELETE'])
def unset_password(self, request, pk=None):
...
-
+
The two new actions will then be available at the urls `^users/{pk}/set_password/$` and `^users/{pk}/unset_password/$`
--
cgit v1.2.3
From fe048dc4fbf064b11d7247061c931bb1038cc774 Mon Sep 17 00:00:00 2001
From: Xavier Ordoquy
Date: Mon, 28 Jul 2014 07:37:30 +0200
Subject: Fix #1712 (issue when django-guardian is installed but not
configured/used)
---
rest_framework/compat.py | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/rest_framework/compat.py b/rest_framework/compat.py
index fdf12448..9ad8b0d2 100644
--- a/rest_framework/compat.py
+++ b/rest_framework/compat.py
@@ -48,12 +48,15 @@ try:
except ImportError:
django_filters = None
-# guardian is optional
-try:
- import guardian
- import guardian.shortcuts # Fixes #1624
-except ImportError:
- guardian = None
+# Django-guardian is optional. Import only if guardian is in INSTALLED_APPS
+# Fixes (#1712). We keep the try/except for the test suite.
+guardian = None
+if 'guardian' in settings.INSTALLED_APPS:
+ try:
+ import guardian
+ import guardian.shortcuts # Fixes #1624
+ except ImportError:
+ pass
# cStringIO only if it's available, otherwise StringIO
--
cgit v1.2.3
From 5429c2800e263d27094ffa814589674b1b02d4f6 Mon Sep 17 00:00:00 2001
From: Xavier Ordoquy
Date: Mon, 28 Jul 2014 08:00:50 +0200
Subject: Django-guardian version cleanup.
---
.travis.yml | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index b2da9e81..7f1fda83 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,7 +8,7 @@ python:
- "3.4"
env:
- - DJANGO="https://www.djangoproject.com/download/1.7.b4/tarball/"
+ - DJANGO="https://www.djangoproject.com/download/1.7c2/tarball/"
- DJANGO="django==1.6.5"
- DJANGO="django==1.5.8"
- DJANGO="django==1.4.13"
@@ -16,15 +16,13 @@ env:
install:
- pip install $DJANGO
- - pip install defusedxml==0.3 Pillow==2.3.0
+ - pip install defusedxml==0.3 Pillow==2.3.0 django-guardian==1.2.3
- "if [[ ${TRAVIS_PYTHON_VERSION::1} != '3' ]]; then pip install oauth2==1.5.211; fi"
- "if [[ ${TRAVIS_PYTHON_VERSION::1} != '3' ]]; then pip install django-oauth-plus==2.2.4; fi"
- "if [[ ${TRAVIS_PYTHON_VERSION::1} != '3' ]]; then pip install django-oauth2-provider==0.2.4; fi"
- - "if [[ ${TRAVIS_PYTHON_VERSION::1} != '3' ]]; then pip install django-guardian==1.1.1; fi"
- "if [[ ${DJANGO::11} == 'django==1.3' ]]; then pip install django-filter==0.5.4; fi"
- "if [[ ${DJANGO::11} != 'django==1.3' ]]; then pip install django-filter==0.7; fi"
- - "if [[ ${TRAVIS_PYTHON_VERSION::1} == '3' ]]; then pip install -e git+https://github.com/linovia/django-guardian.git@feature/django_1_7#egg=django-guardian-1.2.0; fi"
- - "if [[ ${DJANGO} == 'https://www.djangoproject.com/download/1.7.b4/tarball/' ]]; then pip install -e git+https://github.com/linovia/django-guardian.git@feature/django_1_7#egg=django-guardian-1.2.0; fi"
+ - "if [[ ${DJANGO} == 'https://www.djangoproject.com/download/1.7c2/tarball/' ]]; then pip install -e git+https://github.com/linovia/django-guardian.git@feature/django_1_7#egg=django-guardian-1.2.0; fi"
- export PYTHONPATH=.
script:
@@ -33,7 +31,7 @@ script:
matrix:
exclude:
- python: "2.6"
- env: DJANGO="https://www.djangoproject.com/download/1.7.b4/tarball/"
+ env: DJANGO="https://www.djangoproject.com/download/1.7c2/tarball/"
- python: "3.2"
env: DJANGO="django==1.4.13"
- python: "3.2"
--
cgit v1.2.3
From 0cbdbd24e57fbe58b90d77e454594a49a5f357b8 Mon Sep 17 00:00:00 2001
From: Xavier Ordoquy
Date: Mon, 28 Jul 2014 13:54:43 +0200
Subject: Updated the tox file.
---
tox.ini | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/tox.ini b/tox.ini
index 279f79cc..72d156f9 100644
--- a/tox.ini
+++ b/tox.ini
@@ -12,34 +12,34 @@ commands = {envpython} rest_framework/runtests/runtests.py
[testenv:py3.4-django1.7]
basepython = python3.4
-deps = https://www.djangoproject.com/download/1.7b2/tarball/
+deps = https://www.djangoproject.com/download/1.7c2/tarball/
django-filter==0.7
defusedxml==0.3
Pillow==2.3.0
[testenv:py3.3-django1.7]
basepython = python3.3
-deps = https://www.djangoproject.com/download/1.7b2/tarball/
+deps = https://www.djangoproject.com/download/1.7c2/tarball/
django-filter==0.7
defusedxml==0.3
Pillow==2.3.0
[testenv:py3.2-django1.7]
basepython = python3.2
-deps = https://www.djangoproject.com/download/1.7b2/tarball/
+deps = https://www.djangoproject.com/download/1.7c2/tarball/
django-filter==0.7
defusedxml==0.3
Pillow==2.3.0
[testenv:py2.7-django1.7]
basepython = python2.7
-deps = https://www.djangoproject.com/download/1.7b2/tarball/
+deps = https://www.djangoproject.com/download/1.7c2/tarball/
django-filter==0.7
defusedxml==0.3
- django-oauth-plus==2.2.1
- oauth2==1.5.211
- django-oauth2-provider==0.2.4
- django-guardian==1.1.1
+ # django-oauth-plus==2.2.1
+ # oauth2==1.5.211
+ # django-oauth2-provider==0.2.4
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py3.4-django1.6]
@@ -71,7 +71,7 @@ deps = Django==1.6.3
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.4
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py2.6-django1.6]
@@ -82,7 +82,7 @@ deps = Django==1.6.3
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.4
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py3.4-django1.5]
@@ -114,7 +114,7 @@ deps = django==1.5.6
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.3
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py2.6-django1.5]
@@ -125,7 +125,7 @@ deps = django==1.5.6
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.3
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py2.7-django1.4]
@@ -136,7 +136,7 @@ deps = django==1.4.11
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.3
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py2.6-django1.4]
@@ -147,7 +147,7 @@ deps = django==1.4.11
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.3
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py2.7-django1.3]
@@ -158,7 +158,7 @@ deps = django==1.3.5
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.3
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
[testenv:py2.6-django1.3]
@@ -169,5 +169,5 @@ deps = django==1.3.5
django-oauth-plus==2.2.1
oauth2==1.5.211
django-oauth2-provider==0.2.3
- django-guardian==1.1.1
+ django-guardian==1.2.3
Pillow==2.3.0
--
cgit v1.2.3
From e40ffd60d44d736d7e27ff454cba1905f0becc26 Mon Sep 17 00:00:00 2001
From: Kyle
Date: Mon, 28 Jul 2014 10:11:40 -0700
Subject: Issue #1707 - Add documentation about the caching of
`GenericAPIView.queryset` to the `queryset` property, `get_queryset()`, and
do generic-views.md; remove changes to the viewsets.md documentation from my
last commit.
---
docs/api-guide/generic-views.md | 8 +++++++-
docs/api-guide/viewsets.md | 15 ---------------
rest_framework/generics.py | 8 ++++++++
3 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/docs/api-guide/generic-views.md b/docs/api-guide/generic-views.md
index 7d06f246..b76c18cf 100755
--- a/docs/api-guide/generic-views.md
+++ b/docs/api-guide/generic-views.md
@@ -43,6 +43,12 @@ For more complex cases you might also want to override various methods on the vi
return 20
return 100
+ def list(self, request):
+ # Note the use of `get_queryset()` instead of `self.queryset`
+ queryset = self.get_queryset()
+ serializer = UserSerializer(queryset, many=True)
+ return Response(serializer.data)
+
For very simple cases you might want to pass through any class attributes using the `.as_view()` method. For example, your URLconf might include something the following entry.
url(r'^/users/', ListCreateAPIView.as_view(model=User), name='user-list')
@@ -63,7 +69,7 @@ Each of the concrete generic views provided is built by combining `GenericAPIVie
The following attributes control the basic view behavior.
-* `queryset` - The queryset that should be used for returning objects from this view. Typically, you must either set this attribute, or override the `get_queryset()` method.
+* `queryset` - The queryset that should be used for returning objects from this view. Typically, you must either set this attribute, or override the `get_queryset()` method. If you are overriding a view method, it is important that you call `get_queryset()` instead of accessing this property directly, as `queryset` will get evaluated once, and those results will be cached for all subsequent requests.
* `serializer_class` - The serializer class that should be used for validating and deserializing input, and for serializing output. Typically, you must either set this attribute, or override the `get_serializer_class()` method.
* `lookup_field` - The model field that should be used to for performing object lookup of individual model instances. Defaults to `'pk'`. Note that when using hyperlinked APIs you'll need to ensure that *both* the API views *and* the serializer classes set the lookup fields if you need to use a custom value.
* `lookup_url_kwarg` - The URL keyword argument that should be used for object lookup. The URL conf should include a keyword argument corresponding to this value. If unset this defaults to using the same value as `lookup_field`.
diff --git a/docs/api-guide/viewsets.md b/docs/api-guide/viewsets.md
index 774e11b7..4f345abb 100644
--- a/docs/api-guide/viewsets.md
+++ b/docs/api-guide/viewsets.md
@@ -70,21 +70,6 @@ There are two main advantages of using a `ViewSet` class over using a `View` cla
Both of these come with a trade-off. Using regular views and URL confs is more explicit and gives you more control. ViewSets are helpful if you want to get up and running quickly, or when you have a large API and you want to enforce a consistent URL configuration throughout.
-## Overriding ModelViewSet Methods
-
-Overriding the ModelViewSet is the same as overriding anything else, except you will need to remember to clone `self.queryset` before you use it, which you can do by using the built-in `get_queryset` method. For example:
-
- class UserViewSet(viewsets.ModelViewSet):
- """
- A viewset for viewing and editing user instances.
- """
- queryset = User.objects.all()
-
- def list(self, request):
- queryset = self.get_queryset()
- serializer = UserSerializer(queryset, many=True)
- return Response(serializer.data)
-
## Marking extra methods for routing
The default routers included with REST framework will provide routes for a standard set of create/retrieve/update/destroy style operations, as shown below:
diff --git a/rest_framework/generics.py b/rest_framework/generics.py
index 7bac510f..65ccd952 100644
--- a/rest_framework/generics.py
+++ b/rest_framework/generics.py
@@ -43,6 +43,10 @@ class GenericAPIView(views.APIView):
# You'll need to either set these attributes,
# or override `get_queryset()`/`get_serializer_class()`.
+ # If you are overriding a view method, it is important that you call
+ # `get_queryset()` instead of accessing the `queryset` property directly,
+ # as `queryset` will get evaluated only once, and those results are cached
+ # for all subsequent requests.
queryset = None
serializer_class = None
@@ -256,6 +260,10 @@ class GenericAPIView(views.APIView):
This must be an iterable, and may be a queryset.
Defaults to using `self.queryset`.
+ This method should always be used rather than accessing `self.queryset`
+ directly, as `self.queryset` gets evaluated only once, and those results
+ are cached for all subsequent requests.
+
You may want to override this if you need to provide different
querysets depending on the incoming request.
--
cgit v1.2.3
From fc8eb76c2259ea64a19876f040db4d93e834d39d Mon Sep 17 00:00:00 2001
From: Kyle
Date: Mon, 28 Jul 2014 10:19:42 -0700
Subject: Issue #1707 - Add info about queryset property caching to
get_queryset() docs.
Add documentation to the get_queryset() method of generic-views.md regarding
the caching of the queryset property.
---
docs/api-guide/generic-views.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/docs/api-guide/generic-views.md b/docs/api-guide/generic-views.md
index b76c18cf..43c5782f 100755
--- a/docs/api-guide/generic-views.md
+++ b/docs/api-guide/generic-views.md
@@ -99,6 +99,8 @@ The following attributes are used to control pagination when used with list view
Returns the queryset that should be used for list views, and that should be used as the base for lookups in detail views. Defaults to returning the queryset specified by the `queryset` attribute, or the default queryset for the model if the `model` shortcut is being used.
+This method should always be used rather than accessing `self.queryset` directly, as `self.queryset` gets evaluated only once, and those results are cached for all subsequent requests.
+
May be overridden to provide dynamic behavior such as returning a queryset that is specific to the user making the request.
For example:
--
cgit v1.2.3
From 4210fedd211eaff80d139a4967577621282f520b Mon Sep 17 00:00:00 2001
From: Xavier Ordoquy
Date: Tue, 29 Jul 2014 08:35:00 +0200
Subject: Fixed the cache issue with Django 1.7 rc*
---
rest_framework/response.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/rest_framework/response.py b/rest_framework/response.py
index 1dc6abcf..77cbb07c 100644
--- a/rest_framework/response.py
+++ b/rest_framework/response.py
@@ -15,6 +15,7 @@ class Response(SimpleTemplateResponse):
An HttpResponse that allows its data to be rendered into
arbitrary media types.
"""
+ rendering_attrs = SimpleTemplateResponse.rendering_attrs + ['_closable_objects']
def __init__(self, data=None, status=200,
template_name=None, headers=None,
--
cgit v1.2.3
From 59d0a0387d907260ef8f91bbbca618831abd75a3 Mon Sep 17 00:00:00 2001
From: Xavier Ordoquy
Date: Tue, 29 Jul 2014 10:20:10 +0200
Subject: Fixed the Django 1.3 compat
---
rest_framework/response.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/rest_framework/response.py b/rest_framework/response.py
index 77cbb07c..3928ca91 100644
--- a/rest_framework/response.py
+++ b/rest_framework/response.py
@@ -5,6 +5,7 @@ it is initialized with unrendered data, instead of a pre-rendered string.
The appropriate renderer is called during Django's template response rendering.
"""
from __future__ import unicode_literals
+import django
from django.core.handlers.wsgi import STATUS_CODE_TEXT
from django.template.response import SimpleTemplateResponse
from rest_framework.compat import six
@@ -15,7 +16,9 @@ class Response(SimpleTemplateResponse):
An HttpResponse that allows its data to be rendered into
arbitrary media types.
"""
- rendering_attrs = SimpleTemplateResponse.rendering_attrs + ['_closable_objects']
+ # TODO: remove that once Django 1.3 isn't supported
+ if django.VERSION > (1, 3):
+ rendering_attrs = SimpleTemplateResponse.rendering_attrs + ['_closable_objects']
def __init__(self, data=None, status=200,
template_name=None, headers=None,
--
cgit v1.2.3
From 5e02f015b81bd743f6ee78f8414eca4e93eaab82 Mon Sep 17 00:00:00 2001
From: Xavier Ordoquy
Date: Tue, 29 Jul 2014 10:30:08 +0200
Subject: Better fix for the Django 1.3 compat
---
rest_framework/response.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rest_framework/response.py b/rest_framework/response.py
index 3928ca91..5c02ea50 100644
--- a/rest_framework/response.py
+++ b/rest_framework/response.py
@@ -17,7 +17,7 @@ class Response(SimpleTemplateResponse):
arbitrary media types.
"""
# TODO: remove that once Django 1.3 isn't supported
- if django.VERSION > (1, 3):
+ if django.VERSION >= (1, 4):
rendering_attrs = SimpleTemplateResponse.rendering_attrs + ['_closable_objects']
def __init__(self, data=None, status=200,
--
cgit v1.2.3
From 57d6e04ff5512f11594e29bf49c47b610594666c Mon Sep 17 00:00:00 2001
From: Tom Christie
Date: Wed, 30 Jul 2014 12:50:36 +0100
Subject: Add django-rest-framework-mongoengine link. Closes #1722 Closes #1562
Closes #1545
---
docs/api-guide/serializers.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md
index cedf1ff7..72568e53 100644
--- a/docs/api-guide/serializers.md
+++ b/docs/api-guide/serializers.md
@@ -580,7 +580,16 @@ The following custom model serializer could be used as a base class for model se
def get_pk_field(self, model_field):
return None
+---
+
+# Third party packages
+
+The following third party packages are also available.
+
+## MongoengineModelSerializer
+The [django-rest-framework-mongoengine][mongoengine] package provides a `MongoEngineModelSerializer` serializer class that supports using MongoDB as the storage layer for Django REST framework.
[cite]: https://groups.google.com/d/topic/django-users/sVFaOfQi4wY/discussion
[relations]: relations.md
+[mongoengine]: https://github.com/umutbozkurt/django-rest-framework-mongoengine
--
cgit v1.2.3
From 80444165230f019b09d7f19d31c49fbdd68b744d Mon Sep 17 00:00:00 2001
From: Tom Christie
Date: Thu, 31 Jul 2014 20:19:28 +0100
Subject: Add platinum sponsors
---
docs/css/default.css | 31 ++++++++++++++++++++++++++
docs/img/sponsors/0-eventbrite.png | Bin 0 -> 22429 bytes
docs/img/sponsors/1-cyan.png | Bin 0 -> 6121 bytes
docs/img/sponsors/1-divio.png | Bin 0 -> 4864 bytes
docs/img/sponsors/1-kuwaitnet.png | Bin 0 -> 15489 bytes
docs/img/sponsors/1-lulu.png | Bin 0 -> 18013 bytes
docs/img/sponsors/1-potato.png | Bin 0 -> 12190 bytes
docs/img/sponsors/1-purplebit.png | Bin 0 -> 9161 bytes
docs/img/sponsors/1-runscope.png | Bin 0 -> 10913 bytes
docs/img/sponsors/1-simple-energy.png | Bin 0 -> 54455 bytes
docs/img/sponsors/1-vokal_interactive.png | Bin 0 -> 12532 bytes
docs/img/sponsors/1-wiredrive.png | Bin 0 -> 8082 bytes
docs/img/sponsors/2-byte.png | Bin 0 -> 13690 bytes
docs/img/sponsors/2-crate.png | Bin 0 -> 8257 bytes
docs/img/sponsors/2-heroku.png | Bin 0 -> 7337 bytes
docs/img/sponsors/2-hipflask.png | Bin 0 -> 6016 bytes
docs/img/sponsors/2-hipo.png | Bin 0 -> 8111 bytes
docs/img/sponsors/2-koordinates.png | Bin 0 -> 1934 bytes
docs/img/sponsors/2-laterpay.png | Bin 0 -> 2003 bytes
docs/img/sponsors/2-lightning_kite.png | Bin 0 -> 6715 bytes
docs/img/sponsors/2-mirus_research.png | Bin 0 -> 12414 bytes
docs/img/sponsors/2-opbeat.png | Bin 0 -> 11603 bytes
docs/img/sponsors/2-schuberg_philis.png | Bin 0 -> 21870 bytes
docs/img/sponsors/2-vinta.png | Bin 0 -> 9918 bytes
docs/img/sponsors/3-blimp.png | Bin 0 -> 6241 bytes
docs/img/sponsors/3-gizmag.png | Bin 0 -> 5370 bytes
docs/img/sponsors/3-imt_computer_services.png | Bin 0 -> 70397 bytes
docs/img/sponsors/3-infinite_code.png | Bin 0 -> 21786 bytes
docs/img/sponsors/3-life_the_game.png | Bin 0 -> 5485 bytes
docs/img/sponsors/3-pkgfarm.png | Bin 0 -> 2275 bytes
docs/img/sponsors/3-providenz.png | Bin 0 -> 12580 bytes
docs/img/sponsors/3-shippo.png | Bin 0 -> 7345 bytes
docs/img/sponsors/3-thermondo-gmbh.png | Bin 0 -> 20046 bytes
docs/img/sponsors/3-tivix.png | Bin 0 -> 4091 bytes
docs/img/sponsors/3-triggered_messaging.png | Bin 0 -> 10509 bytes
docs/img/sponsors/3-wildfish.png | Bin 0 -> 4137 bytes
docs/topics/kickstarter-announcement.md | 29 ++++++++++++++++++++++++
37 files changed, 60 insertions(+)
create mode 100644 docs/img/sponsors/0-eventbrite.png
create mode 100644 docs/img/sponsors/1-cyan.png
create mode 100644 docs/img/sponsors/1-divio.png
create mode 100644 docs/img/sponsors/1-kuwaitnet.png
create mode 100644 docs/img/sponsors/1-lulu.png
create mode 100644 docs/img/sponsors/1-potato.png
create mode 100644 docs/img/sponsors/1-purplebit.png
create mode 100644 docs/img/sponsors/1-runscope.png
create mode 100644 docs/img/sponsors/1-simple-energy.png
create mode 100644 docs/img/sponsors/1-vokal_interactive.png
create mode 100644 docs/img/sponsors/1-wiredrive.png
create mode 100644 docs/img/sponsors/2-byte.png
create mode 100644 docs/img/sponsors/2-crate.png
create mode 100644 docs/img/sponsors/2-heroku.png
create mode 100644 docs/img/sponsors/2-hipflask.png
create mode 100644 docs/img/sponsors/2-hipo.png
create mode 100644 docs/img/sponsors/2-koordinates.png
create mode 100644 docs/img/sponsors/2-laterpay.png
create mode 100644 docs/img/sponsors/2-lightning_kite.png
create mode 100644 docs/img/sponsors/2-mirus_research.png
create mode 100644 docs/img/sponsors/2-opbeat.png
create mode 100644 docs/img/sponsors/2-schuberg_philis.png
create mode 100644 docs/img/sponsors/2-vinta.png
create mode 100644 docs/img/sponsors/3-blimp.png
create mode 100644 docs/img/sponsors/3-gizmag.png
create mode 100644 docs/img/sponsors/3-imt_computer_services.png
create mode 100644 docs/img/sponsors/3-infinite_code.png
create mode 100644 docs/img/sponsors/3-life_the_game.png
create mode 100644 docs/img/sponsors/3-pkgfarm.png
create mode 100644 docs/img/sponsors/3-providenz.png
create mode 100644 docs/img/sponsors/3-shippo.png
create mode 100644 docs/img/sponsors/3-thermondo-gmbh.png
create mode 100644 docs/img/sponsors/3-tivix.png
create mode 100644 docs/img/sponsors/3-triggered_messaging.png
create mode 100644 docs/img/sponsors/3-wildfish.png
diff --git a/docs/css/default.css b/docs/css/default.css
index af6a9cc0..090d42a6 100644
--- a/docs/css/default.css
+++ b/docs/css/default.css
@@ -307,3 +307,34 @@ table {
.side-nav {
overflow-y: scroll;
}
+
+
+ul.sponsor.diamond li a {
+ float: left;
+ width: 600px;
+ height: 20px;
+ text-align: center;
+ margin: 10px 40px;
+ padding: 300px 0 0 0;
+ background-position: 0 50%;
+ background-size: 600px auto;
+ background-repeat: no-repeat;
+ font-size: 150%;
+}
+
+ul.sponsor.platinum li a {
+ float: left;
+ width: 300px;
+ height: 20px;
+ text-align: center;
+ margin: 10px 40px;
+ padding: 300px 0 0 0;
+ background-position: 0 50%;
+ background-size: 280px auto;
+ background-repeat: no-repeat;
+ font-size: 150%;
+}
+
+ul.sponsor {
+ list-style: none;
+}
diff --git a/docs/img/sponsors/0-eventbrite.png b/docs/img/sponsors/0-eventbrite.png
new file mode 100644
index 00000000..6c739293
Binary files /dev/null and b/docs/img/sponsors/0-eventbrite.png differ
diff --git a/docs/img/sponsors/1-cyan.png b/docs/img/sponsors/1-cyan.png
new file mode 100644
index 00000000..d6b55b4c
Binary files /dev/null and b/docs/img/sponsors/1-cyan.png differ
diff --git a/docs/img/sponsors/1-divio.png b/docs/img/sponsors/1-divio.png
new file mode 100644
index 00000000..8ced88f8
Binary files /dev/null and b/docs/img/sponsors/1-divio.png differ
diff --git a/docs/img/sponsors/1-kuwaitnet.png b/docs/img/sponsors/1-kuwaitnet.png
new file mode 100644
index 00000000..8b2d0550
Binary files /dev/null and b/docs/img/sponsors/1-kuwaitnet.png differ
diff --git a/docs/img/sponsors/1-lulu.png b/docs/img/sponsors/1-lulu.png
new file mode 100644
index 00000000..8a28bfa9
Binary files /dev/null and b/docs/img/sponsors/1-lulu.png differ
diff --git a/docs/img/sponsors/1-potato.png b/docs/img/sponsors/1-potato.png
new file mode 100644
index 00000000..ad38abdd
Binary files /dev/null and b/docs/img/sponsors/1-potato.png differ
diff --git a/docs/img/sponsors/1-purplebit.png b/docs/img/sponsors/1-purplebit.png
new file mode 100644
index 00000000..0df63bf6
Binary files /dev/null and b/docs/img/sponsors/1-purplebit.png differ
diff --git a/docs/img/sponsors/1-runscope.png b/docs/img/sponsors/1-runscope.png
new file mode 100644
index 00000000..d80a4b85
Binary files /dev/null and b/docs/img/sponsors/1-runscope.png differ
diff --git a/docs/img/sponsors/1-simple-energy.png b/docs/img/sponsors/1-simple-energy.png
new file mode 100644
index 00000000..f59f7374
Binary files /dev/null and b/docs/img/sponsors/1-simple-energy.png differ
diff --git a/docs/img/sponsors/1-vokal_interactive.png b/docs/img/sponsors/1-vokal_interactive.png
new file mode 100644
index 00000000..f7811ecd
Binary files /dev/null and b/docs/img/sponsors/1-vokal_interactive.png differ
diff --git a/docs/img/sponsors/1-wiredrive.png b/docs/img/sponsors/1-wiredrive.png
new file mode 100644
index 00000000..c9befefe
Binary files /dev/null and b/docs/img/sponsors/1-wiredrive.png differ
diff --git a/docs/img/sponsors/2-byte.png b/docs/img/sponsors/2-byte.png
new file mode 100644
index 00000000..2c3777b5
Binary files /dev/null and b/docs/img/sponsors/2-byte.png differ
diff --git a/docs/img/sponsors/2-crate.png b/docs/img/sponsors/2-crate.png
new file mode 100644
index 00000000..6ef6b5da
Binary files /dev/null and b/docs/img/sponsors/2-crate.png differ
diff --git a/docs/img/sponsors/2-heroku.png b/docs/img/sponsors/2-heroku.png
new file mode 100644
index 00000000..22447659
Binary files /dev/null and b/docs/img/sponsors/2-heroku.png differ
diff --git a/docs/img/sponsors/2-hipflask.png b/docs/img/sponsors/2-hipflask.png
new file mode 100644
index 00000000..c74735c3
Binary files /dev/null and b/docs/img/sponsors/2-hipflask.png differ
diff --git a/docs/img/sponsors/2-hipo.png b/docs/img/sponsors/2-hipo.png
new file mode 100644
index 00000000..2b854c6d
Binary files /dev/null and b/docs/img/sponsors/2-hipo.png differ
diff --git a/docs/img/sponsors/2-koordinates.png b/docs/img/sponsors/2-koordinates.png
new file mode 100644
index 00000000..f38601b3
Binary files /dev/null and b/docs/img/sponsors/2-koordinates.png differ
diff --git a/docs/img/sponsors/2-laterpay.png b/docs/img/sponsors/2-laterpay.png
new file mode 100644
index 00000000..75eb97d3
Binary files /dev/null and b/docs/img/sponsors/2-laterpay.png differ
diff --git a/docs/img/sponsors/2-lightning_kite.png b/docs/img/sponsors/2-lightning_kite.png
new file mode 100644
index 00000000..ffdced04
Binary files /dev/null and b/docs/img/sponsors/2-lightning_kite.png differ
diff --git a/docs/img/sponsors/2-mirus_research.png b/docs/img/sponsors/2-mirus_research.png
new file mode 100644
index 00000000..b1544070
Binary files /dev/null and b/docs/img/sponsors/2-mirus_research.png differ
diff --git a/docs/img/sponsors/2-opbeat.png b/docs/img/sponsors/2-opbeat.png
new file mode 100644
index 00000000..c71a5241
Binary files /dev/null and b/docs/img/sponsors/2-opbeat.png differ
diff --git a/docs/img/sponsors/2-schuberg_philis.png b/docs/img/sponsors/2-schuberg_philis.png
new file mode 100644
index 00000000..fd9282ee
Binary files /dev/null and b/docs/img/sponsors/2-schuberg_philis.png differ
diff --git a/docs/img/sponsors/2-vinta.png b/docs/img/sponsors/2-vinta.png
new file mode 100644
index 00000000..7c67f6ca
Binary files /dev/null and b/docs/img/sponsors/2-vinta.png differ
diff --git a/docs/img/sponsors/3-blimp.png b/docs/img/sponsors/3-blimp.png
new file mode 100644
index 00000000..494bf792
Binary files /dev/null and b/docs/img/sponsors/3-blimp.png differ
diff --git a/docs/img/sponsors/3-gizmag.png b/docs/img/sponsors/3-gizmag.png
new file mode 100644
index 00000000..a8d41bd0
Binary files /dev/null and b/docs/img/sponsors/3-gizmag.png differ
diff --git a/docs/img/sponsors/3-imt_computer_services.png b/docs/img/sponsors/3-imt_computer_services.png
new file mode 100644
index 00000000..00643c97
Binary files /dev/null and b/docs/img/sponsors/3-imt_computer_services.png differ
diff --git a/docs/img/sponsors/3-infinite_code.png b/docs/img/sponsors/3-infinite_code.png
new file mode 100644
index 00000000..7a8fdcf1
Binary files /dev/null and b/docs/img/sponsors/3-infinite_code.png differ
diff --git a/docs/img/sponsors/3-life_the_game.png b/docs/img/sponsors/3-life_the_game.png
new file mode 100644
index 00000000..9292685e
Binary files /dev/null and b/docs/img/sponsors/3-life_the_game.png differ
diff --git a/docs/img/sponsors/3-pkgfarm.png b/docs/img/sponsors/3-pkgfarm.png
new file mode 100644
index 00000000..9224cc2e
Binary files /dev/null and b/docs/img/sponsors/3-pkgfarm.png differ
diff --git a/docs/img/sponsors/3-providenz.png b/docs/img/sponsors/3-providenz.png
new file mode 100644
index 00000000..55d9c992
Binary files /dev/null and b/docs/img/sponsors/3-providenz.png differ
diff --git a/docs/img/sponsors/3-shippo.png b/docs/img/sponsors/3-shippo.png
new file mode 100644
index 00000000..4f5ae133
Binary files /dev/null and b/docs/img/sponsors/3-shippo.png differ
diff --git a/docs/img/sponsors/3-thermondo-gmbh.png b/docs/img/sponsors/3-thermondo-gmbh.png
new file mode 100644
index 00000000..fe8691c8
Binary files /dev/null and b/docs/img/sponsors/3-thermondo-gmbh.png differ
diff --git a/docs/img/sponsors/3-tivix.png b/docs/img/sponsors/3-tivix.png
new file mode 100644
index 00000000..90d20753
Binary files /dev/null and b/docs/img/sponsors/3-tivix.png differ
diff --git a/docs/img/sponsors/3-triggered_messaging.png b/docs/img/sponsors/3-triggered_messaging.png
new file mode 100644
index 00000000..4f8e5063
Binary files /dev/null and b/docs/img/sponsors/3-triggered_messaging.png differ
diff --git a/docs/img/sponsors/3-wildfish.png b/docs/img/sponsors/3-wildfish.png
new file mode 100644
index 00000000..fa13ea70
Binary files /dev/null and b/docs/img/sponsors/3-wildfish.png differ
diff --git a/docs/topics/kickstarter-announcement.md b/docs/topics/kickstarter-announcement.md
index 98cf12e3..5f5b848e 100644
--- a/docs/topics/kickstarter-announcement.md
+++ b/docs/topics/kickstarter-announcement.md
@@ -29,3 +29,32 @@ I can't wait to see where this takes us!
Many thanks to everyone for your support so far,
Tom Christie :)
+
+---
+
+## Sponsors
+
+We've now blazed way past all our goals, with a staggering £30,000 (~$50,000), meaning I'll be in a position to work on the project significantly beyond what we'd originally planned for. I owe a huge debt of gratitude to all the wonderful companies and individuals who have been backing the project so generously, and making this possible.
+
+---
+
+### Platinum sponsors
+
+Our platinum sponsors have each made a hugely substantial contribution to the future development of Django REST framework, and I simply can't thank them enough.
+
+
+
+
+
+---
+
+### Gold sponsors
+
+Our gold sponsors include companies large and small. Many thanks for their significant funding of the project and their commitment to sustainable open-source development.
+
+
+
+
+
+
+
+---
+
+### Silver sponsors
+
+The serious financial contribution that our silver sponsors have made is very much appreciated. I'd like to say a particular thank you to individuals who have choosen to privately support the project at this level.
+
+
+
+
+
+**Individual contributions**: Paul Hallet, Paul Whipp Consulting, Jannis Leidel.
+
--
cgit v1.2.3
From ebcc78d96cf6f4cd6e464cd6b8eccd83305900c2 Mon Sep 17 00:00:00 2001
From: Anler Hp
Date: Fri, 1 Aug 2014 10:20:10 +0200
Subject: Leave status responsibility to parent class
Django's `HttpResponse` class checks for the `status` param when it's
initialized, if it's `None` it uses the class attribute
`status_code` and thanks to that we can do things like:
```
class BadRequest(HttpResponse):
status_code = 400
```
Now, that doesn't work when inheriting from rest-framework's `Response`:
```
class BadRequest(rest_framework.response.Response):
status_code = 400 # Bad, it's always ignored
```
Because a default status of `200` is being specified in
`rest_framework.response.Response`. I think is more Django-friendly to
just leave that status default value to `None` and leave the
responsibility of choosing its value to the parent class: `HttpResponse`.
---
rest_framework/response.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rest_framework/response.py b/rest_framework/response.py
index 5c02ea50..25b78524 100644
--- a/rest_framework/response.py
+++ b/rest_framework/response.py
@@ -20,7 +20,7 @@ class Response(SimpleTemplateResponse):
if django.VERSION >= (1, 4):
rendering_attrs = SimpleTemplateResponse.rendering_attrs + ['_closable_objects']
- def __init__(self, data=None, status=200,
+ def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
"""
--
cgit v1.2.3
From f87aadb3ced996f54d26d3505ec3df76fcba23df Mon Sep 17 00:00:00 2001
From: Tom Christie
Date: Fri, 1 Aug 2014 11:35:48 +0100
Subject: Latest sponsor updates
---
docs/img/sponsors/2-vinta.png | Bin 9918 -> 6844 bytes
docs/img/sponsors/3-beefarm.png | Bin 0 -> 13066 bytes
docs/img/sponsors/3-fluxility.png | Bin 0 -> 10064 bytes
docs/img/sponsors/3-nephila.png | Bin 0 -> 5842 bytes
docs/img/sponsors/3-tivix.png | Bin 4091 -> 3552 bytes
docs/img/sponsors/3-trackmaven.png | Bin 0 -> 28609 bytes
docs/topics/kickstarter-announcement.md | 12 +++++++++---
7 files changed, 9 insertions(+), 3 deletions(-)
create mode 100644 docs/img/sponsors/3-beefarm.png
create mode 100644 docs/img/sponsors/3-fluxility.png
create mode 100644 docs/img/sponsors/3-nephila.png
create mode 100644 docs/img/sponsors/3-trackmaven.png
diff --git a/docs/img/sponsors/2-vinta.png b/docs/img/sponsors/2-vinta.png
index 7c67f6ca..4f4d75bc 100644
Binary files a/docs/img/sponsors/2-vinta.png and b/docs/img/sponsors/2-vinta.png differ
diff --git a/docs/img/sponsors/3-beefarm.png b/docs/img/sponsors/3-beefarm.png
new file mode 100644
index 00000000..3348df42
Binary files /dev/null and b/docs/img/sponsors/3-beefarm.png differ
diff --git a/docs/img/sponsors/3-fluxility.png b/docs/img/sponsors/3-fluxility.png
new file mode 100644
index 00000000..eacd7da9
Binary files /dev/null and b/docs/img/sponsors/3-fluxility.png differ
diff --git a/docs/img/sponsors/3-nephila.png b/docs/img/sponsors/3-nephila.png
new file mode 100644
index 00000000..12fa46d0
Binary files /dev/null and b/docs/img/sponsors/3-nephila.png differ
diff --git a/docs/img/sponsors/3-tivix.png b/docs/img/sponsors/3-tivix.png
index 90d20753..bc2616a6 100644
Binary files a/docs/img/sponsors/3-tivix.png and b/docs/img/sponsors/3-tivix.png differ
diff --git a/docs/img/sponsors/3-trackmaven.png b/docs/img/sponsors/3-trackmaven.png
new file mode 100644
index 00000000..8d613696
Binary files /dev/null and b/docs/img/sponsors/3-trackmaven.png differ
diff --git a/docs/topics/kickstarter-announcement.md b/docs/topics/kickstarter-announcement.md
index 24c609fa..00d4778f 100644
--- a/docs/topics/kickstarter-announcement.md
+++ b/docs/topics/kickstarter-announcement.md
@@ -119,17 +119,23 @@ The serious financial contribution that our silver sponsors have made is very mu
+
+
-**Individual contributions**: Paul Hallet, Paul Whipp Consulting, Jannis Leidel.
+**Individual contributions**: Paul Hallet, Paul Whipp, Jannis Leidel, Johannes Spielmann, Chris Heisel.
--
cgit v1.2.3
From 27af7a3f4f9870c85d44fde37b041d51d3611473 Mon Sep 17 00:00:00 2001
From: Tom Christie
Date: Fri, 1 Aug 2014 11:36:33 +0100
Subject: Latest sponsor updates
---
docs/img/sponsors/3-trackmaven.png | Bin 28609 -> 5331 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/docs/img/sponsors/3-trackmaven.png b/docs/img/sponsors/3-trackmaven.png
index 8d613696..3880e370 100644
Binary files a/docs/img/sponsors/3-trackmaven.png and b/docs/img/sponsors/3-trackmaven.png differ
--
cgit v1.2.3
From 5377bda9420b5806cfcfceddcfdfbedf5629f6ce Mon Sep 17 00:00:00 2001
From: Tom Christie
Date: Fri, 1 Aug 2014 13:42:51 +0100
Subject: Fix LaterPay link
---
docs/topics/kickstarter-announcement.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/topics/kickstarter-announcement.md b/docs/topics/kickstarter-announcement.md
index 00d4778f..93f670aa 100644
--- a/docs/topics/kickstarter-announcement.md
+++ b/docs/topics/kickstarter-announcement.md
@@ -68,7 +68,7 @@ Our platinum sponsors have each made a hugely substantial contribution to the fu
Our gold sponsors include companies large and small. Many thanks for their significant funding of the project and their commitment to sustainable open-source development.
--
cgit v1.2.3
From 322476c3863090dc2ddbedfcb21ddab7bb64ab35 Mon Sep 17 00:00:00 2001
From: Tom Christie
Date: Mon, 4 Aug 2014 09:20:27 +0100
Subject: Latest sponsor update
---
docs/img/sponsors/3-garfo.png | Bin 4621 -> 3322 bytes
docs/topics/kickstarter-announcement.md | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/img/sponsors/3-garfo.png b/docs/img/sponsors/3-garfo.png
index 7c3f8e05..a9bdea0a 100644
Binary files a/docs/img/sponsors/3-garfo.png and b/docs/img/sponsors/3-garfo.png differ
diff --git a/docs/topics/kickstarter-announcement.md b/docs/topics/kickstarter-announcement.md
index f1a1b6dd..49757c22 100644
--- a/docs/topics/kickstarter-announcement.md
+++ b/docs/topics/kickstarter-announcement.md
@@ -137,5 +137,5 @@ The serious financial contribution that our silver sponsors have made is very mu
-**Individual contributions**: Paul Hallet, Paul Whipp, Jannis Leidel, Johannes Spielmann, Chris Heisel.
+**Individual contributions**: Paul Hallet, Paul Whipp, Jannis Leidel, Johannes Spielmann, Chris Heisel, Marwan Alsabbagh.
--
cgit v1.2.3
From 2d6469348de71f04507f00a5e0e608ae49829dd1 Mon Sep 17 00:00:00 2001
From: Jason Alan Palmer
Date: Tue, 5 Aug 2014 10:25:48 -0400
Subject: Remove duplicate class attributes
These duplicate attributes are ignored by at least Firefox and Chrome, so this change has no effect on the style---
rest_framework/templates/rest_framework/base.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html
index 7067ee2f..e96fa8ec 100644
--- a/rest_framework/templates/rest_framework/base.html
+++ b/rest_framework/templates/rest_framework/base.html
@@ -93,7 +93,7 @@
{% endif %}
{% if options_form %}
-