Skip to content

Commit ff556a9

Browse files
jdufresnecarltongibson
authored andcommitted
Remove references to unsupported Django versions in docs and code (#5602)
Per the trove classifiers, DRF only supports Django versions 1.10+. Can drop documentation, code comments, and workarounds for older Django versions.
1 parent 9c11077 commit ff556a9

File tree

11 files changed

+16
-42
lines changed

11 files changed

+16
-42
lines changed

docs/api-guide/fields.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,6 @@ Corresponds to `django.db.models.fields.DurationField`
356356
The `validated_data` for these fields will contain a `datetime.timedelta` instance.
357357
The representation is a string following this format `'[DD] [HH:[MM:]]ss[.uuuuuu]'`.
358358

359-
**Note:** This field is only available with Django versions >= 1.8.
360-
361359
**Signature:** `DurationField()`
362360

363361
---
@@ -681,4 +679,4 @@ The [django-rest-framework-hstore][django-rest-framework-hstore] package provide
681679
[django-rest-framework-gis]: https://github.com/djangonauts/django-rest-framework-gis
682680
[django-rest-framework-hstore]: https://github.com/djangonauts/django-rest-framework-hstore
683681
[django-hstore]: https://github.com/djangonauts/django-hstore
684-
[python-decimal-rounding-modes]: https://docs.python.org/3/library/decimal.html#rounding-modes
682+
[python-decimal-rounding-modes]: https://docs.python.org/3/library/decimal.html#rounding-modes

docs/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ If you're intending to use the browsable API you'll probably also want to add RE
120120

121121
urlpatterns = [
122122
...
123-
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
123+
url(r'^api-auth/', include('rest_framework.urls'))
124124
]
125125

126-
Note that the URL path can be whatever you want, but you must include `'rest_framework.urls'` with the `'rest_framework'` namespace. You may leave out the namespace in Django 1.9+, and REST framework will set it for you.
126+
Note that the URL path can be whatever you want.
127127

128128
## Example
129129

docs/tutorial/1-serialization.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ We'll need to add our new `snippets` app and the `rest_framework` app to `INSTAL
4848
'snippets.apps.SnippetsConfig',
4949
)
5050

51-
Please note that if you're using Django <1.9, you need to replace `snippets.apps.SnippetsConfig` with `snippets`.
52-
5351
Okay, we're ready to roll.
5452

5553
## Creating a model to work with

docs/tutorial/4-authentication-and-permissions.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,10 @@ Add the following import at the top of the file:
142142
And, at the end of the file, add a pattern to include the login and logout views for the browsable API.
143143

144144
urlpatterns += [
145-
url(r'^api-auth/', include('rest_framework.urls',
146-
namespace='rest_framework')),
145+
url(r'^api-auth/', include('rest_framework.urls'),
147146
]
148147

149-
The `r'^api-auth/'` part of pattern can actually be whatever URL you want to use. The only restriction is that the included urls must use the `'rest_framework'` namespace. In Django 1.9+, REST framework will set the namespace, so you may leave it out.
148+
The `r'^api-auth/'` part of pattern can actually be whatever URL you want to use.
150149

151150
Now if you open up the browser again and refresh the page you'll see a 'Login' link in the top right of the page. If you log in as one of the users you created earlier, you'll be able to create code snippets again.
152151

rest_framework/authtoken/serializers.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,10 @@ def validate(self, attrs):
2020
user = authenticate(request=self.context.get('request'),
2121
username=username, password=password)
2222

23-
if user:
24-
# From Django 1.10 onwards the `authenticate` call simply
25-
# returns `None` for is_active=False users.
26-
# (Assuming the default `ModelBackend` authentication backend.)
27-
if not user.is_active:
28-
msg = _('User account is disabled.')
29-
raise serializers.ValidationError(msg, code='authorization')
30-
else:
23+
# The authenticate call simply returns None for is_active=False
24+
# users. (Assuming the default ModelBackend authentication
25+
# backend.)
26+
if not user:
3127
msg = _('Unable to log in with provided credentials.')
3228
raise serializers.ValidationError(msg, code='authorization')
3329
else:

rest_framework/renderers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ def get_context(self, data, accepted_media_type, renderer_context):
666666
paginator = None
667667

668668
csrf_cookie_name = settings.CSRF_COOKIE_NAME
669-
csrf_header_name = getattr(settings, 'CSRF_HEADER_NAME', 'HTTP_X_CSRFToken') # Fallback for Django 1.8
669+
csrf_header_name = settings.CSRF_HEADER_NAME
670670
if csrf_header_name.startswith('HTTP_'):
671671
csrf_header_name = csrf_header_name[5:]
672672
csrf_header_name = csrf_header_name.replace('_', '-')

rest_framework/urls.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
77
urlpatterns = [
88
...
9-
url(r'^auth/', include('rest_framework.urls', namespace='rest_framework'))
9+
url(r'^auth/', include('rest_framework.urls'))
1010
]
1111
12-
In Django versions older than 1.9, the urls must be namespaced as 'rest_framework',
13-
and you should make sure your authentication settings include `SessionAuthentication`.
12+
You should make sure your authentication settings include `SessionAuthentication`.
1413
"""
1514
from __future__ import unicode_literals
1615

rest_framework/utils/model_meta.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,18 +105,13 @@ def _get_reverse_relationships(opts):
105105
"""
106106
Returns an `OrderedDict` of field names to `RelationInfo`.
107107
"""
108-
# Note that we have a hack here to handle internal API differences for
109-
# this internal API across Django 1.7 -> Django 1.8.
110-
# See: https://code.djangoproject.com/ticket/24208
111-
112108
reverse_relations = OrderedDict()
113109
all_related_objects = [r for r in opts.related_objects if not r.field.many_to_many]
114110
for relation in all_related_objects:
115111
accessor_name = relation.get_accessor_name()
116-
related = getattr(relation, 'related_model', relation.model)
117112
reverse_relations[accessor_name] = RelationInfo(
118113
model_field=None,
119-
related_model=related,
114+
related_model=relation.related_model,
120115
to_many=relation.field.remote_field.multiple,
121116
to_field=_get_to_field(relation.field),
122117
has_through_model=False,
@@ -127,10 +122,9 @@ def _get_reverse_relationships(opts):
127122
all_related_many_to_many_objects = [r for r in opts.related_objects if r.field.many_to_many]
128123
for relation in all_related_many_to_many_objects:
129124
accessor_name = relation.get_accessor_name()
130-
related = getattr(relation, 'related_model', relation.model)
131125
reverse_relations[accessor_name] = RelationInfo(
132126
model_field=None,
133-
related_model=related,
127+
related_model=relation.related_model,
134128
to_many=True,
135129
# manytomany do not have to_fields
136130
to_field=None,

tests/test_atomic_requests.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,12 @@ def test_api_exception_rollback_transaction(self):
120120
Transaction is rollbacked by our transaction atomic block.
121121
"""
122122
request = factory.post('/')
123-
num_queries = (4 if getattr(connection.features,
124-
'can_release_savepoints', False) else 3)
123+
num_queries = 4 if connection.features.can_release_savepoints else 3
125124
with self.assertNumQueries(num_queries):
126125
# 1 - begin savepoint
127126
# 2 - insert
128127
# 3 - rollback savepoint
129-
# 4 - release savepoint (django>=1.8 only)
128+
# 4 - release savepoint
130129
with transaction.atomic():
131130
response = self.view(request)
132131
assert transaction.get_rollback()

tests/test_fields.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import uuid
66
from decimal import ROUND_DOWN, ROUND_UP, Decimal
77

8-
import django
98
import pytest
109
from django.http import QueryDict
1110
from django.test import TestCase, override_settings
@@ -1197,11 +1196,6 @@ class TestDateTimeField(FieldValues):
11971196
field = serializers.DateTimeField(default_timezone=utc)
11981197

11991198

1200-
if django.VERSION[:2] <= (1, 8):
1201-
# Doesn't raise an error on earlier versions of Django
1202-
TestDateTimeField.invalid_inputs.pop('2018-08-16 22:00-24:00')
1203-
1204-
12051199
class TestCustomInputFormatDateTimeField(FieldValues):
12061200
"""
12071201
Valid and invalid values for `DateTimeField` with a custom input format.

tests/test_filters.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from __future__ import unicode_literals
22

33
import datetime
4-
import unittest
54

6-
import django
75
import pytest
86
from django.core.exceptions import ImproperlyConfigured
97
from django.db import models
@@ -291,7 +289,6 @@ def setUpTestData(cls):
291289
Entry.objects.create(blog=b2, headline='Something unrelated', pub_date=datetime.date(1979, 1, 1))
292290
Entry.objects.create(blog=b2, headline='Retrospective on Lennon', pub_date=datetime.date(1990, 6, 1))
293291

294-
@unittest.skipIf(django.VERSION < (1, 9), "Django 1.8 does not support transforms")
295292
def test_multiple_filter_conditions(self):
296293
class SearchListView(generics.ListAPIView):
297294
queryset = Blog.objects.all()

0 commit comments

Comments
 (0)