Skip to content

Commit a59eacd

Browse files
authored
Support more use cases of gettext_lazy. (#1233)
* Replace str with _StrOrPromise where the latter is expected. Fixes #1231 Signed-off-by: Zixuan James Li <[email protected]> * Support lazy strings for _FieldsetSpec. Signed-off-by: Zixuan James Li <[email protected]> Signed-off-by: Zixuan James Li <[email protected]>
1 parent f4cf7f2 commit a59eacd

File tree

4 files changed

+9
-5
lines changed

4 files changed

+9
-5
lines changed

django-stubs/contrib/admin/options.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class _FieldOpts(_OptionalFieldOpts, total=True):
7878
# Workaround for mypy issue, a Sequence type should be preferred here.
7979
# https://github.com/python/mypy/issues/8921
8080
# _FieldsetSpec = Sequence[Tuple[Optional[str], _FieldOpts]]
81-
_FieldsetSpec = _ListOrTuple[Tuple[Optional[str], _FieldOpts]]
81+
_FieldsetSpec = _ListOrTuple[Tuple[Optional[_StrOrPromise], _FieldOpts]]
8282
_ListFilterT = Union[
8383
Type[ListFilter],
8484
Field,

django-stubs/contrib/auth/mixins.pyi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ from typing import Any, Callable, Optional, Sequence
22

33
from django import http
44
from django.http.response import HttpResponseBase, HttpResponseRedirect
5+
from django.utils.functional import _StrOrPromise
56

67
class AccessMixin:
78
login_url: Any = ...
8-
permission_denied_message: str = ...
9+
permission_denied_message: _StrOrPromise = ...
910
raise_exception: bool = ...
1011
redirect_field_name: Any = ...
1112
def get_login_url(self) -> str: ...
12-
def get_permission_denied_message(self) -> str: ...
13+
def get_permission_denied_message(self) -> _StrOrPromise: ...
1314
def get_redirect_field_name(self) -> str: ...
1415
def handle_no_permission(self) -> HttpResponseRedirect: ...
1516

django-stubs/contrib/messages/views.pyi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ from typing import Dict
22

33
from django.forms.forms import BaseForm
44
from django.http.response import HttpResponse
5+
from django.utils.functional import _StrOrPromise
56

67
class SuccessMessageMixin:
7-
success_message: str = ...
8+
success_message: _StrOrPromise = ...
89
def form_valid(self, form: BaseForm) -> HttpResponse: ...
9-
def get_success_message(self, cleaned_data: Dict[str, str]) -> str: ...
10+
def get_success_message(self, cleaned_data: Dict[str, str]) -> _StrOrPromise: ...

tests/typecheck/contrib/admin/test_options.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.db.models.options import Options
1111
from django.http.request import HttpRequest
1212
from django.db.models.query import QuerySet
13+
from django.utils.translation import gettext_lazy as _
1314
1415
def an_action(modeladmin: admin.ModelAdmin, request: HttpRequest, queryset: QuerySet) -> None:
1516
pass
@@ -29,6 +30,7 @@
2930
fieldsets = [
3031
(None, {"fields": ["a", "b"]}),
3132
("group", {"fields": ("c",), "classes": ("a",), "description": "foo"}),
33+
(_("lazy"), {"fields": ["bar"]})
3234
]
3335
form = ModelForm
3436
filter_vertical = ("fields",)

0 commit comments

Comments
 (0)