Add django-upgrade to pre-commit hooks

This commit is contained in:
Ülgen Sarıkavak 2025-04-09 10:14:21 +03:00
parent ea1da76196
commit 5ce273bbce
14 changed files with 36 additions and 28 deletions

View File

@ -37,3 +37,13 @@ repos:
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: ["--py39-plus", "--keep-percent-format"] args: ["--py39-plus", "--keep-percent-format"]
- repo: https://github.com/adamchainz/django-upgrade
rev: 1.24.0
hooks:
- id: django-upgrade
args: [
--target-version, "4.2",
# test_urlpatterns.py has re_path related tests
--skip, "django_urls", "tests/test_urlpatterns.py",
]

View File

@ -17,7 +17,7 @@ def get_authorization_header(request):
Hide some test client ickyness where the header can be unicode. Hide some test client ickyness where the header can be unicode.
""" """
auth = request.META.get('HTTP_AUTHORIZATION', b'') auth = request.headers.get('authorization', b'')
if isinstance(auth, str): if isinstance(auth, str):
# Work around django test client oddness # Work around django test client oddness
auth = auth.encode(HTTP_HEADER_ENCODING) auth = auth.encode(HTTP_HEADER_ENCODING)

View File

@ -21,6 +21,7 @@ class TokenChangeList(ChangeList):
current_app=self.model_admin.admin_site.name) current_app=self.model_admin.admin_site.name)
@admin.register(TokenProxy)
class TokenAdmin(admin.ModelAdmin): class TokenAdmin(admin.ModelAdmin):
list_display = ('key', 'user', 'created') list_display = ('key', 'user', 'created')
fields = ('user',) fields = ('user',)
@ -49,6 +50,3 @@ class TokenAdmin(admin.ModelAdmin):
# Map back to actual Token, since delete() uses pk. # Map back to actual Token, since delete() uses pk.
token = Token.objects.get(key=obj.key) token = Token.objects.get(key=obj.key)
return super().delete_model(request, token) return super().delete_model(request, token)
admin.site.register(TokenProxy, TokenAdmin)

View File

@ -93,5 +93,5 @@ class DefaultContentNegotiation(BaseContentNegotiation):
Given the incoming request, return a tokenized list of media Given the incoming request, return a tokenized list of media
type strings. type strings.
""" """
header = request.META.get('HTTP_ACCEPT', '*/*') header = request.headers.get('accept', '*/*')
return [token.strip() for token in header.split(',')] return [token.strip() for token in header.split(',')]

View File

@ -26,7 +26,7 @@ class BaseThrottle:
if present and number of proxies is > 0. If not use all of if present and number of proxies is > 0. If not use all of
HTTP_X_FORWARDED_FOR if it is available, if not use REMOTE_ADDR. HTTP_X_FORWARDED_FOR if it is available, if not use REMOTE_ADDR.
""" """
xff = request.META.get('HTTP_X_FORWARDED_FOR') xff = request.headers.get('x-forwarded-for')
remote_addr = request.META.get('REMOTE_ADDR') remote_addr = request.META.get('REMOTE_ADDR')
num_proxies = api_settings.NUM_PROXIES num_proxies = api_settings.NUM_PROXIES

View File

@ -4,7 +4,7 @@ import unittest
from django.http import HttpResponse from django.http import HttpResponse
from django.test import override_settings from django.test import override_settings
from django.urls import path, re_path from django.urls import path
from rest_framework.compat import coreapi, coreschema from rest_framework.compat import coreapi, coreschema
from rest_framework.parsers import FileUploadParser from rest_framework.parsers import FileUploadParser
@ -180,7 +180,7 @@ class HeadersView(APIView):
urlpatterns = [ urlpatterns = [
path('', SchemaView.as_view()), path('', SchemaView.as_view()),
path('example/', ListView.as_view()), path('example/', ListView.as_view()),
re_path(r'^example/(?P<id>[0-9]+)/$', DetailView.as_view()), path('example/<int:id>/', DetailView.as_view()),
path('upload/', UploadView.as_view()), path('upload/', UploadView.as_view()),
path('download/', DownloadView.as_view()), path('download/', DownloadView.as_view()),
path('text/', TextView.as_view()), path('text/', TextView.as_view()),

View File

@ -102,7 +102,7 @@ class TestMiddleware(APITestCase):
key = 'abcd1234' key = 'abcd1234'
Token.objects.create(key=key, user=user) Token.objects.create(key=key, user=user)
self.client.get('/auth', HTTP_AUTHORIZATION='Token %s' % key) self.client.get('/auth', headers={"authorization": 'Token %s' % key})
@override_settings(MIDDLEWARE=('tests.test_middleware.RequestPOSTMiddleware',)) @override_settings(MIDDLEWARE=('tests.test_middleware.RequestPOSTMiddleware',))
def test_middleware_can_access_request_post_when_processing_response(self): def test_middleware_can_access_request_post_when_processing_response(self):

View File

@ -4,7 +4,7 @@ import pytest
from _pytest.monkeypatch import MonkeyPatch from _pytest.monkeypatch import MonkeyPatch
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.test import override_settings from django.test import override_settings
from django.urls import re_path from django.urls import path
from django.utils.datastructures import MultiValueDict from django.utils.datastructures import MultiValueDict
from rest_framework import relations, serializers from rest_framework import relations, serializers
@ -152,7 +152,7 @@ class TestProxiedPrimaryKeyRelatedField(APISimpleTestCase):
urlpatterns = [ urlpatterns = [
re_path(r'^example/(?P<name>.+)/$', lambda: None, name='example'), path('example/<path:name>/', lambda: None, name='example'),
] ]

View File

@ -174,7 +174,7 @@ class RendererEndToEndTests(TestCase):
def test_default_renderer_serializes_content_on_accept_any(self): def test_default_renderer_serializes_content_on_accept_any(self):
"""If the Accept header is set to */* the default renderer should serialize the response.""" """If the Accept header is set to */* the default renderer should serialize the response."""
resp = self.client.get('/', HTTP_ACCEPT='*/*') resp = self.client.get('/', headers={"accept": '*/*'})
self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)
@ -182,7 +182,7 @@ class RendererEndToEndTests(TestCase):
def test_specified_renderer_serializes_content_default_case(self): def test_specified_renderer_serializes_content_default_case(self):
"""If the Accept header is set the specified renderer should serialize the response. """If the Accept header is set the specified renderer should serialize the response.
(In this case we check that works for the default renderer)""" (In this case we check that works for the default renderer)"""
resp = self.client.get('/', HTTP_ACCEPT=RendererA.media_type) resp = self.client.get('/', headers={"accept": RendererA.media_type})
self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)
@ -190,14 +190,14 @@ class RendererEndToEndTests(TestCase):
def test_specified_renderer_serializes_content_non_default_case(self): def test_specified_renderer_serializes_content_non_default_case(self):
"""If the Accept header is set the specified renderer should serialize the response. """If the Accept header is set the specified renderer should serialize the response.
(In this case we check that works for a non-default renderer)""" (In this case we check that works for a non-default renderer)"""
resp = self.client.get('/', HTTP_ACCEPT=RendererB.media_type) resp = self.client.get('/', headers={"accept": RendererB.media_type})
self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)
def test_unsatisfiable_accept_header_on_request_returns_406_status(self): def test_unsatisfiable_accept_header_on_request_returns_406_status(self):
"""If the Accept header is unsatisfiable we should return a 406 Not Acceptable response.""" """If the Accept header is unsatisfiable we should return a 406 Not Acceptable response."""
resp = self.client.get('/', HTTP_ACCEPT='foo/bar') resp = self.client.get('/', headers={"accept": 'foo/bar'})
self.assertEqual(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE) self.assertEqual(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE)
def test_specified_renderer_serializes_content_on_format_query(self): def test_specified_renderer_serializes_content_on_format_query(self):
@ -228,14 +228,14 @@ class RendererEndToEndTests(TestCase):
RendererB.format RendererB.format
) )
resp = self.client.get('/' + param, resp = self.client.get('/' + param,
HTTP_ACCEPT=RendererB.media_type) headers={"accept": RendererB.media_type})
self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)
def test_parse_error_renderers_browsable_api(self): def test_parse_error_renderers_browsable_api(self):
"""Invalid data should still render the browsable API correctly.""" """Invalid data should still render the browsable API correctly."""
resp = self.client.post('/parseerror', data='foobar', content_type='application/json', HTTP_ACCEPT='text/html') resp = self.client.post('/parseerror', data='foobar', content_type='application/json', headers={"accept": 'text/html'})
self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8') self.assertEqual(resp['Content-Type'], 'text/html; charset=utf-8')
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
@ -714,13 +714,13 @@ class BrowsableAPIRendererTests(URLPatternsTestCase):
assert result is None assert result is None
def test_extra_actions_dropdown(self): def test_extra_actions_dropdown(self):
resp = self.client.get('/api/examples/', HTTP_ACCEPT='text/html') resp = self.client.get('/api/examples/', headers={"accept": 'text/html'})
assert 'id="extra-actions-menu"' in resp.content.decode() assert 'id="extra-actions-menu"' in resp.content.decode()
assert '/api/examples/list_action/' in resp.content.decode() assert '/api/examples/list_action/' in resp.content.decode()
assert '>Extra list action<' in resp.content.decode() assert '>Extra list action<' in resp.content.decode()
def test_extra_actions_dropdown_not_authed(self): def test_extra_actions_dropdown_not_authed(self):
resp = self.client.get('/api/unauth-examples/', HTTP_ACCEPT='text/html') resp = self.client.get('/api/unauth-examples/', headers={"accept": 'text/html'})
assert 'id="extra-actions-menu"' not in resp.content.decode() assert 'id="extra-actions-menu"' not in resp.content.decode()
assert '/api/examples/list_action/' not in resp.content.decode() assert '/api/examples/list_action/' not in resp.content.decode()
assert '>Extra list action<' not in resp.content.decode() assert '>Extra list action<' not in resp.content.decode()

View File

@ -28,7 +28,7 @@ class Root(APIView):
} }
post = request.POST post = request.POST
json = None json = None
if request.META.get('CONTENT_TYPE') == 'application/json': if request.headers.get('content-type') == 'application/json':
json = request.data json = request.data
return Response({ return Response({

View File

@ -151,7 +151,7 @@ class RendererIntegrationTests(TestCase):
def test_default_renderer_serializes_content_on_accept_any(self): def test_default_renderer_serializes_content_on_accept_any(self):
"""If the Accept header is set to */* the default renderer should serialize the response.""" """If the Accept header is set to */* the default renderer should serialize the response."""
resp = self.client.get('/', HTTP_ACCEPT='*/*') resp = self.client.get('/', headers={"accept": '*/*'})
self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)
@ -159,7 +159,7 @@ class RendererIntegrationTests(TestCase):
def test_specified_renderer_serializes_content_default_case(self): def test_specified_renderer_serializes_content_default_case(self):
"""If the Accept header is set the specified renderer should serialize the response. """If the Accept header is set the specified renderer should serialize the response.
(In this case we check that works for the default renderer)""" (In this case we check that works for the default renderer)"""
resp = self.client.get('/', HTTP_ACCEPT=RendererA.media_type) resp = self.client.get('/', headers={"accept": RendererA.media_type})
self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererA.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)
@ -167,7 +167,7 @@ class RendererIntegrationTests(TestCase):
def test_specified_renderer_serializes_content_non_default_case(self): def test_specified_renderer_serializes_content_non_default_case(self):
"""If the Accept header is set the specified renderer should serialize the response. """If the Accept header is set the specified renderer should serialize the response.
(In this case we check that works for a non-default renderer)""" (In this case we check that works for a non-default renderer)"""
resp = self.client.get('/', HTTP_ACCEPT=RendererB.media_type) resp = self.client.get('/', headers={"accept": RendererB.media_type})
self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)
@ -192,7 +192,7 @@ class RendererIntegrationTests(TestCase):
"""If both a 'format' query and a matching Accept header specified, """If both a 'format' query and a matching Accept header specified,
the renderer with the matching format attribute should serialize the response.""" the renderer with the matching format attribute should serialize the response."""
resp = self.client.get('/?format=%s' % RendererB.format, resp = self.client.get('/?format=%s' % RendererB.format,
HTTP_ACCEPT=RendererB.media_type) headers={"accept": RendererB.media_type})
self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8') self.assertEqual(resp['Content-Type'], RendererB.media_type + '; charset=utf-8')
self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) self.assertEqual(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEqual(resp.status_code, DUMMYSTATUS) self.assertEqual(resp.status_code, DUMMYSTATUS)

View File

@ -21,7 +21,7 @@ from rest_framework.test import (
@api_view(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']) @api_view(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'])
def view(request): def view(request):
data = {'auth': request.META.get('HTTP_AUTHORIZATION', b'')} data = {'auth': request.headers.get('authorization', b'')}
if request.user: if request.user:
data['user'] = request.user.username data['user'] = request.user.username
if request.auth: if request.auth:
@ -347,7 +347,7 @@ class TestAPIRequestFactory(TestCase):
data=None, data=None,
content_type='application/json', content_type='application/json',
) )
assert request.META['CONTENT_TYPE'] == 'application/json' assert request.headers['content-type'] == 'application/json'
class TestUrlPatternTestCase(URLPatternsTestCase): class TestUrlPatternTestCase(URLPatternsTestCase):

View File

@ -93,7 +93,7 @@ class FormatSuffixTests(TestCase):
def test_format_suffix_django2_args(self): def test_format_suffix_django2_args(self):
urlpatterns = [ urlpatterns = [
path('convtest/<int:pk>', dummy_view), path('convtest/<int:pk>', dummy_view),
re_path(r'^retest/(?P<pk>[0-9]+)$', dummy_view), path('retest/<int:pk>', dummy_view),
] ]
test_paths = [ test_paths = [
URLTestPath('/convtest/42', (), {'pk': 42}), URLTestPath('/convtest/42', (), {'pk': 42}),

View File

@ -152,7 +152,7 @@ class TestURLReversing(URLPatternsTestCase, APITestCase):
path('v1/', include((included, 'v1'), namespace='v1')), path('v1/', include((included, 'v1'), namespace='v1')),
path('another/', dummy_view, name='another'), path('another/', dummy_view, name='another'),
re_path(r'^(?P<version>[v1|v2]+)/another/$', dummy_view, name='another'), re_path(r'^(?P<version>[v1|v2]+)/another/$', dummy_view, name='another'),
re_path(r'^(?P<foo>.+)/unversioned/$', dummy_view, name='unversioned'), path('<path:foo>/unversioned/', dummy_view, name='unversioned'),
] ]