Skip to content

Commit 9c6e239

Browse files
authored
Improve Collector and NestedObjects attributes and methods (#1826)
* Improve Collector and NestedObjects class attributes, methods
1 parent b20807d commit 9c6e239

File tree

4 files changed

+35
-28
lines changed

4 files changed

+35
-28
lines changed

django-stubs/contrib/admin/utils.pyi

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import datetime
2+
from collections import defaultdict
23
from collections.abc import Callable, Iterable, Sequence
3-
from typing import Any, Literal, overload
4+
from typing import Any, Literal, TypeVar, overload
45
from uuid import UUID
56

7+
from _typeshed import Unused
68
from django.contrib.admin.options import BaseModelAdmin
79
from django.contrib.admin.sites import AdminSite
810
from django.contrib.auth.forms import AdminPasswordChangeForm
@@ -17,6 +19,8 @@ from django.http.request import HttpRequest
1719
from django.utils.datastructures import _IndexableCollection
1820
from typing_extensions import TypedDict
1921

22+
_T = TypeVar("_T")
23+
2024
class FieldIsAForeignKeyColumnName(Exception): ...
2125

2226
def lookup_spawns_duplicates(opts: Options, lookup_path: str) -> bool: ...
@@ -30,21 +34,30 @@ def get_deleted_objects(
3034
) -> tuple[list[str], dict[str, int], set[str], list[str]]: ...
3135

3236
class NestedObjects(Collector):
33-
data: dict[type[Model], set[Model] | list[Model]]
34-
dependencies: dict[Any, Any]
35-
fast_deletes: list[Any]
36-
field_updates: dict[Any, Any]
37-
using: str
38-
edges: Any
39-
protected: Any
40-
model_objs: Any
41-
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
37+
edges: dict[Model, list[Model]]
38+
protected: set[Model]
39+
model_objs: defaultdict[str, set[Model]]
4240
def add_edge(self, source: Model | None, target: Model) -> None: ...
41+
def collect( # type: ignore[override]
42+
self,
43+
objs: _IndexableCollection[Model | None],
44+
source: type[Model] | None = ...,
45+
source_attr: str | None = ...,
46+
*,
47+
nullable: bool = ...,
48+
collect_related: bool = ...,
49+
reverse_dependency: bool = ...,
50+
keep_parents: bool = ...,
51+
fail_on_restricted: bool = ...,
52+
) -> None: ...
4353
def related_objects(
4454
self, related_model: type[Model], related_fields: Iterable[Field], objs: _IndexableCollection[Model]
4555
) -> QuerySet[Model]: ...
46-
def nested(self, format_callback: Callable = ...) -> list[Any]: ...
47-
def can_fast_delete(self, *args: Any, **kwargs: Any) -> bool: ...
56+
@overload
57+
def nested(self, format_callback: None = None) -> list[Model]: ...
58+
@overload
59+
def nested(self, format_callback: Callable[[Model], _T]) -> list[_T]: ...
60+
def can_fast_delete(self, *args: Unused, **kwargs: Unused) -> Literal[False]: ...
4861

4962
class _ModelFormatDict(TypedDict):
5063
verbose_name: str
Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
from typing import Any
1+
from typing import Literal
22

3+
from _typeshed import Unused
34
from django.core.management import BaseCommand
4-
from django.db.models.base import Model
55
from django.db.models.deletion import Collector
66

77
class Command(BaseCommand): ...
88

99
class NoFastDeleteCollector(Collector):
10-
data: dict[type[Model], set[Model] | list[Model]]
11-
dependencies: dict[Any, Any]
12-
fast_deletes: list[Any]
13-
field_updates: dict[Any, Any]
14-
using: str
15-
def can_fast_delete(self, *args: Any, **kwargs: Any) -> bool: ...
10+
def can_fast_delete(self, *args: Unused, **kwargs: Unused) -> Literal[False]: ...

django-stubs/db/models/deletion.pyi

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections import defaultdict
12
from collections.abc import Callable, Iterable, Iterator, Sequence
23
from typing import Any
34

@@ -57,12 +58,13 @@ class RestrictedError(IntegrityError):
5758

5859
class Collector:
5960
using: str
61+
origin: Model | QuerySet[Model] | None
6062
data: dict[type[Model], set[Model] | list[Model]]
61-
field_updates: Any
62-
restricted_objects: Any
63-
fast_deletes: Any
64-
dependencies: Any
65-
def __init__(self, using: str) -> None: ...
63+
field_updates: defaultdict[tuple[Field, Any], list[Model]]
64+
restricted_objects: defaultdict[Model, defaultdict[Field, set[Model]]]
65+
fast_deletes: list[QuerySet[Model]]
66+
dependencies: defaultdict[Model, set[Model]]
67+
def __init__(self, using: str, origin: Model | QuerySet[Model] | None = None) -> None: ...
6668
def add(
6769
self,
6870
objs: _IndexableCollection[Model],

scripts/stubtest/allowlist_todo.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ django.contrib.admin.templatetags.admin_list.DOT
8080
django.contrib.admin.tests.AdminSeleniumTestCase
8181
django.contrib.admin.tests.AdminSeleniumTestCase.assertCountSeleniumElements
8282
django.contrib.admin.tests.CSPMiddleware.process_response
83-
django.contrib.admin.utils.NestedObjects.collect
84-
django.contrib.admin.utils.NestedObjects.nested
8583
django.contrib.admin.utils.QUOTE_MAP
8684
django.contrib.admin.utils.UNQUOTE_MAP
8785
django.contrib.admin.utils.prepare_lookup_value
@@ -1169,7 +1167,6 @@ django.db.models.constraints.CheckConstraint.validate
11691167
django.db.models.constraints.UniqueConstraint.__init__
11701168
django.db.models.constraints.UniqueConstraint.contains_expressions
11711169
django.db.models.constraints.UniqueConstraint.validate
1172-
django.db.models.deletion.Collector.__init__
11731170
django.db.models.expressions.BaseExpression.empty_result_set_value
11741171
django.db.models.expressions.BaseExpression.get_refs
11751172
django.db.models.expressions.BaseExpression.output_field

0 commit comments

Comments
 (0)