RefExpr in determining model fullname not supported

This commit is contained in:
Maxim Kurnikov
2018-12-21 01:49:10 +03:00
parent 3c3e9305f4
commit 2f58cdae88
2 changed files with 36 additions and 5 deletions

View File

@@ -1,16 +1,30 @@
from typing import cast from typing import cast, Optional
from mypy.checker import TypeChecker from mypy.checker import TypeChecker
from mypy.nodes import TypeInfo from mypy.nodes import TypeInfo, Expression, StrExpr, NameExpr, RefExpr, Var
from mypy.plugin import MethodContext from mypy.plugin import MethodContext
from mypy.types import Type, Instance, TypeType from mypy.types import Type, Instance, TypeType
from mypy_django_plugin import helpers from mypy_django_plugin import helpers
def get_string_value_from_expr(expr: Expression) -> Optional[str]:
if isinstance(expr, StrExpr):
return expr.value
# TODO: somehow figure out other cases
return None
def determine_model_cls_from_string_for_migrations(ctx: MethodContext) -> Type: def determine_model_cls_from_string_for_migrations(ctx: MethodContext) -> Type:
app_label = ctx.args[ctx.callee_arg_names.index('app_label')][0].value app_label_expr = ctx.args[ctx.callee_arg_names.index('app_label')][0]
model_name = ctx.args[ctx.callee_arg_names.index('model_name')][0].value app_label = get_string_value_from_expr(app_label_expr)
if app_label is None:
return ctx.default_return_type
model_name_expr = ctx.args[ctx.callee_arg_names.index('model_name')][0]
model_name = get_string_value_from_expr(model_name_expr)
if model_name is None:
return ctx.default_return_type
api = cast(TypeChecker, ctx.api) api = cast(TypeChecker, ctx.api)
model_fullname = helpers.get_model_fullname(app_label, model_name, all_modules=api.modules) model_fullname = helpers.get_model_fullname(app_label, model_name, all_modules=api.modules)

View File

@@ -8,6 +8,23 @@ model_cls = apps.get_model('myapp', 'User')
reveal_type(model_cls) # E: Revealed type is 'Type[myapp.models.User]' reveal_type(model_cls) # E: Revealed type is 'Type[myapp.models.User]'
reveal_type(model_cls.objects) # E: Revealed type is 'django.db.models.manager.Manager[myapp.models.User]' reveal_type(model_cls.objects) # E: Revealed type is 'django.db.models.manager.Manager[myapp.models.User]'
[file myapp/__init__.py]
[file myapp/models.py]
from django.db import models
class User(models.Model):
pass
[CASE registry_apps_get_model_passed_as_variables_not_supported]
from django.apps.registry import Apps
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from myapp.models import User
app_name = 'myapp'
model_name = 'User'
apps = Apps()
model_cls = apps.get_model(app_name, model_name)
reveal_type(model_cls) # E: Revealed type is 'Type[django.db.models.base.Model]'
[file myapp/__init__.py] [file myapp/__init__.py]
[file myapp/models.py] [file myapp/models.py]
from django.db import models from django.db import models