Skip to content

Commit b1426a6

Browse files
adamchainzsobolevn
andauthored
Update contrib.auth for Django 5.1 (#2555)
* Update contrib.auth for Django 5.1 From django/django@00e1879: * `django.contrib.auth.base_user.BaseUserManager.make_random_password` removed From django/django@f64c528: * `django.contrib.auth.forms.AdminPasswordChangeForm.clean_password2` removed * `django.contrib.auth.forms.BaseUserCreationForm.clean_password2` removed * `django.contrib.auth.forms.SetPasswordForm.clean_new_password2` removed * `django.contrib.auth.forms.SetPasswordMixin` added From django/django@e626716: * `django.contrib.auth.forms.AdminPasswordChangeForm.usable_password_help_text` added From django/django@da22e6c: * `django.contrib.auth.forms.SetUnusablePasswordMixin` added * `django.contrib.auth.forms.AdminUserCreationForm` added From django/django@c7fc9f2: * `django.contrib.auth.middleware.LoginRequiredMiddleware` added * ClassVar Co-authored-by: sobolevn <mail@sobolevn.me> * _ErrorMessagesDict * import --------- Co-authored-by: sobolevn <mail@sobolevn.me>
1 parent c9387e5 commit b1426a6

File tree

5 files changed

+56
-15
lines changed

5 files changed

+56
-15
lines changed

django-stubs/contrib/auth/base_user.pyi

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ _T = TypeVar("_T", bound=Model)
1212
class BaseUserManager(models.Manager[_T]):
1313
@classmethod
1414
def normalize_email(cls, email: str | None) -> str: ...
15-
def make_random_password(self, length: int = ..., allowed_chars: str = ...) -> str: ...
1615
def get_by_natural_key(self, username: str | None) -> _T: ...
1716

1817
class AbstractBaseUser(models.Model):

django-stubs/contrib/auth/forms.pyi

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ from django.db.models.fields import _ErrorMessagesDict
1111
from django.forms.fields import _ClassLevelWidgetT
1212
from django.forms.widgets import Widget
1313
from django.http.request import HttpRequest
14+
from django.utils.functional import _StrOrPromise
1415
from typing_extensions import TypeAlias
1516

1617
logger: Logger
@@ -31,12 +32,42 @@ class UsernameField(forms.CharField):
3132
def to_python(self, value: Any | None) -> Any | None: ...
3233
def widget_attrs(self, widget: Widget) -> dict[str, Any]: ...
3334

35+
class SetPasswordMixin:
36+
error_messages: _ErrorMessagesDict
37+
38+
@staticmethod
39+
def create_password_fields(
40+
label1: _StrOrPromise = ..., label2: _StrOrPromise = ...
41+
) -> tuple[forms.CharField, forms.CharField]: ...
42+
def validate_passwords(
43+
self,
44+
password1_field_name: str = ...,
45+
password2_field_name: str = ...,
46+
) -> None: ...
47+
def validate_password_for_user(self, user: AbstractBaseUser, password_field_name: str = "password2") -> None: ...
48+
def set_password_and_save(
49+
self, user: AbstractBaseUser, password_field_name: str = "password1", commit: bool = True
50+
) -> AbstractBaseUser: ...
51+
52+
class SetUnusablePasswordMixin:
53+
usable_password_help_text: _StrOrPromise
54+
55+
@staticmethod
56+
def create_usable_password_field(help_text: _StrOrPromise = ...) -> forms.ChoiceField: ...
57+
def validate_passwords(
58+
self,
59+
password1_field_name: str = ...,
60+
password2_field_name: str = ...,
61+
usable_password_field_name: str = ...,
62+
) -> None: ...
63+
def validate_password_for_user(self, user: AbstractBaseUser, **kwargs: Any) -> None: ...
64+
def set_password_and_save(self, user: _User, commit: bool = True, **kwargs: Any) -> _User: ...
65+
3466
class BaseUserCreationForm(forms.ModelForm[_User]):
3567
error_messages: _ErrorMessagesDict
3668
password1: forms.Field
3769
password2: forms.Field
3870
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
39-
def clean_password2(self) -> str: ...
4071
def save(self, commit: bool = ...) -> _User: ...
4172

4273
class UserCreationForm(BaseUserCreationForm[_User]):
@@ -90,7 +121,6 @@ class SetPasswordForm(forms.Form):
90121
new_password2: forms.Field
91122
user: AbstractBaseUser
92123
def __init__(self, user: AbstractBaseUser, *args: Any, **kwargs: Any) -> None: ...
93-
def clean_new_password2(self) -> str: ...
94124
def save(self, commit: bool = ...) -> AbstractBaseUser: ...
95125

96126
class PasswordChangeForm(SetPasswordForm):
@@ -101,11 +131,14 @@ class PasswordChangeForm(SetPasswordForm):
101131
class AdminPasswordChangeForm(forms.Form):
102132
error_messages: _ErrorMessagesDict
103133
required_css_class: str
134+
usable_password_help_text: str
104135
password1: forms.Field
105136
password2: forms.Field
106137
user: AbstractBaseUser
107138
def __init__(self, user: AbstractBaseUser, *args: Any, **kwargs: Any) -> None: ...
108-
def clean_password2(self) -> str: ...
109139
def save(self, commit: bool = ...) -> AbstractBaseUser: ...
110140
@property
111141
def changed_data(self) -> list[str]: ...
142+
143+
class AdminUserCreationForm(SetUnusablePasswordMixin, UserCreationForm):
144+
usable_password: forms.ChoiceField = ...

django-stubs/contrib/auth/middleware.pyi

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from typing import Any, Callable, ClassVar
2+
13
from django.contrib.auth.base_user import _UserModel
24
from django.contrib.auth.models import AnonymousUser
3-
from django.http.request import HttpRequest
5+
from django.http import HttpRequest, HttpResponseBase, HttpResponseRedirect
46
from django.utils.deprecation import MiddlewareMixin
57

68
def get_user(request: HttpRequest) -> AnonymousUser | _UserModel: ...
@@ -9,6 +11,22 @@ async def auser(request: HttpRequest) -> AnonymousUser | _UserModel: ...
911
class AuthenticationMiddleware(MiddlewareMixin):
1012
def process_request(self, request: HttpRequest) -> None: ...
1113

14+
class LoginRequiredMiddleware(MiddlewareMixin):
15+
redirect_field_name: ClassVar[str]
16+
17+
def process_view(
18+
self,
19+
request: HttpRequest,
20+
view_func: Callable[..., HttpResponseBase],
21+
view_args: tuple[Any, ...],
22+
view_kwargs: dict[Any, Any],
23+
) -> HttpResponseBase | None: ...
24+
def get_login_url(self, view_func: Callable[..., HttpResponseBase]) -> str: ...
25+
def get_redirect_field_name(self, view_func: Callable[..., HttpResponseBase]) -> str: ...
26+
def handle_no_permission(
27+
self, request: HttpRequest, view_func: Callable[..., HttpResponseBase]
28+
) -> HttpResponseRedirect: ...
29+
1230
class RemoteUserMiddleware(MiddlewareMixin):
1331
header: str
1432
force_logout_if_no_header: bool

scripts/stubtest/allowlist_todo.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ django.contrib.auth.backends.RemoteUserBackend.authenticate
6767
django.contrib.auth.base_user.AbstractBaseUser.last_login
6868
django.contrib.auth.base_user.AbstractBaseUser.password
6969
django.contrib.auth.decorators.login_required
70+
django.contrib.auth.forms.AdminUserCreationForm.declared_fields
7071
django.contrib.auth.forms.BaseUserCreationForm.declared_fields
7172
django.contrib.auth.forms.UserChangeForm.declared_fields
7273
django.contrib.auth.forms.UserCreationForm.declared_fields

scripts/stubtest/allowlist_todo_django51.txt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,6 @@
33
# Only discrepancies that appeared after Django 5.0 -> 5.1 update.
44
# Unsorted: there are real problems and things we can really ignore:
55

6-
django.contrib.auth.base_user.BaseUserManager.make_random_password
7-
django.contrib.auth.forms.AdminPasswordChangeForm.clean_password2
8-
django.contrib.auth.forms.AdminPasswordChangeForm.usable_password_help_text
9-
django.contrib.auth.forms.BaseUserCreationForm.clean_password2
10-
django.contrib.auth.forms.SetPasswordForm.clean_new_password2
11-
django.contrib.auth.forms.SetPasswordMixin
12-
django.contrib.auth.forms.SetUnusablePasswordMixin
13-
django.contrib.auth.forms.AdminUserCreationForm
14-
django.contrib.auth.middleware.LoginRequiredMiddleware
15-
django.contrib.auth.models.BaseUserManager.make_random_password
166
django.contrib.contenttypes.fields.GenericForeignKey.cache_name
177
django.contrib.contenttypes.fields.GenericForeignKey.get_attname_column
188
django.contrib.contenttypes.models.ContentType.get_object_for_this_type

0 commit comments

Comments
 (0)