Skip to content

Commit 5083b2a

Browse files
authored
fixed typing in contrib.auth.decorators (#2564)
1 parent 8057dec commit 5083b2a

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

django-stubs/contrib/auth/decorators.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
from collections.abc import Callable, Iterable
1+
from collections.abc import Awaitable, Callable, Iterable
22
from typing import TypeVar, overload
33

44
from django.contrib.auth.base_user import _UserModel
55
from django.contrib.auth.models import AnonymousUser
66
from django.http.response import HttpResponseBase
77

8-
_VIEW = TypeVar("_VIEW", bound=Callable[..., HttpResponseBase])
8+
_VIEW = TypeVar("_VIEW", bound=Callable[..., HttpResponseBase | Awaitable[HttpResponseBase]])
99

1010
def user_passes_test(
1111
test_func: Callable[[_UserModel | AnonymousUser], bool],

tests/typecheck/contrib/auth/test_decorators.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66
@login_required
77
def view_func(request: HttpRequest) -> HttpResponse: ...
88
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
9+
- case: login_required_bare_async
10+
main: |
11+
from typing import Any
12+
from django.contrib.auth.decorators import login_required
13+
from django.http import HttpRequest, HttpResponse
14+
@login_required
15+
async def view_func(request: HttpRequest) -> HttpResponse: ...
16+
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
917
- case: login_required_fancy
1018
main: |
1119
from django.contrib.auth.decorators import login_required
@@ -14,6 +22,14 @@
1422
@login_required(redirect_field_name='a', login_url='b')
1523
def view_func(request: WSGIRequest, arg: str) -> HttpResponse: ...
1624
reveal_type(view_func) # N: Revealed type is "def (request: django.core.handlers.wsgi.WSGIRequest, arg: builtins.str) -> django.http.response.HttpResponse"
25+
- case: login_required_fancy_async
26+
main: |
27+
from django.contrib.auth.decorators import login_required
28+
from django.core.handlers.asgi import ASGIRequest
29+
from django.http import HttpResponse
30+
@login_required(redirect_field_name='a', login_url='b')
31+
async def view_func(request: ASGIRequest, arg: str) -> HttpResponse: ...
32+
reveal_type(view_func) # N: Revealed type is "def (request: django.core.handlers.asgi.ASGIRequest, arg: builtins.str) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
1733
- case: login_required_weird
1834
main: |
1935
from django.contrib.auth.decorators import login_required
@@ -35,6 +51,13 @@
3551
@user_passes_test(lambda u: u.get_username().startswith('super'))
3652
def view_func(request: HttpRequest) -> HttpResponse: ...
3753
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
54+
- case: user_passes_test_async
55+
main: |
56+
from django.contrib.auth.decorators import user_passes_test
57+
from django.http import HttpRequest, HttpResponse
58+
@user_passes_test(lambda u: u.get_username().startswith('super'))
59+
async def view_func(request: HttpRequest) -> HttpResponse: ...
60+
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"
3861
- case: user_passes_test_bare_is_error
3962
main: |
4063
from django.http import HttpRequest, HttpResponse
@@ -47,3 +70,11 @@
4770
from django.http import HttpRequest, HttpResponse
4871
@permission_required('polls.can_vote')
4972
def view_func(request: HttpRequest) -> HttpResponse: ...
73+
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse"
74+
- case: permission_required_async
75+
main: |
76+
from django.contrib.auth.decorators import permission_required
77+
from django.http import HttpRequest, HttpResponse
78+
@permission_required('polls.can_vote')
79+
async def view_func(request: HttpRequest) -> HttpResponse: ...
80+
reveal_type(view_func) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]"

0 commit comments

Comments
 (0)