1- from typing import Optional , Tuple , Union
1+ from typing import Optional , Union
22
3- from django .db .models import base , manager
43from mypy .checker import TypeChecker , fill_typevars
54from mypy .nodes import (
65 GDEF ,
98 FuncBase ,
109 FuncDef ,
1110 MemberExpr ,
12- NameExpr ,
1311 OverloadedFuncDef ,
1412 RefExpr ,
1513 StrExpr ,
1614 SymbolTableNode ,
1715 TypeInfo ,
1816 Var ,
1917)
20- from mypy .plugin import AttributeContext , ClassDefContext , DynamicClassDefContext , SemanticAnalyzerPluginInterface
18+ from mypy .plugin import AttributeContext , DynamicClassDefContext , SemanticAnalyzerPluginInterface
2119from mypy .types import AnyType , CallableType , Instance , ProperType
2220from mypy .types import Type as MypyType
2321from mypy .types import TypeOfAny
@@ -192,19 +190,12 @@ def create_new_manager_class_from_from_queryset_method(ctx: DynamicClassDefConte
192190 # This is just a deferral run where our work is already finished
193191 return
194192
195- new_manager_info , generated_name = create_manager_info_from_from_queryset_call (ctx .api , ctx .call , ctx .name )
193+ new_manager_info = create_manager_info_from_from_queryset_call (ctx .api , ctx .call , ctx .name )
196194 if new_manager_info is None :
197195 if not ctx .api .final_iteration :
198196 ctx .api .defer ()
199197 return
200198
201- assert generated_name
202- manager_fullname = "." .join (["django.db.models.manager" , generated_name ])
203-
204- base_manager_info = new_manager_info .mro [1 ]
205- base_manager_info .metadata .setdefault ("from_queryset_managers" , {})
206- base_manager_info .metadata ["from_queryset_managers" ][manager_fullname ] = new_manager_info .fullname
207-
208199 # So that the plugin will reparameterize the manager when it is constructed inside of a Model definition
209200 helpers .add_new_manager_base (semanal_api , new_manager_info .fullname )
210201
@@ -217,7 +208,7 @@ def create_new_manager_class_from_from_queryset_method(ctx: DynamicClassDefConte
217208
218209def create_manager_info_from_from_queryset_call (
219210 api : SemanticAnalyzerPluginInterface , call_expr : CallExpr , name : Optional [str ] = None
220- ) -> Tuple [ Optional [TypeInfo ], Optional [ str ] ]:
211+ ) -> Optional [TypeInfo ]:
221212 """
222213 Extract manager and queryset TypeInfo from a from_queryset call.
223214 """
@@ -236,14 +227,14 @@ def create_manager_info_from_from_queryset_call(
236227 or not isinstance (call_expr .args [0 ].node , TypeInfo )
237228 or not call_expr .args [0 ].node .has_base (fullnames .QUERYSET_CLASS_FULLNAME )
238229 ):
239- return None , None
230+ return None
240231
241232 base_manager_info , queryset_info = call_expr .callee .expr .node , call_expr .args [0 ].node
242233 if queryset_info .fullname is None :
243234 # In some cases, due to the way the semantic analyzer works, only
244235 # passed_queryset.name is available. But it should be analyzed again,
245236 # so this isn't a problem.
246- return None , None
237+ return None
247238
248239 if len (call_expr .args ) == 2 and isinstance (call_expr .args [1 ], StrExpr ):
249240 manager_name = call_expr .args [1 ].value
@@ -254,7 +245,13 @@ def create_manager_info_from_from_queryset_call(
254245
255246 popuplate_manager_from_queryset (new_manager_info , queryset_info )
256247
257- return new_manager_info , manager_name
248+ manager_fullname = "." .join (["django.db.models.manager" , manager_name ])
249+
250+ base_manager_info = new_manager_info .mro [1 ]
251+ base_manager_info .metadata .setdefault ("from_queryset_managers" , {})
252+ base_manager_info .metadata ["from_queryset_managers" ][manager_fullname ] = new_manager_info .fullname
253+
254+ return new_manager_info
258255
259256
260257def create_manager_class (
0 commit comments