mirror of
https://github.com/davidhalter/django-stubs.git
synced 2025-12-11 22:41:55 +08:00
* Fix stubs related to `(Async)RequestFactory` and `(Async)Client`
* Revert incorrect removal.
* Allow set as `unique_together`, use shared type alias.
* Revert `Q.__init__` to use only `*args, **kwargs` to remove false-positive with `Q(**{...})`
* Add abstract methods to `HttpResponseBase` to create common interface.
* Remove monkey-patched attributes from `HttpResponseBase` subclasses.
* Add QueryDict mutability checks (+ plugin support)
* Fix lint
* Return back GenericForeignKey to `Options.get_fields`
* Minor fixup
* Make plugin code typecheck with `--warn-unreachable`, minor performance increase.
* Better types for `{unique, index}_together` and Options.
* Fix odd type of `URLResolver.urlconf_name` which isn't a str actually.
* Better types for field migration operations.
* Revert form.files to `MultiValueDict[str, UploadedFile]`
* Compatibility fix (#916)
* Do not assume that `Annotated` is always related to django-stubs (fixes #893)
* Restrict `FormView.get_form` return type to `_FormT` (class type argument). Now it is resolved to `form_class` argument if present, but also errors if it is not subclass of _FormT
* Fix CI (make test runnable on 3.8)
* Fix CI (make test runnable on 3.8 _again_)
45 lines
2.0 KiB
Python
45 lines
2.0 KiB
Python
from mypy.plugin import AttributeContext, MethodContext
|
|
from mypy.types import Instance
|
|
from mypy.types import Type as MypyType
|
|
from mypy.types import UninhabitedType, UnionType
|
|
|
|
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:
|
|
if not django_context.apps_registry.is_installed("django.contrib.auth"):
|
|
return ctx.default_attr_type
|
|
|
|
# Imported here because django isn't properly loaded yet when module is loaded
|
|
from django.contrib.auth.base_user import AbstractBaseUser
|
|
from django.contrib.auth.models import AnonymousUser
|
|
|
|
abstract_base_user_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), AbstractBaseUser)
|
|
anonymous_user_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), AnonymousUser)
|
|
|
|
# This shouldn't be able to happen, as we managed to import the models above.
|
|
assert abstract_base_user_info is not None
|
|
assert anonymous_user_info is not None
|
|
|
|
if ctx.default_attr_type != UnionType([Instance(abstract_base_user_info, []), Instance(anonymous_user_info, [])]):
|
|
# Type has been changed from the default in django-stubs.
|
|
# I.e. HttpRequest has been subclassed and user-type overridden, so let's leave it as is.
|
|
return ctx.default_attr_type
|
|
|
|
auth_user_model = django_context.settings.AUTH_USER_MODEL
|
|
user_cls = django_context.apps_registry.get_model(auth_user_model)
|
|
user_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), user_cls)
|
|
|
|
if user_info is None:
|
|
return ctx.default_attr_type
|
|
|
|
return UnionType([Instance(user_info, []), Instance(anonymous_user_info, [])])
|
|
|
|
|
|
def check_querydict_is_mutable(ctx: MethodContext, django_context: DjangoContext) -> MypyType:
|
|
ret_type = ctx.default_return_type
|
|
if isinstance(ret_type, UninhabitedType):
|
|
ctx.api.fail("This QueryDict is immutable.", ctx.context)
|
|
return ret_type
|