request.user has type of AUTH_USER_MODEL

This commit is contained in:
Maxim Kurnikov
2019-07-20 22:44:40 +03:00
parent 248504c25a
commit fa57fb0cbf
7 changed files with 43 additions and 6 deletions

View File

@@ -36,3 +36,4 @@ RELATED_FIELDS_CLASSES = {
MIGRATION_CLASS_FULLNAME = 'django.db.migrations.migration.Migration'
OPTIONS_CLASS_FULLNAME = 'django.db.models.options.Options'
HTTPREQUEST_CLASS_FULLNAME = 'django.http.request.HttpRequest'

View File

@@ -49,7 +49,7 @@ def lookup_fully_qualified_typeinfo(api: TypeChecker, fullname: str) -> Optional
return node
def lookup_class_typeinfo(api: TypeChecker, klass: type) -> TypeInfo:
def lookup_class_typeinfo(api: TypeChecker, klass: type) -> Optional[TypeInfo]:
fullname = get_class_fullname(klass)
field_info = lookup_fully_qualified_typeinfo(api, fullname)
return field_info

View File

@@ -11,7 +11,7 @@ from mypy.types import Type as MypyType
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import fullnames, helpers
from mypy_django_plugin.transformers import fields, forms, init_create, querysets, settings, meta
from mypy_django_plugin.transformers import fields, forms, init_create, querysets, settings, meta, request
from mypy_django_plugin.transformers.models import process_model_class
@@ -109,7 +109,7 @@ class NewSemanalDjangoPlugin(Plugin):
# for `get_user_model()`
if self.django_context.settings:
if file.fullname() == 'django.contrib.auth':
if (file.fullname() == 'django.contrib.auth') or (file.fullname() in {'django.http', 'django.http.request'}):
auth_user_model_name = self.django_context.settings.AUTH_USER_MODEL
try:
auth_user_module = self.django_context.apps_registry.get_model(auth_user_model_name).__module__
@@ -204,6 +204,11 @@ class NewSemanalDjangoPlugin(Plugin):
return partial(settings.get_type_of_settings_attribute,
django_context=self.django_context)
info = self._get_typeinfo_or_none(class_name)
if info and info.has_base(fullnames.HTTPREQUEST_CLASS_FULLNAME):
return partial(request.set_auth_user_model_as_type_for_request_user, django_context=self.django_context)
# def get_type_analyze_hook(self, fullname: str
# ( ):
# info = self._get_typeinfo_or_none(fullname)

View File

@@ -15,9 +15,6 @@ def get_referred_to_model_fullname(ctx: FunctionContext, django_context: DjangoC
return to_arg_type.ret_type.type.fullname()
outer_model_info = ctx.api.scope.active_class()
# if not outer_model_info or not outer_model_info.has_base(fullnames.MODEL_CLASS_FULLNAME):
# # not inside models.Model class
# return None
assert isinstance(outer_model_info, TypeInfo)
to_arg_expr = helpers.get_call_argument_by_name(ctx, 'to')

View File

@@ -0,0 +1,15 @@
from mypy.plugin import AttributeContext
from mypy.types import Instance, Type as MypyType
from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import helpers
def set_auth_user_model_as_type_for_request_user(ctx: AttributeContext, django_context: DjangoContext) -> MypyType:
auth_user_model = django_context.settings.AUTH_USER_MODEL
model_cls = django_context.apps_registry.get_model(auth_user_model)
model_info = helpers.lookup_class_typeinfo(ctx.api, model_cls)
if model_info is None:
return ctx.default_attr_type
return Instance(model_info, [])