Skip to content

Commit 8c4bfc7

Browse files
authored
Add django-upgrade to pre-commit hooks (#9683)
1 parent c9b3af7 commit 8c4bfc7

15 files changed

Lines changed: 51 additions & 42 deletions

.pre-commit-config.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,7 @@ repos:
4343
rev: v2.11.1
4444
hooks:
4545
- id: pyproject-fmt
46+
- repo: https://github.com/adamchainz/django-upgrade
47+
rev: 1.24.0
48+
hooks:
49+
- id: django-upgrade

rest_framework/authentication.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def get_authorization_header(request):
1717
1818
Hide some test client ickyness where the header can be unicode.
1919
"""
20-
auth = request.META.get('HTTP_AUTHORIZATION', b'')
20+
auth = request.headers.get('authorization', b'')
2121
if isinstance(auth, str):
2222
# Work around django test client oddness
2323
auth = auth.encode(HTTP_HEADER_ENCODING)

rest_framework/authtoken/admin.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def url_for_result(self, result):
2121
current_app=self.model_admin.admin_site.name)
2222

2323

24+
@admin.register(TokenProxy)
2425
class TokenAdmin(admin.ModelAdmin):
2526
list_display = ('key', 'user', 'created')
2627
list_filter = ('created',)
@@ -50,6 +51,3 @@ def delete_model(self, request, obj):
5051
# Map back to actual Token, since delete() uses pk.
5152
token = Token.objects.get(key=obj.key)
5253
return super().delete_model(request, token)
53-
54-
55-
admin.site.register(TokenProxy, TokenAdmin)

rest_framework/negotiation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,5 @@ def get_accept_list(self, request):
9393
Given the incoming request, return a tokenized list of media
9494
type strings.
9595
"""
96-
header = request.META.get('HTTP_ACCEPT', '*/*')
96+
header = request.headers.get('accept', '*/*')
9797
return [token.strip() for token in header.split(',')]

rest_framework/throttling.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def get_ident(self, request):
2626
if present and number of proxies is > 0. If not use all of
2727
HTTP_X_FORWARDED_FOR if it is available, if not use REMOTE_ADDR.
2828
"""
29-
xff = request.META.get('HTTP_X_FORWARDED_FOR')
29+
xff = request.headers.get('x-forwarded-for')
3030
remote_addr = request.META.get('REMOTE_ADDR')
3131
num_proxies = api_settings.NUM_PROXIES
3232

tests/test_decorators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def view(request):
178178
def test_content_negotiation(self):
179179
class CustomContentNegotiation(BaseContentNegotiation):
180180
def select_renderer(self, request, renderers, format_suffix):
181-
assert request.META['HTTP_ACCEPT'] == 'custom/type'
181+
assert request.headers['accept'] == 'custom/type'
182182
return (renderers[0], renderers[0].media_type)
183183

184184
@api_view(["GET"])

tests/test_middleware.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def test_middleware_can_access_user_when_processing_response(self):
9999
key = 'abcd1234'
100100
Token.objects.create(key=key, user=user)
101101

102-
self.client.get('/auth', HTTP_AUTHORIZATION='Token %s' % key)
102+
self.client.get('/auth', headers={"authorization": 'Token %s' % key})
103103

104104
@override_settings(MIDDLEWARE=('tests.test_middleware.RequestPOSTMiddleware',))
105105
def test_middleware_can_access_request_post_when_processing_response(self):

tests/test_relations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from _pytest.monkeypatch import MonkeyPatch
55
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
66
from django.test import override_settings
7-
from django.urls import re_path
7+
from django.urls import path
88
from django.utils.datastructures import MultiValueDict
99

1010
from rest_framework import relations, serializers
@@ -152,7 +152,7 @@ def test_pk_representation(self):
152152

153153

154154
urlpatterns = [
155-
re_path(r'^example/(?P<name>.+)/$', lambda: None, name='example'),
155+
path('example/<path:name>/', lambda: None, name='example'),
156156
]
157157

158158

tests/test_renderers.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -174,30 +174,30 @@ def test_head_method_serializes_no_content(self):
174174

175175
def test_default_renderer_serializes_content_on_accept_any(self):
176176
"""If the Accept header is set to */* the default renderer should serialize the response."""
177-
resp = self.client.get('/', HTTP_ACCEPT='*/*')
177+
resp = self.client.get('/', headers={"accept": '*/*'})
178178
self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8')
179179
self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT))
180180
self.assertEqual(resp.status_code, DUMMYSTATUS)
181181

182182
def test_specified_renderer_serializes_content_default_case(self):
183183
"""If the Accept header is set the specified renderer should serialize the response.
184184
(In this case we check that works for the default renderer)"""
185-
resp = self.client.get('/', HTTP_ACCEPT=RendererA.media_type)
185+
resp = self.client.get('/', headers={"accept": RendererA.media_type})
186186
self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8')
187187
self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT))
188188
self.assertEqual(resp.status_code, DUMMYSTATUS)
189189

190190
def test_specified_renderer_serializes_content_non_default_case(self):
191191
"""If the Accept header is set the specified renderer should serialize the response.
192192
(In this case we check that works for a non-default renderer)"""
193-
resp = self.client.get('/', HTTP_ACCEPT=RendererB.media_type)
193+
resp = self.client.get('/', headers={"accept": RendererB.media_type})
194194
self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8')
195195
self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
196196
self.assertEqual(resp.status_code, DUMMYSTATUS)
197197

198198
def test_unsatisfiable_accept_header_on_request_returns_406_status(self):
199199
"""If the Accept header is unsatisfiable we should return a 406 Not Acceptable response."""
200-
resp = self.client.get('/', HTTP_ACCEPT='foo/bar')
200+
resp = self.client.get('/', headers={"accept": 'foo/bar'})
201201
self.assertEqual(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE)
202202

203203
def test_specified_renderer_serializes_content_on_format_query(self):
@@ -228,14 +228,14 @@ def test_specified_renderer_is_used_on_format_query_with_matching_accept(self):
228228
RendererB.format
229229
)
230230
resp = self.client.get('/' + param,
231-
HTTP_ACCEPT=RendererB.media_type)
231+
headers={"accept": RendererB.media_type})
232232
self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8')
233233
self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
234234
self.assertEqual(resp.status_code, DUMMYSTATUS)
235235

236236
def test_parse_error_renderers_browsable_api(self):
237237
"""Invalid data should still render the browsable API correctly."""
238-
resp = self.client.post('/parseerror', data='foobar', content_type='application/json', HTTP_ACCEPT='text/html')
238+
resp = self.client.post('/parseerror', data='foobar', content_type='application/json', headers={"accept": 'text/html'})
239239
self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8')
240240
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
241241

@@ -834,19 +834,19 @@ class DummyView:
834834
assert result is None
835835

836836
def test_extra_actions_dropdown(self):
837-
resp = self.client.get('/api/examples/', HTTP_ACCEPT='text/html')
837+
resp = self.client.get('/api/examples/', headers={"accept": 'text/html'})
838838
assert 'id="extra-actions-menu"' in resp.content.decode()
839839
assert '/api/examples/list_action/' in resp.content.decode()
840840
assert '>Extra list action<' in resp.content.decode()
841841

842842
def test_extra_actions_dropdown_not_authed(self):
843-
resp = self.client.get('/api/unauth-examples/', HTTP_ACCEPT='text/html')
843+
resp = self.client.get('/api/unauth-examples/', headers={"accept": 'text/html'})
844844
assert 'id="extra-actions-menu"' not in resp.content.decode()
845845
assert '/api/examples/list_action/' not in resp.content.decode()
846846
assert '>Extra list action<' not in resp.content.decode()
847847

848848
def test_options_form_does_not_check_object_permissions_for_extra_action(self):
849-
resp = self.client.get('/api/issue-6855/1/extra_action/', HTTP_ACCEPT='text/html')
849+
resp = self.client.get('/api/issue-6855/1/extra_action/', headers={"accept": 'text/html'})
850850
assert resp.status_code == status.HTTP_200_OK
851851

852852
def test_delete_form_still_checks_object_permissions(self):

tests/test_requests_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def post(self, request):
2828
}
2929
post = request.POST
3030
json = None
31-
if request.META.get('CONTENT_TYPE') == 'application/json':
31+
if request.headers.get('content-type') == 'application/json':
3232
json = request.data
3333

3434
return Response({

0 commit comments

Comments
 (0)