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.nodes import TypeInfo
from mypy.nodes import TypeInfo, Expression, StrExpr, NameExpr, RefExpr, Var
from mypy.plugin import MethodContext
from mypy.types import Type, Instance, TypeType
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:
app_label = ctx.args[ctx.callee_arg_names.index('app_label')][0].value
model_name = ctx.args[ctx.callee_arg_names.index('model_name')][0].value
app_label_expr = ctx.args[ctx.callee_arg_names.index('app_label')][0]
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)
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.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/models.py]
from django.db import models
@@ -28,4 +45,4 @@ reveal_type(model_cls.objects) # E: Revealed type is 'django.db.models.manager.
[file myapp/models.py]
from django.db import models
class User(models.Model):
pass
pass