mirror of
https://github.com/davidhalter/django-stubs.git
synced 2025-12-08 13:04:47 +08:00
RefExpr in determining model fullname not supported
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user