Skip to content

Commit 094d663

Browse files
committed
move orm_lookups to new API
1 parent 279066f commit 094d663

File tree

3 files changed

+53
-54
lines changed

3 files changed

+53
-54
lines changed

mypy_django_plugin/main.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
)
1212
from mypy.types import Type as MypyType
1313

14-
import mypy_django_plugin.transformers.orm_lookups
1514
from mypy_django_plugin.django.context import DjangoContext
1615
from mypy_django_plugin.lib import fullnames, helpers
1716
from mypy_django_plugin.transformers import init_create, querysets
@@ -21,6 +20,9 @@
2120
)
2221
from mypy_django_plugin.transformers2.meta import MetaGetFieldCallback
2322
from mypy_django_plugin.transformers2.models import ModelCallback
23+
from mypy_django_plugin.transformers2.orm_lookups import (
24+
QuerySetFilterTypecheckCallback,
25+
)
2426
from mypy_django_plugin.transformers2.related_managers import (
2527
GetRelatedManagerCallback,
2628
)
@@ -204,9 +206,10 @@ def get_method_hook(self, fullname: str
204206
manager_classes = self._get_current_manager_bases()
205207
if class_fullname in manager_classes and method_name == 'create':
206208
return partial(init_create.redefine_and_typecheck_model_create, django_context=self.django_context)
209+
207210
if class_fullname in manager_classes and method_name in {'filter', 'get', 'exclude'}:
208-
return partial(mypy_django_plugin.transformers.orm_lookups.typecheck_queryset_filter,
209-
django_context=self.django_context)
211+
return QuerySetFilterTypecheckCallback(self)
212+
210213
return None
211214

212215
def get_base_class_hook(self, fullname: str

mypy_django_plugin/transformers/orm_lookups.py

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from mypy.types import AnyType, Instance
2+
from mypy.types import Type as MypyType
3+
from mypy.types import TypeOfAny
4+
5+
from mypy_django_plugin.lib import chk_helpers, fullnames, helpers
6+
7+
8+
class QuerySetFilterTypecheckCallback(helpers.GetMethodCallback):
9+
def resolve_combinable_type(self, combinable_type: Instance) -> MypyType:
10+
if combinable_type.type.fullname != fullnames.F_EXPRESSION_FULLNAME:
11+
# Combinables aside from F expressions are unsupported
12+
return AnyType(TypeOfAny.explicit)
13+
14+
return self.django_context.resolve_f_expression_type(combinable_type)
15+
16+
def get_method_return_type(self) -> MypyType:
17+
lookup_kwargs = self.ctx.arg_names[1]
18+
provided_lookup_types = self.ctx.arg_types[1]
19+
20+
if not self.callee_type.args or not isinstance(self.callee_type.args[0], Instance):
21+
return self.default_return_type
22+
23+
model_cls_fullname = self.callee_type.args[0].type.fullname
24+
model_cls = self.django_context.get_model_class_by_fullname(model_cls_fullname)
25+
if model_cls is None:
26+
return self.default_return_type
27+
28+
for lookup_kwarg, provided_type in zip(lookup_kwargs, provided_lookup_types):
29+
if lookup_kwarg is None:
30+
continue
31+
if (isinstance(provided_type, Instance)
32+
and provided_type.type.has_base('django.db.models.expressions.Combinable')):
33+
provided_type = self.resolve_combinable_type(provided_type)
34+
35+
lookup_type = self.django_context.resolve_lookup_expected_type(self.ctx, model_cls, lookup_kwarg)
36+
# Managers as provided_type is not supported yet
37+
if (isinstance(provided_type, Instance)
38+
and helpers.has_any_of_bases(provided_type.type, (fullnames.MANAGER_CLASS_FULLNAME,
39+
fullnames.QUERYSET_CLASS_FULLNAME))):
40+
return self.default_return_type
41+
42+
chk_helpers.check_types_compatible(self.ctx,
43+
expected_type=lookup_type,
44+
actual_type=provided_type,
45+
error_message=f'Incompatible type for lookup {lookup_kwarg!r}:')
46+
47+
return self.default_return_type

0 commit comments

Comments
 (0)