Skip to content

Commit 87b6ba2

Browse files
authored
Ensure multiple admin get methods returns either list or tuple (#1833)
The get methods serves as extension points for corresponding attributes on the admin class. Thus we align the return type of the the methods with their corresponding attribute's type.
1 parent a217ff0 commit 87b6ba2

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

django-stubs/contrib/admin/options.pyi

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ _ListFilterT: TypeAlias = (
7474
# Generic type specifically for models, for use in BaseModelAdmin and subclasses
7575
# https://github.com/typeddjango/django-stubs/issues/482
7676
_ModelT = TypeVar("_ModelT", bound=Model)
77+
_DisplayT: TypeAlias = _ListOrTuple[str | Callable[[_ModelT], str | bool]]
7778

7879
class BaseModelAdmin(Generic[_ModelT]):
7980
autocomplete_fields: _ListOrTuple[str]
@@ -87,7 +88,7 @@ class BaseModelAdmin(Generic[_ModelT]):
8788
radio_fields: Mapping[str, _Direction]
8889
prepopulated_fields: dict[str, Sequence[str]]
8990
formfield_overrides: Mapping[type[Field], Mapping[str, Any]]
90-
readonly_fields: _ListOrTuple[str] | None
91+
readonly_fields: _ListOrTuple[str]
9192
ordering: _ListOrTuple[str] | None
9293
sortable_by: _ListOrTuple[str] | None
9394
view_on_site: bool | Callable[[_ModelT], str]
@@ -107,18 +108,18 @@ class BaseModelAdmin(Generic[_ModelT]):
107108
def formfield_for_manytomany(
108109
self, db_field: ManyToManyField, request: HttpRequest, **kwargs: Any
109110
) -> ModelMultipleChoiceField | None: ...
110-
def get_autocomplete_fields(self, request: HttpRequest) -> Sequence[str]: ...
111+
def get_autocomplete_fields(self, request: HttpRequest) -> _ListOrTuple[str]: ...
111112
def get_view_on_site_url(self, obj: _ModelT | None = ...) -> str | None: ...
112113
def get_empty_value_display(self) -> SafeString: ...
113-
def get_exclude(self, request: HttpRequest, obj: _ModelT | None = ...) -> Sequence[str] | None: ...
114+
def get_exclude(self, request: HttpRequest, obj: _ModelT | None = ...) -> _ListOrTuple[str] | None: ...
114115
def get_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> _FieldGroups: ...
115116
def get_fieldsets(self, request: HttpRequest, obj: _ModelT | None = ...) -> _FieldsetSpec: ...
116117
def get_inlines(self, request: HttpRequest, obj: _ModelT | None) -> list[type[InlineModelAdmin]]: ...
117-
def get_ordering(self, request: HttpRequest) -> Sequence[str]: ...
118-
def get_readonly_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> Sequence[str]: ...
118+
def get_ordering(self, request: HttpRequest) -> _ListOrTuple[str]: ...
119+
def get_readonly_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> _ListOrTuple[str]: ...
119120
def get_prepopulated_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> dict[str, Sequence[str]]: ...
120121
def get_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ...
121-
def get_sortable_by(self, request: HttpRequest) -> Sequence[str]: ...
122+
def get_sortable_by(self, request: HttpRequest) -> _DisplayT: ...
122123
def lookup_allowed(self, lookup: str, value: str) -> bool: ...
123124
def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ...
124125
def has_add_permission(self, request: HttpRequest) -> bool: ...
@@ -128,7 +129,6 @@ class BaseModelAdmin(Generic[_ModelT]):
128129
def has_view_or_change_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ...
129130
def has_module_permission(self, request: HttpRequest) -> bool: ...
130131

131-
_DisplayT: TypeAlias = _ListOrTuple[str | Callable[[_ModelT], str | bool]]
132132
_ModelAdmin = TypeVar("_ModelAdmin", bound=ModelAdmin)
133133
_ActionCallable: TypeAlias = Callable[[_ModelAdmin, HttpRequest, QuerySet[_ModelT]], HttpResponseBase | None]
134134

@@ -202,9 +202,9 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
202202
def get_action(self, action: Callable | str) -> tuple[Callable[..., str], str, str] | None: ...
203203
def get_list_display(self, request: HttpRequest) -> _DisplayT: ...
204204
def get_list_display_links(self, request: HttpRequest, list_display: _DisplayT) -> _DisplayT: ...
205-
def get_list_filter(self, request: HttpRequest) -> Sequence[_ListFilterT]: ...
206-
def get_list_select_related(self, request: HttpRequest) -> bool | Sequence[str]: ...
207-
def get_search_fields(self, request: HttpRequest) -> Sequence[str]: ...
205+
def get_list_filter(self, request: HttpRequest) -> _ListOrTuple[_ListFilterT]: ...
206+
def get_list_select_related(self, request: HttpRequest) -> bool | _ListOrTuple[str]: ...
207+
def get_search_fields(self, request: HttpRequest) -> _ListOrTuple[str]: ...
208208
def get_search_results(
209209
self, request: HttpRequest, queryset: QuerySet, search_term: str
210210
) -> tuple[QuerySet[_ModelT], bool]: ...

0 commit comments

Comments
 (0)