change get_user to use a protocol requiring a session (#522)

* change get_user to use a protocol requiring a session
define a "_HasSession" protocol, and update contrib.auth.get_user to use it
get_user only requires a session field, and idiomatic django testing frequently calls get_user with a TestClient

* run black

* use union for get_user instead of a protocol

* create tests for get_user typechecking

* properly import test client
This commit is contained in:
proxy
2020-11-07 03:38:45 -05:00
committed by GitHub
parent 1c4a7d25c7
commit aab8acf2ea
3 changed files with 21 additions and 7 deletions

View File

@@ -7,12 +7,11 @@ from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model
from django.db.models.options import Options
from django.http.request import HttpRequest
from django.test.client import Client
from .signals import (
user_logged_in as user_logged_in,
user_logged_out as user_logged_out,
user_login_failed as user_login_failed,
)
from .signals import user_logged_in as user_logged_in
from .signals import user_logged_out as user_logged_out
from .signals import user_login_failed as user_login_failed
SESSION_KEY: str
BACKEND_SESSION_KEY: str
@@ -27,7 +26,7 @@ def login(
) -> None: ...
def logout(request: HttpRequest) -> None: ...
def get_user_model() -> Type[Model]: ...
def get_user(request: HttpRequest) -> Union[AbstractBaseUser, AnonymousUser]: ...
def get_user(request: Union[HttpRequest, Client]) -> Union[AbstractBaseUser, AnonymousUser]: ...
def get_permission_codename(action: str, opts: Options) -> str: ...
def update_session_auth_hash(request: HttpRequest, user: AbstractBaseUser) -> None: ...

View File

@@ -8,7 +8,7 @@ from typing_extensions import Literal
from django.http import HttpRequest, HttpResponse
_FormT = TypeVar('_FormT', bound=BaseForm)
_FormT = TypeVar("_FormT", bound=BaseForm)
class AbstractFormMixin(ContextMixin):
initial: Dict[str, Any] = ...

View File

@@ -0,0 +1,15 @@
- case: test_request_session
main: |
from django.contrib.auth import get_user
from django.contrib.sessions.middleware import SessionMiddleware
from django.http import HttpRequest
request = HttpRequest()
SessionMiddleware().process_request(request)
get_user(request)
- case: test_client_session
main: |
from django.contrib.auth import get_user
from django.test import Client
get_user(Client())