Large update (#909)

* Make module declaration precise.

* Make settings match real file.

* Replace `include` with import.

* Make types more specific.

* Replace `WSGIRequest` with `HttpRequest` where possible.

* Replace all `OrderedDict` occurrences with plain `Dict` (it is not used in Django 3.2 and later)

* Add fake datastructures for convenience: _PropertyDescriptor and _ListOrTuple now can live here. Added _IndexableCollection (often useful as alias for 'sequence or queryset')

* Actualize other datastructures.

* Rework MultiValueDict to reflect the fact that some methods can return empty list instead of value.

* Deprecate SafeText in favor of SafeString.

* Minor improvements to utils

* Disallow using str in TimeFormat and DateFormat, drop removed fmt `B`

* Do not let classproperty expect classmethod, make return value covariant.

* Sync with real file.

* Improve types for timezone.

* Sync deprecated, new and removed features in translation utils.

* Drop removed files, sync huge deprecations.

* Fix incompatible decorators (properties, contextmanagers)

* Rework pagination.

* Sync validators with real code. Add _ValidatorCallable for any external use (field validation etc.)

* Add shared type definitions (for fields of both forms and models). Actualize model fields. Mark keyword-only args explicitly in stubs (where code uses **kwargs). Disallow bytes for verbose_name.

* Make all checks return Sequence[CheckMessage] or subclass to be covariant.

* Add bidirectional references between backend.base and other files. Replace some Any's with specific types.

* Actualize db.migrations: remove removed methods, replace "None" annotations in wrong places, improve some wrong annotations.

* Actualize db.utils to match real file.

* Replace FileResponse and TemplateResponse with HttpResponse(Base) where needed: at least HttpResponseNotModified/HttpResponseRedirect can be returned instead of it, so annotation was wrong.

* Replace Any in forms where possible. Actualize class bases and method arguments.

* Improve typing of serializers.

* Actualize views, rename variable bound to Model to _M for consistency.

* Make types of file-related code consistent. Disallow using bytes as path, because many methods expect str-only paths. Make File inherit from IO[AnyStr] instead of IO[Any]: it makes impossible to instantiate file of union type, but allows precise types for some methods.

* Minor improvements: stop using None as annotation in wrong places, replace obvious Any's with precise types, actualize methods (missing/renamed/signature changed).

* Allow less specific containers, replace Any's with specific types.

* Improve types for requests and responses.

* Use AbstractBaseUser instead of User in auth.

* Use broader type for permission_required

* Use wider container types. Add 'type: ignore' to avoid issues with mypy.stubtest.

* Disallow using backend class as argument (it is passed to import_string).

* Add required methods to PasseordValidator.

* Allow using Path instance as argument.

* Actualize methods.

* Add 'type: ignore' to avoid issues with mypy.stubtest.

* Replace Any's with specific types and BaseForm with ModelForm.

* Actualize contrib.postgres

* Remove render_to_response, add 'get_absolute_url' to corresponding protocol.

* Actualize signers.

* Use precise types for handlers. Disallow str as stream type for LimitedStream.

* Exact types for ValidationError

* Replace wrong used Union with Sequence.

* Actualize static handlers.

* More specific types for admin. Fixes #874.

* Improve types and replace 'Tags' with str (it isn't Enum, so annotation was wrong).

* Replace Any with specific types, actualize signatures.

* Add async variants of handlers and clients. Use fake class to distinguish between request types in RequestFactory and AsyncRequestFactory.

* Fix signature, minor improvements.

* Actualize signatures and class names, replace Any with more specific types.

* Fix signature.

* Add some missing methods to Collector

* Combinable rarely returns Self type: almost always it's CombinedExpression.

* No Random in source anymore.

* Drop removed SimpleCol.

* Replace _OutputField with Field: nothing in docs about strings.

* Introduce reusable types, add missing methods. Remove strange types (probably created by stubgen). Remove RawQuery from Compiler: it obviously doesn't work with RawQuery.

* Use literal constants.

* Actualize base classes.

* Callable is not accepted by get_field.

* Add precise types.

* Use property and broader containers where possible. Add missing methods.

* Actualize indexes.

* More specific types for signals.

* Fix signatures, drop missing methods.

* Actualize window functions to match source.

* Actualize text functions, add missing methods, use type aliases for consistency.

* Add missing property decorators, methods and attributes. Use type aliases. Remove absent YearComparisonLookup and any SafeText references (they aren't related to lookups at all).

* Use bound TypeVar, mark all BuiltinLookup descendants as generic explicitly. Remove strange Union from Lookup.__init__

* Apply type alias, fix base class and argument name.

* Actualize BaseExpression methods.

* Fix imports.

* Add missing class and fix incompatible bases.

* Use same types in __init__ and attribute.

* OrderBy accepts F or Expression.

* Non-expressions are converted to Values.

* Add missing attributes.

* Add missing methods, fix 'None' argument type.

* Define properties where possible, remove 'None' argument annotations, remove inadequate type in make_immutable_fields_list.

* Remove absent QueryWrapper. Replace some Any with precise types.

* Fix wrong types and actualize signatures. Deny ManagerDescriptor.__get__ on model instances.

* Use more specific types.

* Arity can be None in subclasses.

* Reformat with black

* Make DeletionMixin generic.

* Fix wrong type variable in _RequestFactory.

* Fix variable name in signature.

* Disallow returning None from Form.clean()

* Allow again returning None from Form.clean

* Drop some unused imports.

* Add tests for MultiValueDict.

* Add tests for utils.timezone.

* Fix #834.

* Add more files to import_all test

* Allow None for `context_object_name`

* Fix CI

* Fix test to work on python 3.8
This commit is contained in:
sterliakov
2022-04-04 00:41:41 +03:00
committed by GitHub
parent dc4c0d9ee4
commit f69e0639c7
322 changed files with 5740 additions and 3465 deletions

View File

@@ -1,4 +1,5 @@
from typing import Any, Dict, Iterator, Optional, Type import types
from typing import Dict, Iterator, Optional, Type
from django.apps.registry import Apps from django.apps.registry import Apps
from django.db.models.base import Model from django.db.models.base import Model
@@ -7,14 +8,14 @@ MODELS_MODULE_NAME: str
class AppConfig: class AppConfig:
name: str = ... name: str = ...
module: Optional[Any] = ... module: Optional[types.ModuleType] = ...
apps: Optional[Apps] = ... apps: Optional[Apps] = ...
label: str = ... label: str = ...
verbose_name: str = ... verbose_name: str = ...
path: str = ... path: str = ...
models_module: Optional[str] = ... models_module: Optional[str] = ...
models: Dict[str, Type[Model]] = ... models: Dict[str, Type[Model]] = ...
def __init__(self, app_name: str, app_module: Optional[Any]) -> None: ... def __init__(self, app_name: str, app_module: Optional[types.ModuleType]) -> None: ...
@classmethod @classmethod
def create(cls, entry: str) -> AppConfig: ... def create(cls, entry: str) -> AppConfig: ...
def get_model(self, model_name: str, require_ready: bool = ...) -> Type[Model]: ... def get_model(self, model_name: str, require_ready: bool = ...) -> Type[Model]: ...

View File

@@ -1,4 +1,4 @@
from typing import Any from typing import Any, Optional
from django.utils.functional import LazyObject from django.utils.functional import LazyObject
@@ -6,24 +6,32 @@ from django.utils.functional import LazyObject
from . import global_settings from . import global_settings
ENVIRONMENT_VARIABLE: str = ... ENVIRONMENT_VARIABLE: str = ...
DEFAULT_CONTENT_TYPE_DEPRECATED_MSG: str = ... PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG: str = ...
FILE_CHARSET_DEPRECATED_MSG: str = ... DEFAULT_HASHING_ALGORITHM_DEPRECATED_MSG: str = ...
# required for plugin to be able to distinguish this specific instance of LazySettings from others # required for plugin to be able to distinguish this specific instance of LazySettings from others
class _DjangoConfLazyObject(LazyObject): class _DjangoConfLazyObject(LazyObject):
def __getattr__(self, item: Any) -> Any: ... def __getattr__(self, item: Any) -> Any: ...
class LazySettings(_DjangoConfLazyObject): class LazySettings(_DjangoConfLazyObject):
configured: bool @property
def configure(self, default_settings: Any = ..., **options: Any) -> Any: ... def configured(self) -> bool: ...
def configure(self, default_settings: Any = ..., **options: Any) -> None: ...
settings: LazySettings = ... settings: LazySettings = ...
class Settings: class Settings:
def __init__(self, settings_module: str): ... def __init__(self, settings_module: str) -> None: ...
def is_overridden(self, setting: str) -> bool: ... def is_overridden(self, setting: str) -> bool: ...
class UserSettingsHolder: ... class UserSettingsHolder:
SETTINGS_MODULE: Optional[Any] = ...
def __init__(self, default_settings: Any) -> None: ...
def __getattr__(self, name: str) -> Any: ...
def __setattr__(self, name: str, value: Any) -> None: ...
def __delattr__(self, name: str) -> None: ...
def is_overridden(self, setting: str) -> bool: ...
class SettingsReference(str): class SettingsReference(str):
def __new__(self, value: Any, setting_name: str) -> SettingsReference: ...
def __init__(self, value: str, setting_name: str) -> None: ... def __init__(self, value: str, setting_name: str) -> None: ...

View File

@@ -68,15 +68,11 @@ USE_L10N: bool = ...
# notifications and other various emails. # notifications and other various emails.
MANAGERS = ADMINS MANAGERS = ADMINS
# Default content type and charset to use for all HttpResponse objects, if a # Default charset to use for all HttpResponse objects, if a
# MIME type isn't manually specified. These are used to construct the # MIME type isn't manually specified. These are used to construct the
# Content-Type header. # Content-Type header.
DEFAULT_CONTENT_TYPE: str = ...
DEFAULT_CHARSET: str = ... DEFAULT_CHARSET: str = ...
# Encoding of files read from disk (template and initial SQL files).
FILE_CHARSET: str = ...
# Email address that error messages come from. # Email address that error messages come from.
SERVER_EMAIL: str = ... SERVER_EMAIL: str = ...
@@ -136,7 +132,7 @@ APPEND_SLASH: bool = ...
PREPEND_WWW: bool = ... PREPEND_WWW: bool = ...
# Override the server-derived value of SCRIPT_NAME # Override the server-derived value of SCRIPT_NAME
FORCE_SCRIPT_NAME = None FORCE_SCRIPT_NAME: Optional[str] = ...
# List of compiled regular expression objects representing User-Agent strings # List of compiled regular expression objects representing User-Agent strings
# that are not allowed to visit any page, systemwide. Use this for bad # that are not allowed to visit any page, systemwide. Use this for bad
@@ -148,7 +144,7 @@ FORCE_SCRIPT_NAME = None
# re.compile(r'^SiteSucker.*'), # re.compile(r'^SiteSucker.*'),
# re.compile(r'^sohu-search'), # re.compile(r'^sohu-search'),
# ] # ]
DISALLOWED_USER_AGENTS: List[Pattern] = ... DISALLOWED_USER_AGENTS: List[Pattern[str]] = ...
ABSOLUTE_URL_OVERRIDES: Dict[str, Any] = ... ABSOLUTE_URL_OVERRIDES: Dict[str, Any] = ...
@@ -162,7 +158,7 @@ ABSOLUTE_URL_OVERRIDES: Dict[str, Any] = ...
# re.compile(r'^/phpmyadmin/'), # re.compile(r'^/phpmyadmin/'),
# re.compile(r'\.(cgi|php|pl)$'), # re.compile(r'\.(cgi|php|pl)$'),
# ] # ]
IGNORABLE_404_URLS: List[Pattern] = ... IGNORABLE_404_URLS: List[Pattern[str]] = ...
# A secret key for this particular Django installation. Used in secret-key # A secret key for this particular Django installation. Used in secret-key
# hashing algorithms. Set this in your settings, or Django will complain # hashing algorithms. Set this in your settings, or Django will complain
@@ -210,12 +206,12 @@ FILE_UPLOAD_TEMP_DIR: Optional[str] = ...
# The numeric mode to set newly-uploaded files to. The value should be a mode # The numeric mode to set newly-uploaded files to. The value should be a mode
# you'd pass directly to os.chmod; see https://docs.python.org/library/os.html#files-and-directories. # you'd pass directly to os.chmod; see https://docs.python.org/library/os.html#files-and-directories.
FILE_UPLOAD_PERMISSIONS = None FILE_UPLOAD_PERMISSIONS: int = ...
# The numeric mode to assign to newly-created directories, when uploading files. # The numeric mode to assign to newly-created directories, when uploading files.
# The value should be a mode as you'd pass to os.chmod; # The value should be a mode as you'd pass to os.chmod;
# see https://docs.python.org/library/os.html#files-and-directories. # see https://docs.python.org/library/os.html#files-and-directories.
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None FILE_UPLOAD_DIRECTORY_PERMISSIONS: Optional[int] = ...
# Python module path where user will place custom format definition. # Python module path where user will place custom format definition.
# The directory where this setting is pointing should contain subdirectories # The directory where this setting is pointing should contain subdirectories
@@ -330,33 +326,33 @@ MIDDLEWARE: List[str] = ...
############ ############
# Cache to store session data if using the cache session backend. # Cache to store session data if using the cache session backend.
SESSION_CACHE_ALIAS = "default" SESSION_CACHE_ALIAS: str = ...
# Cookie name. This can be whatever you want. # Cookie name. This can be whatever you want.
SESSION_COOKIE_NAME = "sessionid" SESSION_COOKIE_NAME: str = ...
# Age of cookie, in seconds (default: 2 weeks). # Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 SESSION_COOKIE_AGE: int = ...
# A string like "example.com", or None for standard domain cookie. # A string like "example.com", or None for standard domain cookie.
SESSION_COOKIE_DOMAIN: Optional[str] = ... SESSION_COOKIE_DOMAIN: Optional[str] = ...
# Whether the session cookie should be secure (https:// only). # Whether the session cookie should be secure (https:// only).
SESSION_COOKIE_SECURE = False SESSION_COOKIE_SECURE: bool = ...
# The path of the session cookie. # The path of the session cookie.
SESSION_COOKIE_PATH = "/" SESSION_COOKIE_PATH: str = ...
# Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others) # Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others)
SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_HTTPONLY: bool = ...
# Whether to set the flag restricting cookie leaks on cross-site requests. # Whether to set the flag restricting cookie leaks on cross-site requests.
# This can be 'Lax', 'Strict', or None to disable the flag. # This can be 'Lax', 'Strict', or None to disable the flag.
SESSION_COOKIE_SAMESITE: Optional[str] = ... SESSION_COOKIE_SAMESITE: Optional[str] = ...
# Whether to save the session data on every request. # Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST = False SESSION_SAVE_EVERY_REQUEST: bool = ...
# Whether a user's session cookie expires when the Web browser is closed. # Whether a user's session cookie expires when the Web browser is closed.
SESSION_EXPIRE_AT_BROWSER_CLOSE = False SESSION_EXPIRE_AT_BROWSER_CLOSE: bool = ...
# The module to store session data # The module to store session data
SESSION_ENGINE = "django.contrib.sessions.backends.db" SESSION_ENGINE: str = ...
# Directory to store session files if using the file session module. If None, # Directory to store session files if using the file session module. If None,
# the backend will use a sensible default. # the backend will use a sensible default.
SESSION_FILE_PATH: Optional[str] = ... SESSION_FILE_PATH: Optional[str] = ...
# class to serialize session data # class to serialize session data
SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer" SESSION_SERIALIZER: str = ...
######### #########
# CACHE # # CACHE #
@@ -364,9 +360,9 @@ SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer"
# The cache backends to use. # The cache backends to use.
CACHES: Dict[str, Dict[str, Any]] = ... CACHES: Dict[str, Dict[str, Any]] = ...
CACHE_MIDDLEWARE_KEY_PREFIX = "" CACHE_MIDDLEWARE_KEY_PREFIX: str = ...
CACHE_MIDDLEWARE_SECONDS = 600 CACHE_MIDDLEWARE_SECONDS: int = ...
CACHE_MIDDLEWARE_ALIAS = "default" CACHE_MIDDLEWARE_ALIAS: str = ...
################## ##################
# AUTHENTICATION # # AUTHENTICATION #
@@ -376,14 +372,14 @@ AUTH_USER_MODEL: str = ...
AUTHENTICATION_BACKENDS: Sequence[str] = ... AUTHENTICATION_BACKENDS: Sequence[str] = ...
LOGIN_URL = "/accounts/login/" LOGIN_URL: str = ...
LOGIN_REDIRECT_URL: str = ... LOGIN_REDIRECT_URL: str = ...
LOGOUT_REDIRECT_URL: Optional[str] = ... LOGOUT_REDIRECT_URL: Optional[str] = ...
# The number of days a password reset link is valid for # The number of days a password reset link is valid for
PASSWORD_RESET_TIMEOUT_DAYS = 3 PASSWORD_RESET_TIMEOUT_DAYS: int = ...
# the first hasher in this list is the preferred algorithm. any # the first hasher in this list is the preferred algorithm. any
# password using different algorithms will be converted automatically # password using different algorithms will be converted automatically
@@ -396,7 +392,7 @@ AUTH_PASSWORD_VALIDATORS: List[Dict[str, str]] = ...
# SIGNING # # SIGNING #
########### ###########
SIGNING_BACKEND = "django.core.signing.TimestampSigner" SIGNING_BACKEND: str = ...
######## ########
# CSRF # # CSRF #
@@ -404,26 +400,26 @@ SIGNING_BACKEND = "django.core.signing.TimestampSigner"
# Dotted path to callable to be used as view when a request is # Dotted path to callable to be used as view when a request is
# rejected by the CSRF middleware. # rejected by the CSRF middleware.
CSRF_FAILURE_VIEW = "django.views.csrf.csrf_failure" CSRF_FAILURE_VIEW: str = ...
# Settings for CSRF cookie. # Settings for CSRF cookie.
CSRF_COOKIE_NAME = "csrftoken" CSRF_COOKIE_NAME: str = ...
CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52 CSRF_COOKIE_AGE: int = ...
CSRF_COOKIE_DOMAIN = None CSRF_COOKIE_DOMAIN: Optional[str] = ...
CSRF_COOKIE_PATH = "/" CSRF_COOKIE_PATH: str = ...
CSRF_COOKIE_SECURE = False CSRF_COOKIE_SECURE: bool = ...
CSRF_COOKIE_HTTPONLY = False CSRF_COOKIE_HTTPONLY: bool = ...
CSRF_COOKIE_SAMESITE: Optional[str] = ... CSRF_COOKIE_SAMESITE: Optional[str] = ...
CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN" CSRF_HEADER_NAME: str = ...
CSRF_TRUSTED_ORIGINS: List[str] = ... CSRF_TRUSTED_ORIGINS: List[str] = ...
CSRF_USE_SESSIONS = False CSRF_USE_SESSIONS: bool = ...
############ ############
# MESSAGES # # MESSAGES #
############ ############
# Class to use as messages backend # Class to use as messages backend
MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage" MESSAGE_STORAGE: str = ...
# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within # Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within
# django.contrib.messages to avoid imports in this settings file. # django.contrib.messages to avoid imports in this settings file.
@@ -433,21 +429,21 @@ MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage"
########### ###########
# The callable to use to configure logging # The callable to use to configure logging
LOGGING_CONFIG = "logging.config.dictConfig" LOGGING_CONFIG: str = ...
# Custom logging configuration. # Custom logging configuration.
LOGGING: Dict[str, Any] = ... LOGGING: Dict[str, Any] = ...
# Default exception reporter filter class used in case none has been # Default exception reporter filter class used in case none has been
# specifically assigned to the HttpRequest instance. # specifically assigned to the HttpRequest instance.
DEFAULT_EXCEPTION_REPORTER_FILTER = "django.views.debug.SafeExceptionReporterFilter" DEFAULT_EXCEPTION_REPORTER_FILTER: str = ...
########### ###########
# TESTING # # TESTING #
########### ###########
# The name of the class to use to run the test suite # The name of the class to use to run the test suite
TEST_RUNNER = "django.test.runner.DiscoverRunner" TEST_RUNNER: str = ...
# Apps that don't need to be serialized at test database creation time # Apps that don't need to be serialized at test database creation time
# (only apps with migrations are to start with) # (only apps with migrations are to start with)
@@ -494,11 +490,11 @@ SILENCED_SYSTEM_CHECKS: List[str] = ...
####################### #######################
# SECURITY MIDDLEWARE # # SECURITY MIDDLEWARE #
####################### #######################
SECURE_BROWSER_XSS_FILTER = False SECURE_BROWSER_XSS_FILTER: bool = ...
SECURE_CONTENT_TYPE_NOSNIFF = False SECURE_CONTENT_TYPE_NOSNIFF: bool = ...
SECURE_HSTS_INCLUDE_SUBDOMAINS = False SECURE_HSTS_INCLUDE_SUBDOMAINS: bool = ...
SECURE_HSTS_PRELOAD = False SECURE_HSTS_PRELOAD: bool = ...
SECURE_HSTS_SECONDS = 0 SECURE_HSTS_SECONDS: int = ...
SECURE_REDIRECT_EXEMPT: List[str] = ... SECURE_REDIRECT_EXEMPT: List[str] = ...
SECURE_SSL_HOST = None SECURE_SSL_HOST: Optional[str] = ...
SECURE_SSL_REDIRECT = False SECURE_SSL_REDIRECT: bool = ...

View File

@@ -3,6 +3,7 @@ from typing import Any, Callable, Dict, Optional, Sequence, Tuple, Union, overlo
from django.http.response import HttpResponse, HttpResponseBase from django.http.response import HttpResponse, HttpResponseBase
from django.urls import URLPattern, URLResolver from django.urls import URLPattern, URLResolver
from django.urls import include as include
handler400: Union[str, Callable[..., HttpResponse]] = ... handler400: Union[str, Callable[..., HttpResponse]] = ...
handler403: Union[str, Callable[..., HttpResponse]] = ... handler403: Union[str, Callable[..., HttpResponse]] = ...
@@ -11,14 +12,19 @@ handler500: Union[str, Callable[..., HttpResponse]] = ...
IncludedURLConf = Tuple[Sequence[Union[URLResolver, URLPattern]], Optional[str], Optional[str]] IncludedURLConf = Tuple[Sequence[Union[URLResolver, URLPattern]], Optional[str], Optional[str]]
def include(arg: Any, namespace: str = ..., app_name: str = ...) -> IncludedURLConf: ... # Deprecated
@overload @overload
def url( def url(
regex: str, view: Callable[..., HttpResponseBase], kwargs: Dict[str, Any] = ..., name: str = ... regex: str, view: Callable[..., HttpResponseBase], kwargs: Optional[Dict[str, Any]] = ..., name: Optional[str] = ...
) -> URLPattern: ... ) -> URLPattern: ...
@overload @overload
def url(regex: str, view: IncludedURLConf, kwargs: Dict[str, Any] = ..., name: str = ...) -> URLResolver: ... def url(
regex: str, view: IncludedURLConf, kwargs: Optional[Dict[str, Any]] = ..., name: Optional[str] = ...
) -> URLResolver: ...
@overload @overload
def url( def url(
regex: str, view: Sequence[Union[URLResolver, str]], kwargs: Dict[str, Any] = ..., name: str = ... regex: str,
view: Sequence[Union[URLResolver, str]],
kwargs: Optional[Dict[str, Any]] = ...,
name: Optional[str] = ...,
) -> URLResolver: ... ) -> URLResolver: ...

View File

@@ -1,8 +1,10 @@
from typing import Any, Callable, List, Tuple from typing import Callable, List, Tuple, Union
from django.urls.resolvers import URLPattern from django.urls.resolvers import URLPattern, URLResolver
def i18n_patterns(*urls: Any, prefix_default_language: bool = ...) -> List[List[URLPattern]]: ... def i18n_patterns(
*urls: Union[URLPattern, URLResolver], prefix_default_language: bool = ...
) -> List[Union[URLPattern, URLResolver]]: ...
def is_language_prefix_patterns_used(urlconf: str) -> Tuple[bool, bool]: ... def is_language_prefix_patterns_used(urlconf: str) -> Tuple[bool, bool]: ...
urlpatterns: List[Callable] urlpatterns: List[Callable]

View File

@@ -12,7 +12,6 @@ from .filters import ListFilter as ListFilter
from .filters import RelatedFieldListFilter as RelatedFieldListFilter from .filters import RelatedFieldListFilter as RelatedFieldListFilter
from .filters import RelatedOnlyFieldListFilter as RelatedOnlyFieldListFilter from .filters import RelatedOnlyFieldListFilter as RelatedOnlyFieldListFilter
from .filters import SimpleListFilter as SimpleListFilter from .filters import SimpleListFilter as SimpleListFilter
from .helpers import ACTION_CHECKBOX_NAME as ACTION_CHECKBOX_NAME
from .options import HORIZONTAL as HORIZONTAL from .options import HORIZONTAL as HORIZONTAL
from .options import VERTICAL as VERTICAL from .options import VERTICAL as VERTICAL
from .options import ModelAdmin as ModelAdmin from .options import ModelAdmin as ModelAdmin

View File

@@ -1,8 +1,8 @@
from typing import Optional from typing import Optional
from django.contrib.admin.options import ModelAdmin from django.contrib.admin.options import ModelAdmin
from django.core.handlers.wsgi import WSGIRequest
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.http.request import HttpRequest
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
def delete_selected(modeladmin: ModelAdmin, request: WSGIRequest, queryset: QuerySet) -> Optional[TemplateResponse]: ... def delete_selected(modeladmin: ModelAdmin, request: HttpRequest, queryset: QuerySet) -> Optional[TemplateResponse]: ...

View File

@@ -1,18 +1,21 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.contrib.admin.options import BaseModelAdmin from django.contrib.admin.options import BaseModelAdmin
from django.core.checks.messages import CheckMessage, Error from django.core.checks.messages import CheckMessage, Error
def check_admin_app(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Error]: ... def check_admin_app(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[CheckMessage]: ...
def check_dependencies(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Error]: ... def check_dependencies(**kwargs: Any) -> Sequence[CheckMessage]: ...
class BaseModelAdminChecks: class BaseModelAdminChecks:
def check(self, admin_obj: BaseModelAdmin, **kwargs: Any) -> List[CheckMessage]: ... def check(self, admin_obj: BaseModelAdmin, **kwargs: Any) -> Sequence[CheckMessage]: ...
class ModelAdminChecks(BaseModelAdminChecks): ... class ModelAdminChecks(BaseModelAdminChecks):
class InlineModelAdminChecks(BaseModelAdminChecks): ... def check(self, admin_obj: BaseModelAdmin, **kwargs: Any) -> Sequence[CheckMessage]: ...
class InlineModelAdminChecks(BaseModelAdminChecks):
def check(self, inline_obj: BaseModelAdmin, **kwargs: Any) -> Sequence[CheckMessage]: ... # type: ignore
def must_be(type: Any, option: Any, obj: Any, id: Any): ... def must_be(type: Any, option: Any, obj: Any, id: Any): ...
def must_inherit_from(parent: Any, option: Any, obj: Any, id: Any): ... def must_inherit_from(parent: Any, option: Any, obj: Any, id: Any): ...
def refer_to_missing_field(field: Any, option: Any, model: Any, obj: Any, id: Any): ... def refer_to_missing_field(field: Any, option: Any, obj: Any, id: Any): ...

View File

@@ -1,38 +1,39 @@
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type
from django.contrib.admin.options import ModelAdmin from django.contrib.admin.options import ModelAdmin
from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.fields import Field from django.db.models.fields import Field
from django.db.models.fields.related import RelatedField from django.db.models.fields.related import RelatedField
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.http.request import HttpRequest
class ListFilter: class ListFilter:
title: Any = ... title: str = ...
template: str = ... template: str = ...
used_parameters: Any = ... used_parameters: Any = ...
def __init__( def __init__(
self, request: WSGIRequest, params: Dict[str, str], model: Type[Model], model_admin: ModelAdmin self, request: HttpRequest, params: Dict[str, str], model: Type[Model], model_admin: ModelAdmin
) -> None: ... ) -> None: ...
def has_output(self) -> bool: ... def has_output(self) -> bool: ...
def choices(self, changelist: Any) -> Optional[Iterator[Dict[str, Any]]]: ... def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
def queryset(self, request: Any, queryset: QuerySet) -> Optional[QuerySet]: ... def queryset(self, request: Any, queryset: QuerySet) -> Optional[QuerySet]: ...
def expected_parameters(self) -> Optional[List[str]]: ... def expected_parameters(self) -> Optional[List[str]]: ...
class SimpleListFilter(ListFilter): class SimpleListFilter(ListFilter):
parameter_name: Any = ... parameter_name: str = ...
lookup_choices: Any = ... lookup_choices: Any = ...
def value(self) -> Optional[str]: ... def value(self) -> Optional[str]: ...
def lookups(self, request: Any, model_admin: Any) -> List[Tuple[Any, str]]: ... def lookups(self, request: Any, model_admin: Any) -> List[Tuple[Any, str]]: ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
class FieldListFilter(ListFilter): class FieldListFilter(ListFilter):
field: Field = ... field: Field = ...
field_path: Any = ... field_path: str = ...
title: Any = ... title: str = ...
def __init__( def __init__(
self, self,
field: Field, field: Field,
request: WSGIRequest, request: HttpRequest,
params: Dict[str, str], params: Dict[str, str],
model: Type[Model], model: Type[Model],
model_admin: ModelAdmin, model_admin: ModelAdmin,
@@ -44,7 +45,7 @@ class FieldListFilter(ListFilter):
def create( def create(
cls, cls,
field: Field, field: Field,
request: WSGIRequest, request: HttpRequest,
params: Dict[str, str], params: Dict[str, str],
model: Type[Model], model: Type[Model],
model_admin: ModelAdmin, model_admin: ModelAdmin,
@@ -55,32 +56,34 @@ class RelatedFieldListFilter(FieldListFilter):
used_parameters: Dict[Any, Any] used_parameters: Dict[Any, Any]
lookup_kwarg: str = ... lookup_kwarg: str = ...
lookup_kwarg_isnull: str = ... lookup_kwarg_isnull: str = ...
lookup_val: None = ... lookup_val: Any = ...
lookup_val_isnull: None = ... lookup_val_isnull: Any = ...
lookup_choices: Any = ... lookup_choices: Any = ...
lookup_title: Any = ... lookup_title: str = ...
title: str = ... title: str = ...
empty_value_display: Any = ... empty_value_display: Any = ...
@property @property
def include_empty_choice(self) -> bool: ... def include_empty_choice(self) -> bool: ...
def field_choices( def field_choices(
self, field: RelatedField, request: WSGIRequest, model_admin: ModelAdmin self, field: RelatedField, request: HttpRequest, model_admin: ModelAdmin
) -> List[Tuple[str, str]]: ... ) -> List[Tuple[str, str]]: ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
class BooleanFieldListFilter(FieldListFilter): class BooleanFieldListFilter(FieldListFilter):
lookup_kwarg: Any = ... lookup_kwarg: str = ...
lookup_kwarg2: Any = ... lookup_kwarg2: str = ...
lookup_val: Any = ... lookup_val: Any = ...
lookup_val2: Any = ... lookup_val2: Any = ...
def choices(self, changelist: Any) -> None: ... def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
class ChoicesFieldListFilter(FieldListFilter): class ChoicesFieldListFilter(FieldListFilter):
title: str title: str
used_parameters: Dict[Any, Any] used_parameters: Dict[Any, Any]
lookup_kwarg: str = ... lookup_kwarg: str = ...
lookup_kwarg_isnull: str = ... lookup_kwarg_isnull: str = ...
lookup_val: None = ... lookup_val: Any = ...
lookup_val_isnull: None = ... lookup_val_isnull: Any = ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
class DateFieldListFilter(FieldListFilter): class DateFieldListFilter(FieldListFilter):
field_generic: Any = ... field_generic: Any = ...
@@ -89,25 +92,28 @@ class DateFieldListFilter(FieldListFilter):
lookup_kwarg_until: Any = ... lookup_kwarg_until: Any = ...
links: Any = ... links: Any = ...
lookup_kwarg_isnull: Any = ... lookup_kwarg_isnull: Any = ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
class AllValuesFieldListFilter(FieldListFilter): class AllValuesFieldListFilter(FieldListFilter):
title: str title: str
used_parameters: Dict[Any, Any] used_parameters: Dict[Any, Any]
lookup_kwarg: str = ... lookup_kwarg: str = ...
lookup_kwarg_isnull: str = ... lookup_kwarg_isnull: str = ...
lookup_val: None = ... lookup_val: Any = ...
lookup_val_isnull: None = ... lookup_val_isnull: Any = ...
empty_value_display: str = ... empty_value_display: str = ...
lookup_choices: QuerySet = ... lookup_choices: QuerySet = ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
class RelatedOnlyFieldListFilter(RelatedFieldListFilter): class RelatedOnlyFieldListFilter(RelatedFieldListFilter):
lookup_kwarg: str lookup_kwarg: str
lookup_kwarg_isnull: str lookup_kwarg_isnull: str
lookup_val: None lookup_val: Any
lookup_val_isnull: None lookup_val_isnull: Any
title: str title: str
used_parameters: Dict[Any, Any] used_parameters: Dict[Any, Any]
class EmptyFieldListFilter(FieldListFilter): class EmptyFieldListFilter(FieldListFilter):
lookup_kwarg: str = ... lookup_kwarg: str = ...
lookup_val: None = ... lookup_val: Any = ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...

View File

@@ -1,12 +1,20 @@
from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Tuple, Union import sys
from typing import Any, Callable, Dict, Iterable, Iterator, List, Mapping, Optional, Sequence, Tuple, Union
from django import forms from django import forms
from django.contrib.admin.options import ModelAdmin
from django.db.models import Model
from django.db.models.fields import AutoField from django.db.models.fields import AutoField
from django.forms.boundfield import BoundField from django.forms.boundfield import BoundField
from django.forms.forms import BaseForm from django.forms.models import ModelForm
from django.forms.utils import ErrorDict from django.forms.utils import ErrorDict, ErrorList
from django.forms.widgets import Media, Widget from django.forms.widgets import Media, Widget
from django.utils.safestring import SafeText from django.utils.safestring import SafeString
if sys.version_info < (3, 8):
from typing_extensions import TypedDict
else:
from typing import TypedDict
ACTION_CHECKBOX_NAME: str ACTION_CHECKBOX_NAME: str
@@ -16,99 +24,121 @@ class ActionForm(forms.Form):
checkbox: Any checkbox: Any
class _PrepopulatedDict(TypedDict):
field: BoundField
dependencies: List[BoundField]
class AdminForm: class AdminForm:
prepopulated_fields: Any = ... prepopulated_fields: List[_PrepopulatedDict]
model_admin: Any = ... model_admin: Optional[ModelAdmin] = ...
readonly_fields: Any = ... readonly_fields: Sequence[str] = ...
form: ModelForm
fieldsets: List[Tuple[Any, Dict[str, List[str]]]]
def __init__( def __init__(
self, self,
form: BaseForm, form: ModelForm,
fieldsets: List[Tuple[None, Dict[str, List[str]]]], fieldsets: List[Tuple[Any, Dict[str, List[str]]]],
prepopulated_fields: Dict[Any, Any], prepopulated_fields: Mapping[str, Iterable[str]],
readonly_fields: Optional[Iterable[Any]] = ..., readonly_fields: Optional[Sequence[str]] = ...,
model_admin: Any = ..., model_admin: Optional[ModelAdmin] = ...,
) -> None: ... ) -> None: ...
def __iter__(self) -> Iterator[Fieldset]: ... def __iter__(self) -> Iterator[Fieldset]: ...
@property @property
def errors(self) -> ErrorDict: ... def errors(self) -> ErrorDict: ...
@property @property
def non_field_errors(self) -> Callable: ... def non_field_errors(self) -> Callable[[], ErrorList]: ...
@property @property
def media(self) -> Media: ... def media(self) -> Media: ...
class Fieldset: class Fieldset:
form: Any = ... form: ModelForm = ...
classes: Any = ... classes: str = ...
description: Any = ... description: Optional[str] = ...
model_admin: Any = ... model_admin: Optional[ModelAdmin] = ...
readonly_fields: Any = ... readonly_fields: Sequence[str] = ...
def __init__( def __init__(
self, self,
form: Any, form: ModelForm,
name: Optional[Any] = ..., name: Optional[Any] = ...,
readonly_fields: Optional[Iterable[Any]] = ..., readonly_fields: Sequence[str] = ...,
fields: Any = ..., fields: Sequence[str] = ...,
classes: Any = ..., classes: Iterable[str] = ...,
description: Optional[Any] = ..., description: Optional[str] = ...,
model_admin: Optional[Any] = ..., model_admin: Optional[ModelAdmin] = ...,
) -> None: ... ) -> None: ...
@property @property
def media(self) -> Media: ... def media(self) -> Media: ...
def __iter__(self) -> Iterator[Fieldline]: ... def __iter__(self) -> Iterator[Fieldline]: ...
class Fieldline: class Fieldline:
form: Any = ... form: ModelForm = ...
fields: Any = ... fields: Sequence[str] = ...
has_visible_field: Any = ... has_visible_field: bool = ...
model_admin: Any = ... model_admin: Optional[ModelAdmin] = ...
readonly_fields: Any = ... readonly_fields: Sequence[str] = ...
def __init__( def __init__(
self, form: Any, field: Any, readonly_fields: Optional[Iterable[Any]] = ..., model_admin: Optional[Any] = ... self,
form: ModelForm,
field: Union[str, Sequence[str]],
readonly_fields: Optional[Sequence[str]] = ...,
model_admin: Optional[ModelAdmin] = ...,
) -> None: ... ) -> None: ...
def __iter__(self) -> Iterator[Union[AdminField, AdminReadonlyField]]: ... def __iter__(self) -> Iterator[Union[AdminField, AdminReadonlyField]]: ...
def errors(self) -> SafeText: ... def errors(self) -> SafeString: ...
class AdminField: class AdminField:
field: BoundField = ... field: BoundField = ...
is_first: bool = ... is_first: bool = ...
is_checkbox: bool = ... is_checkbox: bool = ...
is_readonly: bool = ... is_readonly: bool = ...
def __init__(self, form: Any, field: Any, is_first: Any) -> None: ... def __init__(self, form: ModelForm, field: str, is_first: bool) -> None: ...
def label_tag(self) -> SafeText: ... def label_tag(self) -> SafeString: ...
def errors(self) -> SafeText: ... def errors(self) -> SafeString: ...
class _FieldDictT(TypedDict):
name: str
label: str
help_text: str
field: Union[Callable[[Model], Any], str]
class AdminReadonlyField: class AdminReadonlyField:
field: Any = ... field: _FieldDictT = ...
form: Any = ... form: ModelForm = ...
model_admin: Any = ... model_admin: Optional[ModelAdmin] = ...
is_first: Any = ... is_first: bool = ...
is_checkbox: bool = ... is_checkbox: bool = ...
is_readonly: bool = ... is_readonly: bool = ...
empty_value_display: Any = ... empty_value_display: Any = ...
def __init__(self, form: Any, field: Any, is_first: Any, model_admin: Optional[Any] = ...) -> None: ... def __init__(
def label_tag(self) -> SafeText: ... self,
def contents(self) -> SafeText: ... form: ModelForm,
field: Union[Callable[[Model], Any], str],
is_first: bool,
model_admin: Optional[ModelAdmin] = ...,
) -> None: ...
def label_tag(self) -> SafeString: ...
def contents(self) -> SafeString: ...
class InlineAdminFormSet: class InlineAdminFormSet:
opts: Any = ... opts: Any = ...
formset: Any = ... formset: Any = ...
fieldsets: Any = ... fieldsets: Any = ...
model_admin: Any = ... model_admin: Optional[ModelAdmin] = ...
readonly_fields: Any = ... readonly_fields: Sequence[str] = ...
prepopulated_fields: Any = ... prepopulated_fields: Dict[str, Any] = ...
classes: Any = ... classes: str = ...
has_add_permission: Any = ... has_add_permission: bool = ...
has_change_permission: Any = ... has_change_permission: bool = ...
has_delete_permission: Any = ... has_delete_permission: bool = ...
has_view_permission: Any = ... has_view_permission: bool = ...
def __init__( def __init__(
self, self,
inline: Any, inline: Any,
formset: Any, formset: Any,
fieldsets: Any, fieldsets: Any,
prepopulated_fields: Optional[Any] = ..., prepopulated_fields: Optional[Dict[str, Any]] = ...,
readonly_fields: Optional[Any] = ..., readonly_fields: Optional[Sequence[str]] = ...,
model_admin: Optional[Any] = ..., model_admin: Optional[ModelAdmin] = ...,
has_add_permission: bool = ..., has_add_permission: bool = ...,
has_change_permission: bool = ..., has_change_permission: bool = ...,
has_delete_permission: bool = ..., has_delete_permission: bool = ...,
@@ -120,26 +150,27 @@ class InlineAdminFormSet:
@property @property
def forms(self): ... def forms(self): ...
@property @property
def non_form_errors(self) -> Callable: ... def non_form_errors(self) -> Callable[[], ErrorList]: ...
@property @property
def media(self) -> Media: ... def media(self) -> Media: ...
class InlineAdminForm(AdminForm): class InlineAdminForm(AdminForm):
formset: Any = ... formset: Any = ...
original: Any = ... original: Optional[bool] = ...
show_url: Any = ... show_url: bool = ...
absolute_url: Any = ... absolute_url: Optional[str] = ...
def __init__( def __init__(
self, self,
formset: Any, formset: Any,
form: Any, form: ModelForm,
fieldsets: Any, fieldsets: Any,
prepopulated_fields: Any, prepopulated_fields: Any,
original: Any, original: Optional[bool],
readonly_fields: Optional[Any] = ..., readonly_fields: Optional[Sequence[str]] = ...,
model_admin: Optional[Any] = ..., model_admin: Optional[ModelAdmin] = ...,
view_on_site_url: Optional[Any] = ..., view_on_site_url: Optional[str] = ...,
) -> None: ... ) -> None: ...
def __iter__(self) -> Iterator[InlineFieldset]: ...
def needs_explicit_pk_field(self) -> Union[bool, AutoField]: ... def needs_explicit_pk_field(self) -> Union[bool, AutoField]: ...
def pk_field(self) -> AdminField: ... def pk_field(self) -> AdminField: ...
def fk_field(self) -> AdminField: ... def fk_field(self) -> AdminField: ...
@@ -149,6 +180,7 @@ class InlineAdminForm(AdminForm):
class InlineFieldset(Fieldset): class InlineFieldset(Fieldset):
formset: Any = ... formset: Any = ...
def __init__(self, formset: Any, *args: Any, **kwargs: Any) -> None: ... def __init__(self, formset: Any, *args: Any, **kwargs: Any) -> None: ...
def __iter__(self) -> Iterator[Fieldline]: ...
class AdminErrorList(forms.utils.ErrorList): class AdminErrorList(forms.utils.ErrorList):
def __init__(self, form: Any, inline_formsets: Any) -> None: ... def __init__(self, form: ModelForm, inline_formsets: Any) -> None: ...

View File

@@ -1,9 +1,10 @@
from collections import OrderedDict import sys
from typing import ( from typing import (
Any, Any,
Callable, Callable,
Dict, Dict,
Generic, Generic,
Iterable,
Iterator, Iterator,
List, List,
Mapping, Mapping,
@@ -17,7 +18,7 @@ from typing import (
) )
from django import forms from django import forms
from django.contrib.admin.filters import ListFilter from django.contrib.admin.filters import FieldListFilter, ListFilter
from django.contrib.admin.models import LogEntry from django.contrib.admin.models import LogEntry
from django.contrib.admin.sites import AdminSite from django.contrib.admin.sites import AdminSite
from django.contrib.admin.views.main import ChangeList from django.contrib.admin.views.main import ChangeList
@@ -25,22 +26,28 @@ from django.contrib.auth.forms import AdminPasswordChangeForm
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.checks.messages import CheckMessage from django.core.checks.messages import CheckMessage
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.db import models
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.fields import Field from django.db.models.fields import Field
from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField
from django.db.models.options import Options from django.db.models.options import Options
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.forms.fields import Field as FormField
from django.forms.fields import TypedChoiceField from django.forms.fields import TypedChoiceField
from django.forms.forms import BaseForm from django.forms.forms import BaseForm
from django.forms.formsets import BaseFormSet
from django.forms.models import BaseInlineFormSet, ModelChoiceField, ModelMultipleChoiceField from django.forms.models import BaseInlineFormSet, ModelChoiceField, ModelMultipleChoiceField
from django.forms.widgets import Media from django.forms.widgets import Media
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirect, JsonResponse from django.http.response import HttpResponse, HttpResponseRedirect, JsonResponse
from django.template.response import TemplateResponse from django.template.response import _TemplateForResponseT
from django.urls.resolvers import URLPattern from django.urls.resolvers import URLPattern
from django.utils.safestring import SafeText from django.utils.datastructures import _ListOrTuple
from django.utils.safestring import SafeString
if sys.version_info < (3, 8):
from typing_extensions import Literal, TypedDict from typing_extensions import Literal, TypedDict
else:
from typing import Literal, TypedDict
IS_POPUP_VAR: str IS_POPUP_VAR: str
TO_FIELD_VAR: str TO_FIELD_VAR: str
@@ -57,19 +64,26 @@ class IncorrectLookupParameters(Exception): ...
FORMFIELD_FOR_DBFIELD_DEFAULTS: Any FORMFIELD_FOR_DBFIELD_DEFAULTS: Any
csrf_protect_m: Any csrf_protect_m: Any
_FieldGroups = Sequence[Union[str, Sequence[str]]]
class _OptionalFieldOpts(TypedDict, total=False): class _OptionalFieldOpts(TypedDict, total=False):
classes: Sequence[str] classes: Sequence[str]
description: str description: str
class _FieldOpts(_OptionalFieldOpts, total=True): class _FieldOpts(_OptionalFieldOpts, total=True):
fields: Sequence[Union[str, Sequence[str]]] fields: _FieldGroups
# Workaround for mypy issue, a Sequence type should be preferred here. # Workaround for mypy issue, a Sequence type should be preferred here.
# https://github.com/python/mypy/issues/8921 # https://github.com/python/mypy/issues/8921
# _FieldsetSpec = Sequence[Tuple[Optional[str], _FieldOpts]] # _FieldsetSpec = Sequence[Tuple[Optional[str], _FieldOpts]]
_T = TypeVar("_T")
_ListOrTuple = Union[Tuple[_T, ...], List[_T]]
_FieldsetSpec = _ListOrTuple[Tuple[Optional[str], _FieldOpts]] _FieldsetSpec = _ListOrTuple[Tuple[Optional[str], _FieldOpts]]
_ListFilterT = Union[
Type[ListFilter],
Field,
str,
Tuple[Union[Field, str], Type[FieldListFilter]],
List[Union[Field, str, Type[FieldListFilter]]],
]
# Generic type specifically for models, for use in BaseModelAdmin and subclasses # Generic type specifically for models, for use in BaseModelAdmin and subclasses
# https://github.com/typeddjango/django-stubs/issues/482 # https://github.com/typeddjango/django-stubs/issues/482
@@ -78,62 +92,66 @@ _ModelT = TypeVar("_ModelT", bound=Model)
class BaseModelAdmin(Generic[_ModelT]): class BaseModelAdmin(Generic[_ModelT]):
autocomplete_fields: Sequence[str] = ... autocomplete_fields: Sequence[str] = ...
raw_id_fields: Sequence[str] = ... raw_id_fields: Sequence[str] = ...
fields: Sequence[Union[str, Sequence[str]]] = ... fields: Optional[_FieldGroups] = ...
exclude: Sequence[str] = ... exclude: Optional[Sequence[str]] = ...
fieldsets: _FieldsetSpec = ... fieldsets: Optional[_FieldsetSpec] = ...
form: Type[BaseForm] = ... form: Type[forms.ModelForm[_ModelT]] = ...
filter_vertical: Sequence[str] = ... filter_vertical: Sequence[str] = ...
filter_horizontal: Sequence[str] = ... filter_horizontal: Sequence[str] = ...
radio_fields: Mapping[str, _Direction] = ... radio_fields: Mapping[str, _Direction] = ...
prepopulated_fields: Mapping[str, Sequence[str]] = ... prepopulated_fields: Dict[str, Sequence[str]] = ...
formfield_overrides: Mapping[Type[Field], Mapping[str, Any]] = ... formfield_overrides: Mapping[Type[Field], Mapping[str, Any]] = ...
readonly_fields: Sequence[Union[str, Callable[[_ModelT], Any]]] = ... readonly_fields: Sequence[str] = ...
ordering: Sequence[str] = ... ordering: Optional[Sequence[str]] = ...
sortable_by: Sequence[str] = ... sortable_by: Optional[_ListOrTuple[str]] = ...
view_on_site: bool = ... view_on_site: Union[bool, Callable[[_ModelT], str]] = ...
show_full_result_count: bool = ... show_full_result_count: bool = ...
checks_class: Any = ... checks_class: Any = ...
model: Type[_ModelT]
opts: Options[_ModelT]
admin_site: AdminSite
def __init__(self) -> None: ...
def check(self, **kwargs: Any) -> List[CheckMessage]: ... def check(self, **kwargs: Any) -> List[CheckMessage]: ...
def formfield_for_dbfield( def formfield_for_dbfield(self, db_field: Field, request: HttpRequest, **kwargs: Any) -> Optional[FormField]: ...
self, db_field: models.Field, request: Optional[HttpRequest], **kwargs: Any def formfield_for_choice_field(self, db_field: Field, request: HttpRequest, **kwargs: Any) -> TypedChoiceField: ...
) -> Optional[forms.Field]: ...
def formfield_for_choice_field(
self, db_field: Field, request: Optional[HttpRequest], **kwargs: Any
) -> TypedChoiceField: ...
def get_field_queryset( def get_field_queryset(
self, db: None, db_field: RelatedField, request: Optional[HttpRequest] self, db: Optional[str], db_field: RelatedField, request: HttpRequest
) -> Optional[QuerySet]: ... ) -> Optional[QuerySet]: ...
def formfield_for_foreignkey( def formfield_for_foreignkey(
self, db_field: ForeignKey, request: Optional[HttpRequest], **kwargs: Any self, db_field: ForeignKey, request: HttpRequest, **kwargs: Any
) -> Optional[ModelChoiceField]: ... ) -> ModelChoiceField: ...
def formfield_for_manytomany( def formfield_for_manytomany(
self, db_field: ManyToManyField, request: Optional[HttpRequest], **kwargs: Any self, db_field: ManyToManyField, request: HttpRequest, **kwargs: Any
) -> ModelMultipleChoiceField: ... ) -> Optional[ModelMultipleChoiceField]: ...
def get_autocomplete_fields(self, request: HttpRequest) -> Tuple: ... def get_autocomplete_fields(self, request: HttpRequest) -> Sequence[str]: ...
def get_view_on_site_url(self, obj: Optional[_ModelT] = ...) -> Optional[str]: ... def get_view_on_site_url(self, obj: Optional[_ModelT] = ...) -> Optional[str]: ...
def get_empty_value_display(self) -> SafeText: ... def get_empty_value_display(self) -> SafeString: ...
def get_exclude(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> Any: ... def get_exclude(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> Optional[Sequence[str]]: ...
def get_fields(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> Sequence[Union[Callable, str]]: ... def get_fields(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> _FieldGroups: ...
def get_fieldsets( def get_fieldsets(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> _FieldsetSpec: ...
def get_inlines(self, request: HttpRequest, obj: Optional[_ModelT]) -> List[Type[InlineModelAdmin]]: ...
def get_ordering(self, request: HttpRequest) -> Sequence[str]: ...
def get_readonly_fields(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> Sequence[str]: ...
def get_prepopulated_fields(
self, request: HttpRequest, obj: Optional[_ModelT] = ... self, request: HttpRequest, obj: Optional[_ModelT] = ...
) -> List[Tuple[Optional[str], Dict[str, Any]]]: ... ) -> Dict[str, Sequence[str]]: ...
def get_ordering(self, request: HttpRequest) -> Union[List[str], Tuple]: ... def get_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ...
def get_readonly_fields(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> Union[List[str], Tuple]: ... def get_sortable_by(self, request: HttpRequest) -> Sequence[str]: ...
def get_prepopulated_fields(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> Dict[str, Tuple[str]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet: ...
def get_sortable_by(self, request: HttpRequest) -> Union[List[Callable], List[str], Tuple]: ...
def lookup_allowed(self, lookup: str, value: str) -> bool: ... def lookup_allowed(self, lookup: str, value: str) -> bool: ...
def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ... def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ...
def has_add_permission(self, request: HttpRequest) -> bool: ... def has_add_permission(self, request: HttpRequest) -> bool: ...
def has_change_permission(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> bool: ... def has_change_permission(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> bool: ...
def has_delete_permission(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> bool: ... def has_delete_permission(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> bool: ...
def has_view_permission(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> bool: ... def has_view_permission(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> bool: ...
def has_view_or_change_permission(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> bool: ...
def has_module_permission(self, request: HttpRequest) -> bool: ... def has_module_permission(self, request: HttpRequest) -> bool: ...
_DisplayT = _ListOrTuple[Union[str, Callable[[_ModelT], str]]]
class ModelAdmin(BaseModelAdmin[_ModelT]): class ModelAdmin(BaseModelAdmin[_ModelT]):
list_display: Sequence[Union[str, Callable[[_ModelT], Any]]] = ... list_display: _DisplayT = ...
list_display_links: Optional[Sequence[Union[str, Callable]]] = ... list_display_links: _DisplayT = ...
list_filter: Sequence[Union[str, Type[ListFilter], Tuple[str, Type[ListFilter]]]] = ... list_filter: _ListOrTuple[_ListFilterT] = ...
list_select_related: Union[bool, Sequence[str]] = ... list_select_related: Union[bool, Sequence[str]] = ...
list_per_page: int = ... list_per_page: int = ...
list_max_show_all: int = ... list_max_show_all: int = ...
@@ -146,23 +164,22 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
paginator: Type = ... paginator: Type = ...
preserve_filters: bool = ... preserve_filters: bool = ...
inlines: Sequence[Type[InlineModelAdmin]] = ... inlines: Sequence[Type[InlineModelAdmin]] = ...
add_form_template: str = ... add_form_template: Optional[_TemplateForResponseT] = ...
change_form_template: str = ... change_form_template: Optional[_TemplateForResponseT] = ...
change_list_template: str = ... change_list_template: Optional[_TemplateForResponseT] = ...
delete_confirmation_template: str = ... delete_confirmation_template: Optional[_TemplateForResponseT] = ...
delete_selected_confirmation_template: str = ... delete_selected_confirmation_template: Optional[_TemplateForResponseT] = ...
object_history_template: str = ... object_history_template: Optional[_TemplateForResponseT] = ...
popup_response_template: str = ... popup_response_template: Optional[_TemplateForResponseT] = ...
actions: Optional[Sequence[Union[Callable[[ModelAdmin, HttpRequest, QuerySet], None], str]]] = ... actions: Optional[Sequence[Union[Callable[[ModelAdmin, HttpRequest, QuerySet], None], str]]] = ...
action_form: Any = ... action_form: Any = ...
actions_on_top: bool = ... actions_on_top: bool = ...
actions_on_bottom: bool = ... actions_on_bottom: bool = ...
actions_selection_counter: bool = ... actions_selection_counter: bool = ...
model: Type[_ModelT] = ... model: Type[_ModelT] = ...
opts: Options = ... opts: Options[_ModelT] = ...
admin_site: AdminSite = ... admin_site: AdminSite = ...
def __init__(self, model: Type[_ModelT], admin_site: Optional[AdminSite]) -> None: ... def __init__(self, model: Type[_ModelT], admin_site: AdminSite) -> None: ...
def get_inlines(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> List[Type[InlineModelAdmin]]: ...
def get_inline_instances(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> List[InlineModelAdmin]: ... def get_inline_instances(self, request: HttpRequest, obj: Optional[_ModelT] = ...) -> List[InlineModelAdmin]: ...
def get_urls(self) -> List[URLPattern]: ... def get_urls(self) -> List[URLPattern]: ...
@property @property
@@ -170,11 +187,13 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
@property @property
def media(self) -> Media: ... def media(self) -> Media: ...
def get_model_perms(self, request: HttpRequest) -> Dict[str, bool]: ... def get_model_perms(self, request: HttpRequest) -> Dict[str, bool]: ...
def get_form(self, request: Any, obj: Optional[_ModelT] = ..., change: bool = ..., **kwargs: Any): ... def get_form(
self, request: Any, obj: Optional[_ModelT] = ..., change: bool = ..., **kwargs: Any
) -> Type[forms.ModelForm[_ModelT]]: ...
def get_changelist(self, request: HttpRequest, **kwargs: Any) -> Type[ChangeList]: ... def get_changelist(self, request: HttpRequest, **kwargs: Any) -> Type[ChangeList]: ...
def get_changelist_instance(self, request: HttpRequest) -> ChangeList: ... def get_changelist_instance(self, request: HttpRequest) -> ChangeList: ...
def get_object( def get_object(
self, request: HttpRequest, object_id: str, from_field: Optional[Union[Callable[..., Any], str]] = ... self, request: HttpRequest, object_id: str, from_field: Optional[str] = ...
) -> Optional[_ModelT]: ... ) -> Optional[_ModelT]: ...
def get_changelist_form(self, request: Any, **kwargs: Any): ... def get_changelist_form(self, request: Any, **kwargs: Any): ...
def get_changelist_formset(self, request: Any, **kwargs: Any): ... def get_changelist_formset(self, request: Any, **kwargs: Any): ...
@@ -190,25 +209,25 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
def log_addition(self, request: HttpRequest, object: _ModelT, message: Any) -> LogEntry: ... def log_addition(self, request: HttpRequest, object: _ModelT, message: Any) -> LogEntry: ...
def log_change(self, request: HttpRequest, object: _ModelT, message: Any) -> LogEntry: ... def log_change(self, request: HttpRequest, object: _ModelT, message: Any) -> LogEntry: ...
def log_deletion(self, request: HttpRequest, object: _ModelT, object_repr: str) -> LogEntry: ... def log_deletion(self, request: HttpRequest, object: _ModelT, object_repr: str) -> LogEntry: ...
def action_checkbox(self, obj: _ModelT) -> SafeText: ... def action_checkbox(self, obj: _ModelT) -> SafeString: ...
def get_actions(self, request: HttpRequest) -> OrderedDict: ... def get_actions(self, request: HttpRequest) -> Dict[str, Optional[Tuple[Callable[..., str], str, str]]]: ...
def get_action_choices( def get_action_choices(
self, request: HttpRequest, default_choices: List[Tuple[str, str]] = ... self, request: HttpRequest, default_choices: List[Tuple[str, str]] = ...
) -> List[Tuple[str, str]]: ... ) -> List[Tuple[str, str]]: ...
def get_action(self, action: Union[Callable, str]) -> Tuple[Callable, str, str]: ... def get_action(self, action: Union[Callable, str]) -> Optional[Tuple[Callable[..., str], str, str]]: ...
def get_list_display(self, request: HttpRequest) -> Sequence[str]: ... def get_list_display(self, request: HttpRequest) -> _DisplayT: ...
def get_list_display_links(self, request: HttpRequest, list_display: Sequence[str]) -> Optional[Sequence[str]]: ... def get_list_display_links(self, request: HttpRequest, list_display: _DisplayT) -> _DisplayT: ...
def get_list_filter(self, request: HttpRequest) -> Sequence[str]: ... def get_list_filter(self, request: HttpRequest) -> Sequence[_ListFilterT]: ...
def get_list_select_related(self, request: HttpRequest) -> Sequence[str]: ... def get_list_select_related(self, request: HttpRequest) -> Union[bool, Sequence[str]]: ...
def get_search_fields(self, request: HttpRequest) -> List[str]: ... def get_search_fields(self, request: HttpRequest) -> Sequence[str]: ...
def get_search_results( def get_search_results(
self, request: HttpRequest, queryset: QuerySet, search_term: str self, request: HttpRequest, queryset: QuerySet, search_term: str
) -> Tuple[QuerySet, bool]: ... ) -> Tuple[QuerySet[_ModelT], bool]: ...
def get_preserved_filters(self, request: HttpRequest) -> str: ... def get_preserved_filters(self, request: HttpRequest) -> str: ...
def _get_edited_object_pks(self, request: HttpRequest, prefix: str) -> List[str]: ... def _get_edited_object_pks(self, request: HttpRequest, prefix: str) -> List[str]: ...
def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> QuerySet: ... def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> QuerySet[_ModelT]: ...
def construct_change_message( def construct_change_message(
self, request: HttpRequest, form: AdminPasswordChangeForm, formsets: None, add: bool = ... self, request: HttpRequest, form: AdminPasswordChangeForm, formsets: Iterable[BaseFormSet], add: bool = ...
) -> List[Dict[str, Dict[str, List[str]]]]: ... ) -> List[Dict[str, Dict[str, List[str]]]]: ...
def message_user( def message_user(
self, self,
@@ -239,44 +258,45 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
def response_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponse: ... def response_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponse: ...
def response_post_save_add(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ... def response_post_save_add(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ...
def response_post_save_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ... def response_post_save_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ...
def response_action(self, request: HttpRequest, queryset: QuerySet) -> Optional[HttpResponseBase]: ... # Probably FileResponse cannot come from ModelAdmin views
def response_action(self, request: HttpRequest, queryset: QuerySet) -> Optional[HttpResponse]: ...
def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ... def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ...
def render_delete_form(self, request: Any, context: Any): ... def render_delete_form(self, request: Any, context: Any): ...
def get_inline_formsets( def get_inline_formsets(
self, request: HttpRequest, formsets: List[Any], inline_instances: List[Any], obj: Optional[_ModelT] = ... self, request: HttpRequest, formsets: List[Any], inline_instances: List[Any], obj: Optional[_ModelT] = ...
) -> List[Any]: ... ) -> List[Any]: ...
def get_changeform_initial_data(self, request: HttpRequest) -> Dict[str, str]: ... def get_changeform_initial_data(self, request: HttpRequest) -> Dict[str, Union[str, List[str]]]: ...
def changeform_view( def changeform_view(
self, self,
request: HttpRequest, request: HttpRequest,
object_id: Optional[str] = ..., object_id: Optional[str] = ...,
form_url: str = ..., form_url: str = ...,
extra_context: Optional[Dict[str, Any]] = ..., extra_context: Optional[Dict[str, Any]] = ...,
) -> Any: ... ) -> HttpResponse: ...
def autocomplete_view(self, request: HttpRequest) -> JsonResponse: ...
def add_view( def add_view(
self, request: HttpRequest, form_url: str = ..., extra_context: Optional[Dict[str, Any]] = ... self, request: HttpRequest, form_url: str = ..., extra_context: Optional[Dict[str, Any]] = ...
) -> HttpResponse: ... ) -> HttpResponse: ...
def change_view( def change_view(
self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: Optional[Dict[str, Any]] = ... self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: Optional[Dict[str, Any]] = ...
) -> HttpResponse: ... ) -> HttpResponse: ...
def changelist_view( def changelist_view(self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...) -> HttpResponse: ...
self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...
) -> TemplateResponse: ...
def get_deleted_objects( def get_deleted_objects(
self, objs: QuerySet, request: HttpRequest self, objs: Union[Sequence[_ModelT], QuerySet[_ModelT]], request: HttpRequest
) -> Tuple[List[Any], Dict[Any, Any], Set[Any], List[Any]]: ... ) -> Tuple[List[Model], Dict[str, int], Set[str], List[str]]: ...
def delete_view( def delete_view(
self, request: HttpRequest, object_id: str, extra_context: Optional[Dict[str, Any]] = ... self, request: HttpRequest, object_id: str, extra_context: Optional[Dict[str, Any]] = ...
) -> Any: ... ) -> HttpResponse: ...
def history_view( def history_view(
self, request: HttpRequest, object_id: str, extra_context: Optional[Dict[str, Any]] = ... self, request: HttpRequest, object_id: str, extra_context: Optional[Dict[str, Any]] = ...
) -> HttpResponse: ... ) -> HttpResponse: ...
class InlineModelAdmin(BaseModelAdmin[_ModelT]): _ChildModelT = TypeVar("_ChildModelT", bound=Model)
model: Type[_ModelT] = ... _ParentModelT = TypeVar("_ParentModelT", bound=Model)
fk_name: str = ...
formset: Type[BaseInlineFormSet] = ... class InlineModelAdmin(Generic[_ChildModelT, _ParentModelT], BaseModelAdmin[_ChildModelT]):
model: Type[_ChildModelT] = ...
fk_name: Optional[str] = ...
formset: Type[BaseInlineFormSet[_ChildModelT, forms.ModelForm[_ChildModelT]]] = ...
extra: int = ... extra: int = ...
min_num: Optional[int] = ... min_num: Optional[int] = ...
max_num: Optional[int] = ... max_num: Optional[int] = ...
@@ -287,16 +307,26 @@ class InlineModelAdmin(BaseModelAdmin[_ModelT]):
show_change_link: bool = ... show_change_link: bool = ...
classes: Optional[Sequence[str]] = ... classes: Optional[Sequence[str]] = ...
admin_site: AdminSite = ... admin_site: AdminSite = ...
parent_model: Any = ... parent_model: Type[_ParentModelT] = ...
opts: Any = ... opts: Options[_ChildModelT] = ...
has_registered_model: Any = ... has_registered_model: bool = ...
def __init__(self, parent_model: Union[Type[_ModelT], _ModelT], admin_site: AdminSite) -> None: ... def __init__(self, parent_model: Type[_ParentModelT], admin_site: AdminSite) -> None: ...
@property @property
def media(self) -> Media: ... def media(self) -> Media: ...
def get_extra(self, request: HttpRequest, obj: Optional[_ModelT] = ..., **kwargs: Any) -> int: ... def get_extra(self, request: HttpRequest, obj: Optional[_ParentModelT] = ..., **kwargs: Any) -> int: ...
def get_min_num(self, request: HttpRequest, obj: Optional[_ModelT] = ..., **kwargs: Any) -> Optional[int]: ... def get_min_num(self, request: HttpRequest, obj: Optional[_ParentModelT] = ..., **kwargs: Any) -> Optional[int]: ...
def get_max_num(self, request: HttpRequest, obj: Optional[_ModelT] = ..., **kwargs: Any) -> Optional[int]: ... def get_max_num(self, request: HttpRequest, obj: Optional[_ParentModelT] = ..., **kwargs: Any) -> Optional[int]: ...
def get_formset(self, request: Any, obj: Optional[_ModelT] = ..., **kwargs: Any): ... def get_formset(
self, request: HttpRequest, obj: Optional[_ParentModelT] = ..., **kwargs: Any
) -> Type[BaseInlineFormSet[_ChildModelT, forms.ModelForm[_ChildModelT]]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet[_ChildModelT]: ...
def has_add_permission(self, request: HttpRequest, obj: Optional[_ParentModelT]) -> bool: ... # type: ignore
def has_change_permission(self, request: HttpRequest, obj: Optional[_ParentModelT] = ...) -> bool: ... # type: ignore
def has_delete_permission(self, request: HttpRequest, obj: Optional[_ParentModelT] = ...) -> bool: ... # type: ignore
def has_view_permission(self, request: HttpRequest, obj: Optional[_ParentModelT] = ...) -> bool: ... # type: ignore
class StackedInline(InlineModelAdmin[_ModelT]): ... class StackedInline(InlineModelAdmin[_ChildModelT, _ParentModelT]):
class TabularInline(InlineModelAdmin[_ModelT]): ... template: str = ...
class TabularInline(InlineModelAdmin[_ChildModelT, _ParentModelT]):
template: str = ...

View File

@@ -5,9 +5,9 @@ from django.apps.config import AppConfig
from django.contrib.admin.options import ModelAdmin from django.contrib.admin.options import ModelAdmin
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.core.checks import CheckMessage from django.core.checks import CheckMessage
from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.http.request import HttpRequest
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.urls import URLPattern, URLResolver from django.urls import URLPattern, URLResolver
@@ -22,7 +22,7 @@ else:
all_sites: MutableSet[AdminSite] all_sites: MutableSet[AdminSite]
_ActionCallback = Callable[[ModelAdmin, WSGIRequest, QuerySet], Optional[TemplateResponse]] _ActionCallback = Callable[[ModelAdmin, HttpRequest, QuerySet], Optional[TemplateResponse]]
class AlreadyRegistered(Exception): ... class AlreadyRegistered(Exception): ...
class NotRegistered(Exception): ... class NotRegistered(Exception): ...
@@ -41,6 +41,7 @@ class AdminSite:
password_change_done_template: Optional[str] = ... password_change_done_template: Optional[str] = ...
name: str = ... name: str = ...
enable_nav_sidebar: bool = ... enable_nav_sidebar: bool = ...
empty_value_display: str = ...
final_catch_all_view: bool = ... final_catch_all_view: bool = ...
_empty_value_display: str = ... _empty_value_display: str = ...
_registry: Dict[Type[Model], ModelAdmin] _registry: Dict[Type[Model], ModelAdmin]
@@ -61,31 +62,29 @@ class AdminSite:
def get_action(self, name: str) -> Callable: ... def get_action(self, name: str) -> Callable: ...
@property @property
def actions(self) -> Iterable[Tuple[str, _ActionCallback]]: ... def actions(self) -> Iterable[Tuple[str, _ActionCallback]]: ...
@property def has_permission(self, request: HttpRequest) -> bool: ...
def empty_value_display(self) -> str: ...
@empty_value_display.setter
def empty_value_display(self, empty_value_display: str) -> None: ...
def has_permission(self, request: WSGIRequest) -> bool: ...
def admin_view(self, view: Callable, cacheable: bool = ...) -> Callable: ... def admin_view(self, view: Callable, cacheable: bool = ...) -> Callable: ...
def get_urls(self) -> List[URLResolver]: ... def get_urls(self) -> List[Union[URLResolver, URLPattern]]: ...
@property @property
def urls(self) -> Tuple[List[Union[URLResolver, URLPattern]], str, str]: ... def urls(self) -> Tuple[List[Union[URLResolver, URLPattern]], str, str]: ...
def each_context(self, request: WSGIRequest) -> Dict[str, Any]: ... def each_context(self, request: HttpRequest) -> Dict[str, Any]: ...
def password_change( def password_change(
self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ... self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...
) -> TemplateResponse: ... ) -> TemplateResponse: ...
def password_change_done( def password_change_done(
self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ... self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...
) -> TemplateResponse: ... ) -> TemplateResponse: ...
def i18n_javascript(self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...) -> HttpResponse: ... def i18n_javascript(self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...) -> HttpResponse: ...
def logout(self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...) -> TemplateResponse: ... def logout(self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...) -> TemplateResponse: ...
def login(self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...) -> HttpResponse: ... def login(self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...) -> HttpResponse: ...
def _build_app_dict(self, request: WSGIRequest, label: Optional[str] = ...) -> Dict[str, Any]: ... def _build_app_dict(self, request: HttpRequest, label: Optional[str] = ...) -> Dict[str, Any]: ...
def get_app_list(self, request: WSGIRequest) -> List[Any]: ... def get_app_list(self, request: HttpRequest) -> List[Any]: ...
def index(self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...) -> TemplateResponse: ... def index(self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...) -> TemplateResponse: ...
def app_index( def app_index(
self, request: WSGIRequest, app_label: str, extra_context: Optional[Dict[str, Any]] = ... self, request: HttpRequest, app_label: str, extra_context: Optional[Dict[str, Any]] = ...
) -> TemplateResponse: ... ) -> TemplateResponse: ...
def autocomplete_view(self, request: HttpRequest) -> HttpResponse: ...
def catch_all_view(self, request: HttpRequest, url: str) -> HttpResponse: ...
class DefaultAdminSite(LazyObject): ... class DefaultAdminSite(LazyObject): ...

View File

@@ -5,24 +5,25 @@ from django.contrib.admin.templatetags.base import InclusionAdminNode
from django.contrib.admin.views.main import ChangeList from django.contrib.admin.views.main import ChangeList
from django.db.models.base import Model from django.db.models.base import Model
from django.forms.boundfield import BoundField from django.forms.boundfield import BoundField
from django.forms.models import ModelForm
from django.template.base import Parser, Token from django.template.base import Parser, Token
from django.template.context import RequestContext from django.template.context import RequestContext
from django.utils.safestring import SafeText from django.utils.safestring import SafeString
from .base import InclusionAdminNode from .base import InclusionAdminNode
register: Any register: Any
DOT: str DOT: str
def paginator_number(cl: ChangeList, i: int) -> SafeText: ... def paginator_number(cl: ChangeList, i: int) -> SafeString: ...
def pagination(cl: ChangeList) -> Dict[str, Iterable[Any]]: ... def pagination(cl: ChangeList) -> Dict[str, Any]: ...
def pagination_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def pagination_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def result_headers(cl: ChangeList) -> Iterator[Dict[str, Optional[Union[int, str]]]]: ... def result_headers(cl: ChangeList) -> Iterator[Dict[str, Optional[Union[int, str]]]]: ...
def items_for_result(cl: ChangeList, result: Model, form: None) -> Iterator[SafeText]: ... def items_for_result(cl: ChangeList, result: Model, form: Optional[ModelForm]) -> Iterator[SafeString]: ...
class ResultList(list): class ResultList(list):
form: None = ... form: Optional[ModelForm] = ...
def __init__(self, form: None, *items: Any) -> None: ... def __init__(self, form: Optional[ModelForm], *items: Any) -> None: ...
def results(cl: ChangeList) -> Iterator[ResultList]: ... def results(cl: ChangeList) -> Iterator[ResultList]: ...
def result_hidden_fields(cl: ChangeList) -> Iterator[BoundField]: ... def result_hidden_fields(cl: ChangeList) -> Iterator[BoundField]: ...
@@ -36,7 +37,7 @@ def date_hierarchy(cl: ChangeList) -> Optional[Dict[str, Any]]: ...
def date_hierarchy_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def date_hierarchy_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def search_form(cl: ChangeList) -> Dict[str, Union[bool, ChangeList, str]]: ... def search_form(cl: ChangeList) -> Dict[str, Union[bool, ChangeList, str]]: ...
def search_form_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def search_form_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def admin_list_filter(cl: ChangeList, spec: FieldListFilter) -> SafeText: ... def admin_list_filter(cl: ChangeList, spec: FieldListFilter) -> SafeString: ...
def admin_actions(context: RequestContext) -> RequestContext: ... def admin_actions(context: RequestContext) -> RequestContext: ...
def admin_actions_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def admin_actions_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...
def change_list_object_tools_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def change_list_object_tools_tag(parser: Parser, token: Token) -> InclusionAdminNode: ...

View File

@@ -1,5 +0,0 @@
from typing import Any
register: Any
def static(path: str) -> str: ...

View File

@@ -3,11 +3,11 @@ from uuid import UUID
from django.db.models.options import Options from django.db.models.options import Options
from django.template.context import RequestContext from django.template.context import RequestContext
from django.utils.safestring import SafeText from django.utils.safestring import SafeString
register: Any register: Any
def admin_urlname(value: Options, arg: SafeText) -> str: ... def admin_urlname(value: Options, arg: SafeString) -> str: ...
def admin_urlquote(value: Union[int, str, UUID]) -> Union[int, str, UUID]: ... def admin_urlquote(value: Union[int, str, UUID]) -> Union[int, str, UUID]: ...
def add_preserved_filters( def add_preserved_filters(
context: Union[Dict[str, Union[Options, str]], RequestContext], context: Union[Dict[str, Union[Options, str]], RequestContext],

View File

@@ -3,15 +3,15 @@ from typing import Any, Callable, Dict, List
from django.template.base import Parser, Token from django.template.base import Parser, Token
from django.template.context import Context from django.template.context import Context
from django.template.library import InclusionNode from django.template.library import InclusionNode
from django.utils.safestring import SafeText from django.utils.safestring import SafeString
class InclusionAdminNode(InclusionNode): class InclusionAdminNode(InclusionNode):
args: List[Any] args: List[Any]
func: Callable func: Callable
kwargs: Dict[Any, Any] kwargs: Dict[str, Any]
takes_context: bool takes_context: bool
template_name: str = ... template_name: str = ...
def __init__( def __init__(
self, parser: Parser, token: Token, func: Callable, template_name: str, takes_context: bool = ... self, parser: Parser, token: Token, func: Callable, template_name: str, takes_context: bool = ...
) -> None: ... ) -> None: ...
def render(self, context: Context) -> SafeText: ... def render(self, context: Context) -> SafeString: ...

View File

@@ -1,4 +1,5 @@
from typing import Any, Callable from contextlib import contextmanager
from typing import Any, Callable, Generator
from django.contrib.staticfiles.testing import StaticLiveServerTestCase from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.test.selenium import SeleniumTestCase from django.test.selenium import SeleniumTestCase
@@ -8,16 +9,18 @@ class CSPMiddleware(MiddlewareMixin): ...
class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase): class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase):
def wait_until(self, callback: Callable, timeout: int = ...) -> None: ... def wait_until(self, callback: Callable, timeout: int = ...) -> None: ...
def wait_for_popup(self, num_windows: int = ..., timeout: int = ...) -> None: ... def wait_for_and_switch_to_popup(self, num_windows: int = ..., timeout: int = ...) -> None: ...
def wait_for(self, css_selector: str, timeout: int = ...) -> None: ... def wait_for(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_for_text(self, css_selector: str, text: str, timeout: int = ...) -> None: ... def wait_for_text(self, css_selector: str, text: str, timeout: int = ...) -> None: ...
def wait_for_value(self, css_selector: str, text: str, timeout: int = ...) -> None: ... def wait_for_value(self, css_selector: str, text: str, timeout: int = ...) -> None: ...
def wait_until_visible(self, css_selector: str, timeout: int = ...) -> None: ... def wait_until_visible(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_until_invisible(self, css_selector: str, timeout: int = ...) -> None: ... def wait_until_invisible(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_page_loaded(self) -> None: ... def wait_page_ready(self, timeout: int = ...) -> None: ...
@contextmanager
def wait_page_loaded(self, timeout: int = ...) -> Generator[None, None, None]: ...
def admin_login(self, username: str, password: str, login_url: str = ...) -> None: ... def admin_login(self, username: str, password: str, login_url: str = ...) -> None: ...
def get_css_value(self, selector: str, attribute: str) -> Any: ... def select_option(self, selector: str, value: Any) -> None: ...
def get_select_option(self, selector: str, value: Any) -> Any: ... def deselect_option(self, selector: str, value: Any) -> None: ...
def assertSelectOptions(self, selector: str, values: Any) -> None: ... def assertSelectOptions(self, selector: str, values: Any) -> None: ...
def assertSelectedOptions(self, selector: str, values: Any) -> None: ... def assertSelectedOptions(self, selector: str, values: Any) -> None: ...
def has_css_class(self, selector: str, klass: str) -> bool: ... def has_css_class(self, selector: str, klass: str) -> bool: ...

View File

@@ -1,34 +1,40 @@
import collections import datetime
from datetime import datetime import sys
from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Type, Union from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Set, Tuple, Type, Union, overload
from uuid import UUID from uuid import UUID
from django.contrib.admin.options import BaseModelAdmin from django.contrib.admin.options import BaseModelAdmin
from django.contrib.admin.sites import AdminSite from django.contrib.admin.sites import AdminSite
from django.contrib.auth.forms import AdminPasswordChangeForm from django.contrib.auth.forms import AdminPasswordChangeForm
from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.deletion import Collector from django.db.models.deletion import Collector
from django.db.models.fields import Field, reverse_related from django.db.models.fields import Field, reverse_related
from django.db.models.fields.reverse_related import ManyToOneRel
from django.db.models.options import Options from django.db.models.options import Options
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.forms.forms import BaseForm from django.forms.forms import BaseForm
from django.forms.formsets import BaseFormSet
from django.http.request import HttpRequest
from django.utils.datastructures import _IndexableCollection
if sys.version_info < (3, 8):
from typing_extensions import Literal
else:
from typing import Literal
class FieldIsAForeignKeyColumnName(Exception): ... class FieldIsAForeignKeyColumnName(Exception): ...
def lookup_needs_distinct(opts: Options, lookup_path: str) -> bool: ... def lookup_needs_distinct(opts: Options, lookup_path: str) -> bool: ...
def prepare_lookup_value(key: str, value: Union[datetime, str]) -> Union[bool, datetime, str]: ... def prepare_lookup_value(key: str, value: Union[datetime.datetime, str]) -> Union[bool, datetime.datetime, str]: ...
def quote(s: Union[int, str, UUID]) -> str: ... def quote(s: Union[int, str, UUID]) -> str: ...
def unquote(s: str) -> str: ... def unquote(s: str) -> str: ...
def flatten(fields: Any) -> List[Union[Callable, str]]: ... def flatten(fields: Any) -> List[Union[Callable, str]]: ...
def flatten_fieldsets(fieldsets: Any) -> List[Union[Callable, str]]: ... def flatten_fieldsets(fieldsets: Any) -> List[Union[Callable, str]]: ...
def get_deleted_objects( def get_deleted_objects(
objs: Sequence[Optional[Model]], request: WSGIRequest, admin_site: AdminSite objs: Union[Sequence[Optional[Model]], QuerySet[Model]], request: HttpRequest, admin_site: AdminSite
) -> Tuple[List[Any], Dict[Any, Any], Set[Any], List[Any]]: ... ) -> Tuple[List[Model], Dict[str, int], Set[str], List[str]]: ...
class NestedObjects(Collector): class NestedObjects(Collector):
data: collections.OrderedDict data: Dict[str, Any]
dependencies: Dict[Any, Any] dependencies: Dict[Any, Any]
fast_deletes: List[Any] fast_deletes: List[Any]
field_updates: Dict[Any, Any] field_updates: Dict[Any, Any]
@@ -38,21 +44,33 @@ class NestedObjects(Collector):
model_objs: Any = ... model_objs: Any = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def add_edge(self, source: Optional[Model], target: Model) -> None: ... def add_edge(self, source: Optional[Model], target: Model) -> None: ...
def related_objects(self, related: ManyToOneRel, objs: Sequence[Optional[Model]]) -> QuerySet: ... def related_objects(
self, related_model: Type[Model], related_fields: Iterable[Field], objs: _IndexableCollection[Model]
) -> QuerySet[Model]: ...
def nested(self, format_callback: Callable = ...) -> List[Any]: ... def nested(self, format_callback: Callable = ...) -> List[Any]: ...
def can_fast_delete(self, *args: Any, **kwargs: Any) -> bool: ...
def model_format_dict(obj: Any): ... def model_format_dict(obj: Union[Model, Type[Model], QuerySet, Options[Model]]): ...
def model_ngettext(obj: Union[Options, QuerySet], n: Optional[int] = ...) -> str: ... def model_ngettext(obj: Union[Options, QuerySet], n: Optional[int] = ...) -> str: ...
def lookup_field( def lookup_field(
name: Union[Callable, str], obj: Model, model_admin: BaseModelAdmin = ... name: Union[Callable, str], obj: Model, model_admin: Optional[BaseModelAdmin] = ...
) -> Tuple[Optional[Field], Any, Any]: ... ) -> Tuple[Optional[Field], Optional[str], Any]: ...
@overload
def label_for_field( # type: ignore
name: Union[Callable, str],
model: Type[Model],
model_admin: Optional[BaseModelAdmin] = ...,
return_attr: Literal[True] = ...,
form: Optional[BaseForm] = ...,
) -> Tuple[str, Union[Callable, str, None]]: ...
@overload
def label_for_field( def label_for_field(
name: Union[Callable, str], name: Union[Callable, str],
model: Type[Model], model: Type[Model],
model_admin: Optional[BaseModelAdmin] = ..., model_admin: Optional[BaseModelAdmin] = ...,
return_attr: bool = ..., return_attr: Literal[False] = ...,
form: Optional[BaseForm] = ..., form: Optional[BaseForm] = ...,
) -> Union[Tuple[Optional[str], Union[Callable, Type[str]]], str]: ... ) -> str: ...
def help_text_for_field(name: str, model: Type[Model]) -> str: ... def help_text_for_field(name: str, model: Type[Model]) -> str: ...
def display_for_field(value: Any, field: Field, empty_value_display: str) -> str: ... def display_for_field(value: Any, field: Field, empty_value_display: str) -> str: ...
def display_for_value(value: Any, empty_value_display: str, boolean: bool = ...) -> str: ... def display_for_value(value: Any, empty_value_display: str, boolean: bool = ...) -> str: ...
@@ -63,5 +81,5 @@ def get_model_from_relation(field: Union[Field, reverse_related.ForeignObjectRel
def reverse_field_path(model: Type[Model], path: str) -> Tuple[Type[Model], str]: ... def reverse_field_path(model: Type[Model], path: str) -> Tuple[Type[Model], str]: ...
def get_fields_from_path(model: Type[Model], path: str) -> List[Field]: ... def get_fields_from_path(model: Type[Model], path: str) -> List[Field]: ...
def construct_change_message( def construct_change_message(
form: AdminPasswordChangeForm, formsets: None, add: bool form: AdminPasswordChangeForm, formsets: Iterable[BaseFormSet], add: bool
) -> List[Dict[str, Dict[str, List[str]]]]: ... ) -> List[Dict[str, Dict[str, List[str]]]]: ...

View File

@@ -1,10 +1,11 @@
from typing import Any from typing import Any, Optional
from django.contrib.admin.options import ModelAdmin from django.contrib.admin.options import ModelAdmin
from django.core.handlers.wsgi import WSGIRequest from django.db.models import Model
from django.http.request import HttpRequest
from django.views.generic.list import BaseListView from django.views.generic.list import BaseListView
class AutocompleteJsonView(BaseListView): class AutocompleteJsonView(BaseListView):
model_admin: ModelAdmin = ... model_admin: ModelAdmin = ...
term: Any = ... term: Any = ...
def has_perm(self, request: WSGIRequest, obj: None = ...) -> bool: ... def has_perm(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ...

View File

@@ -1,16 +1,21 @@
from collections import OrderedDict import sys
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Tuple, Type, Union
from django.contrib.admin.filters import ListFilter, SimpleListFilter from django.contrib.admin.filters import ListFilter
from django.contrib.admin.options import IS_POPUP_VAR as IS_POPUP_VAR # noqa: F401 from django.contrib.admin.options import IS_POPUP_VAR as IS_POPUP_VAR # noqa: F401
from django.contrib.admin.options import TO_FIELD_VAR as TO_FIELD_VAR from django.contrib.admin.options import TO_FIELD_VAR as TO_FIELD_VAR
from django.contrib.admin.options import ModelAdmin from django.contrib.admin.options import ModelAdmin, _DisplayT, _ListFilterT
from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.expressions import Combinable, CombinedExpression, OrderBy from django.db.models.expressions import Expression
from django.db.models.options import Options from django.db.models.options import Options
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.forms.formsets import BaseFormSet from django.forms.formsets import BaseFormSet
from django.http.request import HttpRequest
if sys.version_info < (3, 8):
from typing_extensions import Literal
else:
from typing import Literal
ALL_VAR: str ALL_VAR: str
ORDER_VAR: str ORDER_VAR: str
@@ -18,69 +23,75 @@ ORDER_TYPE_VAR: str
PAGE_VAR: str PAGE_VAR: str
SEARCH_VAR: str SEARCH_VAR: str
ERROR_FLAG: str ERROR_FLAG: str
IGNORED_PARAMS: Any IGNORED_PARAMS: Tuple[str, ...]
class ChangeList: class ChangeList:
model: Type[Model] = ... model: Type[Model] = ...
opts: Options = ... opts: Options = ...
lookup_opts: Options = ... lookup_opts: Options = ...
root_queryset: QuerySet = ... root_queryset: QuerySet = ...
list_display: List[str] = ... list_display: _DisplayT = ...
list_display_links: List[str] = ... list_display_links: _DisplayT = ...
list_filter: Tuple = ... list_filter: Sequence[_ListFilterT] = ...
date_hierarchy: None = ... date_hierarchy: Any = ...
search_fields: Tuple = ... search_fields: Sequence[str] = ...
list_select_related: bool = ... list_select_related: Union[bool, Sequence[str]] = ...
list_per_page: int = ... list_per_page: int = ...
list_max_show_all: int = ... list_max_show_all: int = ...
model_admin: ModelAdmin = ... model_admin: ModelAdmin = ...
preserved_filters: str = ... preserved_filters: str = ...
sortable_by: Tuple[str] = ... sortable_by: Optional[Sequence[str]] = ...
page_num: int = ... page_num: int = ...
show_all: bool = ... show_all: bool = ...
is_popup: bool = ... is_popup: bool = ...
to_field: None = ... to_field: Any = ...
params: Dict[Any, Any] = ... params: Dict[str, Any] = ...
list_editable: Tuple = ... list_editable: Sequence[str] = ...
query: str = ... query: str = ...
queryset: Any = ... queryset: Any = ...
title: Any = ... title: str = ...
pk_attname: Any = ... pk_attname: str = ...
formset: Optional[BaseFormSet] formset: Optional[BaseFormSet]
def __init__( def __init__(
self, self,
request: WSGIRequest, request: HttpRequest,
model: Type[Model], model: Type[Model],
list_display: Union[List[Union[Callable, str]], Tuple[str]], list_display: _DisplayT,
list_display_links: Optional[Union[List[Callable], List[str], Tuple[str]]], list_display_links: _DisplayT,
list_filter: Union[List[Type[SimpleListFilter]], List[str], Tuple], list_filter: Sequence[_ListFilterT],
date_hierarchy: Optional[str], date_hierarchy: Optional[str],
search_fields: Union[List[str], Tuple], search_fields: Sequence[str],
list_select_related: Union[Tuple, bool], list_select_related: Union[bool, Sequence[str]],
list_per_page: int, list_per_page: int,
list_max_show_all: int, list_max_show_all: int,
list_editable: Union[List[str], Tuple], list_editable: Sequence[str],
model_admin: ModelAdmin, model_admin: ModelAdmin,
sortable_by: Union[List[Callable], List[str], Tuple], sortable_by: Optional[Sequence[str]],
) -> None: ... ) -> None: ...
def get_filters_params(self, params: None = ...) -> Dict[str, str]: ... def get_filters_params(self, params: Optional[Dict[str, Any]] = ...) -> Dict[str, Any]: ...
def get_filters(self, request: WSGIRequest) -> Tuple[List[ListFilter], bool, Dict[str, Union[bool, str]], bool]: ... def get_filters(
self, request: HttpRequest
) -> Tuple[List[ListFilter], bool, Dict[str, Union[bool, str]], bool, bool]: ...
def get_query_string( def get_query_string(
self, new_params: Optional[Dict[str, None]] = ..., remove: Optional[List[str]] = ... self, new_params: Optional[Dict[str, Any]] = ..., remove: Optional[Iterable[str]] = ...
) -> str: ... ) -> str: ...
result_count: Any = ... result_count: int = ...
show_full_result_count: Any = ... show_full_result_count: bool = ...
show_admin_actions: Any = ... show_admin_actions: bool = ...
full_result_count: Any = ... full_result_count: Optional[int] = ...
result_list: Any = ... result_list: Any = ...
can_show_all: Any = ... can_show_all: bool = ...
multi_page: Any = ... multi_page: bool = ...
paginator: Any = ... paginator: Any = ...
def get_results(self, request: WSGIRequest) -> None: ... def get_results(self, request: HttpRequest) -> None: ...
def get_ordering_field(self, field_name: Union[Callable, str]) -> Optional[Union[CombinedExpression, str]]: ... def get_ordering_field(self, field_name: Union[Callable, str]) -> Optional[Union[Expression, str]]: ...
def get_ordering(self, request: WSGIRequest, queryset: QuerySet) -> List[Union[OrderBy, Combinable, str]]: ... def get_ordering(self, request: HttpRequest, queryset: QuerySet) -> List[Union[Expression, str]]: ...
def get_ordering_field_columns(self) -> OrderedDict: ... def get_ordering_field_columns(self) -> Dict[int, Literal["desc", "asc"]]: ...
def get_queryset(self, request: WSGIRequest) -> QuerySet: ... def get_queryset(self, request: HttpRequest) -> QuerySet: ...
filter_specs: List[ListFilter]
has_filters: bool
has_active_filters: bool
clear_all_filters_qs: str
def apply_select_related(self, qs: QuerySet) -> QuerySet: ... def apply_select_related(self, qs: QuerySet) -> QuerySet: ...
def has_related_field_in_list_display(self) -> bool: ... def has_related_field_in_list_display(self) -> bool: ...
def url_for_result(self, result: Model) -> str: ... def url_for_result(self, result: Model) -> str: ...

View File

@@ -1,28 +1,31 @@
from typing import Any, Dict, Optional, Tuple, Union from typing import Any, Dict, Iterable, List, Mapping, Optional, Sequence, Tuple, Union
from uuid import UUID
from django import forms from django import forms
from django.contrib.admin.sites import AdminSite from django.contrib.admin.sites import AdminSite
from django.db.models.fields.reverse_related import ForeignObjectRel, ManyToOneRel from django.core.files.base import File
from django.db.models.fields import _FieldChoices
from django.db.models.fields.reverse_related import ForeignObjectRel, ManyToManyRel, ManyToOneRel
from django.forms.models import ModelChoiceIterator from django.forms.models import ModelChoiceIterator
from django.forms.widgets import Media from django.forms.widgets import Media, _OptAttrs
class FilteredSelectMultiple(forms.SelectMultiple): class FilteredSelectMultiple(forms.SelectMultiple):
@property verbose_name: str = ...
def media(self) -> Media: ... is_stacked: bool = ...
verbose_name: Any = ... def __init__(
is_stacked: Any = ... self, verbose_name: str, is_stacked: bool, attrs: Optional[_OptAttrs] = ..., choices: _FieldChoices = ...
def __init__(self, verbose_name: str, is_stacked: bool, attrs: None = ..., choices: Tuple = ...) -> None: ... ) -> None: ...
class AdminDateWidget(forms.DateInput): class AdminDateWidget(forms.DateInput):
@property def __init__(self, attrs: Optional[_OptAttrs] = ..., format: Optional[str] = ...) -> None: ...
def media(self) -> Media: ...
class AdminTimeWidget(forms.TimeInput): class AdminTimeWidget(forms.TimeInput):
@property def __init__(self, attrs: Optional[_OptAttrs] = ..., format: Optional[str] = ...) -> None: ...
def media(self) -> Media: ...
class AdminSplitDateTime(forms.SplitDateTimeWidget):
template_name: str
def __init__(self, attrs: Optional[_OptAttrs] = ...) -> None: ...
def get_context(self, name: str, value: Any, attrs: Optional[_OptAttrs]) -> Dict[str, Any]: ...
class AdminSplitDateTime(forms.SplitDateTimeWidget): ...
class AdminRadioSelect(forms.RadioSelect): ... class AdminRadioSelect(forms.RadioSelect): ...
class AdminFileWidget(forms.ClearableFileInput): ... class AdminFileWidget(forms.ClearableFileInput): ...
@@ -31,18 +34,27 @@ def url_params_from_lookup_dict(lookups: Any) -> Dict[str, str]: ...
class ForeignKeyRawIdWidget(forms.TextInput): class ForeignKeyRawIdWidget(forms.TextInput):
rel: ManyToOneRel = ... rel: ManyToOneRel = ...
admin_site: AdminSite = ... admin_site: AdminSite = ...
db: None = ... db: Optional[str] = ...
def __init__(self, rel: ForeignObjectRel, admin_site: AdminSite, attrs: None = ..., using: None = ...) -> None: ... def __init__(
self, rel: ManyToOneRel, admin_site: AdminSite, attrs: Optional[_OptAttrs] = ..., using: Optional[str] = ...
) -> None: ...
def base_url_parameters(self) -> Dict[str, str]: ... def base_url_parameters(self) -> Dict[str, str]: ...
def get_context(self, name: str, value: Any, attrs: Optional[_OptAttrs]) -> Dict[str, Any]: ...
def url_parameters(self) -> Dict[str, str]: ... def url_parameters(self) -> Dict[str, str]: ...
def label_and_url_for_value(self, value: Union[int, str, UUID]) -> Tuple[str, str]: ... def label_and_url_for_value(self, value: Any) -> Tuple[str, str]: ...
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): ... class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
rel: ManyToManyRel = ... # type: ignore
def get_context(self, name: str, value: Any, attrs: Optional[_OptAttrs]) -> Dict[str, Any]: ...
def url_parameters(self) -> Dict[str, str]: ...
def label_and_url_for_value(self, value: Any) -> Tuple[str, str]: ...
def format_value(self, value: Any) -> Optional[str]: ...
def value_from_datadict(self, data: Mapping[str, Any], files: Mapping[str, Iterable[File]], name: str) -> Any: ...
class RelatedFieldWidgetWrapper(forms.Widget): class RelatedFieldWidgetWrapper(forms.Widget):
template_name: str = ... template_name: str = ...
choices: ModelChoiceIterator = ... choices: ModelChoiceIterator = ...
widget: forms.Widget = ... widget: forms.ChoiceWidget = ...
rel: ManyToOneRel = ... rel: ManyToOneRel = ...
can_add_related: bool = ... can_add_related: bool = ...
can_change_related: bool = ... can_change_related: bool = ...
@@ -51,8 +63,8 @@ class RelatedFieldWidgetWrapper(forms.Widget):
admin_site: AdminSite = ... admin_site: AdminSite = ...
def __init__( def __init__(
self, self,
widget: forms.Widget, widget: forms.ChoiceWidget,
rel: ForeignObjectRel, rel: ManyToOneRel,
admin_site: AdminSite, admin_site: AdminSite,
can_add_related: Optional[bool] = ..., can_add_related: Optional[bool] = ...,
can_change_related: bool = ..., can_change_related: bool = ...,
@@ -60,42 +72,66 @@ class RelatedFieldWidgetWrapper(forms.Widget):
can_view_related: bool = ..., can_view_related: bool = ...,
) -> None: ... ) -> None: ...
@property @property
def media(self) -> Media: ... def media(self) -> Media: ... # type: ignore
@property
def is_hidden(self) -> bool: ...
def get_related_url(self, info: Tuple[str, str], action: str, *args: Any) -> str: ... def get_related_url(self, info: Tuple[str, str], action: str, *args: Any) -> str: ...
def get_context(self, name: str, value: Any, attrs: Optional[_OptAttrs]) -> Dict[str, Any]: ...
def value_from_datadict(self, data: Mapping[str, Any], files: Mapping[str, Iterable[File]], name: str) -> Any: ...
def value_omitted_from_data(
self, data: Mapping[str, Any], files: Mapping[str, Iterable[File]], name: str
) -> bool: ...
def id_for_label(self, id_: str) -> str: ...
class AdminTextareaWidget(forms.Textarea): ... class AdminTextareaWidget(forms.Textarea):
class AdminTextInputWidget(forms.TextInput): ... def __init__(self, attrs: Optional[_OptAttrs] = ...) -> None: ...
class AdminEmailInputWidget(forms.EmailInput): ...
class AdminURLFieldWidget(forms.URLInput): ... class AdminTextInputWidget(forms.TextInput):
def __init__(self, attrs: Optional[_OptAttrs] = ...) -> None: ...
class AdminEmailInputWidget(forms.EmailInput):
def __init__(self, attrs: Optional[_OptAttrs] = ...) -> None: ...
class AdminURLFieldWidget(forms.URLInput):
template_name: str
def __init__(self, attrs: Optional[_OptAttrs] = ..., validator_class: Any = ...) -> None: ...
def get_context(self, name: str, value: Any, attrs: Optional[_OptAttrs]) -> Dict[str, Any]: ...
class AdminIntegerFieldWidget(forms.NumberInput): class AdminIntegerFieldWidget(forms.NumberInput):
def __init__(self, attrs: Optional[_OptAttrs] = ...) -> None: ...
class_name: str = ... class_name: str = ...
class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget): ... class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget):
class_name: str = ...
class AdminUUIDInputWidget(forms.TextInput): class AdminUUIDInputWidget(forms.TextInput):
def __init__(self, attrs: Optional[Dict[str, str]] = ...) -> None: ... def __init__(self, attrs: Optional[_OptAttrs] = ...) -> None: ...
SELECT2_TRANSLATIONS: Any SELECT2_TRANSLATIONS: Dict[str, str] = ...
class AutocompleteMixin: class AutocompleteMixin:
url_name: str = ... url_name: str = ...
rel: Any = ... field: Any = ...
admin_site: Any = ... admin_site: AdminSite = ...
db: Any = ... db: Optional[str] = ...
choices: Any = ... choices: Any = ...
attrs: Any = ... attrs: _OptAttrs = ...
def __init__( def __init__(
self, self,
rel: ForeignObjectRel, field: Any,
admin_site: AdminSite, admin_site: AdminSite,
attrs: Optional[Dict[str, str]] = ..., attrs: Optional[_OptAttrs] = ...,
choices: Tuple = ..., choices: Any = ...,
using: None = ..., using: Optional[str] = ...,
) -> None: ... ) -> None: ...
def get_url(self) -> str: ... def get_url(self) -> str: ...
@property @property
def media(self) -> Media: ... def media(self) -> Media: ...
def build_attrs(self, base_attrs: _OptAttrs, extra_attrs: Optional[_OptAttrs] = ...) -> Dict[str, Any]: ...
# typo in source: `attr` instead of `attrs`
def optgroups(
self, name: str, value: Sequence[str], attr: Optional[_OptAttrs] = ...
) -> List[Tuple[Optional[str], List[Dict[str, Any]], Optional[int]]]: ...
class AutocompleteSelect(AutocompleteMixin, forms.Select): ... class AutocompleteSelect(AutocompleteMixin, forms.Select): ... # type: ignore
class AutocompleteSelectMultiple(AutocompleteMixin, forms.SelectMultiple): ... class AutocompleteSelectMultiple(AutocompleteMixin, forms.SelectMultiple): ... # type: ignore

View File

@@ -1,10 +1,14 @@
from typing import Any, Callable, Dict, Optional, Tuple from typing import Any, Callable, Dict, Optional, Tuple
from django.core.handlers.wsgi import WSGIRequest from django.http.request import HttpRequest
from django.http.response import HttpResponse from django.http.response import HttpResponse, HttpResponseBase
from django.utils.deprecation import MiddlewareMixin from django.utils.deprecation import MiddlewareMixin
class XViewMiddleware(MiddlewareMixin): class XViewMiddleware(MiddlewareMixin):
def process_view( def process_view(
self, request: WSGIRequest, view_func: Callable, view_args: Tuple, view_kwargs: Dict[Any, Any] self,
request: HttpRequest,
view_func: Callable[..., HttpResponseBase],
view_args: Tuple,
view_kwargs: Dict[Any, Any],
) -> Optional[HttpResponse]: ... ) -> Optional[HttpResponse]: ...

View File

@@ -1,19 +1,18 @@
from typing import Any, Callable, Optional from typing import Any, Callable, Dict, Optional, Tuple
docutils_is_available: bool docutils_is_available: bool
def get_view_name(view_func: Callable) -> str: ... def get_view_name(view_func: Callable) -> str: ...
def trim_docstring(docstring: Any): ... def parse_docstring(docstring: str) -> Tuple[str, str, Dict[str, str]]: ...
def parse_docstring(docstring: Any): ... def parse_rst(text: str, default_reference_context: Any, thing_being_parsed: Optional[Any] = ...): ...
def parse_rst(text: Any, default_reference_context: Any, thing_being_parsed: Optional[Any] = ...): ...
ROLES: Any ROLES: Dict[str, str]
def create_reference_role(rolename: Any, urlbase: Any): ... def create_reference_role(rolename: str, urlbase: str) -> None: ...
def default_reference_role( def default_reference_role(
name: Any, name: str,
rawtext: Any, rawtext: str,
text: Any, text: str,
lineno: Any, lineno: Any,
inliner: Any, inliner: Any,
options: Optional[Any] = ..., options: Optional[Any] = ...,

View File

@@ -3,8 +3,6 @@ from typing import Any, List, Optional, Type, Union
from django.contrib.auth.backends import ModelBackend from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model
from django.db.models.options import Options from django.db.models.options import Options
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.test.client import Client from django.test.client import Client
@@ -20,12 +18,12 @@ REDIRECT_FIELD_NAME: str
def load_backend(path: str) -> ModelBackend: ... def load_backend(path: str) -> ModelBackend: ...
def get_backends() -> List[ModelBackend]: ... def get_backends() -> List[ModelBackend]: ...
def authenticate(request: Any = ..., **credentials: Any) -> Optional[AbstractBaseUser]: ... def authenticate(request: Optional[HttpRequest] = ..., **credentials: Any) -> Optional[AbstractBaseUser]: ...
def login( def login(
request: HttpRequest, user: Optional[AbstractBaseUser], backend: Optional[Union[Type[ModelBackend], str]] = ... request: HttpRequest, user: Optional[AbstractBaseUser], backend: Optional[Union[Type[ModelBackend], str]] = ...
) -> None: ... ) -> None: ...
def logout(request: HttpRequest) -> None: ... def logout(request: HttpRequest) -> None: ...
def get_user_model() -> Type[Model]: ... def get_user_model() -> Type[AbstractBaseUser]: ...
def get_user(request: Union[HttpRequest, Client]) -> Union[AbstractBaseUser, AnonymousUser]: ... def get_user(request: Union[HttpRequest, Client]) -> Union[AbstractBaseUser, AnonymousUser]: ...
def get_permission_codename(action: str, opts: Options) -> str: ... def get_permission_codename(action: str, opts: Options) -> str: ...
def update_session_auth_hash(request: HttpRequest, user: AbstractBaseUser) -> None: ... def update_session_auth_hash(request: HttpRequest, user: AbstractBaseUser) -> None: ...

View File

@@ -1,7 +1,7 @@
from typing import Any from typing import Any
from django.contrib import admin from django.contrib import admin
from django.core.handlers.wsgi import WSGIRequest from django.http.request import HttpRequest
from django.http.response import HttpResponse from django.http.response import HttpResponse
csrf_protect_m: Any csrf_protect_m: Any
@@ -14,4 +14,4 @@ class UserAdmin(admin.ModelAdmin):
add_fieldsets: Any = ... add_fieldsets: Any = ...
add_form: Any = ... add_form: Any = ...
change_password_form: Any = ... change_password_form: Any = ...
def user_change_password(self, request: WSGIRequest, id: str, form_url: str = ...) -> HttpResponse: ... def user_change_password(self, request: HttpRequest, id: str, form_url: str = ...) -> HttpResponse: ...

View File

@@ -1,11 +1,11 @@
from typing import Any, Optional, Set, Union from typing import Any, Optional, Set, TypeVar, Union
from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import AnonymousUser, Permission, User from django.contrib.auth.models import AnonymousUser, Permission
from django.db.models.base import Model from django.db.models.base import Model
from django.http.request import HttpRequest from django.http.request import HttpRequest
_AnyUser = Union[Model, AnonymousUser] _AnyUser = Union[AbstractBaseUser, AnonymousUser]
UserModel: Any UserModel: Any
@@ -18,6 +18,13 @@ class BaseBackend:
def has_perm(self, user_obj: _AnyUser, perm: str, obj: Optional[Model] = ...) -> bool: ... def has_perm(self, user_obj: _AnyUser, perm: str, obj: Optional[Model] = ...) -> bool: ...
class ModelBackend(BaseBackend): class ModelBackend(BaseBackend):
def authenticate(
self,
request: Optional[HttpRequest],
username: Optional[str] = ...,
password: Optional[str] = ...,
**kwargs: Any
) -> Optional[AbstractBaseUser]: ...
def has_module_perms(self, user_obj: _AnyUser, app_label: str) -> bool: ... def has_module_perms(self, user_obj: _AnyUser, app_label: str) -> bool: ...
def user_can_authenticate(self, user: Optional[_AnyUser]) -> bool: ... def user_can_authenticate(self, user: Optional[_AnyUser]) -> bool: ...
def with_perm( def with_perm(
@@ -30,9 +37,11 @@ class ModelBackend(BaseBackend):
class AllowAllUsersModelBackend(ModelBackend): ... class AllowAllUsersModelBackend(ModelBackend): ...
_U = TypeVar("_U", bound=AbstractBaseUser)
class RemoteUserBackend(ModelBackend): class RemoteUserBackend(ModelBackend):
create_unknown_user: bool = ... create_unknown_user: bool = ...
def clean_username(self, username: str) -> str: ... def clean_username(self, username: str) -> str: ...
def configure_user(self, request: HttpRequest, user: User) -> User: ... def configure_user(self, request: HttpRequest, user: _U) -> _U: ...
class AllowAllUsersRemoteUserBackend(RemoteUserBackend): ... class AllowAllUsersRemoteUserBackend(RemoteUserBackend): ...

View File

@@ -1,7 +1,9 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage from django.core.checks.messages import CheckMessage
def check_user_model(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ... def check_user_model(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> Sequence[CheckMessage]: ...
def check_models_permissions(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ... def check_models_permissions(
app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any
) -> Sequence[CheckMessage]: ...

View File

@@ -1,4 +1,4 @@
from typing import Callable, List, Optional, Set, TypeVar, Union, overload from typing import Callable, Iterable, Optional, TypeVar, Union, overload
from django.contrib.auth import REDIRECT_FIELD_NAME as REDIRECT_FIELD_NAME # noqa: F401 from django.contrib.auth import REDIRECT_FIELD_NAME as REDIRECT_FIELD_NAME # noqa: F401
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
@@ -16,5 +16,5 @@ def login_required(redirect_field_name: str = ..., login_url: Optional[str] = ..
@overload @overload
def login_required(function: _VIEW, redirect_field_name: str = ..., login_url: Optional[str] = ...) -> _VIEW: ... def login_required(function: _VIEW, redirect_field_name: str = ..., login_url: Optional[str] = ...) -> _VIEW: ...
def permission_required( def permission_required(
perm: Union[List[str], Set[str], str], login_url: None = ..., raise_exception: bool = ... perm: Union[Iterable[str], str], login_url: Optional[str] = ..., raise_exception: bool = ...
) -> Callable[[_VIEW], _VIEW]: ... ) -> Callable[[_VIEW], _VIEW]: ...

View File

@@ -1,49 +1,58 @@
from typing import Any, Dict, Iterable, Optional from typing import Any, Dict, Iterable, List, Optional, Type, TypeVar, Union
from django import forms from django import forms
from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import User
from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.handlers.wsgi import WSGIRequest from django.db import models
from django.db.models.fields import _ErrorMessagesT
from django.forms.fields import _ClassLevelWidgetT
from django.forms.widgets import Widget
from django.http.request import HttpRequest from django.http.request import HttpRequest
UserModel: Any UserModel: Type[AbstractBaseUser]
_User = TypeVar("_User", bound=AbstractBaseUser)
class ReadOnlyPasswordHashWidget(forms.Widget): class ReadOnlyPasswordHashWidget(forms.Widget):
template_name: str = ... template_name: str = ...
read_only: bool = ...
def get_context(self, name: str, value: Any, attrs: Optional[Dict[str, Any]]) -> Dict[str, Any]: ...
class ReadOnlyPasswordHashField(forms.Field): class ReadOnlyPasswordHashField(forms.Field):
widget: _ClassLevelWidgetT = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class UsernameField(forms.CharField): ... class UsernameField(forms.CharField):
def to_python(self, value: Optional[Any]) -> Optional[Any]: ...
def widget_attrs(self, widget: Widget) -> Dict[str, Any]: ...
class UserCreationForm(forms.ModelForm): class UserCreationForm(forms.ModelForm[_User]):
error_messages: Any = ... error_messages: _ErrorMessagesT = ...
password1: Any = ... password1: forms.Field = ...
password2: Any = ... password2: forms.Field = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def clean_password2(self) -> str: ... def clean_password2(self) -> str: ...
def save(self, commit: bool = ...) -> _User: ...
class UserChangeForm(forms.ModelForm): class UserChangeForm(forms.ModelForm[_User]):
password: Any = ... password: forms.Field = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def clean_password(self) -> str: ...
class AuthenticationForm(forms.Form): class AuthenticationForm(forms.Form):
username: Any = ... username: forms.Field = ...
password: Any = ... password: forms.Field = ...
error_messages: Any = ... error_messages: _ErrorMessagesT = ...
request: WSGIRequest = ... request: Optional[HttpRequest] = ...
user_cache: None = ... user_cache: Any = ...
username_field: Any = ... username_field: models.Field = ...
def __init__(self, request: Any = ..., *args: Any, **kwargs: Any) -> None: ... def __init__(self, request: Optional[HttpRequest] = ..., *args: Any, **kwargs: Any) -> None: ...
def confirm_login_allowed(self, user: AbstractBaseUser) -> None: ... def confirm_login_allowed(self, user: AbstractBaseUser) -> None: ...
def get_user(self) -> User: ... def get_user(self) -> AbstractBaseUser: ...
def get_invalid_login_error(self) -> ValidationError: ... def get_invalid_login_error(self) -> ValidationError: ...
def clean(self) -> Dict[str, Any]: ...
class PasswordResetForm(forms.Form): class PasswordResetForm(forms.Form):
email: Any = ... email: forms.Field = ...
def send_mail( def send_mail(
self, self,
subject_template_name: str, subject_template_name: str,
@@ -53,7 +62,7 @@ class PasswordResetForm(forms.Form):
to_email: str, to_email: str,
html_email_template_name: Optional[str] = ..., html_email_template_name: Optional[str] = ...,
) -> None: ... ) -> None: ...
def get_users(self, email: str) -> Iterable[Any]: ... def get_users(self, email: str) -> Iterable[AbstractBaseUser]: ...
def save( def save(
self, self,
domain_override: Optional[str] = ..., domain_override: Optional[str] = ...,
@@ -68,24 +77,27 @@ class PasswordResetForm(forms.Form):
) -> None: ... ) -> None: ...
class SetPasswordForm(forms.Form): class SetPasswordForm(forms.Form):
error_messages: Any = ... error_messages: _ErrorMessagesT = ...
new_password1: Any = ... new_password1: forms.Field = ...
new_password2: Any = ... new_password2: forms.Field = ...
user: User = ... user: AbstractBaseUser = ...
def __init__(self, user: Optional[AbstractBaseUser], *args: Any, **kwargs: Any) -> None: ... def __init__(self, user: AbstractBaseUser, *args: Any, **kwargs: Any) -> None: ...
def clean_new_password2(self) -> str: ... def clean_new_password2(self) -> str: ...
def save(self, commit: bool = ...) -> AbstractBaseUser: ... def save(self, commit: bool = ...) -> AbstractBaseUser: ...
class PasswordChangeForm(SetPasswordForm): class PasswordChangeForm(SetPasswordForm):
old_password: Any = ... error_messages: _ErrorMessagesT = ...
old_password: forms.Field = ...
def clean_old_password(self) -> str: ... def clean_old_password(self) -> str: ...
class AdminPasswordChangeForm(forms.Form): class AdminPasswordChangeForm(forms.Form):
error_messages: Any = ... error_messages: _ErrorMessagesT = ...
required_css_class: str = ... required_css_class: str = ...
password1: Any = ... password1: forms.Field = ...
password2: Any = ... password2: forms.Field = ...
user: User = ... user: AbstractBaseUser = ...
def __init__(self, user: AbstractBaseUser, *args: Any, **kwargs: Any) -> None: ... def __init__(self, user: AbstractBaseUser, *args: Any, **kwargs: Any) -> None: ...
def clean_password2(self) -> str: ... def clean_password2(self) -> str: ...
def save(self, commit: bool = ...) -> AbstractBaseUser: ... def save(self, commit: bool = ...) -> AbstractBaseUser: ...
@property
def changed_data(self) -> List[str]: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Dict, List, Optional, Union from typing import Any, Callable, Dict, List, Optional, Tuple, Union
UNUSABLE_PASSWORD_PREFIX: str UNUSABLE_PASSWORD_PREFIX: str
UNUSABLE_PASSWORD_SUFFIX_LENGTH: int UNUSABLE_PASSWORD_SUFFIX_LENGTH: int
@@ -19,7 +19,7 @@ def mask_hash(hash: str, show: int = ..., char: str = ...) -> str: ...
class BasePasswordHasher: class BasePasswordHasher:
algorithm: str = ... algorithm: str = ...
library: str = ... library: Union[str, Tuple[str, str]] = ...
rounds: int = ... rounds: int = ...
time_cost: int = ... time_cost: int = ...
memory_cost: int = ... memory_cost: int = ...

View File

@@ -12,4 +12,4 @@ def create_permissions(
**kwargs: Any **kwargs: Any
) -> None: ... ) -> None: ...
def get_system_username() -> str: ... def get_system_username() -> str: ...
def get_default_username(check_db: bool = ...) -> str: ... def get_default_username(check_db: bool = ..., database: str = ...) -> str: ...

View File

@@ -1,11 +1,11 @@
from typing import Union from typing import Union
from django.contrib.auth.models import AnonymousUser, User from django.contrib.auth.base_user import AbstractBaseUser
from django.core.handlers.wsgi import WSGIRequest from django.contrib.auth.models import AnonymousUser
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.utils.deprecation import MiddlewareMixin from django.utils.deprecation import MiddlewareMixin
def get_user(request: WSGIRequest) -> Union[AnonymousUser, User]: ... def get_user(request: HttpRequest) -> Union[AnonymousUser, AbstractBaseUser]: ...
class AuthenticationMiddleware(MiddlewareMixin): class AuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request: HttpRequest) -> None: ... def process_request(self, request: HttpRequest) -> None: ...

View File

@@ -1,7 +1,7 @@
from typing import Any, Callable, List, Optional from typing import Any, Callable, Optional, Sequence
from django import http from django import http
from django.http.response import HttpResponse, HttpResponseRedirect from django.http.response import HttpResponseBase, HttpResponseRedirect
class AccessMixin: class AccessMixin:
login_url: Any = ... login_url: Any = ...
@@ -14,15 +14,15 @@ class AccessMixin:
def handle_no_permission(self) -> HttpResponseRedirect: ... def handle_no_permission(self) -> HttpResponseRedirect: ...
class LoginRequiredMixin(AccessMixin): class LoginRequiredMixin(AccessMixin):
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
class PermissionRequiredMixin(AccessMixin): class PermissionRequiredMixin(AccessMixin):
permission_required: Any = ... permission_required: Any = ...
def get_permission_required(self) -> List[str]: ... def get_permission_required(self) -> Sequence[str]: ...
def has_permission(self) -> bool: ... def has_permission(self) -> bool: ...
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...
class UserPassesTestMixin(AccessMixin): class UserPassesTestMixin(AccessMixin):
def test_func(self) -> Optional[bool]: ... def test_func(self) -> Optional[bool]: ...
def get_test_func(self) -> Callable: ... def get_test_func(self) -> Callable: ...
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ...

View File

@@ -1,7 +1,6 @@
import sys import sys
from typing import Any, Collection, Optional, Set, Tuple, Type, TypeVar, Union from typing import Any, Iterable, Optional, Set, Tuple, Type, TypeVar, Union
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.base_user import AbstractBaseUser as AbstractBaseUser from django.contrib.auth.base_user import AbstractBaseUser as AbstractBaseUser
from django.contrib.auth.base_user import BaseUserManager as BaseUserManager from django.contrib.auth.base_user import BaseUserManager as BaseUserManager
from django.contrib.auth.validators import UnicodeUsernameValidator from django.contrib.auth.validators import UnicodeUsernameValidator
@@ -48,14 +47,14 @@ class UserManager(BaseUserManager[_T]):
self, username: str, email: Optional[str] = ..., password: Optional[str] = ..., **extra_fields: Any self, username: str, email: Optional[str] = ..., password: Optional[str] = ..., **extra_fields: Any
) -> _T: ... ) -> _T: ...
def create_superuser( def create_superuser(
self, username: str, email: Optional[str], password: Optional[str], **extra_fields: Any self, username: str, email: Optional[str] = ..., password: Optional[str] = ..., **extra_fields: Any
) -> _T: ... ) -> _T: ...
def with_perm( def with_perm(
self, self,
perm: Union[str, Permission], perm: Union[str, Permission],
is_active: bool = ..., is_active: bool = ...,
include_superusers: bool = ..., include_superusers: bool = ...,
backend: Optional[Union[Type[ModelBackend], str]] = ..., backend: Optional[str] = ...,
obj: Optional[Model] = ..., obj: Optional[Model] = ...,
): ... ): ...
@@ -67,7 +66,7 @@ class PermissionsMixin(models.Model):
def get_group_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def get_group_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ...
def get_all_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def get_all_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ...
def has_perm(self, perm: str, obj: Optional[_AnyUser] = ...) -> bool: ... def has_perm(self, perm: str, obj: Optional[_AnyUser] = ...) -> bool: ...
def has_perms(self, perm_list: Collection[str], obj: Optional[_AnyUser] = ...) -> bool: ... def has_perms(self, perm_list: Iterable[str], obj: Optional[_AnyUser] = ...) -> bool: ...
def has_module_perms(self, app_label: str) -> bool: ... def has_module_perms(self, app_label: str) -> bool: ...
class AbstractUser(AbstractBaseUser, PermissionsMixin): class AbstractUser(AbstractBaseUser, PermissionsMixin):
@@ -92,13 +91,13 @@ class User(AbstractUser): ...
class AnonymousUser: class AnonymousUser:
id: Any = ... id: Any = ...
pk: Any = ... pk: Any = ...
username: str = ... username: Literal[""] = ...
is_staff: bool = ... is_staff: Literal[False] = ...
is_active: bool = ... is_active: Literal[False] = ...
is_superuser: bool = ... is_superuser: Literal[False] = ...
def save(self) -> Any: ... def save(self) -> None: ...
def delete(self) -> Any: ... def delete(self) -> None: ...
def set_password(self, raw_password: str) -> Any: ... def set_password(self, raw_password: str) -> None: ...
def check_password(self, raw_password: str) -> Any: ... def check_password(self, raw_password: str) -> Any: ...
@property @property
def groups(self) -> EmptyManager: ... def groups(self) -> EmptyManager: ...
@@ -108,7 +107,7 @@ class AnonymousUser:
def get_group_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[Any]: ... def get_group_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[Any]: ...
def get_all_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def get_all_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ...
def has_perm(self, perm: str, obj: Optional[_AnyUser] = ...) -> bool: ... def has_perm(self, perm: str, obj: Optional[_AnyUser] = ...) -> bool: ...
def has_perms(self, perm_list: Collection[str], obj: Optional[_AnyUser] = ...) -> bool: ... def has_perms(self, perm_list: Iterable[str], obj: Optional[_AnyUser] = ...) -> bool: ...
def has_module_perms(self, module: str) -> bool: ... def has_module_perms(self, module: str) -> bool: ...
@property @property
def is_anonymous(self) -> Literal[True]: ... def is_anonymous(self) -> Literal[True]: ...

View File

@@ -6,7 +6,8 @@ from django.db.models.base import Model
_UserModel = Model _UserModel = Model
class PasswordValidator(Protocol): class PasswordValidator(Protocol):
def password_changed(self, password: str, user: Optional[_UserModel] = ...): ... def validate(self, __password: str, __user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...
def get_default_password_validators() -> List[PasswordValidator]: ... def get_default_password_validators() -> List[PasswordValidator]: ...
def get_password_validators(validator_config: Sequence[Mapping[str, Any]]) -> List[PasswordValidator]: ... def get_password_validators(validator_config: Sequence[Mapping[str, Any]]) -> List[PasswordValidator]: ...
@@ -37,7 +38,7 @@ class UserAttributeSimilarityValidator:
class CommonPasswordValidator: class CommonPasswordValidator:
DEFAULT_PASSWORD_LIST_PATH: Path = ... DEFAULT_PASSWORD_LIST_PATH: Path = ...
passwords: Set[str] = ... passwords: Set[str] = ...
def __init__(self, password_list_path: Union[PosixPath, str] = ...) -> None: ... def __init__(self, password_list_path: Union[Path, PosixPath, str] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ... def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ... def get_help_text(self) -> str: ...

View File

@@ -1,5 +1,5 @@
from datetime import date from datetime import date, datetime
from typing import Any, Optional from typing import Any, Optional, Union
from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.base_user import AbstractBaseUser
@@ -9,9 +9,9 @@ class PasswordResetTokenGenerator:
algorithm: str = ... algorithm: str = ...
def make_token(self, user: AbstractBaseUser) -> str: ... def make_token(self, user: AbstractBaseUser) -> str: ...
def check_token(self, user: Optional[AbstractBaseUser], token: Optional[str]) -> bool: ... def check_token(self, user: Optional[AbstractBaseUser], token: Optional[str]) -> bool: ...
def _make_token_with_timestamp(self, user: AbstractBaseUser, timestamp: int) -> str: ... def _make_token_with_timestamp(self, user: AbstractBaseUser, timestamp: int, legacy: bool = ...) -> str: ...
def _make_hash_value(self, user: AbstractBaseUser, timestamp: int) -> str: ... def _make_hash_value(self, user: AbstractBaseUser, timestamp: int) -> str: ...
def _num_days(self, dt: date) -> float: ... def _num_seconds(self, dt: Union[datetime, date]) -> int: ...
def _today(self) -> date: ... def _now(self) -> datetime: ...
default_token_generator: Any default_token_generator: Any

View File

@@ -2,10 +2,8 @@ from typing import Any, Optional, Set
from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.http.response import HttpResponseRedirect from django.http.response import HttpResponse, HttpResponseRedirect
from django.template.response import TemplateResponse
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
@@ -23,10 +21,11 @@ class LoginView(SuccessURLAllowedHostsMixin, FormView[AuthenticationForm]):
def get_redirect_url(self) -> str: ... def get_redirect_url(self) -> str: ...
class LogoutView(SuccessURLAllowedHostsMixin, TemplateView): class LogoutView(SuccessURLAllowedHostsMixin, TemplateView):
next_page: Any = ... next_page: Optional[str] = ...
redirect_field_name: Any = ... redirect_field_name: str = ...
extra_context: Any = ... extra_context: Any = ...
def post(self, request: WSGIRequest, *args: Any, **kwargs: Any) -> TemplateResponse: ... def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_next_page(self) -> Optional[str]: ... def get_next_page(self) -> Optional[str]: ...
def logout_then_login(request: HttpRequest, login_url: Optional[str] = ...) -> HttpResponseRedirect: ... def logout_then_login(request: HttpRequest, login_url: Optional[str] = ...) -> HttpResponseRedirect: ...

View File

@@ -1,9 +1,10 @@
from typing import Any, List, Type from typing import Any, List, Type
from django.contrib.admin.checks import InlineModelAdminChecks
from django.contrib.admin.options import InlineModelAdmin from django.contrib.admin.options import InlineModelAdmin
from django.db.models.base import Model from django.db.models.base import Model
class GenericInlineModelAdminChecks: class GenericInlineModelAdminChecks(InlineModelAdminChecks):
def _check_exclude_of_parent_model(self, obj: GenericInlineModelAdmin, parent_model: Type[Model]) -> List[Any]: ... def _check_exclude_of_parent_model(self, obj: GenericInlineModelAdmin, parent_model: Type[Model]) -> List[Any]: ...
def _check_relation(self, obj: GenericInlineModelAdmin, parent_model: Type[Model]) -> List[Any]: ... def _check_relation(self, obj: GenericInlineModelAdmin, parent_model: Type[Model]) -> List[Any]: ...

View File

@@ -1,9 +1,11 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage from django.core.checks.messages import CheckMessage
def check_generic_foreign_keys( def check_generic_foreign_keys(
app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any
) -> List[CheckMessage]: ... ) -> Sequence[CheckMessage]: ...
def check_model_name_lengths(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ... def check_model_name_lengths(
app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any
) -> Sequence[CheckMessage]: ...

View File

@@ -4,7 +4,7 @@ from django.contrib.contenttypes.models import ContentType
from django.core.checks.messages import CheckMessage from django.core.checks.messages import CheckMessage
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.expressions import Combinable from django.db.models.expressions import Combinable
from django.db.models.fields import Field, PositiveIntegerField from django.db.models.fields import Field
from django.db.models.fields.mixins import FieldCacheMixin from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.fields.related import ForeignObject from django.db.models.fields.related import ForeignObject
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor
@@ -48,7 +48,7 @@ class GenericForeignKey(FieldCacheMixin):
def get_prefetch_queryset( def get_prefetch_queryset(
self, instances: Union[List[Model], QuerySet], queryset: Optional[QuerySet] = ... self, instances: Union[List[Model], QuerySet], queryset: Optional[QuerySet] = ...
) -> Tuple[List[Model], Callable, Callable, bool, str, bool]: ... ) -> Tuple[List[Model], Callable, Callable, bool, str, bool]: ...
def __get__(self, instance: Optional[Model], cls: Type[Model] = ...) -> Optional[Any]: ... def __get__(self, instance: Optional[Model], cls: Optional[Type[Model]] = ...) -> Optional[Any]: ...
def __set__(self, instance: Model, value: Optional[Any]) -> None: ... def __set__(self, instance: Model, value: Optional[Any]) -> None: ...
class GenericRel(ForeignObjectRel): class GenericRel(ForeignObjectRel):
@@ -65,9 +65,9 @@ class GenericRel(ForeignObjectRel):
class GenericRelation(ForeignObject): class GenericRelation(ForeignObject):
rel_class: Any = ... rel_class: Any = ...
mti_inherited: bool = ... mti_inherited: bool = ...
object_id_field_name: Any = ... object_id_field_name: str = ...
content_type_field_name: Any = ... content_type_field_name: str = ...
for_concrete_model: Any = ... for_concrete_model: bool = ...
to_fields: Any = ... to_fields: Any = ...
def __init__( def __init__(
self, self,
@@ -79,9 +79,9 @@ class GenericRelation(ForeignObject):
limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any]]] = ..., limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any]]] = ...,
**kwargs: Any **kwargs: Any
) -> None: ... ) -> None: ...
def resolve_related_fields(self) -> List[Tuple[PositiveIntegerField, Field]]: ... def resolve_related_fields(self) -> List[Tuple[Field, Field]]: ...
def get_path_info(self, filtered_relation: Optional[FilteredRelation] = ...) -> List[PathInfo]: ... def get_path_info(self, filtered_relation: Optional[FilteredRelation] = ...) -> List[PathInfo]: ...
def get_reverse_path_info(self, filtered_relation: None = ...) -> List[PathInfo]: ... def get_reverse_path_info(self, filtered_relation: Optional[FilteredRelation] = ...) -> List[PathInfo]: ...
def get_content_type(self) -> ContentType: ... def get_content_type(self) -> ContentType: ...
def get_extra_restriction( def get_extra_restriction(
self, where_class: Type[WhereNode], alias: Optional[str], remote_alias: str self, where_class: Type[WhereNode], alias: Optional[str], remote_alias: str

View File

@@ -38,4 +38,6 @@ def generic_inlineformset_factory(
for_concrete_model: bool = ..., for_concrete_model: bool = ...,
min_num: Optional[Any] = ..., min_num: Optional[Any] = ...,
validate_min: bool = ..., validate_min: bool = ...,
absolute_max: Optional[int] = ...,
can_delete_extra: bool = ...,
): ... ): ...

View File

@@ -1,6 +1,6 @@
from django.core.handlers.wsgi import WSGIRequest from django.http.request import HttpRequest
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin from django.utils.deprecation import MiddlewareMixin
class FlatpageFallbackMiddleware(MiddlewareMixin): class FlatpageFallbackMiddleware(MiddlewareMixin):
def process_response(self, request: WSGIRequest, response: HttpResponse) -> HttpResponse: ... def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...

View File

@@ -1,8 +1,8 @@
from django.contrib.flatpages.models import FlatPage from django.contrib.flatpages.models import FlatPage
from django.core.handlers.wsgi import WSGIRequest from django.http.request import HttpRequest
from django.http.response import HttpResponse from django.http.response import HttpResponse
DEFAULT_TEMPLATE: str DEFAULT_TEMPLATE: str
def flatpage(request: WSGIRequest, url: str) -> HttpResponse: ... def flatpage(request: HttpRequest, url: str) -> HttpResponse: ...
def render_flatpage(request: WSGIRequest, f: FlatPage) -> HttpResponse: ... def render_flatpage(request: HttpRequest, f: FlatPage) -> HttpResponse: ...

View File

@@ -1,4 +1,4 @@
from typing import Any from typing import Any, Union
from django.contrib.admin import ModelAdmin as ModelAdmin from django.contrib.admin import ModelAdmin as ModelAdmin
@@ -14,9 +14,9 @@ class GeoModelAdmin(ModelAdmin):
num_zoom: int = ... num_zoom: int = ...
max_zoom: bool = ... max_zoom: bool = ...
min_zoom: bool = ... min_zoom: bool = ...
units: bool = ... units: Union[str, bool] = ...
max_resolution: bool = ... max_resolution: Union[str, bool] = ...
max_extent: bool = ... max_extent: Union[str, bool] = ...
modifiable: bool = ... modifiable: bool = ...
mouse_position: bool = ... mouse_position: bool = ...
scale_text: bool = ... scale_text: bool = ...
@@ -43,4 +43,7 @@ class OSMGeoAdmin(GeoModelAdmin):
map_template: str = ... map_template: str = ...
num_zoom: int = ... num_zoom: int = ...
map_srid: Any = ... map_srid: Any = ...
point_zoom: Any = ... max_extent: str = ...
max_resolution: str = ...
point_zoom: int = ...
units: str = ...

View File

@@ -1,4 +1,4 @@
from typing import Any from typing import Any, Set
class BaseSpatialOperations: class BaseSpatialOperations:
postgis: bool = ... postgis: bool = ...
@@ -7,27 +7,28 @@ class BaseSpatialOperations:
oracle: bool = ... oracle: bool = ...
spatial_version: Any = ... spatial_version: Any = ...
select: str = ... select: str = ...
def select_extent(self): ... @property
def select_extent(self) -> str: ...
geography: bool = ... geography: bool = ...
geometry: bool = ... geometry: bool = ...
disallowed_aggregates: Any = ... disallowed_aggregates: Any = ...
geom_func_prefix: str = ... geom_func_prefix: str = ...
function_names: Any = ... function_names: Any = ...
unsupported_functions: Any = ... unsupported_functions: Set[str] = ...
from_text: bool = ... from_text: bool = ...
def convert_extent(self, box: Any, srid: Any) -> None: ... def convert_extent(self, box: Any, srid: Any) -> Any: ...
def convert_extent3d(self, box: Any, srid: Any) -> None: ... def convert_extent3d(self, box: Any, srid: Any) -> Any: ...
def geo_quote_name(self, name: Any): ... def geo_quote_name(self, name: Any): ...
def geo_db_type(self, f: Any) -> None: ... def geo_db_type(self, f: Any) -> Any: ...
def get_distance(self, f: Any, value: Any, lookup_type: Any) -> None: ... def get_distance(self, f: Any, value: Any, lookup_type: Any) -> Any: ...
def get_geom_placeholder(self, f: Any, value: Any, compiler: Any): ... def get_geom_placeholder(self, f: Any, value: Any, compiler: Any): ...
def check_expression_support(self, expression: Any) -> None: ... def check_expression_support(self, expression: Any) -> None: ...
def spatial_aggregate_name(self, agg_name: Any) -> None: ... def spatial_aggregate_name(self, agg_name: Any) -> Any: ...
def spatial_function_name(self, func_name: Any): ... def spatial_function_name(self, func_name: Any): ...
def geometry_columns(self) -> None: ... def geometry_columns(self) -> Any: ...
def spatial_ref_sys(self) -> None: ... def spatial_ref_sys(self) -> Any: ...
distance_expr_for_lookup: Any = ... distance_expr_for_lookup: Any = ...
def get_db_converters(self, expression: Any): ... def get_db_converters(self, expression: Any): ...
def get_geometry_converter(self, expression: Any) -> None: ... def get_geometry_converter(self, expression: Any) -> Any: ...
def get_area_att_for_field(self, field: Any): ... def get_area_att_for_field(self, field: Any): ...
def get_distance_att_for_field(self, field: Any): ... def get_distance_att_for_field(self, field: Any): ...

View File

@@ -1,3 +1,5 @@
from typing import Any, Dict
from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures as BaseSpatialFeatures from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures as BaseSpatialFeatures
from django.db.backends.mysql.features import DatabaseFeatures as MySQLDatabaseFeatures from django.db.backends.mysql.features import DatabaseFeatures as MySQLDatabaseFeatures
@@ -10,5 +12,9 @@ class DatabaseFeatures(BaseSpatialFeatures, MySQLDatabaseFeatures):
supports_transform: bool = ... supports_transform: bool = ...
supports_null_geometries: bool = ... supports_null_geometries: bool = ...
supports_num_points_poly: bool = ... supports_num_points_poly: bool = ...
def supports_empty_geometry_collection(self): ... @property
def supports_geometry_field_unique_index(self): ... def empty_intersection_returns_none(self) -> bool: ...
@property
def supports_geometry_field_unique_index(self) -> bool: ... # type: ignore
@property
def django_test_skips(self) -> Dict[str, Any]: ... # type: ignore

View File

@@ -1,18 +1,27 @@
from typing import Any from typing import Any, Callable, Dict, List, Optional, Set, Type
from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations as BaseSpatialOperations from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations as BaseSpatialOperations
from django.contrib.gis.db.backends.utils import SpatialOperator
from django.contrib.gis.geos.geometry import GEOSGeometryBase
from django.db.backends.mysql.operations import DatabaseOperations as DatabaseOperations from django.db.backends.mysql.operations import DatabaseOperations as DatabaseOperations
class MySQLOperations(BaseSpatialOperations, DatabaseOperations): class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
mysql: bool = ...
name: str = ... name: str = ...
geom_func_prefix: str = ... geom_func_prefix: str = ...
Adapter: Any = ... Adapter: Any = ...
def select(self): ... @property
def from_text(self): ... def mariadb(self) -> bool: ...
def gis_operators(self): ... @property
def mysql(self) -> bool: ... # type: ignore
@property
def select(self) -> str: ... # type: ignore
@property
def from_text(self) -> str: ... # type: ignore
@property
def gis_operators(self) -> Dict[str, SpatialOperator]: ...
disallowed_aggregates: Any = ... disallowed_aggregates: Any = ...
def unsupported_functions(self): ... @property
def geo_db_type(self, f: Any): ... def unsupported_functions(self) -> Set[str]: ... # type: ignore
def get_distance(self, f: Any, value: Any, lookup_type: Any): ... def geo_db_type(self, f: Any) -> Any: ...
def get_geometry_converter(self, expression: Any): ... def get_distance(self, f: Any, value: Any, lookup_type: Any) -> List[Any]: ...
def get_geometry_converter(self, expression: Any) -> Callable[[Any, Any, Any], Optional[GEOSGeometryBase]]: ...

View File

@@ -3,5 +3,6 @@ from typing import Any
from django.db.backends.oracle.introspection import DatabaseIntrospection as DatabaseIntrospection from django.db.backends.oracle.introspection import DatabaseIntrospection as DatabaseIntrospection
class OracleIntrospection(DatabaseIntrospection): class OracleIntrospection(DatabaseIntrospection):
@property
def data_types_reverse(self): ... def data_types_reverse(self): ...
def get_geometry_type(self, table_name: Any, description: Any): ... def get_geometry_type(self, table_name: Any, description: Any): ...

View File

@@ -1,22 +1,31 @@
from typing import Any import sys
from typing import Any, Union
from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations
from django.contrib.gis.db.backends.utils import SpatialOperator from django.contrib.gis.db.backends.utils import SpatialOperator
from django.db.backends.postgresql.operations import DatabaseOperations from django.db.backends.postgresql.operations import DatabaseOperations
from django.db.models import Func from django.db.models import Func
BILATERAL: str if sys.version_info < (3, 8):
from typing_extensions import Literal
else:
from typing import Literal
BILATERAL: Literal["bilateral"]
class PostGISOperator(SpatialOperator): class PostGISOperator(SpatialOperator):
geography: Any = ... geography: Any = ...
raster: Any = ... raster: Union[bool, Literal["bilateral"]] = ...
def __init__(self, geography: bool = ..., raster: bool = ..., **kwargs: Any) -> None: ... def __init__(
self, geography: bool = ..., raster: Union[bool, Literal["bilateral"]] = ..., **kwargs: Any
) -> None: ...
def as_sql(self, connection: Any, lookup: Any, template_params: Any, *args: Any): ... def as_sql(self, connection: Any, lookup: Any, template_params: Any, *args: Any): ...
def check_raster(self, lookup: Any, template_params: Any): ... def check_raster(self, lookup: Any, template_params: Any): ...
class ST_Polygon(Func): class ST_Polygon(Func):
function: str = ... function: str = ...
def __init__(self, expr: Any) -> None: ... def __init__(self, expr: Any) -> None: ...
@property
def output_field(self): ... def output_field(self): ...
class PostGISOperations(BaseSpatialOperations, DatabaseOperations): class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
@@ -36,7 +45,9 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
unsupported_functions: Any = ... unsupported_functions: Any = ...
select: str = ... select: str = ...
select_extent: Any = ... select_extent: Any = ...
@property
def function_names(self): ... def function_names(self): ...
@property
def spatial_version(self): ... def spatial_version(self): ...
def geo_db_type(self, f: Any): ... def geo_db_type(self, f: Any): ...
def get_distance(self, f: Any, dist_val: Any, lookup_type: Any): ... def get_distance(self, f: Any, dist_val: Any, lookup_type: Any): ...

View File

@@ -3,4 +3,5 @@ from django.db.backends.sqlite3.features import DatabaseFeatures as SQLiteDataba
class DatabaseFeatures(BaseSpatialFeatures, SQLiteDatabaseFeatures): class DatabaseFeatures(BaseSpatialFeatures, SQLiteDatabaseFeatures):
supports_3d_storage: bool = ... supports_3d_storage: bool = ...
@property
def supports_area_geodetic(self): ... def supports_area_geodetic(self): ...

View File

@@ -19,12 +19,14 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
disallowed_aggregates: Any = ... disallowed_aggregates: Any = ...
select: str = ... select: str = ...
function_names: Any = ... function_names: Any = ...
@property
def unsupported_functions(self): ... def unsupported_functions(self): ...
@property
def spatial_version(self): ... def spatial_version(self): ...
def geo_db_type(self, f: Any) -> None: ... def geo_db_type(self, f: Any) -> None: ...
def get_distance(self, f: Any, value: Any, lookup_type: Any): ... def get_distance(self, f: Any, value: Any, lookup_type: Any): ...
def geos_version(self): ... def geos_version(self): ...
def proj4_version(self): ... def proj_version(self): ...
def lwgeom_version(self): ... def lwgeom_version(self): ...
def spatialite_version(self): ... def spatialite_version(self): ...
def spatialite_version_tuple(self): ... def spatialite_version_tuple(self): ...

View File

@@ -5,6 +5,7 @@ from django.db.models import Aggregate
class GeoAggregate(Aggregate): class GeoAggregate(Aggregate):
function: Any = ... function: Any = ...
is_extent: bool = ... is_extent: bool = ...
@property
def output_field(self): ... def output_field(self): ...
def as_sql(self, compiler: Any, connection: Any, function: Optional[Any] = ..., **extra_context: Any): ... def as_sql(self, compiler: Any, connection: Any, function: Optional[Any] = ..., **extra_context: Any): ...
def as_oracle(self, compiler: Any, connection: Any, **extra_context: Any): ... def as_oracle(self, compiler: Any, connection: Any, **extra_context: Any): ...

View File

@@ -1,6 +1,7 @@
from typing import Any, Iterable, NamedTuple, Optional, Tuple, TypeVar, Union from typing import Any, Iterable, NamedTuple, Optional, Tuple, TypeVar, Union
from django.db.models.fields import Field, _ErrorMessagesToOverride, _FieldChoices, _ValidatorCallable from django.core.validators import _ValidatorCallable
from django.db.models.fields import Field, _ErrorMessagesT, _FieldChoices
# __set__ value type # __set__ value type
_ST = TypeVar("_ST") _ST = TypeVar("_ST")
@@ -21,6 +22,7 @@ class BaseSpatialField(Field[_ST, _GT]):
verbose_name: Optional[Union[str, bytes]] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
srid: int = ..., srid: int = ...,
spatial_index: bool = ..., spatial_index: bool = ...,
*,
name: Optional[str] = ..., name: Optional[str] = ...,
primary_key: bool = ..., primary_key: bool = ...,
max_length: Optional[int] = ..., max_length: Optional[int] = ...,
@@ -40,7 +42,7 @@ class BaseSpatialField(Field[_ST, _GT]):
db_column: Optional[str] = ..., db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ..., db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ..., validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ..., error_messages: Optional[_ErrorMessagesT] = ...,
): ... ): ...
def deconstruct(self): ... def deconstruct(self): ...
def db_type(self, connection: Any): ... def db_type(self, connection: Any): ...
@@ -66,6 +68,7 @@ class GeometryField(BaseSpatialField):
verbose_name: Optional[Union[str, bytes]] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
dim: int = ..., dim: int = ...,
geography: bool = ..., geography: bool = ...,
*,
extent: Tuple[float, float, float, float] = ..., extent: Tuple[float, float, float, float] = ...,
tolerance: float = ..., tolerance: float = ...,
srid: int = ..., srid: int = ...,
@@ -89,10 +92,10 @@ class GeometryField(BaseSpatialField):
db_column: Optional[str] = ..., db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ..., db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ..., validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ..., error_messages: Optional[_ErrorMessagesT] = ...,
): ... ): ...
def deconstruct(self): ... def deconstruct(self): ...
def formfield(self, **kwargs: Any): ... def formfield(self, **kwargs: Any): ... # type: ignore[override]
def select_format(self, compiler: Any, sql: Any, params: Any): ... def select_format(self, compiler: Any, sql: Any, params: Any): ...
class PointField(GeometryField): class PointField(GeometryField):

View File

@@ -9,6 +9,7 @@ class GeoFuncMixin:
function: Any = ... function: Any = ...
geom_param_pos: Any = ... geom_param_pos: Any = ...
def __init__(self, *expressions: Any, **extra: Any) -> None: ... def __init__(self, *expressions: Any, **extra: Any) -> None: ...
@property
def geo_field(self): ... def geo_field(self): ...
def as_sql(self, compiler: Any, connection: Any, function: Optional[Any] = ..., **extra_context: Any): ... def as_sql(self, compiler: Any, connection: Any, function: Optional[Any] = ..., **extra_context: Any): ...
def resolve_expression(self, *args: Any, **kwargs: Any): ... def resolve_expression(self, *args: Any, **kwargs: Any): ...
@@ -16,6 +17,7 @@ class GeoFuncMixin:
class GeoFunc(GeoFuncMixin, Func): ... class GeoFunc(GeoFuncMixin, Func): ...
class GeomOutputGeoFunc(GeoFunc): class GeomOutputGeoFunc(GeoFunc):
@property
def output_field(self): ... def output_field(self): ...
class SQLiteDecimalToFloatMixin: class SQLiteDecimalToFloatMixin:
@@ -27,6 +29,7 @@ class OracleToleranceMixin:
class Area(OracleToleranceMixin, GeoFunc): class Area(OracleToleranceMixin, GeoFunc):
arity: int = ... arity: int = ...
@property
def output_field(self): ... def output_field(self): ...
def as_sqlite(self, compiler: Any, connection: Any, **extra_context: Any): ... def as_sqlite(self, compiler: Any, connection: Any, **extra_context: Any): ...
@@ -64,7 +67,7 @@ class AsWKT(GeoFunc):
output_field: Any = ... output_field: Any = ...
arity: int = ... arity: int = ...
class BoundingCircle(OracleToleranceMixin, GeoFunc): class BoundingCircle(OracleToleranceMixin, GeomOutputGeoFunc):
def __init__(self, expression: Any, num_seg: int = ..., **extra: Any) -> None: ... def __init__(self, expression: Any, num_seg: int = ..., **extra: Any) -> None: ...
def as_oracle(self, compiler: Any, connection: Any, **extra_context: Any): ... def as_oracle(self, compiler: Any, connection: Any, **extra_context: Any): ...
@@ -76,6 +79,7 @@ class Difference(OracleToleranceMixin, GeomOutputGeoFunc):
geom_param_pos: Any = ... geom_param_pos: Any = ...
class DistanceResultMixin: class DistanceResultMixin:
@property
def output_field(self): ... def output_field(self): ...
def source_is_geography(self): ... def source_is_geography(self): ...

View File

@@ -20,9 +20,11 @@ class GDALRaster(GDALRasterBase):
def __del__(self) -> None: ... def __del__(self) -> None: ...
@property @property
def vsi_buffer(self): ... def vsi_buffer(self): ...
@property
def is_vsi_based(self): ... def is_vsi_based(self): ...
@property @property
def name(self): ... def name(self): ...
@property
def driver(self): ... def driver(self): ...
@property @property
def width(self): ... def width(self): ...
@@ -53,7 +55,7 @@ class GDALRaster(GDALRasterBase):
def warp(self, ds_input: Any, resampling: str = ..., max_error: float = ...): ... def warp(self, ds_input: Any, resampling: str = ..., max_error: float = ...): ...
def transform( def transform(
self, self,
srid: Any, srs: Any,
driver: Optional[Any] = ..., driver: Optional[Any] = ...,
name: Optional[Any] = ..., name: Optional[Any] = ...,
resampling: str = ..., resampling: str = ...,

View File

@@ -38,6 +38,7 @@ class GEOSFuncFactory:
argtypes: Optional[Any] = ... argtypes: Optional[Any] = ...
) -> None: ... ) -> None: ...
def __call__(self, *args: Any): ... def __call__(self, *args: Any): ...
@property
def func(self): ... def func(self): ...
def geos_version(): ... def geos_version(): ...

View File

@@ -36,7 +36,7 @@ class LayerMapping:
using: Optional[Any] = ..., using: Optional[Any] = ...,
) -> None: ... ) -> None: ...
def check_fid_range(self, fid_range: Any): ... def check_fid_range(self, fid_range: Any): ...
geom_field: bool = ... geom_field: str = ...
fields: Any = ... fields: Any = ...
coord_dim: Any = ... coord_dim: Any = ...
def check_layer(self): ... def check_layer(self): ...

View File

@@ -7,5 +7,5 @@ class BitAnd(Aggregate): ...
class BitOr(Aggregate): ... class BitOr(Aggregate): ...
class BoolAnd(Aggregate): ... class BoolAnd(Aggregate): ...
class BoolOr(Aggregate): ... class BoolOr(Aggregate): ...
class JSONBAgg(Aggregate): ... class JSONBAgg(OrderableAggMixin, Aggregate): ...
class StringAgg(OrderableAggMixin, Aggregate): ... class StringAgg(OrderableAggMixin, Aggregate): ...

View File

@@ -1,5 +1,6 @@
from typing import Optional, Sequence, Tuple, Union from typing import List, Optional, Sequence, Tuple, Union
from django.db.models import Deferrable
from django.db.models.constraints import BaseConstraint from django.db.models.constraints import BaseConstraint
from django.db.models.expressions import Combinable from django.db.models.expressions import Combinable
from django.db.models.query_utils import Q from django.db.models.query_utils import Q
@@ -13,6 +14,9 @@ class ExclusionConstraint(BaseConstraint):
*, *,
name: str, name: str,
expressions: Sequence[Tuple[Union[str, Combinable], str]], expressions: Sequence[Tuple[Union[str, Combinable], str]],
condition: Optional[Q] = ...,
index_type: Optional[str] = ..., index_type: Optional[str] = ...,
condition: Optional[Q] = ...,
deferrable: Optional[Deferrable] = ...,
include: Union[List[str], Tuple[str], None] = ...,
opclasses: Union[List[str], Tuple[str]] = ...,
): ... ): ...

View File

@@ -4,13 +4,11 @@ from .citext import CIEmailField as CIEmailField
from .citext import CIText as CIText from .citext import CIText as CIText
from .citext import CITextField as CITextField from .citext import CITextField as CITextField
from .hstore import HStoreField as HStoreField from .hstore import HStoreField as HStoreField
from .jsonb import JsonAdapter as JsonAdapter
from .jsonb import JSONField as JSONField from .jsonb import JSONField as JSONField
from .ranges import BigIntegerRangeField as BigIntegerRangeField from .ranges import BigIntegerRangeField as BigIntegerRangeField
from .ranges import DateRangeField as DateRangeField from .ranges import DateRangeField as DateRangeField
from .ranges import DateTimeRangeField as DateTimeRangeField from .ranges import DateTimeRangeField as DateTimeRangeField
from .ranges import DecimalRangeField as DecimalRangeField from .ranges import DecimalRangeField as DecimalRangeField
from .ranges import FloatRangeField as FloatRangeField
from .ranges import IntegerRangeField as IntegerRangeField from .ranges import IntegerRangeField as IntegerRangeField
from .ranges import RangeBoundary as RangeBoundary from .ranges import RangeBoundary as RangeBoundary
from .ranges import RangeField as RangeField from .ranges import RangeField as RangeField

View File

@@ -1,9 +1,10 @@
from typing import Any, Iterable, List, Optional, Sequence, TypeVar, Union from typing import Any, Iterable, List, Optional, Sequence, Type, TypeVar, Union
from django.core.validators import _ValidatorCallable
from django.db.models import Field, Transform
from django.db.models.expressions import Combinable from django.db.models.expressions import Combinable
from django.db.models.fields import Field, _ErrorMessagesToOverride, _FieldChoices, _ValidatorCallable from django.db.models.fields import _ErrorMessagesT, _FieldChoices
from django.db.models.fields.mixins import CheckFieldDefaultMixin
from .mixins import CheckFieldDefaultMixin
# __set__ value type # __set__ value type
_ST = TypeVar("_ST") _ST = TypeVar("_ST")
@@ -15,15 +16,16 @@ class ArrayField(CheckFieldDefaultMixin, Field[_ST, _GT]):
_pyi_private_get_type: List[Any] _pyi_private_get_type: List[Any]
empty_strings_allowed: bool = ... empty_strings_allowed: bool = ...
default_error_messages: Any = ... default_error_messages: _ErrorMessagesT = ...
base_field: Any = ... base_field: Field = ...
size: Any = ... size: Optional[int] = ...
default_validators: Any = ... default_validators: Sequence[_ValidatorCallable] = ...
from_db_value: Any = ... from_db_value: Any = ...
def __init__( def __init__(
self, self,
base_field: Field, base_field: Field,
size: Optional[int] = ..., size: Optional[int] = ...,
*,
verbose_name: Optional[Union[str, bytes]] = ..., verbose_name: Optional[Union[str, bytes]] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
primary_key: bool = ..., primary_key: bool = ...,
@@ -44,8 +46,8 @@ class ArrayField(CheckFieldDefaultMixin, Field[_ST, _GT]):
db_column: Optional[str] = ..., db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ..., db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ..., validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ..., error_messages: Optional[_ErrorMessagesT] = ...,
) -> None: ... ) -> None: ...
@property @property
def description(self): ... def description(self) -> str: ... # type: ignore
def get_transform(self, name: Any): ... def get_transform(self, name: Any) -> Optional[Type[Transform]]: ...

View File

@@ -1,8 +1,7 @@
from typing import Any from typing import Any
from django.db.models import Field, Transform from django.db.models import Field, Transform
from django.db.models.fields.mixins import CheckFieldDefaultMixin
from .mixins import CheckFieldDefaultMixin
class HStoreField(CheckFieldDefaultMixin, Field): class HStoreField(CheckFieldDefaultMixin, Field):
def get_transform(self, name) -> Any: ... def get_transform(self, name) -> Any: ...

View File

@@ -1,32 +1,8 @@
from json import JSONEncoder from django.db.models import JSONField as BuiltinJSONField
from typing import Any, Optional, Type from django.db.models.fields.json import KeyTextTransform as BuiltinKeyTextTransform
from django.db.models.fields.json import KeyTransform as BuiltinKeyTransform
from django.db.models import Field # All deprecated
from django.db.models.lookups import Transform class JSONField(BuiltinJSONField): ...
class KeyTransform(BuiltinKeyTransform): ...
from .mixins import CheckFieldDefaultMixin class KeyTextTransform(BuiltinKeyTextTransform): ...
class JsonAdapter:
encoder: Any = ...
def __init__(self, adapted: Any, dumps: Optional[Any] = ..., encoder: Optional[Any] = ...) -> None: ...
def dumps(self, obj: Any): ...
class JSONField(CheckFieldDefaultMixin, Field):
empty_strings_allowed: bool = ...
description: Any = ...
default_error_messages: Any = ...
encoder: Any = ...
def __init__(
self,
verbose_name: Optional[str] = ...,
name: Optional[str] = ...,
encoder: Optional[Type[JSONEncoder]] = ...,
**kwargs: Any
) -> None: ...
class KeyTransform(Transform):
operator: str = ...
nested_operator: str = ...
def __init__(self, key_name: str, *args: Any, **kwargs: Any) -> None: ...
class KeyTextTransform(KeyTransform): ...

View File

@@ -1,4 +0,0 @@
from typing import Any, List
class CheckFieldDefaultMixin:
def check(self, **kwargs: Any) -> List[Any]: ...

View File

@@ -1,14 +1,38 @@
from typing import Any import sys
from typing import Any, Dict, Optional, Type
from django.db import models from django.db import models
from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange from django.db.models.lookups import PostgresOperatorLookup
from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange, Range
if sys.version_info < (3, 8):
from typing_extensions import Literal
else:
from typing import Literal
class RangeBoundary(models.Expression):
lower: str
upper: str
def __init__(self, inclusive_lower: bool = ..., inclusive_upper: bool = ...): ...
class RangeOperators:
EQUAL: Literal["="]
NOT_EQUAL: Literal["<>"]
CONTAINS: Literal["@>"]
CONTAINED_BY: Literal["<@"]
OVERLAPS: Literal["&&"]
FULLY_LT: Literal["<<"]
FULLY_GT: Literal[">>"]
NOT_LT: Literal["&>"]
NOT_GT: Literal["&<"]
ADJACENT_TO: Literal["-|-"]
class RangeField(models.Field): class RangeField(models.Field):
empty_strings_allowed: bool = ... empty_strings_allowed: bool = ...
base_field: Any = ... base_field: models.Field = ...
range_type: Any = ... range_type: Type[Range] = ...
def get_prep_value(self, value: Any): ... def get_prep_value(self, value: Any) -> Optional[Any]: ...
def to_python(self, value: Any): ... def to_python(self, value: Any) -> Any: ...
class IntegerRangeField(RangeField): class IntegerRangeField(RangeField):
def __get__(self, instance, owner) -> NumericRange: ... def __get__(self, instance, owner) -> NumericRange: ...
@@ -19,28 +43,74 @@ class BigIntegerRangeField(RangeField):
class DecimalRangeField(RangeField): class DecimalRangeField(RangeField):
def __get__(self, instance, owner) -> NumericRange: ... def __get__(self, instance, owner) -> NumericRange: ...
class FloatRangeField(RangeField):
def __get__(self, instance, owner) -> NumericRange: ...
class DateTimeRangeField(RangeField): class DateTimeRangeField(RangeField):
def __get__(self, instance, owner) -> DateTimeTZRange: ... def __get__(self, instance, owner) -> DateTimeTZRange: ...
class DateRangeField(RangeField): class DateRangeField(RangeField):
def __get__(self, instance, owner) -> DateRange: ... def __get__(self, instance, owner) -> DateRange: ...
class RangeOperators: class DateTimeRangeContains(PostgresOperatorLookup):
EQUAL: str lookup_name: str = ...
NOT_EQUAL: str postgres_operator: str = ...
CONTAINS: str
CONTAINED_BY: str
OVERLAPS: str
FULLY_LT: str
FULLY_GT: str
NOT_LT: str
NOT_GT: str
ADJACENT_TO: str
class RangeBoundary(models.Expression): class RangeContainedBy(PostgresOperatorLookup):
lower: str lookup_name: str = ...
upper: str type_mapping: Dict[str, str] = ...
def __init__(self, inclusive_lower: bool = ..., inclusive_upper: bool = ...): ... postgres_operator: str = ...
class FullyLessThan(PostgresOperatorLookup):
lookup_name: str = ...
postgres_operator: str = ...
class FullGreaterThan(PostgresOperatorLookup):
lookup_name: str = ...
postgres_operator: str = ...
class NotLessThan(PostgresOperatorLookup):
lookup_name: str = ...
postgres_operator: str = ...
class NotGreaterThan(PostgresOperatorLookup):
lookup_name: str = ...
postgres_operator: str = ...
class AdjacentToLookup(PostgresOperatorLookup):
lookup_name: str = ...
postgres_operator: str = ...
class RangeStartsWith(models.Transform):
lookup_name: str = ...
function: str = ...
@property
def output_field(self) -> models.Field: ...
class RangeEndsWith(models.Transform):
lookup_name: str = ...
function: str = ...
@property
def output_field(self) -> models.Field: ...
class IsEmpty(models.Transform):
lookup_name: str = ...
function: str = ...
output_field: models.BooleanField = ...
class LowerInclusive(models.Transform):
lookup_name: str = ...
function: str = ...
output_field: models.BooleanField = ...
class LowerInfinite(models.Transform):
lookup_name: str = ...
function: str = ...
output_field: models.BooleanField = ...
class UpperInclusive(models.Transform):
lookup_name: str = ...
function: str = ...
output_field: models.BooleanField = ...
class UpperInfinite(models.Transform):
lookup_name: str = ...
function: str = ...
output_field: models.BooleanField = ...

View File

@@ -0,0 +1,4 @@
from .array import *
from .hstore import *
from .jsonb import *
from .ranges import *

View File

@@ -0,0 +1,62 @@
from typing import Any, Dict, Optional, Sequence, Type, Union
from django import forms as forms
from django.contrib.postgres.validators import ArrayMaxLengthValidator as ArrayMaxLengthValidator
from django.contrib.postgres.validators import ArrayMinLengthValidator as ArrayMinLengthValidator
from django.core.exceptions import ValidationError as ValidationError
from django.db.models.fields import _ErrorMessagesT
from django.forms.fields import _ClassLevelWidgetT
from django.forms.utils import _DataT, _FilesT
from django.forms.widgets import Media, _OptAttrs
from ..utils import prefix_validation_error as prefix_validation_error
class SimpleArrayField(forms.CharField):
default_error_messages: _ErrorMessagesT = ...
base_field: Type[forms.Field]
delimiter: str
min_length: Optional[int]
max_length: Optional[int]
def __init__(
self,
base_field: Type[forms.Field],
*,
delimiter: str = ...,
max_length: Optional[int] = ...,
min_length: Optional[int] = ...,
**kwargs: Any
) -> None: ...
def clean(self, value: Any) -> Sequence[Any]: ...
def prepare_value(self, value: Any) -> Any: ...
def to_python(self, value: Any) -> Sequence[Any]: ... # type: ignore
def validate(self, value: Sequence[Any]) -> None: ...
def run_validators(self, value: Sequence[Any]) -> None: ...
def has_changed(self, initial: Any, data: Any) -> bool: ...
class SplitArrayWidget(forms.Widget):
template_name: str
widget: _ClassLevelWidgetT
size: int
def __init__(self, widget: Union[forms.Widget, Type[forms.Widget]], size: int, **kwargs: Any) -> None: ...
@property
def is_hidden(self) -> bool: ...
def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ...
def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ...
def id_for_label(self, id_: str) -> str: ...
def get_context(self, name: str, value: Any, attrs: Optional[_OptAttrs] = ...) -> Dict[str, Any]: ...
@property
def media(self) -> Media: ... # type: ignore
@property
def needs_multipart_form(self) -> bool: ... # type: ignore
class SplitArrayField(forms.Field):
default_error_messages: _ErrorMessagesT = ...
base_field: Type[forms.Field]
size: int
remove_trailing_nulls: bool
def __init__(
self, base_field: Type[forms.Field], size: int, *, remove_trailing_nulls: bool = ..., **kwargs: Any
) -> None: ...
def to_python(self, value: Any) -> Sequence[Any]: ...
def clean(self, value: Any) -> Sequence[Any]: ...
def has_changed(self, initial: Any, data: Any) -> bool: ...

View File

@@ -0,0 +1,12 @@
from typing import Any, Dict, Optional, Type, Union
from django import forms
from django.db.models.fields import _ErrorMessagesT
from django.forms.fields import _ClassLevelWidgetT
class HStoreField(forms.CharField):
widget: _ClassLevelWidgetT
default_error_messages: _ErrorMessagesT = ...
def prepare_value(self, value: Any) -> Any: ...
def to_python(self, value: Any) -> Dict[str, Optional[str]]: ... # type: ignore
def has_changed(self, initial: Any, data: Any) -> bool: ...

View File

@@ -0,0 +1,9 @@
from typing import Any
from django.forms import JSONField as BuiltinJSONField
# Deprecated, removed in 4.0
class JSONField(BuiltinJSONField):
def __init__(self, *args: Any, **kwargs: Any) -> None:
...

View File

@@ -0,0 +1,44 @@
from typing import Any, Optional, Tuple, Type, Union
from django import forms
from django.db.models.fields import _ErrorMessagesT
from django.forms.widgets import MultiWidget, _OptAttrs
from psycopg2.extras import Range
class RangeWidget(MultiWidget):
def __init__(
self, base_widget: Union[forms.Widget, Type[forms.Widget]], attrs: Optional[_OptAttrs] = ...
) -> None: ...
def decompress(self, value: Any) -> Tuple[Optional[Any], Optional[Any]]: ...
class HiddenRangeWidget(RangeWidget):
def __init__(self, attrs: Optional[_OptAttrs] = ...) -> None: ...
class BaseRangeField(forms.MultiValueField):
default_error_messages: _ErrorMessagesT
base_field: Type[forms.Field]
range_type: Type[Range]
hidden_widget: Type[forms.Widget]
def __init__(self, **kwargs: Any) -> None: ...
def prepare_value(self, value: Any) -> Any: ...
def compress(self, values: Tuple[Optional[Any], Optional[Any]]) -> Optional[Range]: ...
class IntegerRangeField(BaseRangeField):
default_error_messages: _ErrorMessagesT
base_field: Type[forms.Field]
range_type: Type[Range]
class DecimalRangeField(BaseRangeField):
default_error_messages: _ErrorMessagesT
base_field: Type[forms.Field]
range_type: Type[Range]
class DateTimeRangeField(BaseRangeField):
default_error_messages: _ErrorMessagesT
base_field: Type[forms.Field]
range_type: Type[Range]
class DateRangeField(BaseRangeField):
default_error_messages: _ErrorMessagesT
base_field: Type[forms.Field]
range_type: Type[Range]

View File

@@ -1,10 +1,34 @@
from typing import Optional, Sequence, Union from typing import Any, List, Optional, Sequence, Tuple, Type, Union
from django.db.models import Func, Index from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.ddl_references import Statement
from django.db.models import Func, Index, Model
from django.db.models.expressions import BaseExpression, Combinable from django.db.models.expressions import BaseExpression, Combinable
from django.db.models.query_utils import Q from django.db.models.query_utils import Q
from django.utils.datastructures import _ListOrTuple
class PostgresIndex(Index): ... class PostgresIndex(Index):
@property
def max_name_length(self) -> int: ... # type: ignore
def create_sql(
self, model: Type[Model], schema_editor: BaseDatabaseSchemaEditor, using: str = ..., **kwargs: Any
) -> Statement: ...
def check_supported(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ...
def get_with_params(self) -> Sequence[str]: ...
class BloomIndex(PostgresIndex):
def __init__(
self,
*expressions: Union[BaseExpression, Combinable, str],
length: Optional[int] = ...,
columns: _ListOrTuple[int] = ...,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...,
include: Optional[Sequence[str]] = ...,
) -> None: ...
class BrinIndex(PostgresIndex): class BrinIndex(PostgresIndex):
def __init__( def __init__(

View File

@@ -1,18 +1,14 @@
from django.db.models import Lookup, Transform from django.db.models import Lookup, Transform
from django.db.models.lookups import Exact from django.db.models.lookups import Exact, PostgresOperatorLookup
from .search import SearchVectorExact from .search import SearchVectorExact
class PostgresSimpleLookup(Lookup): class DataContains(PostgresOperatorLookup): ...
operator: str class ContainedBy(PostgresOperatorLookup): ...
class Overlap(PostgresOperatorLookup): ...
class DataContains(PostgresSimpleLookup): ... class HasKey(PostgresOperatorLookup): ...
class ContainedBy(PostgresSimpleLookup): ... class HasKeys(PostgresOperatorLookup): ...
class Overlap(PostgresSimpleLookup): ...
class HasKey(PostgresSimpleLookup): ...
class HasKeys(PostgresSimpleLookup): ...
class HasAnyKeys(HasKeys): ... class HasAnyKeys(HasKeys): ...
class Unaccent(Transform): ... class Unaccent(Transform): ...
class SearchLookup(SearchVectorExact): ... class SearchLookup(SearchVectorExact): ...
class TrigramSimilar(PostgresSimpleLookup): ... class TrigramSimilar(PostgresOperatorLookup): ...
class JSONExact(Exact): ...

View File

@@ -1,7 +1,7 @@
from typing import Any, Dict, Optional, TypeVar, Union from typing import Any, Dict, Optional, TypeVar, Union
from django.db.models import Field from django.db.models import Expression, Field
from django.db.models.expressions import Combinable, CombinedExpression, Func, Value, _OutputField from django.db.models.expressions import Combinable, CombinedExpression, Func, Value
from django.db.models.lookups import Lookup from django.db.models.lookups import Lookup
_Expression = Union[str, Combinable, "SearchQueryCombinable"] _Expression = Union[str, Combinable, "SearchQueryCombinable"]
@@ -10,17 +10,33 @@ class SearchVectorExact(Lookup): ...
class SearchVectorField(Field): ... class SearchVectorField(Field): ...
class SearchQueryField(Field): ... class SearchQueryField(Field): ...
class SearchConfig(Expression):
config: Optional[_Expression] = ...
def __init__(self, config: _Expression) -> None: ...
@classmethod
def from_parameter(cls, config: Optional[_Expression]) -> SearchConfig: ...
class SearchVectorCombinable: class SearchVectorCombinable:
ADD: str = ... ADD: str = ...
class SearchVector(SearchVectorCombinable, Func): class SearchVector(SearchVectorCombinable, Func):
config: Optional[Any] = ... config: Optional[_Expression] = ...
def __init__(self, *expressions: _Expression, **extra: Any): ... function: str = ...
arg_joiner: str = ...
output_field: Field
def __init__(
self, *expressions: _Expression, config: Optional[_Expression] = ..., weight: Optional[Any] = ...
) -> None: ...
class CombinedSearchVector(SearchVectorCombinable, CombinedExpression): class CombinedSearchVector(SearchVectorCombinable, CombinedExpression):
def __init__( def __init__(
self, lhs, connector, rhs, config: Optional[_Expression] = ..., output_field: Optional[_OutputField] = ... self,
): ... lhs: Combinable,
connector: str,
rhs: Combinable,
config: Optional[_Expression],
output_field: Optional[Field] = None,
) -> None: ...
_T = TypeVar("_T", bound="SearchQueryCombinable") _T = TypeVar("_T", bound="SearchQueryCombinable")
@@ -32,31 +48,65 @@ class SearchQueryCombinable:
def __and__(self: _T, other: SearchQueryCombinable) -> _T: ... def __and__(self: _T, other: SearchQueryCombinable) -> _T: ...
def __rand__(self: _T, other: SearchQueryCombinable) -> _T: ... def __rand__(self: _T, other: SearchQueryCombinable) -> _T: ...
class SearchQuery(SearchQueryCombinable, Value): # type: ignore class SearchQuery(SearchQueryCombinable, Func): # type: ignore
SEARCH_TYPES: Dict[str, str] = ... SEARCH_TYPES: Dict[str, str] = ...
def __init__( def __init__(
self, self,
value: str, value: _Expression,
output_field: Optional[_OutputField] = ..., output_field: Optional[Field] = ...,
*, *,
config: Optional[_Expression] = ..., config: Optional[_Expression] = ...,
invert: bool = ..., invert: bool = ...,
search_type: str = ... search_type: str = ...,
): ... ): ...
def __invert__(self: _T) -> _T: ... def __invert__(self: _T) -> _T: ...
class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): # type: ignore class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): # type: ignore
def __init__( def __init__(
self, lhs, connector, rhs, config: Optional[_Expression] = ..., output_field: Optional[_OutputField] = ... self,
lhs: Combinable,
connector: str,
rhs: Combinable,
config: Optional[_Expression],
output_field: Optional[Field] = None,
) -> None: ... ) -> None: ...
class SearchRank(Func): class SearchRank(Func):
def __init__( def __init__(
self, vector: Union[SearchVector, _Expression], query: Union[SearchQuery, _Expression], **extra: Any self,
vector: Union[SearchVector, _Expression],
query: Union[SearchQuery, _Expression],
weights: Optional[Any] = ...,
normalization: Optional[Any] = ...,
cover_density: bool = ...,
) -> None: ...
class SearchHeadline(Func):
function: str = ...
template: str = ...
output_field: Field = ...
def __init__(
self,
expression: _Expression,
query: _Expression,
*,
config: Optional[_Expression] = ...,
start_sel: Optional[Any] = ...,
stop_sel: Optional[Any] = ...,
max_words: Optional[int] = ...,
min_words: Optional[int] = ...,
short_word: Optional[str] = ...,
highlight_all: Optional[bool] = ...,
max_fragments: Optional[int] = ...,
fragment_delimiter: Optional[str] = ...,
) -> None: ... ) -> None: ...
class TrigramBase(Func): class TrigramBase(Func):
def __init__(self, expression: _Expression, string, **extra: Any) -> None: ... def __init__(self, expression: _Expression, string: str, **extra: Any) -> None: ...
class TrigramSimilarity(TrigramBase): ... class TrigramSimilarity(TrigramBase):
class TrigramDistance(TrigramBase): ... function: str
class TrigramDistance(TrigramBase):
function: str
arg_joiner: str

View File

@@ -9,5 +9,6 @@ class SessionStore(SessionBase):
def __init__(self, session_key: Optional[str] = ...) -> None: ... def __init__(self, session_key: Optional[str] = ...) -> None: ...
@classmethod @classmethod
def get_model_class(cls) -> Type[Session]: ... def get_model_class(cls) -> Type[Session]: ...
@property
def model(self) -> Type[AbstractBaseSession]: ... def model(self) -> Type[AbstractBaseSession]: ...
def create_model_instance(self, data: Dict[str, Model]) -> AbstractBaseSession: ... def create_model_instance(self, data: Dict[str, Model]) -> AbstractBaseSession: ...

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import Any, Dict, List, Optional, Protocol, Union from typing import Any, Dict, List, Optional, Sequence, Union
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.contrib.sites.requests import RequestSite from django.contrib.sites.requests import RequestSite
@@ -11,22 +11,17 @@ PING_URL: str
class SitemapNotFound(Exception): ... class SitemapNotFound(Exception): ...
def ping_google(sitemap_url: Optional[str] = ..., ping_url: str = ...) -> None: ... def ping_google(sitemap_url: Optional[str] = ..., ping_url: str = ..., sitemap_uses_https: bool = ...) -> None: ...
class _SupportsLen(Protocol):
def __len__(self) -> int: ...
class _SupportsCount(Protocol):
def count(self) -> int: ...
class _SupportsOrdered(Protocol):
ordered: bool = ...
class Sitemap: class Sitemap:
limit: int = ... limit: int = ...
protocol: Optional[str] = ... protocol: Optional[str] = ...
def items(self) -> Union[_SupportsLen, _SupportsCount, _SupportsOrdered]: ... i18n: bool = ...
def location(self, obj: Model) -> str: ... languages: Optional[Sequence[str]] = ...
alternates: bool = ...
x_default: bool = ...
def items(self) -> Union[Sequence[Any], QuerySet[Any]]: ...
def location(self, item: Model) -> str: ...
@property @property
def paginator(self) -> Paginator: ... def paginator(self) -> Paginator: ...
def get_urls( def get_urls(
@@ -36,15 +31,15 @@ class Sitemap:
class GenericSitemap(Sitemap): class GenericSitemap(Sitemap):
priority: Optional[float] = ... priority: Optional[float] = ...
changefreq: Optional[str] = ... changefreq: Optional[str] = ...
queryset: QuerySet = ... queryset: QuerySet[Model] = ...
date_field: None = ... date_field: Optional[str] = ...
protocol: Optional[str] = ...
def __init__( def __init__(
self, self,
info_dict: Dict[str, Union[datetime, QuerySet, str]], info_dict: Dict[str, Union[datetime, QuerySet[Model], str]],
priority: Optional[float] = ..., priority: Optional[float] = ...,
changefreq: Optional[str] = ..., changefreq: Optional[str] = ...,
protocol: Optional[str] = ..., protocol: Optional[str] = ...,
) -> None: ... ) -> None: ...
def lastmod(self, item: Model) -> Optional[datetime]: ... def lastmod(self, item: Model) -> Optional[datetime]: ...
def items(self) -> QuerySet[Model]: ...
default_app_config: str

View File

@@ -1,11 +1,12 @@
from collections import OrderedDict from typing import Callable, Dict, Optional, Type, TypeVar, Union
from typing import Callable, Dict, Optional, Type, Union
from django.contrib.sitemaps import GenericSitemap, Sitemap from django.contrib.sitemaps import GenericSitemap, Sitemap
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
def x_robots_tag(func: Callable) -> Callable: ... _C = TypeVar("_C", bound=Callable)
def x_robots_tag(func: _C) -> _C: ...
def index( def index(
request: HttpRequest, request: HttpRequest,
sitemaps: Dict[str, Union[Type[Sitemap], Sitemap]], sitemaps: Dict[str, Union[Type[Sitemap], Sitemap]],
@@ -15,7 +16,7 @@ def index(
) -> TemplateResponse: ... ) -> TemplateResponse: ...
def sitemap( def sitemap(
request: HttpRequest, request: HttpRequest,
sitemaps: Union[Dict[str, Type[Sitemap]], Dict[str, GenericSitemap], OrderedDict], sitemaps: Dict[str, Union[Type[Sitemap], Sitemap]],
section: Optional[str] = ..., section: Optional[str] = ...,
template_name: str = ..., template_name: str = ...,
content_type: str = ..., content_type: str = ...,

View File

@@ -1,6 +1,6 @@
from typing import Any, List, Optional, Sequence from typing import Any, List, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import Error from django.core.checks.messages import CheckMessage
def check_finders(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Error]: ... def check_finders(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ...

View File

@@ -1,51 +1,74 @@
import os import sys
from typing import Any, Iterable, Iterator, List, Mapping, Optional, Tuple, Type, Union, overload from typing import Any, Dict, Iterable, Iterator, List, Optional, Sequence, Tuple, Type, overload
from django.core.checks.messages import CheckMessage from django.core.checks.messages import CheckMessage
from django.core.files.storage import Storage from django.core.files.storage import FileSystemStorage, Storage
from typing_extensions import Literal from django.utils._os import _PathCompatible
if sys.version_info < (3, 8):
from typing_extensions import Literal
else:
from typing import Literal
_PathType = Union[str, bytes, os.PathLike]
searched_locations: Any searched_locations: Any
class BaseFinder: class BaseFinder:
def check(self, **kwargs: Any) -> List[CheckMessage]: ... def check(self, **kwargs: Any) -> List[CheckMessage]: ...
@overload @overload
def find(self, path: _PathType, all: Literal[True]) -> List[_PathType]: ... def find(self, path: _PathCompatible, all: Literal[False] = False) -> Optional[_PathCompatible]: ... # type: ignore
@overload @overload
def find(self, path: _PathType, all: Literal[False] = ...) -> Optional[_PathType]: ... def find(self, path: _PathCompatible, all: Literal[True] = ...) -> List[_PathCompatible]: ...
def list(self, ignore_patterns: Any) -> Iterable[Any]: ... def list(self, ignore_patterns: Optional[Iterable[str]]) -> Iterable[Any]: ...
class FileSystemFinder(BaseFinder): class FileSystemFinder(BaseFinder):
locations: List[Tuple[str, _PathType]] = ... locations: List[Tuple[str, _PathCompatible]] = ...
storages: Mapping[str, Any] = ... storages: Dict[_PathCompatible, Any] = ...
def __init__(self, app_names: None = ..., *args: Any, **kwargs: Any) -> None: ... def __init__(self, app_names: Sequence[str] = ..., *args: Any, **kwargs: Any) -> None: ...
def find_location(self, root: _PathType, path: _PathType, prefix: str = ...) -> Optional[_PathType]: ... def find_location(
self, root: _PathCompatible, path: str, prefix: Optional[str] = ...
) -> Optional[_PathCompatible]: ...
@overload
def find(self, path: _PathCompatible, all: Literal[False] = False) -> Optional[_PathCompatible]: ... # type: ignore
@overload
def find(self, path: _PathCompatible, all: Literal[True] = ...) -> List[_PathCompatible]: ...
def list(self, ignore_patterns: Optional[Iterable[str]]) -> Iterable[Any]: ...
class AppDirectoriesFinder(BaseFinder): class AppDirectoriesFinder(BaseFinder):
storage_class: Type[Storage] = ... storage_class: Type[FileSystemStorage] = ...
source_dir: str = ... source_dir: str = ...
apps: List[str] = ... apps: List[str] = ...
storages: Mapping[str, Storage] = ... storages: Dict[_PathCompatible, FileSystemStorage] = ...
def __init__(self, app_names: None = ..., *args: Any, **kwargs: Any) -> None: ... def __init__(self, app_names: Optional[Iterable[str]] = ..., *args: Any, **kwargs: Any) -> None: ...
def find_in_app(self, app: str, path: _PathType) -> Optional[_PathType]: ... def find_in_app(self, app: str, path: _PathCompatible) -> Optional[_PathCompatible]: ...
@overload
def find(self, path: _PathCompatible, all: Literal[False] = False) -> Optional[_PathCompatible]: ... # type: ignore
@overload
def find(self, path: _PathCompatible, all: Literal[True] = ...) -> List[_PathCompatible]: ...
def list(self, ignore_patterns: Optional[Iterable[str]]) -> Iterable[Any]: ...
class BaseStorageFinder(BaseFinder): class BaseStorageFinder(BaseFinder):
storage: Storage = ... storage: Storage = ...
def __init__(self, storage: Optional[Storage] = ..., *args: Any, **kwargs: Any) -> None: ... def __init__(self, storage: Optional[Storage] = ..., *args: Any, **kwargs: Any) -> None: ...
@overload
def find(self, path: _PathCompatible, all: Literal[False] = False) -> Optional[_PathCompatible]: ... # type: ignore
@overload
def find(self, path: _PathCompatible, all: Literal[True] = ...) -> List[_PathCompatible]: ...
def list(self, ignore_patterns: Optional[Iterable[str]]) -> Iterable[Any]: ...
class DefaultStorageFinder(BaseStorageFinder): ... class DefaultStorageFinder(BaseStorageFinder):
storage: Storage = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@overload @overload
def find(path: str, all: Literal[True]) -> List[_PathType]: ... def find(path: _PathCompatible, all: Literal[False] = False) -> Optional[_PathCompatible]: ... # type: ignore
@overload @overload
def find(path: str, all: Literal[False] = ...) -> Optional[_PathType]: ... def find(path: _PathCompatible, all: Literal[True] = ...) -> List[_PathCompatible]: ...
def get_finders() -> Iterator[BaseFinder]: ... def get_finders() -> Iterator[BaseFinder]: ...
@overload @overload
def get_finder(import_path: Literal["django.contrib.staticfiles.finders.FileSystemFinder"]) -> FileSystemFinder: ... def get_finder(
import_path: Literal["django.contrib.staticfiles.finders.FileSystemFinder"],
) -> FileSystemFinder: ...
@overload @overload
def get_finder( def get_finder(
import_path: Literal["django.contrib.staticfiles.finders.AppDirectoriesFinder"], import_path: Literal["django.contrib.staticfiles.finders.AppDirectoriesFinder"],
) -> AppDirectoriesFinder: ... ) -> AppDirectoriesFinder: ...
@overload
def get_finder(import_path: str) -> BaseFinder: ...

View File

@@ -1,12 +1,41 @@
from typing import Any from typing import Any, Awaitable, Callable, Dict, Mapping, Sequence, Tuple
from urllib.parse import ParseResult
from django.core.handlers.asgi import ASGIHandler, ASGIRequest
from django.core.handlers.base import BaseHandler
from django.core.handlers.wsgi import WSGIHandler, WSGIRequest from django.core.handlers.wsgi import WSGIHandler, WSGIRequest
from django.http import HttpRequest
from django.http.response import HttpResponseBase
class StaticFilesHandler(WSGIHandler): class StaticFilesHandlerMixin:
handles_files: bool = ... handles_files: bool = ...
application: WSGIHandler = ... application: BaseHandler
base_url: Any = ... base_url: ParseResult
def __init__(self, application: WSGIHandler) -> None: ... def load_middleware(self) -> None: ...
def get_base_url(self) -> str: ... def get_base_url(self) -> str: ...
def _should_handle(self, path: str) -> bool: ...
def file_path(self, url: str) -> str: ... def file_path(self, url: str) -> str: ...
def serve(self, request: WSGIRequest) -> Any: ... def serve(self, request: HttpRequest) -> HttpResponseBase: ...
def get_response(self, request: HttpRequest) -> HttpResponseBase: ...
async def get_response_async(self, request: HttpRequest) -> HttpResponseBase: ...
class StaticFilesHandler(StaticFilesHandlerMixin, WSGIHandler): # type: ignore
application: WSGIHandler
base_url: ParseResult
def __init__(self, application: WSGIHandler) -> None: ...
def __call__(
self,
environ: Dict[str, Any],
start_response: Callable[[str, Sequence[Tuple[str, str]]], None],
) -> HttpResponseBase: ...
class ASGIStaticFilesHandler(StaticFilesHandlerMixin, ASGIHandler): # type: ignore
application: ASGIHandler
base_url: ParseResult
def __init__(self, application: ASGIHandler) -> None: ...
async def __call__(
self,
scope: Dict[str, Any],
receive: Callable[[], Awaitable[Mapping[str, Any]]],
send: Callable[[Mapping[str, Any]], Awaitable[None]],
) -> None: ...

View File

@@ -10,6 +10,7 @@ class Command(BaseCommand):
post_processed_files: Any = ... post_processed_files: Any = ...
storage: Any = ... storage: Any = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
@property
def local(self) -> bool: ... def local(self) -> bool: ...
interactive: Any = ... interactive: Any = ...
verbosity: Any = ... verbosity: Any = ...

View File

@@ -1,29 +1,32 @@
from collections import OrderedDict from typing import Any, Callable, Dict, Iterator, Optional, Tuple, Union
from typing import Any, Callable, Iterator, Optional, Tuple
from django.core.files.base import File from django.core.files.base import File
from django.core.files.storage import FileSystemStorage, Storage from django.core.files.storage import FileSystemStorage, Storage
from django.utils._os import _PathCompatible
from django.utils.functional import LazyObject from django.utils.functional import LazyObject
_PostProcessT = Iterator[Union[Tuple[str, str, bool], Tuple[str, None, RuntimeError]]]
class StaticFilesStorage(FileSystemStorage): class StaticFilesStorage(FileSystemStorage):
base_location: Any = ... base_location: str
location: Any = ... location: _PathCompatible
def __init__(self, location: Optional[str] = ..., base_url: None = ..., *args: Any, **kwargs: Any) -> None: ... def __init__(
def path(self, name: str) -> str: ... self, location: Optional[_PathCompatible] = ..., base_url: Optional[str] = ..., *args: Any, **kwargs: Any
) -> None: ...
def path(self, name: _PathCompatible) -> str: ...
class HashedFilesMixin: class HashedFilesMixin:
default_template: str = ... default_template: str = ...
max_post_process_passes: int = ... max_post_process_passes: int = ...
patterns: Any = ... patterns: Any = ...
hashed_files: Any = ... hashed_files: Any = ...
keep_intermediate_files: bool = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def file_hash(self, name: str, content: File = ...) -> str: ... def file_hash(self, name: str, content: File = ...) -> str: ...
def hashed_name(self, name: str, content: Optional[File] = ..., filename: Optional[str] = ...) -> str: ... def hashed_name(self, name: str, content: Optional[File] = ..., filename: Optional[str] = ...) -> str: ...
def url(self, name: Optional[str], force: bool = ...) -> str: ... def url(self, name: str, force: bool = ...) -> str: ...
def url_converter(self, name: str, hashed_files: OrderedDict, template: str = ...) -> Callable: ... def url_converter(self, name: str, hashed_files: Dict[str, Any], template: str = ...) -> Callable: ...
def post_process( def post_process(self, paths: Dict[str, Any], dry_run: bool = ..., **options: Any) -> _PostProcessT: ...
self, paths: OrderedDict, dry_run: bool = ..., **options: Any
) -> Iterator[Tuple[str, str, bool]]: ...
def clean_name(self, name: str) -> str: ... def clean_name(self, name: str) -> str: ...
def hash_key(self, name: str) -> str: ... def hash_key(self, name: str) -> str: ...
def stored_name(self, name: str) -> str: ... def stored_name(self, name: str) -> str: ...
@@ -32,25 +35,15 @@ class ManifestFilesMixin(HashedFilesMixin):
manifest_version: str = ... manifest_version: str = ...
manifest_name: str = ... manifest_name: str = ...
manifest_strict: bool = ... manifest_strict: bool = ...
keep_intermediate_files: bool = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def read_manifest(self) -> Any: ... def read_manifest(self) -> str: ...
def load_manifest(self) -> OrderedDict: ... def load_manifest(self) -> Dict[str, Any]: ...
def save_manifest(self) -> None: ... def save_manifest(self) -> None: ...
def post_process(self, *args: Any, **kwargs: Any) -> _PostProcessT: ...
def stored_name(self, name: str) -> str: ...
class _MappingCache: class ManifestStaticFilesStorage(ManifestFilesMixin, StaticFilesStorage): ... # type: ignore
cache: Any = ...
def __init__(self, cache: Any) -> None: ...
def __setitem__(self, key: Any, value: Any) -> None: ...
def __getitem__(self, key: Any): ...
def clear(self) -> None: ...
def update(self, data: Any) -> None: ...
def get(self, key: Any, default: Optional[Any] = ...): ...
class CachedFilesMixin(HashedFilesMixin):
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class CachedStaticFilesStorage(CachedFilesMixin, StaticFilesStorage): ...
class ManifestStaticFilesStorage(ManifestFilesMixin, StaticFilesStorage): ...
class ConfiguredStorage(LazyObject): ... class ConfiguredStorage(LazyObject): ...
staticfiles_storage: Storage staticfiles_storage: Storage

View File

@@ -1,9 +0,0 @@
from typing import Any
from django.template.base import Parser, Token
from django.templatetags.static import StaticNode
register: Any
def static(path: str) -> str: ...
def do_static(parser: Parser, token: Token) -> StaticNode: ...

View File

@@ -1,8 +1,9 @@
from collections import OrderedDict from typing import Iterable, Iterator, Optional
from typing import Iterator, List, Optional, Tuple, Union
from django.core.files.storage import FileSystemStorage from django.core.files.storage import Storage
def matches_patterns(path: str, patterns: Union[List[str], Tuple[str], OrderedDict] = ...) -> bool: ... def matches_patterns(path: str, patterns: Iterable[str]) -> bool: ...
def get_files(storage: FileSystemStorage, ignore_patterns: List[str] = ..., location: str = ...) -> Iterator[str]: ... def get_files(
storage: Storage, ignore_patterns: Optional[Iterable[str]] = ..., location: str = ...
) -> Iterator[str]: ...
def check_settings(base_url: Optional[str] = ...) -> None: ... def check_settings(base_url: Optional[str] = ...) -> None: ...

View File

@@ -1,6 +1,6 @@
from typing import Any from typing import Any
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.http.response import FileResponse from django.http.response import HttpResponseBase
def serve(request: HttpRequest, path: str, insecure: bool = ..., **kwargs: Any) -> FileResponse: ... def serve(request: HttpRequest, path: str, insecure: bool = ..., **kwargs: Any) -> HttpResponseBase: ...

View File

@@ -1,8 +1,8 @@
import datetime from typing import Any, Dict, Generic, List, Optional, Type, TypeVar
from typing import Any, Callable, Dict, Generic, Iterable, Optional, Type, TypeVar, Union
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.handlers.wsgi import WSGIRequest from django.db.models import Model
from django.http.request import HttpRequest
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.utils.feedgenerator import Enclosure, SyndicationFeed from django.utils.feedgenerator import Enclosure, SyndicationFeed
@@ -10,7 +10,7 @@ def add_domain(domain: str, url: str, secure: bool = ...) -> str: ...
class FeedDoesNotExist(ObjectDoesNotExist): ... class FeedDoesNotExist(ObjectDoesNotExist): ...
_Item = TypeVar("_Item") _Item = TypeVar("_Item", bound=Model)
_Object = TypeVar("_Object") _Object = TypeVar("_Object")
class Feed(Generic[_Item, _Object]): class Feed(Generic[_Item, _Object]):
@@ -18,38 +18,40 @@ class Feed(Generic[_Item, _Object]):
title_template: Optional[str] = ... title_template: Optional[str] = ...
description_template: Optional[str] = ... description_template: Optional[str] = ...
language: Optional[str] = ... language: Optional[str] = ...
title: Any = ...
link: Any = ... # Dynamic attributes:
feed_url: Any = ... title: Any
feed_guid: Any = ... link: Any
description: Any = ... feed_url: Any
author_name: Any = ... feed_guid: Any
author_email: Any = ... description: Any
author_link: Any = ... author_name: Any
categories: Any = ... author_email: Any
feed_copyright: Any = ... author_link: Any
ttl: Any = ... categories: Any
items: Any = ... feed_copyright: Any
item_title: Any = ... ttl: Any
item_description: Any = ... items: Any
item_link: Any = ... item_guid: Any
item_guid: Any = ... item_guid_is_permalink: Any
item_guid_is_permalink: Any = ... item_author_name: Any
item_author_name: Any = ... item_author_email: Any
item_author_email: Any = ... item_author_link: Any
item_author_link: Any = ... item_enclosure_url: Any
item_enclosures: Any = ... item_enclosure_length: Any
item_enclosure_url: Any = ... item_enclosure_mime_type: Any
item_enclosure_length: Any = ... item_pubdate: Any
item_enclosure_mime_type: Any = ... item_updateddate: Any
item_pubdate: Any = ... item_categories: Any
item_updateddate: Any = ... item_copyright: Any
item_categories: Any = ... item_comments: Any
item_copyright: Any = ... def __call__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
item_comments: Any = ... def get_object(self, request: HttpRequest, *args: Any, **kwargs: Any) -> Optional[_Object]: ...
def __call__(self, request: WSGIRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_object(self, request: WSGIRequest, *args: Any, **kwargs: Any) -> Optional[_Object]: ...
def feed_extra_kwargs(self, obj: _Object) -> Dict[Any, Any]: ... def feed_extra_kwargs(self, obj: _Object) -> Dict[Any, Any]: ...
def item_extra_kwargs(self, item: _Item) -> Dict[Any, Any]: ... def item_extra_kwargs(self, item: _Item) -> Dict[Any, Any]: ...
def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ... def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ...
def get_feed(self, obj: _Object, request: WSGIRequest) -> SyndicationFeed: ... def get_feed(self, obj: _Object, request: HttpRequest) -> SyndicationFeed: ...
def item_title(self, item: _Item) -> str: ...
def item_description(self, item: _Item) -> str: ...
def item_link(self, item: _Item) -> str: ...
def item_enclosures(self, item: _Item) -> List[Enclosure]: ...

View File

@@ -1,5 +1,6 @@
from collections import OrderedDict from typing import Any, Type
from typing import Any, Callable, Dict, Union
from django.utils.connection import BaseConnectionHandler, ConnectionProxy
from .backends.base import BaseCache as BaseCache from .backends.base import BaseCache as BaseCache
from .backends.base import CacheKeyWarning as CacheKeyWarning from .backends.base import CacheKeyWarning as CacheKeyWarning
@@ -7,16 +8,13 @@ from .backends.base import InvalidCacheBackendError as InvalidCacheBackendError
DEFAULT_CACHE_ALIAS: str DEFAULT_CACHE_ALIAS: str
class CacheHandler: class CacheHandler(BaseConnectionHandler):
def __init__(self) -> None: ... settings_name: str = ...
def __getitem__(self, alias: str) -> BaseCache: ... exception_class: Type[Exception] = ...
def all(self): ... def create_connection(self, alias: str) -> BaseCache: ...
def all(self, initialized_only: bool = ...): ...
class DefaultCacheProxy: def close_caches(**kwargs: Any) -> None: ...
def __getattr__(self, name: str) -> Union[Callable, Dict[str, float], OrderedDict, int]: ...
def __setattr__(self, name: str, value: Callable) -> None: ...
def __delattr__(self, name: Any): ...
def __contains__(self, key: str) -> bool: ...
cache: Any cache: ConnectionProxy
caches: CacheHandler caches: CacheHandler

View File

@@ -1,8 +1,8 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage from django.core.checks.messages import Error
E001: Any E001: Error
def check_async_unsafe(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ... def check_async_unsafe(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...

View File

@@ -1,10 +1,14 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import Error from django.core.checks.messages import Error, Warning
E001: Any E001: Error
def check_default_cache_is_configured( def check_default_cache_is_configured(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any def check_cache_location_not_exposed(
) -> List[Error]: ... app_configs: Optional[Sequence[AppConfig]], **kwargs: Any
) -> Sequence[Warning]: ...
def check_file_based_cache_is_absolute(
app_configs: Optional[Sequence[AppConfig]], **kwargs: Any
) -> Sequence[Warning]: ...

View File

@@ -1,3 +1,5 @@
from typing import Any, List from typing import Any, Iterable, Optional, Sequence
def check_database_backends(*args: Any, **kwargs: Any) -> List[Any]: ... from django.core.checks import CheckMessage
def check_database_backends(databases: Optional[Iterable[str]] = ..., **kwargs: Any) -> Sequence[CheckMessage]: ...

View File

@@ -1,7 +1,9 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Warning from django.core.checks.messages import CheckMessage
def check_all_models(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ... def check_all_models(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> Sequence[CheckMessage]: ...
def check_lazy_references(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ... def check_lazy_references(
app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any
) -> Sequence[CheckMessage]: ...

View File

@@ -1,8 +1,14 @@
from typing import Any, Callable, List, Optional, Set, Union import sys
from typing import Any, Callable, List, Optional, Sequence, Set, TypeVar, Union
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage from django.core.checks.messages import CheckMessage
if sys.version_info < (3, 8):
from typing_extensions import Protocol
else:
from typing import Protocol
class Tags: class Tags:
admin: str = ... admin: str = ...
caches: str = ... caches: str = ...
@@ -11,28 +17,38 @@ class Tags:
models: str = ... models: str = ...
security: str = ... security: str = ...
signals: str = ... signals: str = ...
sites: str = ...
staticfiles: str = ...
templates: str = ... templates: str = ...
translation: str = ... translation: str = ...
urls: str = ... urls: str = ...
_CheckCallable = Callable[..., List[CheckMessage]] _CheckCallable = Callable[..., Sequence[CheckMessage]]
_C = TypeVar("_C", bound=_CheckCallable)
class _ProcessedCheckCallable(Protocol[_C]):
tags: Sequence[str]
__call__: _C
class CheckRegistry: class CheckRegistry:
registered_checks: Set[Callable] = ... registered_checks: Set[_ProcessedCheckCallable] = ...
deployment_checks: Set[Callable] = ... deployment_checks: Set[_ProcessedCheckCallable] = ...
def __init__(self) -> None: ... def __init__(self) -> None: ...
def register(self, check: Optional[Union[_CheckCallable, str]] = ..., *tags: str, **kwargs: Any) -> Callable: ... def register(
self, check: Optional[Union[_CheckCallable, str]] = ..., *tags: str, **kwargs: Any
) -> Union[Callable[[_CheckCallable], _ProcessedCheckCallable], _ProcessedCheckCallable]: ...
def run_checks( def run_checks(
self, self,
app_configs: Optional[List[AppConfig]] = ..., app_configs: Optional[Sequence[AppConfig]] = ...,
tags: Optional[List[str]] = ..., tags: Optional[Sequence[str]] = ...,
include_deployment_checks: bool = ..., include_deployment_checks: bool = ...,
databases: Optional[Any] = ...,
) -> List[CheckMessage]: ... ) -> List[CheckMessage]: ...
def tag_exists(self, tag: str, include_deployment_checks: bool = ...) -> bool: ... def tag_exists(self, tag: str, include_deployment_checks: bool = ...) -> bool: ...
def tags_available(self, deployment_checks: bool = ...) -> Set[str]: ... def tags_available(self, deployment_checks: bool = ...) -> Set[str]: ...
def get_checks(self, include_deployment_checks: bool = ...) -> List[Callable]: ... def get_checks(self, include_deployment_checks: bool = ...) -> List[_ProcessedCheckCallable]: ...
registry: Any registry: CheckRegistry = ...
register: Any register: Any = ...
run_checks: Any run_checks: Any = ...
tag_exists: Any tag_exists: Any = ...

View File

@@ -1,34 +1,36 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import Warning from django.core.checks.messages import CheckMessage, Error, Warning
SECRET_KEY_MIN_LENGTH: int SECRET_KEY_MIN_LENGTH: int
SECRET_KEY_MIN_UNIQUE_CHARACTERS: int SECRET_KEY_MIN_UNIQUE_CHARACTERS: int
W001: Any W001: Warning
W002: Any W002: Warning
W004: Any W004: Warning
W005: Any W005: Warning
W006: Any W006: Warning
W007: Any W007: Warning
W008: Any W008: Warning
W009: Any W009: Warning
W018: Any W018: Warning
W019: Any W019: Warning
W020: Any W020: Warning
W021: Any W021: Warning
W022: Warning
E023: Error
E100: Error
def check_security_middleware(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_security_middleware(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_xframe_options_middleware( def check_xframe_options_middleware(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any def check_sts(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
) -> List[Warning]: ... def check_sts_include_subdomains(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_sts(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_sts_preload(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_sts_include_subdomains(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_content_type_nosniff(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_sts_preload(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_ssl_redirect(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_content_type_nosniff(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_secret_key(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_xss_filter(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_debug(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_ssl_redirect(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_xframe_deny(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_secret_key(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_allowed_hosts(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_debug(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_referrer_policy(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[CheckMessage]: ...
def check_xframe_deny(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_default_hashing_algorithm(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
def check_allowed_hosts(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ...

View File

@@ -1,10 +1,10 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import Warning from django.core.checks.messages import Warning
W003: Any W003: Warning
W016: Any W016: Warning
def check_csrf_middleware(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_csrf_middleware(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_csrf_cookie_secure(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_csrf_cookie_secure(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...

View File

@@ -1,19 +1,19 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import Warning from django.core.checks.messages import Warning
def add_session_cookie_message(message: Any): ... def add_session_cookie_message(message: str) -> str: ...
W010: Any W010: Warning
W011: Any W011: Warning
W012: Any W012: Warning
def add_httponly_message(message: Any): ... def add_httponly_message(message: str) -> str: ...
W013: Any W013: Warning
W014: Any W014: Warning
W015: Any W015: Warning
def check_session_cookie_secure(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_session_cookie_secure(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def check_session_cookie_httponly(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_session_cookie_httponly(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...

View File

@@ -1,12 +1,10 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import Error from django.core.checks.messages import Error
E001: Any E001: Error
E002: Any E002: Error
def check_setting_app_dirs_loaders(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Error]: ... def check_setting_app_dirs_loaders(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
def check_string_if_invalid_is_string( def check_string_if_invalid_is_string(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any
) -> List[Error]: ...

View File

@@ -1,9 +1,17 @@
from typing import Any, List, Optional, Sequence from typing import Any, Optional, Sequence
from django.apps.config import AppConfig from django.apps.config import AppConfig
from . import Error from . import Error
E001: Error = ... E001: Error = ...
E002: Error = ...
E003: Error = ...
E004: Error = ...
def check_setting_language_code(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Error]: ... def check_setting_language_code(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
def check_setting_languages(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
def check_setting_languages_bidi(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
def check_language_settings_consistent(
app_configs: Optional[Sequence[AppConfig]], **kwargs: Any
) -> Sequence[Error]: ...

View File

@@ -1,12 +1,12 @@
from typing import Any, Callable, List, Optional, Sequence, Tuple, Union from typing import Any, Optional, Sequence, Union
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.checks.messages import CheckMessage, Error, Warning from django.core.checks.messages import CheckMessage, Error, Warning
from django.urls.resolvers import URLPattern, URLResolver from django.urls.resolvers import URLPattern, URLResolver
def check_url_config(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[CheckMessage]: ... def check_url_config(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[CheckMessage]: ...
def check_resolver(resolver: Union[Tuple[str, Callable], URLPattern, URLResolver]) -> List[CheckMessage]: ... def check_resolver(resolver: Union[URLPattern, URLResolver]) -> Sequence[CheckMessage]: ...
def check_url_namespaces_unique(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Warning]: ... def check_url_namespaces_unique(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Warning]: ...
def get_warning_for_invalid_pattern(pattern: Any) -> List[Error]: ... def get_warning_for_invalid_pattern(pattern: Any) -> Sequence[Error]: ...
def check_url_settings(app_configs: Optional[Sequence[AppConfig]] = ..., **kwargs: Any) -> List[Error]: ... def check_url_settings(app_configs: Optional[Sequence[AppConfig]], **kwargs: Any) -> Sequence[Error]: ...
def E006(name: str) -> Error: ... def E006(name: str) -> Error: ...

View File

@@ -1,7 +1,12 @@
from typing import Any, Dict, Iterator, List, Mapping, Optional, Tuple, Union import sys
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
from django.forms.utils import ErrorDict from django.forms.utils import ErrorDict
if sys.version_info < (3, 8):
from typing_extensions import Literal from typing_extensions import Literal
else:
from typing import Literal
class FieldDoesNotExist(Exception): ... class FieldDoesNotExist(Exception): ...
class AppRegistryNotReady(Exception): ... class AppRegistryNotReady(Exception): ...
@@ -25,27 +30,37 @@ class MiddlewareNotUsed(Exception): ...
class ImproperlyConfigured(Exception): ... class ImproperlyConfigured(Exception): ...
class FieldError(Exception): ... class FieldError(Exception): ...
NON_FIELD_ERRORS: Literal["__all__"] NON_FIELD_ERRORS: Literal["__all__"] = ...
_MsgTypeBase = Union[str, ValidationError]
# Yeah, it's really ugly, but __init__ checks with isinstance()
_MsgType = Union[
_MsgTypeBase,
Dict[str, _MsgTypeBase],
List[_MsgTypeBase],
Dict[str, str],
Dict[str, ValidationError],
List[str],
List[ValidationError],
]
class ValidationError(Exception): class ValidationError(Exception):
error_dict: Dict[str, ValidationError] = ... error_dict: Dict[str, ValidationError] = ...
error_list: List[ValidationError] = ... error_list: List[ValidationError] = ...
message: str = ... message: str = ...
code: Optional[str] = ... code: Optional[str] = ...
params: Optional[Mapping[str, Any]] = ... params: Optional[Dict[str, Any]] = ...
def __init__( def __init__(
self, self,
message: Union[str, ValidationError, Dict[str, Any], List[Any]], message: _MsgType,
code: Optional[str] = ..., code: Optional[str] = ...,
params: Optional[Mapping[str, Any]] = ..., params: Optional[Dict[str, Any]] = ...,
) -> None: ... ) -> None: ...
@property @property
def message_dict(self) -> Dict[str, List[str]]: ... def message_dict(self) -> Optional[Dict[str, List[str]]]: ...
@property @property
def messages(self) -> List[str]: ... def messages(self) -> List[str]: ...
def update_error_dict( def update_error_dict(self, error_dict: Dict[str, List[ValidationError]]) -> Dict[str, List[ValidationError]]: ...
self, error_dict: Mapping[str, Any]
) -> Union[Dict[str, List[ValidationError]], ErrorDict]: ...
def __iter__(self) -> Iterator[Union[Tuple[str, List[str]], str]]: ... def __iter__(self) -> Iterator[Union[Tuple[str, List[str]], str]]: ...
class EmptyResultSet(Exception): ... class EmptyResultSet(Exception): ...

View File

@@ -1,41 +1,48 @@
import os
import types import types
from io import StringIO from typing import IO, AnyStr, Iterator, Optional, Type, TypeVar, Union, type_check_only
from typing import IO, Any, Iterator, Optional, Type, TypeVar, Union
from django.core.files.utils import FileProxyMixin from django.core.files.utils import FileProxyMixin
_T = TypeVar("_T", bound="File") _T = TypeVar("_T", bound="File")
class File(FileProxyMixin, IO[Any]): class File(FileProxyMixin[AnyStr], IO[AnyStr]):
DEFAULT_CHUNK_SIZE: Any = ... DEFAULT_CHUNK_SIZE: int = ...
file: IO[Any] = ... file: Optional[IO[AnyStr]] = ...
name: str = ... name: Optional[str] = ... # type: ignore[assignment]
mode: str = ... mode: str = ...
def __init__(self, file: Any, name: Optional[str] = ...) -> None: ... def __init__(self, file: Optional[IO[AnyStr]], name: Optional[str] = ...) -> None: ...
def __str__(self) -> str: ...
def __repr__(self) -> str: ...
def __bool__(self) -> bool: ... def __bool__(self) -> bool: ...
def __len__(self) -> int: ... def __len__(self) -> int: ...
@property @property
def size(self) -> int: ... def size(self) -> int: ...
def chunks(self, chunk_size: Optional[int] = ...) -> Iterator[bytes]: ... def chunks(self, chunk_size: Optional[int] = ...) -> Iterator[AnyStr]: ...
def multiple_chunks(self, chunk_size: Optional[int] = ...) -> bool: ... def multiple_chunks(self, chunk_size: Optional[int] = ...) -> Optional[bool]: ...
def __iter__(self) -> Iterator[Union[bytes, str]]: ... def __iter__(self) -> Iterator[AnyStr]: ...
def __next__(self) -> Union[bytes, str]: ...
def __enter__(self: _T) -> _T: ... def __enter__(self: _T) -> _T: ...
def __exit__( def __exit__(
self, self,
exc_type: Optional[Type[BaseException]], exc_type: Optional[Type[BaseException]],
exc_value: Optional[BaseException], exc_value: Optional[BaseException],
tb: Optional[types.TracebackType], tb: Optional[types.TracebackType],
) -> bool: ... ) -> None: ...
def open(self: _T, mode: Optional[str] = ...) -> _T: ... def open(self: _T, mode: Optional[str] = ...) -> _T: ...
def close(self) -> None: ... def close(self) -> None: ...
@type_check_only
def __next__(self) -> AnyStr: ...
class ContentFile(File): class ContentFile(File[AnyStr]):
file: StringIO file: IO[AnyStr]
size: Any = ... size: int = ...
def __init__(self, content: Union[bytes, str], name: Optional[str] = ...) -> None: ... def __init__(self, content: AnyStr, name: Optional[str] = ...) -> None: ...
def write(self, data: str) -> int: ... def __str__(self) -> str: ...
def __bool__(self) -> bool: ...
def open(self: _T, mode: Optional[str] = ...) -> _T: ...
def close(self) -> None: ...
def write(self, data: AnyStr) -> int: ...
def endswith_cr(line: bytes) -> bool: ... def endswith_cr(line: Union[bytes, str]) -> bool: ...
def endswith_lf(line: Union[bytes, str]) -> bool: ... def endswith_lf(line: Union[bytes, str]) -> bool: ...
def equals_lf(line: bytes) -> bool: ... def equals_lf(line: Union[bytes, str]) -> bool: ...

Some files were not shown because too many files have changed in this diff Show More