Skip to content

Commit 3c5a53e

Browse files
authored
Gracefully handle unwanted types when creating fallback managers (#1728)
1 parent 5b34b88 commit 3c5a53e

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

mypy_django_plugin/transformers/models.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def get_generated_manager_info(self, manager_fullname: str, base_manager_fullnam
103103
# Not a generated manager
104104
return None
105105

106-
def get_or_create_manager_with_any_fallback(self, related_manager: bool = False) -> TypeInfo:
106+
def get_or_create_manager_with_any_fallback(self, related_manager: bool = False) -> Optional[TypeInfo]:
107107
"""
108108
Create a Manager subclass with fallback to Any for unknown attributes
109109
and methods. This is used for unresolved managers, where we don't know
@@ -121,11 +121,14 @@ def get_or_create_manager_with_any_fallback(self, related_manager: bool = False)
121121
return manager_info
122122

123123
fallback_queryset = self.get_or_create_queryset_with_any_fallback()
124+
if fallback_queryset is None:
125+
return None
124126
base_manager_fullname = (
125127
fullnames.MANAGER_CLASS_FULLNAME if not related_manager else fullnames.RELATED_MANAGER_CLASS
126128
)
127129
base_manager_info = self.lookup_typeinfo(base_manager_fullname)
128-
assert base_manager_info, f"Type info for {base_manager_fullname} missing"
130+
if base_manager_info is None:
131+
return None
129132

130133
base_manager = fill_typevars(base_manager_info)
131134
assert isinstance(base_manager, Instance)
@@ -153,7 +156,7 @@ def get_or_create_manager_with_any_fallback(self, related_manager: bool = False)
153156

154157
return manager_info
155158

156-
def get_or_create_queryset_with_any_fallback(self) -> TypeInfo:
159+
def get_or_create_queryset_with_any_fallback(self) -> Optional[TypeInfo]:
157160
"""
158161
Create a QuerySet subclass with fallback to Any for unknown attributes
159162
and methods. This is used for the manager returned by the method above.
@@ -168,7 +171,8 @@ def get_or_create_queryset_with_any_fallback(self) -> TypeInfo:
168171
return queryset_info
169172

170173
base_queryset_info = self.lookup_typeinfo(fullnames.QUERYSET_CLASS_FULLNAME)
171-
assert base_queryset_info, f"Type info for {fullnames.QUERYSET_CLASS_FULLNAME} missing"
174+
if base_queryset_info is None:
175+
return None
172176

173177
base_queryset = fill_typevars(base_queryset_info)
174178
assert isinstance(base_queryset, Instance)
@@ -346,11 +350,12 @@ def run_with_model_cls(self, model_cls: Type[Model]) -> None:
346350
# ignoring a more specialised manager not being resolved while still
347351
# setting _some_ type
348352
fallback_manager_info = self.get_or_create_manager_with_any_fallback()
349-
self.add_new_node_to_model_class(
350-
manager_name,
351-
Instance(fallback_manager_info, [Instance(self.model_classdef.info, [])]),
352-
is_classvar=True,
353-
)
353+
if fallback_manager_info is not None:
354+
self.add_new_node_to_model_class(
355+
manager_name,
356+
Instance(fallback_manager_info, [Instance(self.model_classdef.info, [])]),
357+
is_classvar=True,
358+
)
354359

355360
# Find expression for e.g. `objects = SomeManager()`
356361
manager_expr = self.get_manager_expression(manager_name)
@@ -493,9 +498,10 @@ def run_with_model_cls(self, model_cls: Type[Model]) -> None:
493498
# See https://github.com/typeddjango/django-stubs/pull/993
494499
# for more information on when this error can occur.
495500
fallback_manager = self.get_or_create_manager_with_any_fallback(related_manager=True)
496-
self.add_new_node_to_model_class(
497-
attname, Instance(fallback_manager, [Instance(related_model_info, [])])
498-
)
501+
if fallback_manager is not None:
502+
self.add_new_node_to_model_class(
503+
attname, Instance(fallback_manager, [Instance(related_model_info, [])])
504+
)
499505
related_model_fullname = related_model_cls.__module__ + "." + related_model_cls.__name__
500506
self.ctx.api.fail(
501507
(

0 commit comments

Comments
 (0)