Merge branch 'master' into django-db-models-missing-imports

This commit is contained in:
Oleg Nykolyn
2019-01-31 20:32:47 +02:00
61 changed files with 1641 additions and 402 deletions

View File

@@ -10,7 +10,7 @@ jobs:
- name: "Typecheck Django test suite" - name: "Typecheck Django test suite"
python: 3.7 python: 3.7
script: | script: |
xonsh ./scripts/typecheck_django_tests.xsh python ./scripts/typecheck_tests.py
- name: "Run plugin test suite with python 3.7" - name: "Run plugin test suite with python 3.7"
python: 3.7 python: 3.7
@@ -25,7 +25,8 @@ jobs:
before_install: | before_install: |
# Upgrade pip, setuptools, and wheel # Upgrade pip, setuptools, and wheel
pip install -U pip setuptools wheel xonsh pip install -U pip setuptools wheel
install: | install: |
pip install -r ./dev-requirements.txt pip install -r ./dev-requirements.txt
pip install -r ./scripts/typecheck-tests-requirements.txt

View File

@@ -24,3 +24,9 @@ plugins =
in your `mypy.ini` file. in your `mypy.ini` file.
Also, it uses value of `DJANGO_SETTINGS_MODULE` from the environment, so set it before execution, otherwise some features will not work. Also, it uses value of `DJANGO_SETTINGS_MODULE` from the environment, so set it before execution, otherwise some features will not work.
## To get help
We have Gitter here https://gitter.im/mypy-django/Lobby.
If you think you have more generic typing issue, please refer to https://github.com/python/mypy and their Gitter.

View File

@@ -1,6 +1,7 @@
from typing import Any from typing import Any
from django.utils.version import get_version as get_version from .utils.version import get_version as get_version
VERSION: Any VERSION: Any
__version__: str
def setup(set_prefix: bool = ...) -> None: ... def setup(set_prefix: bool = ...) -> None: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Iterator, Type from typing import Any, Iterator, Type, Optional
from django.db.models.base import Model from django.db.models.base import Model
@@ -6,14 +6,14 @@ MODELS_MODULE_NAME: str
class AppConfig: class AppConfig:
name: str = ... name: str = ...
module: Any = ... module: Optional[Any] = ...
apps: None = ... apps: None = ...
label: str = ... label: str = ...
verbose_name: str = ... verbose_name: str = ...
path: str = ... path: str = ...
models_module: None = ... models_module: None = ...
models: None = ... models: None = ...
def __init__(self, app_name: str, app_module: None) -> None: ... def __init__(self, app_name: str, app_module: Optional[Any]) -> 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

@@ -2,6 +2,8 @@ from typing import Any
from django.utils.functional import LazyObject from django.utils.functional import LazyObject
ENVIRONMENT_VARIABLE: 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): ...
@@ -11,5 +13,8 @@ class LazySettings(_DjangoConfLazyObject):
settings: LazySettings = ... settings: LazySettings = ...
class Settings: ... class Settings:
def __init__(self, settings_module: str): ...
def is_overridden(self, setting: str) -> bool: ...
class UserSettingsHolder: ... class UserSettingsHolder: ...

View File

@@ -0,0 +1,630 @@
"""
Default Django settings. Override these with settings in the module pointed to
by the DJANGO_SETTINGS_MODULE environment variable.
"""
# This is defined here as a do-nothing function because we can't import
# django.utils.translation -- that module depends on the settings.
def gettext_noop(s):
return s
####################
# CORE #
####################
DEBUG = False
# Whether the framework should propagate raw exceptions rather than catching
# them. This is useful under some testing situations and should never be used
# on a live site.
DEBUG_PROPAGATE_EXCEPTIONS = False
# People who get code error notifications.
# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')]
ADMINS = []
# List of IP addresses, as strings, that:
# * See debug comments, when DEBUG is true
# * Receive x-headers
INTERNAL_IPS = []
# Hosts/domain names that are valid for this site.
# "*" matches anything, ".example.com" matches example.com and all subdomains
ALLOWED_HOSTS = []
# Local time zone for this installation. All choices can be found here:
# https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all
# systems may support all possibilities). When USE_TZ is True, this is
# interpreted as the default user time zone.
TIME_ZONE = "America/Chicago"
# If you set this to True, Django will use timezone-aware datetimes.
USE_TZ = False
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = "en-us"
# Languages we provide translations for, out of the box.
LANGUAGES = [
("af", gettext_noop("Afrikaans")),
("ar", gettext_noop("Arabic")),
("ast", gettext_noop("Asturian")),
("az", gettext_noop("Azerbaijani")),
("bg", gettext_noop("Bulgarian")),
("be", gettext_noop("Belarusian")),
("bn", gettext_noop("Bengali")),
("br", gettext_noop("Breton")),
("bs", gettext_noop("Bosnian")),
("ca", gettext_noop("Catalan")),
("cs", gettext_noop("Czech")),
("cy", gettext_noop("Welsh")),
("da", gettext_noop("Danish")),
("de", gettext_noop("German")),
("dsb", gettext_noop("Lower Sorbian")),
("el", gettext_noop("Greek")),
("en", gettext_noop("English")),
("en-au", gettext_noop("Australian English")),
("en-gb", gettext_noop("British English")),
("eo", gettext_noop("Esperanto")),
("es", gettext_noop("Spanish")),
("es-ar", gettext_noop("Argentinian Spanish")),
("es-co", gettext_noop("Colombian Spanish")),
("es-mx", gettext_noop("Mexican Spanish")),
("es-ni", gettext_noop("Nicaraguan Spanish")),
("es-ve", gettext_noop("Venezuelan Spanish")),
("et", gettext_noop("Estonian")),
("eu", gettext_noop("Basque")),
("fa", gettext_noop("Persian")),
("fi", gettext_noop("Finnish")),
("fr", gettext_noop("French")),
("fy", gettext_noop("Frisian")),
("ga", gettext_noop("Irish")),
("gd", gettext_noop("Scottish Gaelic")),
("gl", gettext_noop("Galician")),
("he", gettext_noop("Hebrew")),
("hi", gettext_noop("Hindi")),
("hr", gettext_noop("Croatian")),
("hsb", gettext_noop("Upper Sorbian")),
("hu", gettext_noop("Hungarian")),
("ia", gettext_noop("Interlingua")),
("id", gettext_noop("Indonesian")),
("io", gettext_noop("Ido")),
("is", gettext_noop("Icelandic")),
("it", gettext_noop("Italian")),
("ja", gettext_noop("Japanese")),
("ka", gettext_noop("Georgian")),
("kab", gettext_noop("Kabyle")),
("kk", gettext_noop("Kazakh")),
("km", gettext_noop("Khmer")),
("kn", gettext_noop("Kannada")),
("ko", gettext_noop("Korean")),
("lb", gettext_noop("Luxembourgish")),
("lt", gettext_noop("Lithuanian")),
("lv", gettext_noop("Latvian")),
("mk", gettext_noop("Macedonian")),
("ml", gettext_noop("Malayalam")),
("mn", gettext_noop("Mongolian")),
("mr", gettext_noop("Marathi")),
("my", gettext_noop("Burmese")),
("nb", gettext_noop("Norwegian Bokmål")),
("ne", gettext_noop("Nepali")),
("nl", gettext_noop("Dutch")),
("nn", gettext_noop("Norwegian Nynorsk")),
("os", gettext_noop("Ossetic")),
("pa", gettext_noop("Punjabi")),
("pl", gettext_noop("Polish")),
("pt", gettext_noop("Portuguese")),
("pt-br", gettext_noop("Brazilian Portuguese")),
("ro", gettext_noop("Romanian")),
("ru", gettext_noop("Russian")),
("sk", gettext_noop("Slovak")),
("sl", gettext_noop("Slovenian")),
("sq", gettext_noop("Albanian")),
("sr", gettext_noop("Serbian")),
("sr-latn", gettext_noop("Serbian Latin")),
("sv", gettext_noop("Swedish")),
("sw", gettext_noop("Swahili")),
("ta", gettext_noop("Tamil")),
("te", gettext_noop("Telugu")),
("th", gettext_noop("Thai")),
("tr", gettext_noop("Turkish")),
("tt", gettext_noop("Tatar")),
("udm", gettext_noop("Udmurt")),
("uk", gettext_noop("Ukrainian")),
("ur", gettext_noop("Urdu")),
("vi", gettext_noop("Vietnamese")),
("zh-hans", gettext_noop("Simplified Chinese")),
("zh-hant", gettext_noop("Traditional Chinese")),
]
# Languages using BiDi (right-to-left) layout
LANGUAGES_BIDI = ["he", "ar", "fa", "ur"]
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
LOCALE_PATHS = []
# Settings for language cookie
LANGUAGE_COOKIE_NAME = "django_language"
LANGUAGE_COOKIE_AGE = None
LANGUAGE_COOKIE_DOMAIN = None
LANGUAGE_COOKIE_PATH = "/"
# If you set this to True, Django will format dates, numbers and calendars
# according to user current locale.
USE_L10N = False
# Not-necessarily-technical managers of the site. They get broken link
# notifications and other various emails.
MANAGERS = ADMINS
# Default content type and charset to use for all HttpResponse objects, if a
# MIME type isn't manually specified. These are used to construct the
# Content-Type header.
DEFAULT_CONTENT_TYPE = "text/html"
DEFAULT_CHARSET = "utf-8"
# Encoding of files read from disk (template and initial SQL files).
FILE_CHARSET = "utf-8"
# Email address that error messages come from.
SERVER_EMAIL = "root@localhost"
# Database connection info. If left empty, will default to the dummy backend.
DATABASES = {}
# Classes used to implement DB routing behavior.
DATABASE_ROUTERS = []
# The email backend to use. For possible shortcuts see django.core.mail.
# The default is to use the SMTP backend.
# Third-party backends can be specified by providing a Python path
# to a module that defines an EmailBackend class.
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
# Host for sending email.
EMAIL_HOST = "localhost"
# Port for sending email.
EMAIL_PORT = 25
# Whether to send SMTP 'Date' header in the local time zone or in UTC.
EMAIL_USE_LOCALTIME = False
# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ""
EMAIL_HOST_PASSWORD = ""
EMAIL_USE_TLS = False
EMAIL_USE_SSL = False
EMAIL_SSL_CERTFILE = None
EMAIL_SSL_KEYFILE = None
EMAIL_TIMEOUT = None
# List of strings representing installed apps.
INSTALLED_APPS = []
TEMPLATES = []
# Default form rendering class.
FORM_RENDERER = "django.forms.renderers.DjangoTemplates"
# Default email address to use for various automated correspondence from
# the site managers.
DEFAULT_FROM_EMAIL = "webmaster@localhost"
# Subject-line prefix for email messages send with django.core.mail.mail_admins
# or ...mail_managers. Make sure to include the trailing space.
EMAIL_SUBJECT_PREFIX = "[Django] "
# Whether to append trailing slashes to URLs.
APPEND_SLASH = True
# Whether to prepend the "www." subdomain to URLs that don't have it.
PREPEND_WWW = False
# Override the server-derived value of SCRIPT_NAME
FORCE_SCRIPT_NAME = None
# List of compiled regular expression objects representing User-Agent strings
# that are not allowed to visit any page, systemwide. Use this for bad
# robots/crawlers. Here are a few examples:
# import re
# DISALLOWED_USER_AGENTS = [
# re.compile(r'^NaverBot.*'),
# re.compile(r'^EmailSiphon.*'),
# re.compile(r'^SiteSucker.*'),
# re.compile(r'^sohu-search'),
# ]
DISALLOWED_USER_AGENTS = []
ABSOLUTE_URL_OVERRIDES = {}
# List of compiled regular expression objects representing URLs that need not
# be reported by BrokenLinkEmailsMiddleware. Here are a few examples:
# import re
# IGNORABLE_404_URLS = [
# re.compile(r'^/apple-touch-icon.*\.png$'),
# re.compile(r'^/favicon.ico$'),
# re.compile(r'^/robots.txt$'),
# re.compile(r'^/phpmyadmin/'),
# re.compile(r'\.(cgi|php|pl)$'),
# ]
IGNORABLE_404_URLS = []
# A secret key for this particular Django installation. Used in secret-key
# hashing algorithms. Set this in your settings, or Django will complain
# loudly.
SECRET_KEY = ""
# Default file storage mechanism that holds media.
DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage"
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = ""
# URL that handles the media served from MEDIA_ROOT.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = ""
# Absolute path to the directory static files should be collected to.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = None
# URL that handles the static files served from STATIC_ROOT.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = None
# List of upload handler classes to be applied in order.
FILE_UPLOAD_HANDLERS = [
"django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",
]
# Maximum size, in bytes, of a request before it will be streamed to the
# file system instead of into memory.
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB
# Maximum size in bytes of request data (excluding file uploads) that will be
# read before a SuspiciousOperation (RequestDataTooBig) is raised.
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB
# Maximum number of GET/POST parameters that will be read before a
# SuspiciousOperation (TooManyFieldsSent) is raised.
DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
# Directory in which upload streamed files will be temporarily saved. A value of
# `None` will make Django use the operating system's default temporary directory
# (i.e. "/tmp" on *nix systems).
FILE_UPLOAD_TEMP_DIR = None
# 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.
FILE_UPLOAD_PERMISSIONS = None
# 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;
# see https://docs.python.org/library/os.html#files-and-directories.
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
# Python module path where user will place custom format definition.
# The directory where this setting is pointing should contain subdirectories
# named as the locales, containing a formats.py file
# (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use)
FORMAT_MODULE_PATH = None
# Default formatting for date objects. See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = "N j, Y"
# Default formatting for datetime objects. See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATETIME_FORMAT = "N j, Y, P"
# Default formatting for time objects. See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
TIME_FORMAT = "P"
# Default formatting for date objects when only the year and month are relevant.
# See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
YEAR_MONTH_FORMAT = "F Y"
# Default formatting for date objects when only the month and day are relevant.
# See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
MONTH_DAY_FORMAT = "F j"
# Default short formatting for date objects. See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
SHORT_DATE_FORMAT = "m/d/Y"
# Default short formatting for datetime objects.
# See all available format strings here:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
SHORT_DATETIME_FORMAT = "m/d/Y P"
# Default formats to be used when parsing dates from input boxes, in order
# See all available format string here:
# https://docs.python.org/library/datetime.html#strftime-behavior
# * Note that these format strings are different from the ones to display dates
DATE_INPUT_FORMATS = [
"%Y-%m-%d",
"%m/%d/%Y",
"%m/%d/%y", # '2006-10-25', '10/25/2006', '10/25/06'
"%b %d %Y",
"%b %d, %Y", # 'Oct 25 2006', 'Oct 25, 2006'
"%d %b %Y",
"%d %b, %Y", # '25 Oct 2006', '25 Oct, 2006'
"%B %d %Y",
"%B %d, %Y", # 'October 25 2006', 'October 25, 2006'
"%d %B %Y",
"%d %B, %Y", # '25 October 2006', '25 October, 2006'
]
# Default formats to be used when parsing times from input boxes, in order
# See all available format string here:
# https://docs.python.org/library/datetime.html#strftime-behavior
# * Note that these format strings are different from the ones to display dates
TIME_INPUT_FORMATS = ["%H:%M:%S", "%H:%M:%S.%f", "%H:%M"] # '14:30:59' # '14:30:59.000200' # '14:30'
# Default formats to be used when parsing dates and times from input boxes,
# in order
# See all available format string here:
# https://docs.python.org/library/datetime.html#strftime-behavior
# * Note that these format strings are different from the ones to display dates
DATETIME_INPUT_FORMATS = [
"%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59'
"%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200'
"%Y-%m-%d %H:%M", # '2006-10-25 14:30'
"%Y-%m-%d", # '2006-10-25'
"%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59'
"%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200'
"%m/%d/%Y %H:%M", # '10/25/2006 14:30'
"%m/%d/%Y", # '10/25/2006'
"%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59'
"%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200'
"%m/%d/%y %H:%M", # '10/25/06 14:30'
"%m/%d/%y", # '10/25/06'
]
# First day of week, to be used on calendars
# 0 means Sunday, 1 means Monday...
FIRST_DAY_OF_WEEK = 0
# Decimal separator symbol
DECIMAL_SEPARATOR = "."
# Boolean that sets whether to add thousand separator when formatting numbers
USE_THOUSAND_SEPARATOR = False
# Number of digits that will be together, when splitting them by
# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands...
NUMBER_GROUPING = 0
# Thousand separator symbol
THOUSAND_SEPARATOR = ","
# The tablespaces to use for each model when not specified otherwise.
DEFAULT_TABLESPACE = ""
DEFAULT_INDEX_TABLESPACE = ""
# Default X-Frame-Options header value
X_FRAME_OPTIONS = "SAMEORIGIN"
USE_X_FORWARDED_HOST = False
USE_X_FORWARDED_PORT = False
# The Python dotted path to the WSGI application that Django's internal server
# (runserver) will use. If `None`, the return value of
# 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same
# behavior as previous versions of Django. Otherwise this should point to an
# actual WSGI application object.
WSGI_APPLICATION = None
# If your Django app is behind a proxy that sets a header to specify secure
# connections, AND that proxy ensures that user-submitted headers with the
# same name are ignored (so that people can't spoof it), set this value to
# a tuple of (header_name, header_value). For any requests that come in with
# that header/value, request.is_secure() will return True.
# WARNING! Only set this if you fully understand what you're doing. Otherwise,
# you may be opening yourself up to a security risk.
SECURE_PROXY_SSL_HEADER = None
##############
# MIDDLEWARE #
##############
# List of middleware to use. Order is important; in the request phase, these
# middleware will be applied in the order given, and in the response
# phase the middleware will be applied in reverse order.
MIDDLEWARE = []
############
# SESSIONS #
############
# Cache to store session data if using the cache session backend.
SESSION_CACHE_ALIAS = "default"
# Cookie name. This can be whatever you want.
SESSION_COOKIE_NAME = "sessionid"
# Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
# A string like "example.com", or None for standard domain cookie.
SESSION_COOKIE_DOMAIN = None
# Whether the session cookie should be secure (https:// only).
SESSION_COOKIE_SECURE = False
# The path of the session cookie.
SESSION_COOKIE_PATH = "/"
# Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others)
SESSION_COOKIE_HTTPONLY = True
# Whether to set the flag restricting cookie leaks on cross-site requests.
# This can be 'Lax', 'Strict', or None to disable the flag.
SESSION_COOKIE_SAMESITE = "Lax"
# Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST = False
# Whether a user's session cookie expires when the Web browser is closed.
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# The module to store session data
SESSION_ENGINE = "django.contrib.sessions.backends.db"
# Directory to store session files if using the file session module. If None,
# the backend will use a sensible default.
SESSION_FILE_PATH = None
# class to serialize session data
SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer"
#########
# CACHE #
#########
# The cache backends to use.
CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}}
CACHE_MIDDLEWARE_KEY_PREFIX = ""
CACHE_MIDDLEWARE_SECONDS = 600
CACHE_MIDDLEWARE_ALIAS = "default"
##################
# AUTHENTICATION #
##################
AUTH_USER_MODEL = "auth.User"
AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"]
LOGIN_URL = "/accounts/login/"
LOGIN_REDIRECT_URL = "/accounts/profile/"
LOGOUT_REDIRECT_URL = None
# The number of days a password reset link is valid for
PASSWORD_RESET_TIMEOUT_DAYS = 3
# the first hasher in this list is the preferred algorithm. any
# password using different algorithms will be converted automatically
# upon login
PASSWORD_HASHERS = [
"django.contrib.auth.hashers.PBKDF2PasswordHasher",
"django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
"django.contrib.auth.hashers.Argon2PasswordHasher",
"django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
]
AUTH_PASSWORD_VALIDATORS = []
###########
# SIGNING #
###########
SIGNING_BACKEND = "django.core.signing.TimestampSigner"
########
# CSRF #
########
# Dotted path to callable to be used as view when a request is
# rejected by the CSRF middleware.
CSRF_FAILURE_VIEW = "django.views.csrf.csrf_failure"
# Settings for CSRF cookie.
CSRF_COOKIE_NAME = "csrftoken"
CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52
CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_PATH = "/"
CSRF_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_SAMESITE = "Lax"
CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN"
CSRF_TRUSTED_ORIGINS = []
CSRF_USE_SESSIONS = False
############
# MESSAGES #
############
# Class to use as messages backend
MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage"
# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within
# django.contrib.messages to avoid imports in this settings file.
###########
# LOGGING #
###########
# The callable to use to configure logging
LOGGING_CONFIG = "logging.config.dictConfig"
# Custom logging configuration.
LOGGING = {}
# Default exception reporter filter class used in case none has been
# specifically assigned to the HttpRequest instance.
DEFAULT_EXCEPTION_REPORTER_FILTER = "django.views.debug.SafeExceptionReporterFilter"
###########
# TESTING #
###########
# The name of the class to use to run the test suite
TEST_RUNNER = "django.test.runner.DiscoverRunner"
# Apps that don't need to be serialized at test database creation time
# (only apps with migrations are to start with)
TEST_NON_SERIALIZED_APPS = []
############
# FIXTURES #
############
# The list of directories to search for fixtures
FIXTURE_DIRS = []
###############
# STATICFILES #
###############
# A list of locations of additional static files
STATICFILES_DIRS = []
# The default file storage backend used during the build process
STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage"
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = [
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
]
##############
# MIGRATIONS #
##############
# Migration module overrides for apps, by app label.
MIGRATION_MODULES = {}
#################
# SYSTEM CHECKS #
#################
# List of all issues generated by system checks that should be silenced. Light
# issues like warnings, infos or debugs will not generate a message. Silencing
# serious issues like errors and criticals does not result in hiding the
# message, but Django will not stop you from e.g. running server.
SILENCED_SYSTEM_CHECKS = []
#######################
# SECURITY MIDDLEWARE #
#######################
SECURE_BROWSER_XSS_FILTER = False
SECURE_CONTENT_TYPE_NOSNIFF = False
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
SECURE_HSTS_PRELOAD = False
SECURE_HSTS_SECONDS = 0
SECURE_REDIRECT_EXEMPT = []
SECURE_SSL_HOST = None
SECURE_SSL_REDIRECT = False

View File

@@ -1,19 +1,21 @@
from typing import Any, List from typing import Any, List, Union
from django.contrib.admin.options import BaseModelAdmin, InlineModelAdmin, ModelAdmin from django.contrib.admin.options import BaseModelAdmin, InlineModelAdmin, ModelAdmin
from django.core.checks.messages import Error from django.core.checks.messages import Error
def check_admin_app(app_configs: None, **kwargs: Any) -> List[str]: ... _CheckError = Union[str, Error]
def check_dependencies(**kwargs: Any) -> List[Error]: ...
def check_admin_app(app_configs: None, **kwargs: Any) -> List[_CheckError]: ...
def check_dependencies(**kwargs: Any) -> List[_CheckError]: ...
class BaseModelAdminChecks: class BaseModelAdminChecks:
def check(self, admin_obj: BaseModelAdmin, **kwargs: Any) -> List[Error]: ... def check(self, admin_obj: BaseModelAdmin, **kwargs: Any) -> List[_CheckError]: ...
class ModelAdminChecks(BaseModelAdminChecks): class ModelAdminChecks(BaseModelAdminChecks):
def check(self, admin_obj: ModelAdmin, **kwargs: Any) -> List[Error]: ... def check(self, admin_obj: ModelAdmin, **kwargs: Any) -> List[_CheckError]: ...
class InlineModelAdminChecks(BaseModelAdminChecks): class InlineModelAdminChecks(BaseModelAdminChecks):
def check(self, inline_obj: InlineModelAdmin, **kwargs: Any) -> List[Any]: ... def check(self, inline_obj: InlineModelAdmin, **kwargs: Any) -> List[_CheckError]: ...
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): ...

View File

@@ -1,7 +1,6 @@
from collections import OrderedDict from collections import OrderedDict
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, Union from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Type, Union
from django.contrib.admin.filters import SimpleListFilter
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
@@ -11,18 +10,17 @@ from django.core.checks.messages import Error
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.db.models.base import Model from django.db.models.base import Model
from django.forms.fields import TypedChoiceField
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.query import QuerySet from django.db.models.query import QuerySet
from django.forms.fields import TypedChoiceField
from django.forms.models import ModelChoiceField, ModelMultipleChoiceField from django.forms.models import ModelChoiceField, ModelMultipleChoiceField
from django.forms.widgets import Media from django.forms.widgets import Media
from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirect, JsonResponse from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirect, JsonResponse
from django.urls.resolvers import URLPattern from django.urls.resolvers import URLPattern
from django.utils.safestring import SafeText from django.utils.safestring import SafeText
from django.db.models.options import Options from django.db.models.fields import Field
IS_POPUP_VAR: str IS_POPUP_VAR: str
TO_FIELD_VAR: str TO_FIELD_VAR: str
@@ -55,7 +53,7 @@ class BaseModelAdmin:
view_on_site: bool = ... view_on_site: bool = ...
show_full_result_count: bool = ... show_full_result_count: bool = ...
checks_class: Any = ... checks_class: Any = ...
def check(self, **kwargs: Any) -> List[Error]: ... def check(self, **kwargs: Any) -> List[Union[str, Error]]: ...
def __init__(self) -> None: ... def __init__(self) -> None: ...
def formfield_for_dbfield(self, db_field: Field, request: WSGIRequest, **kwargs: Any) -> Optional[Field]: ... def formfield_for_dbfield(self, db_field: Field, request: WSGIRequest, **kwargs: Any) -> Optional[Field]: ...
def formfield_for_choice_field(self, db_field: Field, request: WSGIRequest, **kwargs: Any) -> TypedChoiceField: ... def formfield_for_choice_field(self, db_field: Field, request: WSGIRequest, **kwargs: Any) -> TypedChoiceField: ...
@@ -94,13 +92,13 @@ class BaseModelAdmin:
class ModelAdmin(BaseModelAdmin): class ModelAdmin(BaseModelAdmin):
formfield_overrides: Any formfield_overrides: Any
list_display: Any = ... list_display: Sequence[str] = ...
list_display_links: Any = ... list_display_links: Sequence[str] = ...
list_filter: Any = ... list_filter: Sequence[str] = ...
list_select_related: bool = ... list_select_related: Sequence[str] = ...
list_per_page: int = ... list_per_page: int = ...
list_max_show_all: int = ... list_max_show_all: int = ...
list_editable: Any = ... list_editable: Sequence[str] = ...
search_fields: Any = ... search_fields: Any = ...
date_hierarchy: Any = ... date_hierarchy: Any = ...
save_as: bool = ... save_as: bool = ...
@@ -167,17 +165,17 @@ class ModelAdmin(BaseModelAdmin):
self, request: WSGIRequest, default_choices: List[Tuple[str, str]] = ... self, request: WSGIRequest, 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]) -> Tuple[Callable, str, str]: ...
def get_list_display(self, request: WSGIRequest) -> Union[List[Callable], List[str], Tuple[str]]: ... def get_list_display(self, request: WSGIRequest) -> Sequence[str]: ...
def get_list_display_links( def get_list_display_links(self, request: WSGIRequest, list_display: Sequence[str]) -> Optional[Sequence[str]]: ...
self, request: WSGIRequest, list_display: Union[List[Callable], List[str], Tuple[str]] def get_list_filter(self, request: WSGIRequest) -> Sequence[str]: ...
) -> Optional[Union[List[Callable], List[str], Tuple[str]]]: ... def get_list_select_related(self, request: WSGIRequest) -> Sequence[str]: ...
def get_list_filter(self, request: WSGIRequest) -> Union[List[Type[SimpleListFilter]], List[str], Tuple]: ... def get_search_fields(self, request: WSGIRequest) -> List[str]: ...
def get_list_select_related(self, request: WSGIRequest) -> Union[Tuple, bool]: ...
def get_search_fields(self, request: WSGIRequest) -> Union[List[str], Tuple]: ...
def get_search_results( def get_search_results(
self, request: WSGIRequest, queryset: QuerySet, search_term: str self, request: WSGIRequest, queryset: QuerySet, search_term: str
) -> Tuple[QuerySet, bool]: ... ) -> Tuple[QuerySet, bool]: ...
def get_preserved_filters(self, request: WSGIRequest) -> str: ... def get_preserved_filters(self, request: WSGIRequest) -> str: ...
def _get_edited_object_pks(self, request: WSGIRequest, prefix: str) -> List[str]: ...
def _get_list_editable_queryset(self, request: WSGIRequest, prefix: str) -> QuerySet: ...
def construct_change_message( def construct_change_message(
self, request: WSGIRequest, form: AdminPasswordChangeForm, formsets: None, add: bool = ... self, request: WSGIRequest, form: AdminPasswordChangeForm, formsets: None, add: bool = ...
) -> List[Dict[str, Dict[str, List[str]]]]: ... ) -> List[Dict[str, Dict[str, List[str]]]]: ...
@@ -204,7 +202,9 @@ class ModelAdmin(BaseModelAdmin):
form_url: str = ..., form_url: str = ...,
obj: Optional[Any] = ..., obj: Optional[Any] = ...,
): ... ): ...
def response_add(self, request: WSGIRequest, obj: Model, post_url_continue: None = ...) -> HttpResponse: ... def response_add(
self, request: WSGIRequest, obj: Model, post_url_continue: Optional[str] = ...
) -> HttpResponse: ...
def response_change(self, request: WSGIRequest, obj: Model) -> HttpResponse: ... def response_change(self, request: WSGIRequest, obj: Model) -> HttpResponse: ...
def response_post_save_add(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ... def response_post_save_add(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ...
def response_post_save_change(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ... def response_post_save_change(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ...

View File

@@ -26,8 +26,9 @@ class AdminSite:
password_change_template: Any = ... password_change_template: Any = ...
password_change_done_template: Any = ... password_change_done_template: Any = ...
name: str = ... name: str = ...
_registry: Dict[Type[Model], ModelAdmin]
def __init__(self, name: str = ...) -> None: ... def __init__(self, name: str = ...) -> None: ...
def check(self, app_configs: None) -> List[str]: ... def check(self, app_configs: None) -> List[Any]: ...
def register( def register(
self, self,
model_or_iterable: Union[List[Type[Model]], Tuple[Type[Model]], Type[Model]], model_or_iterable: Union[List[Type[Model]], Tuple[Type[Model]], Type[Model]],
@@ -47,9 +48,9 @@ class AdminSite:
def empty_value_display(self, empty_value_display: Any) -> None: ... def empty_value_display(self, empty_value_display: Any) -> None: ...
def has_permission(self, request: WSGIRequest) -> bool: ... 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[Union[URLPattern, URLResolver]]: ... def get_urls(self) -> List[URLResolver]: ...
@property @property
def urls(self) -> Tuple[List[Union[URLPattern, URLResolver]], str, str]: ... def urls(self) -> Tuple[List[URLResolver], str, str]: ...
def each_context(self, request: Any): ... def each_context(self, request: Any): ...
def password_change(self, request: WSGIRequest, extra_context: Dict[str, str] = ...) -> TemplateResponse: ... def password_change(self, request: WSGIRequest, extra_context: Dict[str, str] = ...) -> TemplateResponse: ...
def password_change_done(self, request: WSGIRequest, extra_context: None = ...) -> TemplateResponse: ... def password_change_done(self, request: WSGIRequest, extra_context: None = ...) -> TemplateResponse: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, Iterator, List, Optional, Union from typing import Any, Dict, Iterator, List, Optional, Union, Iterable
from django.contrib.admin.filters import FieldListFilter from django.contrib.admin.filters import FieldListFilter
from django.contrib.admin.templatetags.base import InclusionAdminNode from django.contrib.admin.templatetags.base import InclusionAdminNode
@@ -15,7 +15,7 @@ register: Any
DOT: str DOT: str
def paginator_number(cl: ChangeList, i: int) -> SafeText: ... def paginator_number(cl: ChangeList, i: int) -> SafeText: ...
def pagination(cl: ChangeList) -> Dict[str, Union[List[Union[int, str]], ChangeList, int, range, str]]: ... def pagination(cl: ChangeList) -> Dict[str, Iterable[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: None) -> Iterator[SafeText]: ...

View File

@@ -9,6 +9,7 @@ from django.db.models.expressions import Combinable, CombinedExpression, OrderBy
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.db.models.options import Options from django.db.models.options import Options
from django.forms.formsets import BaseFormSet
ALL_VAR: str ALL_VAR: str
ORDER_VAR: str ORDER_VAR: str
@@ -44,6 +45,7 @@ class ChangeList:
queryset: Any = ... queryset: Any = ...
title: Any = ... title: Any = ...
pk_attname: Any = ... pk_attname: Any = ...
formset: Optional[BaseFormSet]
def __init__( def __init__(
self, self,
request: WSGIRequest, request: WSGIRequest,

View File

@@ -11,10 +11,8 @@ class BaseUserManager(models.Manager):
class AbstractBaseUser(models.Model): class AbstractBaseUser(models.Model):
password: models.CharField = ... password: models.CharField = ...
last_login: Optional[models.DateTimeField] = ... last_login: Optional[models.DateTimeField] = ...
is_active: bool = ... is_active: models.BooleanField = ...
REQUIRED_FIELDS: List[str] = ... REQUIRED_FIELDS: List[str] = ...
class Meta:
abstract: bool = ...
def get_username(self) -> str: ... def get_username(self) -> str: ...
def clean(self) -> None: ... def clean(self) -> None: ...
def save(self, *args: Any, **kwargs: Any) -> None: ... def save(self, *args: Any, **kwargs: Any) -> None: ...

View File

@@ -1,4 +1,3 @@
from collections import OrderedDict
from typing import Any, Callable, Dict, List, Optional from typing import Any, Callable, Dict, List, Optional
UNUSABLE_PASSWORD_PREFIX: str UNUSABLE_PASSWORD_PREFIX: str
@@ -17,92 +16,30 @@ def identify_hasher(encoded: str) -> BasePasswordHasher: ...
def mask_hash(hash: str, show: int = ..., char: str = ...) -> str: ... def mask_hash(hash: str, show: int = ..., char: str = ...) -> str: ...
class BasePasswordHasher: class BasePasswordHasher:
algorithm: Any = ... algorithm: str = ...
library: Any = ... library: str = ...
rounds: int = ...
time_cost: int = ...
memory_cost: int = ...
parallelism: int = ...
digest: Any = ...
iterations: Optional[int] = ...
def salt(self) -> str: ... def salt(self) -> str: ...
def verify(self, password: str, encoded: str) -> Any: ... def verify(self, password: str, encoded: str) -> bool: ...
def encode(self, password: str, salt: str) -> Any: ... def encode(self, password: str, salt: str) -> Any: ...
def safe_summary(self, encoded: str) -> Any: ... def safe_summary(self, encoded: str) -> Any: ...
def must_update(self, encoded: str) -> bool: ... def must_update(self, encoded: str) -> bool: ...
def harden_runtime(self, password: str, encoded: str) -> None: ... def harden_runtime(self, password: str, encoded: str) -> None: ...
class PBKDF2PasswordHasher(BasePasswordHasher): class PBKDF2PasswordHasher(BasePasswordHasher):
algorithm: str = ...
iterations: int = ...
digest: Any = ...
def encode(self, password: str, salt: str, iterations: Optional[int] = ...) -> str: ... def encode(self, password: str, salt: str, iterations: Optional[int] = ...) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def safe_summary(self, encoded: str) -> OrderedDict: ...
def must_update(self, encoded: str) -> bool: ...
def harden_runtime(self, password: str, encoded: str) -> None: ...
class PBKDF2SHA1PasswordHasher(PBKDF2PasswordHasher): class PBKDF2SHA1PasswordHasher(PBKDF2PasswordHasher): ...
algorithm: str = ... class Argon2PasswordHasher(BasePasswordHasher): ...
digest: Any = ... class BCryptSHA256PasswordHasher(BasePasswordHasher): ...
class BCryptPasswordHasher(BCryptSHA256PasswordHasher): ...
class Argon2PasswordHasher(BasePasswordHasher): class SHA1PasswordHasher(BasePasswordHasher): ...
algorithm: str = ... class MD5PasswordHasher(BasePasswordHasher): ...
library: str = ... class UnsaltedSHA1PasswordHasher(BasePasswordHasher): ...
time_cost: int = ... class UnsaltedMD5PasswordHasher(BasePasswordHasher): ...
memory_cost: int = ... class CryptPasswordHasher(BasePasswordHasher): ...
parallelism: int = ...
def encode(self, password: Any, salt: Any): ...
def verify(self, password: Any, encoded: Any): ...
def safe_summary(self, encoded: Any): ...
def must_update(self, encoded: Any): ...
def harden_runtime(self, password: Any, encoded: Any) -> None: ...
class BCryptSHA256PasswordHasher(BasePasswordHasher):
algorithm: str = ...
digest: Any = ...
library: Any = ...
rounds: int = ...
def salt(self): ...
def encode(self, password: Any, salt: Any): ...
def verify(self, password: Any, encoded: Any): ...
def safe_summary(self, encoded: Any): ...
def must_update(self, encoded: Any): ...
def harden_runtime(self, password: Any, encoded: Any) -> None: ...
class BCryptPasswordHasher(BCryptSHA256PasswordHasher):
algorithm: str = ...
digest: Any = ...
class SHA1PasswordHasher(BasePasswordHasher):
algorithm: str = ...
def encode(self, password: str, salt: str) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def safe_summary(self, encoded: Any): ...
def harden_runtime(self, password: Any, encoded: Any) -> None: ...
class MD5PasswordHasher(BasePasswordHasher):
algorithm: str = ...
def encode(self, password: str, salt: str) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def safe_summary(self, encoded: str) -> OrderedDict: ...
def harden_runtime(self, password: Any, encoded: Any) -> None: ...
class UnsaltedSHA1PasswordHasher(BasePasswordHasher):
algorithm: str = ...
def salt(self) -> str: ...
def encode(self, password: str, salt: str) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def safe_summary(self, encoded: Any): ...
def harden_runtime(self, password: Any, encoded: Any) -> None: ...
class UnsaltedMD5PasswordHasher(BasePasswordHasher):
algorithm: str = ...
def salt(self) -> str: ...
def encode(self, password: str, salt: str) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def safe_summary(self, encoded: Any): ...
def harden_runtime(self, password: Any, encoded: Any) -> None: ...
class CryptPasswordHasher(BasePasswordHasher):
algorithm: str = ...
library: str = ...
def salt(self): ...
def encode(self, password: Any, salt: Any): ...
def verify(self, password: Any, encoded: Any): ...
def safe_summary(self, encoded: Any): ...
def harden_runtime(self, password: Any, encoded: Any) -> None: ...

View File

@@ -1,6 +1,14 @@
from django.db.models.base import Model
from typing import Any, List, Type from typing import Any, List, Type
from django.contrib.admin.options import InlineModelAdmin
from django.db.models.base import Model
class GenericInlineModelAdminChecks: class GenericInlineModelAdminChecks:
def _check_exclude_of_parent_model(self, obj: GenericTabularInline, 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: GenericTabularInline, parent_model: Type[Model]) -> List[Any]: ... def _check_relation(self, obj: GenericInlineModelAdmin, parent_model: Type[Model]) -> List[Any]: ...
class GenericInlineModelAdmin(InlineModelAdmin):
template: str = ...
class GenericStackedInline(GenericInlineModelAdmin): ...
class GenericTabularInline(GenericInlineModelAdmin): ...

View File

@@ -79,6 +79,7 @@ class GenericRelation(ForeignObject):
object_id_field_name: Any = ... object_id_field_name: Any = ...
content_type_field_name: Any = ... content_type_field_name: Any = ...
for_concrete_model: Any = ... for_concrete_model: Any = ...
to_fields: Any = ...
def __init__( def __init__(
self, self,
to: Union[Type[Model], str], to: Union[Type[Model], str],
@@ -90,13 +91,11 @@ class GenericRelation(ForeignObject):
**kwargs: Any **kwargs: Any
) -> None: ... ) -> None: ...
def check(self, **kwargs: Any) -> List[Error]: ... def check(self, **kwargs: Any) -> List[Error]: ...
to_fields: Any = ...
def resolve_related_fields(self) -> List[Tuple[PositiveIntegerField, Field]]: ... def resolve_related_fields(self) -> List[Tuple[PositiveIntegerField, 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: None = ...) -> List[PathInfo]: ...
def value_to_string(self, obj: Model) -> str: ... def value_to_string(self, obj: Model) -> str: ...
model: Any = ... model: Any = ...
def contribute_to_class(self, cls: Type[Model], name: str, **kwargs: Any) -> None: ...
def set_attributes_from_rel(self) -> None: ... def set_attributes_from_rel(self) -> None: ...
def get_internal_type(self) -> str: ... def get_internal_type(self) -> str: ...
def get_content_type(self) -> ContentType: ... def get_content_type(self) -> ContentType: ...

View File

@@ -1,4 +1,4 @@
from datetime import date, datetime from datetime import date, datetime as datetime
from decimal import Decimal from decimal import Decimal
from typing import Any, Optional, Union from typing import Any, Optional, Union

View File

@@ -0,0 +1 @@
from .api import get_level as get_level, set_level as set_level

View File

@@ -13,22 +13,14 @@ class ArrayField(CheckFieldDefaultMixin, Field, Generic[_T]):
default_validators: Any = ... default_validators: Any = ...
from_db_value: Any = ... from_db_value: Any = ...
def __init__(self, base_field: _T, size: None = ..., **kwargs: Any) -> None: ... def __init__(self, base_field: _T, size: None = ..., **kwargs: Any) -> None: ...
@property
def model(self): ...
@model.setter
def model(self, model: Any) -> None: ...
def check(self, **kwargs: Any) -> List[Any]: ... def check(self, **kwargs: Any) -> List[Any]: ...
def set_attributes_from_name(self, name: str) -> None: ...
@property @property
def description(self): ... def description(self): ...
def db_type(self, connection: Any): ...
def get_db_prep_value(self, value: Any, connection: Any, prepared: bool = ...): ... def get_db_prep_value(self, value: Any, connection: Any, prepared: bool = ...): ...
def deconstruct(self) -> Tuple[None, str, List[Any], Dict[str, Optional[Union[bool, Field]]]]: ...
def to_python(self, value: Any): ... def to_python(self, value: Any): ...
def value_to_string(self, obj: Any): ... def value_to_string(self, obj: Any): ...
def get_transform(self, name: Any): ... def get_transform(self, name: Any): ...
def validate(self, value: Any, model_instance: Any) -> None: ... def validate(self, value: Any, model_instance: Any) -> None: ...
def run_validators(self, value: Any) -> None: ... def run_validators(self, value: Any) -> None: ...
def formfield(self, **kwargs: Any): ...
def __set__(self, instance, value: Sequence[_T]): ... def __set__(self, instance, value: Sequence[_T]): ...
def __get__(self, instance, owner) -> List[_T]: ... def __get__(self, instance, owner) -> List[_T]: ...

View File

@@ -5,43 +5,13 @@ from django.db import models
class RangeField(models.Field): class RangeField(models.Field):
empty_strings_allowed: bool = ... empty_strings_allowed: bool = ...
base_field: Any = ... base_field: Any = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... range_type: Any = ...
@property
def model(self): ...
@model.setter
def model(self, model: Any) -> None: ...
def get_prep_value(self, value: Any): ... def get_prep_value(self, value: Any): ...
def to_python(self, value: Any): ... def to_python(self, value: Any): ...
def set_attributes_from_name(self, name: str) -> None: ...
def value_to_string(self, obj: Any): ... def value_to_string(self, obj: Any): ...
def formfield(self, **kwargs: Any): ...
class IntegerRangeField(RangeField): class IntegerRangeField(RangeField): ...
base_field: Any = ... class BigIntegerRangeField(RangeField): ...
range_type: Any = ... class FloatRangeField(RangeField): ...
form_field: Any = ... class DateTimeRangeField(RangeField): ...
def db_type(self, connection: Any): ... class DateRangeField(RangeField): ...
class BigIntegerRangeField(RangeField):
base_field: Any = ...
range_type: Any = ...
form_field: Any = ...
def db_type(self, connection: Any): ...
class FloatRangeField(RangeField):
base_field: Any = ...
range_type: Any = ...
form_field: Any = ...
def db_type(self, connection: Any): ...
class DateTimeRangeField(RangeField):
base_field: Any = ...
range_type: Any = ...
form_field: Any = ...
def db_type(self, connection: Any): ...
class DateRangeField(RangeField):
base_field: Any = ...
range_type: Any = ...
form_field: Any = ...
def db_type(self, connection: Any): ...

View File

@@ -41,10 +41,10 @@ class SessionBase:
def get_expire_at_browser_close(self) -> bool: ... def get_expire_at_browser_close(self) -> bool: ...
def flush(self) -> None: ... def flush(self) -> None: ...
def cycle_key(self) -> None: ... def cycle_key(self) -> None: ...
def exists(self, session_key: Any) -> None: ... def exists(self, session_key: str) -> None: ...
def create(self) -> None: ... def create(self) -> None: ...
def save(self, must_create: bool = ...) -> None: ... def save(self, must_create: bool = ...) -> None: ...
def delete(self, session_key: Optional[Any] = ...) -> None: ... def delete(self, session_key: Optional[Any] = ...) -> None: ...
def load(self) -> None: ... def load(self) -> Dict[str, Any]: ...
@classmethod @classmethod
def clear_expired(cls) -> None: ... def clear_expired(cls) -> None: ...

View File

@@ -2,11 +2,10 @@ from typing import Type
from django.contrib.sessions.backends.base import SessionBase from django.contrib.sessions.backends.base import SessionBase
from django.core.handlers.wsgi import WSGIRequest 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 SessionMiddleware(MiddlewareMixin): class SessionMiddleware(MiddlewareMixin):
SessionStore: Type[SessionBase] = ... SessionStore: Type[SessionBase] = ...
def process_request(self, request: HttpRequest) -> None: ... def process_request(self, request: WSGIRequest) -> None: ...
def process_response(self, request: WSGIRequest, response: HttpResponse) -> HttpResponse: ... def process_response(self, request: WSGIRequest, response: HttpResponse) -> HttpResponse: ...

View File

@@ -21,7 +21,7 @@ class BaseCache:
def get_backend_timeout(self, timeout: Any = ...) -> Optional[float]: ... def get_backend_timeout(self, timeout: Any = ...) -> Optional[float]: ...
def make_key(self, key: Union[int, str], version: Optional[Union[int, str]] = ...) -> str: ... def make_key(self, key: Union[int, str], version: Optional[Union[int, str]] = ...) -> str: ...
def add(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ... def add(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ...
def get(self, key: Any, default: Optional[Any] = ..., version: Optional[Any] = ...) -> None: ... def get(self, key: Any, default: Optional[Any] = ..., version: Optional[Any] = ...) -> Any: ...
def set(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ... def set(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ...
def touch(self, key: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ... def touch(self, key: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ...
def delete(self, key: Any, version: Optional[Any] = ...) -> None: ... def delete(self, key: Any, version: Optional[Any] = ...) -> None: ...

View File

@@ -1 +1,3 @@
from .messages import Warning as Warning, Info as Info, Debug as Debug, Error as Error, Critical as Critical from .messages import Warning as Warning, Info as Info, Debug as Debug, Error as Error, Critical as Critical
from .registry import run_checks as run_checks, Tags as Tags, register as register

View File

@@ -6,6 +6,10 @@ from django.http.response import HttpResponse, HttpResponseBase
logger: Any logger: Any
class BaseHandler: class BaseHandler:
_view_middleware: None = ...
_template_response_middleware: None = ...
_exception_middleware: None = ...
_middleware_chain: None = ...
def load_middleware(self) -> None: ... def load_middleware(self) -> None: ...
def make_view_atomic(self, view: Callable) -> Callable: ... def make_view_atomic(self, view: Callable) -> Callable: ...
def get_exception_response(self, request: Any, resolver: Any, status_code: Any, exception: Any): ... def get_exception_response(self, request: Any, resolver: Any, status_code: Any, exception: Any): ...

View File

@@ -1,4 +1,4 @@
from typing import Dict, List, Optional, Union, Iterable, Sequence from typing import Dict, List, Optional, Union, Iterable, Sequence, Protocol, Any
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
@@ -8,13 +8,23 @@ class InvalidPage(Exception): ...
class PageNotAnInteger(InvalidPage): ... class PageNotAnInteger(InvalidPage): ...
class EmptyPage(InvalidPage): ... class EmptyPage(InvalidPage): ...
class SupportsLen(Protocol):
def __len__(self) -> int: ...
class SupportsCount(Protocol):
def count(self) -> int: ...
class Paginator: class Paginator:
object_list: QuerySet = ... object_list: QuerySet = ...
per_page: int = ... per_page: int = ...
orphans: int = ... orphans: int = ...
allow_empty_first_page: bool = ... allow_empty_first_page: bool = ...
def __init__( def __init__(
self, object_list: Iterable, per_page: Union[int, str], orphans: int = ..., allow_empty_first_page: bool = ... self,
object_list: Union[SupportsLen, SupportsCount],
per_page: Union[int, str],
orphans: int = ...,
allow_empty_first_page: bool = ...,
) -> None: ... ) -> None: ...
def validate_number(self, number: Optional[Union[float, str]]) -> int: ... def validate_number(self, number: Optional[Union[float, str]]) -> int: ...
def get_page(self, number: Optional[int]) -> Page: ... def get_page(self, number: Optional[int]) -> Page: ...

View File

@@ -2,10 +2,18 @@ from collections import OrderedDict
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type, Union
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.core.serializers.base import Serializer, Deserializer
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 .base import (
Serializer as Serializer,
Deserializer as Deserializer,
SerializerDoesNotExist as SerializerDoesNotExist,
SerializationError as SerializationError,
DeserializationError as DeserializationError,
M2MDeserializationError as M2MDeserializationError,
)
BUILTIN_SERIALIZERS: Any BUILTIN_SERIALIZERS: Any
class BadSerializer: class BadSerializer:

View File

@@ -18,10 +18,11 @@ from . import migrations
connections: Any connections: Any
router: Any router: Any
connection: Any
class DefaultConnectionProxy: class DefaultConnectionProxy:
def __getattr__(self, item: str) -> Any: ... def __getattr__(self, item: str) -> Any: ...
def __setattr__(self, name: str, value: Any) -> None: ... def __setattr__(self, name: str, value: Any) -> None: ...
def __delattr__(self, name: str) -> None: ... def __delattr__(self, name: str) -> None: ...
connection: Any def close_old_connections(**kwargs): ...

View File

@@ -37,6 +37,7 @@ from .fields import (
FilePathField as FilePathField, FilePathField as FilePathField,
BinaryField as BinaryField, BinaryField as BinaryField,
DurationField as DurationField, DurationField as DurationField,
BigAutoField as BigAutoField,
) )
from .fields.related import ( from .fields.related import (
@@ -78,8 +79,21 @@ from .expressions import (
RawSQL as RawSQL, RawSQL as RawSQL,
Value as Value, Value as Value,
Func as Func, Func as Func,
ExpressionWrapper as ExpressionWrapper,
) )
from .manager import BaseManager as BaseManager, Manager as Manager from .manager import BaseManager as BaseManager, Manager as Manager
from . import lookups as lookups from . import lookups as lookups
from .aggregates import (
Avg as Avg,
Min as Min,
Max as Max,
Variance as Variance,
StdDev as StdDev,
Sum as Sum,
Aggregate as Aggregate,
)
from .indexes import Index as Index

View File

@@ -1,15 +1,18 @@
from typing import Any, List, Optional, Set, Tuple, Dict from typing import Any, Dict, List, Optional, Set, Tuple, TypeVar, Union
from django.db.models.manager import Manager from django.db.models.manager import Manager
class ModelBase(type): ... class ModelBase(type): ...
_Self = TypeVar("_Self", bound="Model")
class Model(metaclass=ModelBase): class Model(metaclass=ModelBase):
class DoesNotExist(Exception): class DoesNotExist(Exception):
pass pass
_meta: Any
pk: Any = ... pk: Any = ...
objects: Manager[Model] objects: Manager[Model]
def __init__(self, **kwargs) -> None: ... def __init__(self, *args, **kwargs) -> None: ...
def delete(self, using: Any = ..., keep_parents: bool = ...) -> Tuple[int, Dict[str, int]]: ... def delete(self, using: Any = ..., keep_parents: bool = ...) -> Tuple[int, Dict[str, int]]: ...
def full_clean(self, exclude: Optional[List[str]] = ..., validate_unique: bool = ...) -> None: ... def full_clean(self, exclude: Optional[List[str]] = ..., validate_unique: bool = ...) -> None: ...
def clean_fields(self, exclude: List[str] = ...) -> None: ... def clean_fields(self, exclude: List[str] = ...) -> None: ...
@@ -19,7 +22,14 @@ class Model(metaclass=ModelBase):
force_insert: bool = ..., force_insert: bool = ...,
force_update: bool = ..., force_update: bool = ...,
using: Optional[str] = ..., using: Optional[str] = ...,
update_fields: Optional[List[str]] = ..., update_fields: Optional[Union[List[str], str]] = ...,
) -> None: ... ) -> None: ...
def refresh_from_db(self, using: None = ..., fields: Optional[List[str]] = ...) -> None: ... def refresh_from_db(self: _Self, using: Optional[str] = ..., fields: Optional[List[str]] = ...) -> _Self: ...
def get_deferred_fields(self) -> Set[str]: ... def get_deferred_fields(self) -> Set[str]: ...
class ModelStateFieldsCacheDescriptor: ...
class ModelState:
db: None = ...
adding: bool = ...
fields_cache: ModelStateFieldsCacheDescriptor = ...

View File

@@ -1,5 +1,9 @@
from django.db import IntegrityError
def CASCADE(collector, field, sub_objs, using): ... def CASCADE(collector, field, sub_objs, using): ...
def SET_NULL(collector, field, sub_objs, using): ... def SET_NULL(collector, field, sub_objs, using): ...
def SET_DEFAULT(collector, field, sub_objs, using): ... def SET_DEFAULT(collector, field, sub_objs, using): ...
def DO_NOTHING(collector, field, sub_objs, using): ... def DO_NOTHING(collector, field, sub_objs, using): ...
def PROTECT(collector, field, sub_objs, using): ... def PROTECT(collector, field, sub_objs, using): ...
class ProtectedError(IntegrityError): ...

View File

@@ -1,13 +1,16 @@
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Tuple, Type, Union from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, Union
from django.db.models import QuerySet
from django.db.models.fields import Field
from django.db.models.lookups import Lookup from django.db.models.lookups import Lookup
from django.db.models.sql import Query
from django.db.models.sql.compiler import SQLCompiler from django.db.models.sql.compiler import SQLCompiler
from django.db.models import Q, QuerySet
from django.db.models.fields import Field
from django.db.models.sql import Query
_OutputField = Union[Field, str]
class SQLiteNumericMixin: class SQLiteNumericMixin:
def as_sqlite(self, compiler: SQLCompiler, connection: Any, **extra_context: Any) -> Tuple[str, List[float]]: ... def as_sqlite(self, compiler: SQLCompiler, connection: Any, **extra_context: Any) -> Tuple[str, List[float]]: ...
@@ -26,9 +29,10 @@ class Combinable:
def __add__(self, other: Optional[Union[timedelta, Combinable, float, str]]) -> CombinedExpression: ... def __add__(self, other: Optional[Union[timedelta, Combinable, float, str]]) -> CombinedExpression: ...
def __sub__(self, other: Union[timedelta, Combinable, float]) -> CombinedExpression: ... def __sub__(self, other: Union[timedelta, Combinable, float]) -> CombinedExpression: ...
def __mul__(self, other: Union[timedelta, Combinable, float]) -> CombinedExpression: ... def __mul__(self, other: Union[timedelta, Combinable, float]) -> CombinedExpression: ...
def __truediv__(self, other: float) -> CombinedExpression: ... def __truediv__(self, other: Union[Combinable, float]) -> Combinable: ...
def __mod__(self, other: int) -> CombinedExpression: ... def __itruediv__(self, other: Union[Combinable, float]) -> Combinable: ...
def __pow__(self, other: float) -> CombinedExpression: ... def __mod__(self, other: int) -> Combinable: ...
def __pow__(self, other: float) -> Combinable: ...
def __and__(self, other: Combinable) -> Any: ... def __and__(self, other: Combinable) -> Any: ...
def bitand(self, other: int) -> CombinedExpression: ... def bitand(self, other: int) -> CombinedExpression: ...
def bitleftshift(self, other: int) -> CombinedExpression: ... def bitleftshift(self, other: int) -> CombinedExpression: ...
@@ -48,11 +52,10 @@ class BaseExpression:
is_summary: bool = ... is_summary: bool = ...
filterable: bool = ... filterable: bool = ...
window_compatible: bool = ... window_compatible: bool = ...
def __init__(self, output_field: Optional[Union[Field, str]] = ...) -> None: ... def __init__(self, output_field: Optional[_OutputField] = ...) -> None: ...
def get_db_converters(self, connection: Any) -> List[Callable]: ... def get_db_converters(self, connection: Any) -> List[Callable]: ...
def get_source_expressions(self) -> List[Any]: ... def get_source_expressions(self) -> List[Any]: ...
def set_source_expressions(self, exprs: List[Any]) -> None: ... def set_source_expressions(self, exprs: List[Any]) -> None: ...
def as_sql(self, compiler: Any, connection: Any) -> None: ...
def contains_aggregate(self) -> bool: ... def contains_aggregate(self) -> bool: ...
def contains_over_clause(self) -> bool: ... def contains_over_clause(self) -> bool: ...
def contains_column_references(self) -> bool: ... def contains_column_references(self) -> bool: ...
@@ -80,6 +83,12 @@ class BaseExpression:
def reverse_ordering(self): ... def reverse_ordering(self): ...
def flatten(self) -> Iterator[Expression]: ... def flatten(self) -> Iterator[Expression]: ...
def __hash__(self) -> int: ... def __hash__(self) -> int: ...
def deconstruct(self) -> Any: ...
def as_sqlite(self, compiler: SQLCompiler, connection: Any) -> Any: ...
def as_sql(self, compiler: SQLCompiler, connection: Any, **extra_context: Any) -> Any: ...
def as_mysql(self, compiler: Any, connection: Any) -> Any: ...
def as_postgresql(self, compiler: Any, connection: Any) -> Any: ...
def as_oracle(self, compiler: Any, connection: Any): ...
class Expression(BaseExpression, Combinable): ... class Expression(BaseExpression, Combinable): ...
@@ -87,10 +96,11 @@ class CombinedExpression(SQLiteNumericMixin, Expression):
connector: Any = ... connector: Any = ...
lhs: Any = ... lhs: Any = ...
rhs: Any = ... rhs: Any = ...
def __init__(self, lhs: Combinable, connector: str, rhs: Combinable, output_field: None = ...) -> None: ... def __init__(
self, lhs: Combinable, connector: str, rhs: Combinable, output_field: Optional[_OutputField] = ...
) -> None: ...
def get_source_expressions(self) -> Union[List[Combinable], List[SQLiteNumericMixin]]: ... def get_source_expressions(self) -> Union[List[Combinable], List[SQLiteNumericMixin]]: ...
def set_source_expressions(self, exprs: List[Combinable]) -> None: ... def set_source_expressions(self, exprs: List[Combinable]) -> None: ...
def as_sql(self, compiler: SQLCompiler, connection: Any) -> Any: ...
def resolve_expression( def resolve_expression(
self, self,
query: Any = ..., query: Any = ...,
@@ -111,6 +121,9 @@ class F(Combinable):
summarize: bool = ..., summarize: bool = ...,
for_save: bool = ..., for_save: bool = ...,
) -> Expression: ... ) -> Expression: ...
def asc(self, **kwargs) -> OrderBy: ...
def desc(self, **kwargs) -> OrderBy: ...
def deconstruct(self) -> Any: ...
class OuterRef(F): ... class OuterRef(F): ...
@@ -118,7 +131,7 @@ class Subquery(Expression):
template: str = ... template: str = ...
queryset: QuerySet = ... queryset: QuerySet = ...
extra: Dict[Any, Any] = ... extra: Dict[Any, Any] = ...
def __init__(self, queryset: QuerySet, output_field: Optional[Field] = ..., **extra: Any) -> None: ... def __init__(self, queryset: QuerySet, output_field: Optional[_OutputField] = ..., **extra: Any) -> None: ...
class Exists(Subquery): class Exists(Subquery):
extra: Dict[Any, Any] extra: Dict[Any, Any]
@@ -139,13 +152,13 @@ class OrderBy(BaseExpression):
class Value(Expression): class Value(Expression):
value: Any = ... value: Any = ...
def __init__(self, value: Any, output_field: Optional[Field] = ...) -> None: ... def __init__(self, value: Any, output_field: Optional[_OutputField] = ...) -> None: ...
class RawSQL(Expression): class RawSQL(Expression):
output_field: Field output_field: Field
params: List[Any] params: List[Any]
sql: str sql: str
def __init__(self, sql: str, params: Union[List[int], List[str], Tuple], output_field: None = ...) -> None: ... def __init__(self, sql: str, params: Sequence[Any], output_field: Optional[_OutputField] = ...) -> None: ...
class Func(SQLiteNumericMixin, Expression): class Func(SQLiteNumericMixin, Expression):
function: Any = ... function: Any = ...
@@ -154,7 +167,7 @@ class Func(SQLiteNumericMixin, Expression):
arity: Any = ... arity: Any = ...
source_expressions: List[Expression] = ... source_expressions: List[Expression] = ...
extra: Any = ... extra: Any = ...
def __init__(self, *expressions: Any, output_field: Optional[Any] = ..., **extra: Any) -> None: ... def __init__(self, *expressions: Any, output_field: Optional[_OutputField] = ..., **extra: Any) -> None: ...
def get_source_expressions(self) -> List[Combinable]: ... def get_source_expressions(self) -> List[Combinable]: ...
def set_source_expressions(self, exprs: List[Expression]) -> None: ... def set_source_expressions(self, exprs: List[Expression]) -> None: ...
def resolve_expression( def resolve_expression(
@@ -180,5 +193,10 @@ class Case(Expression):
default: Any = ... default: Any = ...
extra: Any = ... extra: Any = ...
def __init__( def __init__(
self, *cases: Any, default: Optional[Any] = ..., output_field: Optional[Any] = ..., **extra: Any self, *cases: Any, default: Optional[Any] = ..., output_field: Optional[_OutputField] = ..., **extra: Any
) -> None: ... ) -> None: ...
class ExpressionWrapper(Expression):
def __init__(self, expression: Union[Expression, Q], output_field: _OutputField): ...
def set_source_expressions(self, exprs: Sequence[Expression]) -> None: ...
def get_source_expressions(self) -> List[Expression]: ...

View File

@@ -1,6 +1,8 @@
from typing import Any, Optional, Tuple, Iterable, Callable, Dict, Union from typing import Any, Optional, Tuple, Iterable, Callable, Dict, Union, Type
from django.db.models import Model
from django.db.models.query_utils import RegisterLookupMixin from django.db.models.query_utils import RegisterLookupMixin
from django.forms import Widget, Field as FormField
_Choice = Tuple[Any, str] _Choice = Tuple[Any, str]
_ChoiceNamedGroup = Tuple[str, Iterable[_Choice]] _ChoiceNamedGroup = Tuple[str, Iterable[_Choice]]
@@ -10,11 +12,18 @@ _ValidatorCallable = Callable[..., None]
_ErrorMessagesToOverride = Dict[str, Any] _ErrorMessagesToOverride = Dict[str, Any]
class Field(RegisterLookupMixin): class Field(RegisterLookupMixin):
widget: Widget
help_text: str
db_table: str
remote_field: Field
model: Type[Model]
name: str
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[str] = ...,
name: Optional[str] = ..., name: Optional[str] = ...,
primary_key: bool = ..., primary_key: bool = ...,
max_length: Optional[int] = ...,
unique: bool = ..., unique: bool = ...,
blank: bool = ..., blank: bool = ...,
null: bool = ..., null: bool = ...,
@@ -23,6 +32,9 @@ class Field(RegisterLookupMixin):
editable: bool = ..., editable: bool = ...,
auto_created: bool = ..., auto_created: bool = ...,
serialize: bool = ..., serialize: bool = ...,
unique_for_date: Optional[str] = ...,
unique_for_month: Optional[str] = ...,
unique_for_year: Optional[str] = ...,
choices: Optional[_FieldChoices] = ..., choices: Optional[_FieldChoices] = ...,
help_text: str = ..., help_text: str = ...,
db_column: Optional[str] = ..., db_column: Optional[str] = ...,
@@ -31,6 +43,13 @@ class Field(RegisterLookupMixin):
error_messages: Optional[_ErrorMessagesToOverride] = ..., error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ... ): ...
def __get__(self, instance, owner) -> Any: ... def __get__(self, instance, owner) -> Any: ...
def deconstruct(self) -> Any: ...
def set_attributes_from_name(self, name: str) -> None: ...
def db_type(self, connection: Any) -> str: ...
def db_parameters(self, connection: Any) -> Dict[str, str]: ...
def get_prep_value(self, value: Any) -> Any: ...
def formfield(self, **kwargs) -> FormField: ...
def contribute_to_class(self, cls: Type[Model], name: str, private_only: bool = ...) -> None: ...
class IntegerField(Field): class IntegerField(Field):
def __get__(self, instance, owner) -> int: ... def __get__(self, instance, owner) -> int: ...
@@ -86,6 +105,9 @@ class CharField(Field):
editable: bool = ..., editable: bool = ...,
auto_created: bool = ..., auto_created: bool = ...,
serialize: bool = ..., serialize: bool = ...,
unique_for_date: Optional[str] = ...,
unique_for_month: Optional[str] = ...,
unique_for_year: Optional[str] = ...,
choices: Optional[_FieldChoices] = ..., choices: Optional[_FieldChoices] = ...,
help_text: str = ..., help_text: str = ...,
db_column: Optional[str] = ..., db_column: Optional[str] = ...,
@@ -112,6 +134,9 @@ class SlugField(CharField):
editable: bool = ..., editable: bool = ...,
auto_created: bool = ..., auto_created: bool = ...,
serialize: bool = ..., serialize: bool = ...,
unique_for_date: Optional[str] = ...,
unique_for_month: Optional[str] = ...,
unique_for_year: Optional[str] = ...,
choices: Optional[_FieldChoices] = ..., choices: Optional[_FieldChoices] = ...,
help_text: str = ..., help_text: str = ...,
db_column: Optional[str] = ..., db_column: Optional[str] = ...,
@@ -168,6 +193,31 @@ class GenericIPAddressField(Field):
class DateTimeCheckMixin: ... class DateTimeCheckMixin: ...
class DateField(DateTimeCheckMixin, Field): class DateField(DateTimeCheckMixin, Field):
def __init__(
self,
verbose_name: Optional[str] = ...,
name: Optional[str] = ...,
auto_now: bool = ...,
auto_now_add: bool = ...,
primary_key: bool = ...,
max_length: Optional[int] = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: Optional[_FieldChoices] = ...,
help_text: str = ...,
db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ...
class TimeField(DateTimeCheckMixin, Field):
def __init__( def __init__(
self, self,
verbose_name: Optional[str] = ..., verbose_name: Optional[str] = ...,
@@ -191,7 +241,6 @@ class DateField(DateTimeCheckMixin, Field):
error_messages: Optional[_ErrorMessagesToOverride] = ..., error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ... ): ...
class TimeField(DateTimeCheckMixin, Field): ...
class DateTimeField(DateField): ... class DateTimeField(DateField): ...
class UUIDField(Field): ... class UUIDField(Field): ...
@@ -206,6 +255,7 @@ class FilePathField(Field):
allow_files: bool = ..., allow_files: bool = ...,
allow_folders: bool = ..., allow_folders: bool = ...,
primary_key: bool = ..., primary_key: bool = ...,
max_length: int = ...,
unique: bool = ..., unique: bool = ...,
blank: bool = ..., blank: bool = ...,
null: bool = ..., null: bool = ...,
@@ -224,3 +274,4 @@ class FilePathField(Field):
class BinaryField(Field): ... class BinaryField(Field): ...
class DurationField(Field): ... class DurationField(Field): ...
class BigAutoField(AutoField): ...

View File

@@ -51,7 +51,6 @@ class FileField(Field):
def get_internal_type(self) -> str: ... def get_internal_type(self) -> str: ...
def get_prep_value(self, value: Union[FieldFile, str]) -> str: ... def get_prep_value(self, value: Union[FieldFile, str]) -> str: ...
def pre_save(self, model_instance: Model, add: bool) -> FieldFile: ... def pre_save(self, model_instance: Model, add: bool) -> FieldFile: ...
def contribute_to_class(self, cls: Type[Model], name: str, **kwargs: Any) -> None: ...
def generate_filename(self, instance: Optional[Model], filename: str) -> str: ... def generate_filename(self, instance: Optional[Model], filename: str) -> str: ...
def save_form_data(self, instance: Model, data: Optional[Union[bool, File, str]]) -> None: ... def save_form_data(self, instance: Model, data: Optional[Union[bool, File, str]]) -> None: ...
def formfield(self, **kwargs: Any) -> form_fields.FileField: ... def formfield(self, **kwargs: Any) -> form_fields.FileField: ...
@@ -75,6 +74,5 @@ class ImageField(FileField):
) -> None: ... ) -> None: ...
def check(self, **kwargs: Any) -> List[Any]: ... def check(self, **kwargs: Any) -> List[Any]: ...
def deconstruct(self) -> Any: ... def deconstruct(self) -> Any: ...
def contribute_to_class(self, cls: Type[Model], name: str, **kwargs: Any) -> None: ...
def update_dimension_fields(self, instance: Model, force: bool = ..., *args: Any, **kwargs: Any) -> None: ... def update_dimension_fields(self, instance: Model, force: bool = ..., *args: Any, **kwargs: Any) -> None: ...
def formfield(self, **kwargs: Any) -> form_fields.ImageField: ... def formfield(self, **kwargs: Any) -> form_fields.ImageField: ...

View File

@@ -1,9 +1,35 @@
from typing import Type, Union, TypeVar, Any, Generic, List, Optional, Dict, Callable, Tuple, Sequence, TYPE_CHECKING from typing import (
Type,
Union,
TypeVar,
Any,
Generic,
List,
Optional,
Dict,
Callable,
Tuple,
Sequence,
TYPE_CHECKING,
Iterable,
)
from uuid import UUID from uuid import UUID
from django.db import models from django.db import models
from django.db.models import Field, Model, QuerySet from django.db.models import Field, Model, QuerySet
from django.db.models.fields.mixins import FieldCacheMixin from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.fields.related_descriptors import (
ReverseManyToOneDescriptor as ReverseManyToOneDescriptor,
ReverseOneToOneDescriptor as ReverseOneToOneDescriptor,
ForwardManyToOneDescriptor as ForwardManyToOneDescriptor,
ForwardOneToOneDescriptor as ForwardOneToOneDescriptor,
ManyToManyDescriptor as ManyToManyDescriptor,
)
from django.db.models.fields.reverse_related import (
ForeignObjectRel as ForeignObjectRel,
ManyToManyRel as ManyToManyRel,
ManyToOneRel as ManyToOneRel,
)
from django.db.models.query_utils import PathInfo, Q from django.db.models.query_utils import PathInfo, Q
if TYPE_CHECKING: if TYPE_CHECKING:
@@ -11,6 +37,15 @@ if TYPE_CHECKING:
_T = TypeVar("_T", bound=models.Model) _T = TypeVar("_T", bound=models.Model)
_Choice = Tuple[Any, str]
_ChoiceNamedGroup = Tuple[str, Iterable[_Choice]]
_FieldChoices = Iterable[Union[_Choice, _ChoiceNamedGroup]]
_ValidatorCallable = Callable[..., None]
_ErrorMessagesToOverride = Dict[str, Any]
RECURSIVE_RELATIONSHIP_CONSTANT: str = ...
class RelatedField(FieldCacheMixin, Field): class RelatedField(FieldCacheMixin, Field):
one_to_many: bool = ... one_to_many: bool = ...
one_to_one: bool = ... one_to_one: bool = ...
@@ -29,12 +64,41 @@ class RelatedField(FieldCacheMixin, Field):
def set_attributes_from_rel(self) -> None: ... def set_attributes_from_rel(self) -> None: ...
def do_related_class(self, other: Type[Model], cls: Type[Model]) -> None: ... def do_related_class(self, other: Type[Model], cls: Type[Model]) -> None: ...
def get_limit_choices_to(self) -> Dict[str, int]: ... def get_limit_choices_to(self) -> Dict[str, int]: ...
def formfield(self, **kwargs: Any) -> Field: ...
def related_query_name(self) -> str: ... def related_query_name(self) -> str: ...
@property @property
def target_field(self) -> Field: ... def target_field(self) -> Field: ...
class ForeignObject(RelatedField): ... class ForeignObject(RelatedField):
def __init__(
self,
to: Union[Type[Model], str],
on_delete: Callable[..., None],
from_fields: Sequence[str],
to_fields: Sequence[str],
rel: None = ...,
related_name: Optional[str] = ...,
related_query_name: None = ...,
limit_choices_to: None = ...,
parent_link: bool = ...,
swappable: bool = ...,
verbose_name: Optional[str] = ...,
name: Optional[str] = ...,
primary_key: bool = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
choices: Optional[_FieldChoices] = ...,
help_text: str = ...,
db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ...
class ForeignKey(RelatedField, Generic[_T]): class ForeignKey(RelatedField, Generic[_T]):
def __init__(self, to: Union[Type[_T], str], on_delete: Any, related_name: str = ..., **kwargs): ... def __init__(self, to: Union[Type[_T], str], on_delete: Any, related_name: str = ..., **kwargs): ...
@@ -52,7 +116,6 @@ class ManyToManyField(RelatedField, Generic[_T]):
rel_class: Any = ... rel_class: Any = ...
description: Any = ... description: Any = ...
has_null_arg: Any = ... has_null_arg: Any = ...
db_table: Any = ...
swappable: Any = ... swappable: Any = ...
def __init__( def __init__(
self, self,
@@ -64,7 +127,7 @@ class ManyToManyField(RelatedField, Generic[_T]):
through: Optional[Union[str, Type[Model]]] = ..., through: Optional[Union[str, Type[Model]]] = ...,
through_fields: Optional[Tuple[str, str]] = ..., through_fields: Optional[Tuple[str, str]] = ...,
db_constraint: bool = ..., db_constraint: bool = ...,
db_table: None = ..., db_table: Optional[str] = ...,
swappable: bool = ..., swappable: bool = ...,
**kwargs: Any **kwargs: Any
) -> None: ... ) -> None: ...
@@ -85,3 +148,5 @@ class ManyToManyField(RelatedField, Generic[_T]):
def set_attributes_from_rel(self) -> None: ... def set_attributes_from_rel(self) -> None: ...
def value_from_object(self, obj: Model) -> List[Model]: ... def value_from_object(self, obj: Model) -> List[Model]: ...
def save_form_data(self, instance: Model, data: QuerySet) -> None: ... def save_form_data(self, instance: Model, data: QuerySet) -> None: ...
def create_many_to_many_intermediary_model(field: Type[Field], klass: Type[Model]) -> Type[Model]: ...

View File

@@ -1 +1,61 @@
from .text import Lower as Lower from .text import (
Lower as Lower,
Upper as Upper,
Length as Length,
Chr as Chr,
Concat as Concat,
ConcatPair as ConcatPair,
Left as Left,
Right as Right,
LPad as LPad,
RPad as RPad,
LTrim as LTrim,
RTrim as RTrim,
Trim as Trim,
Ord as Ord,
Repeat as Repeat,
StrIndex as StrIndex,
Replace as Replace,
Substr as Substr,
)
from .window import (
CumeDist as CumeDist,
DenseRank as DenseRank,
FirstValue as FirstValue,
Lag as Lag,
LastValue as LastValue,
Lead as Lead,
NthValue as NthValue,
Ntile as Ntile,
PercentRank as PercentRank,
Rank as Rank,
RowNumber as RowNumber,
)
from .datetime import (
Extract as Extract,
ExtractDay as ExtractDay,
ExtractHour as ExtractHour,
ExtractMinute as ExtractMinute,
ExtractSecond as ExtractSecond,
ExtractMonth as ExtractMonth,
ExtractQuarter as ExtractQuarter,
ExtractWeek as ExtractWeek,
ExtractWeekDay as ExtractWeekDay,
ExtractYear as ExtractYear,
Trunc as Trunc,
TruncDate as TruncDate,
TruncDay as TruncDay,
TruncHour as TruncHour,
TruncMinute as TruncMinute,
TruncQuarter as TruncQuarter,
TruncMonth as TruncMonth,
TruncSecond as TruncSecond,
TruncTime as TruncTime,
TruncWeek as TruncWeek,
TruncYear as TruncYear,
Now as Now,
)
from .comparison import Coalesce as Coalesce, Greatest as Greatest, Least as Least, Cast as Cast

View File

@@ -1,12 +1,11 @@
from datetime import date, datetime from datetime import date
from decimal import Decimal from decimal import Decimal
from typing import Any, List, Optional, Tuple, Union from typing import Any, Callable, Dict, List, Union
from django.db.models.expressions import Combinable, Expression
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.db.models import Func from django.db.models import Func
from django.db.models.expressions import Value
from django.db.models.fields import Field from django.db.models.fields import Field
from django.db.models.sql.compiler import SQLCompiler
class Cast(Func): class Cast(Func):
contains_aggregate: bool contains_aggregate: bool
@@ -14,15 +13,10 @@ class Cast(Func):
extra: Dict[Any, Any] extra: Dict[Any, Any]
is_summary: bool is_summary: bool
output_field: Field output_field: Field
source_expressions: List[django.db.models.expressions.Combinable] source_expressions: List[Combinable]
function: str = ... function: str = ...
template: str = ... template: str = ...
def __init__(self, expression: Union[date, Decimal, Value, str], output_field: Field) -> None: ... def __init__(self, expression: Union[date, Decimal, Expression, str], output_field: Union[str, Field]) -> None: ...
def as_sql(
self, compiler: SQLCompiler, connection: DatabaseWrapper, **extra_context: Any
) -> Tuple[str, Union[List[date], List[Decimal]]]: ...
def as_mysql(self, compiler: Any, connection: Any): ...
def as_postgresql(self, compiler: Any, connection: Any): ...
class Coalesce(Func): class Coalesce(Func):
contains_aggregate: bool contains_aggregate: bool
@@ -30,10 +24,9 @@ class Coalesce(Func):
extra: Dict[Any, Any] extra: Dict[Any, Any]
is_summary: bool is_summary: bool
output_field: Field output_field: Field
source_expressions: List[django.db.models.expressions.Combinable] source_expressions: List[Combinable]
function: str = ... function: str = ...
def __init__(self, *expressions: Any, **extra: Any) -> None: ... def __init__(self, *expressions: Any, **extra: Any) -> None: ...
def as_oracle(self, compiler: Any, connection: Any): ...
class Greatest(Func): class Greatest(Func):
contains_aggregate: bool contains_aggregate: bool
@@ -42,10 +35,9 @@ class Greatest(Func):
extra: Dict[Any, Any] extra: Dict[Any, Any]
is_summary: bool is_summary: bool
output_field: Field output_field: Field
source_expressions: List[django.db.models.expressions.Combinable] source_expressions: List[Combinable]
function: str = ... function: str = ...
def __init__(self, *expressions: Any, **extra: Any) -> None: ... def __init__(self, *expressions: Any, **extra: Any) -> None: ...
def as_sqlite(self, compiler: SQLCompiler, connection: DatabaseWrapper) -> Tuple[str, List[datetime]]: ...
class Least(Func): class Least(Func):
contains_aggregate: bool contains_aggregate: bool
@@ -54,7 +46,6 @@ class Least(Func):
extra: Dict[Any, Any] extra: Dict[Any, Any]
is_summary: bool is_summary: bool
output_field: Field output_field: Field
source_expressions: List[django.db.models.expressions.Combinable] source_expressions: List[Combinable]
function: str = ... function: str = ...
def __init__(self, *expressions: Any, **extra: Any) -> None: ... def __init__(self, *expressions: Any, **extra: Any) -> None: ...
def as_sqlite(self, compiler: SQLCompiler, connection: DatabaseWrapper) -> Tuple[str, List[datetime]]: ...

View File

@@ -17,6 +17,8 @@ class BaseManager(QuerySet[_T]):
def check(self, **kwargs: Any) -> List[Any]: ... def check(self, **kwargs: Any) -> List[Any]: ...
@classmethod @classmethod
def from_queryset(cls, queryset_class: Any, class_name: Optional[Any] = ...): ... def from_queryset(cls, queryset_class: Any, class_name: Optional[Any] = ...): ...
@classmethod
def _get_queryset_methods(cls, queryset_class: type) -> Dict[str, Any]: ...
def contribute_to_class(self, model: Type[Model], name: str) -> None: ... def contribute_to_class(self, model: Type[Model], name: str) -> None: ...
def db_manager(self, using: Optional[str] = ..., hints: Optional[Dict[str, Model]] = ...) -> Manager: ... def db_manager(self, using: Optional[str] = ..., hints: Optional[Dict[str, Model]] = ...) -> Manager: ...
def get_queryset(self) -> QuerySet[_T]: ... def get_queryset(self) -> QuerySet[_T]: ...

View File

@@ -1,14 +1,31 @@
from typing import TypeVar, Optional, Any, Type, Dict, Union, overload, List, Iterator, Tuple, Iterable, Sized, Sequence from typing import (
Any,
Dict,
Iterable,
Iterator,
List,
MutableMapping,
Optional,
Sequence,
Sized,
Tuple,
Type,
TypeVar,
Union,
overload,
)
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.sql.query import Query, RawQuery
from django.db import models from django.db import models
from django.db.models import Manager from django.db.models import Manager
from django.db.models.sql.query import Query, RawQuery
_T = TypeVar("_T", bound=models.Model, covariant=True) _T = TypeVar("_T", bound=models.Model, covariant=True)
class QuerySet(Iterable[_T], Sized): class QuerySet(Iterable[_T], Sized):
query: Query
def __init__( def __init__(
self, self,
model: Optional[Type[models.Model]] = ..., model: Optional[Type[models.Model]] = ...,
@@ -23,6 +40,7 @@ class QuerySet(Iterable[_T], Sized):
def __bool__(self) -> bool: ... def __bool__(self) -> bool: ...
def __class_getitem__(cls, item: Type[_T]): def __class_getitem__(cls, item: Type[_T]):
pass pass
def __getstate__(self) -> Dict[str, Any]: ...
@overload @overload
def __getitem__(self, k: int) -> _T: ... def __getitem__(self, k: int) -> _T: ...
@overload @overload
@@ -35,25 +53,26 @@ class QuerySet(Iterable[_T], Sized):
def aggregate(self, *args: Any, **kwargs: Any) -> Dict[str, Any]: ... def aggregate(self, *args: Any, **kwargs: Any) -> Dict[str, Any]: ...
def get(self, *args: Any, **kwargs: Any) -> _T: ... def get(self, *args: Any, **kwargs: Any) -> _T: ...
def create(self, **kwargs: Any) -> _T: ... def create(self, **kwargs: Any) -> _T: ...
def bulk_create(self, objs: Sequence[Model], batch_size: Optional[int] = ...) -> List[_T]: ... def bulk_create(self, objs: Iterable[Model], batch_size: Optional[int] = ...) -> List[_T]: ...
def get_or_create(self, defaults: Optional[Dict[str, Any]] = ..., **kwargs: Any) -> Tuple[_T, bool]: ... def get_or_create(self, defaults: Optional[MutableMapping[str, Any]] = ..., **kwargs: Any) -> Tuple[_T, bool]: ...
def update_or_create(self, defaults: Optional[Dict[str, Any]] = ..., **kwargs: Any) -> Tuple[_T, bool]: ... def update_or_create(
self, defaults: Optional[MutableMapping[str, Any]] = ..., **kwargs: Any
) -> Tuple[_T, bool]: ...
def earliest(self, *fields: Any, field_name: Optional[Any] = ...) -> _T: ... def earliest(self, *fields: Any, field_name: Optional[Any] = ...) -> _T: ...
def latest(self, *fields: Any, field_name: Optional[Any] = ...) -> _T: ... def latest(self, *fields: Any, field_name: Optional[Any] = ...) -> _T: ...
def first(self) -> Optional[_T]: ... def first(self) -> Optional[_T]: ...
def last(self) -> Optional[_T]: ... def last(self) -> Optional[_T]: ...
def in_bulk( def in_bulk(self, id_list: Any = ..., *, field_name: str = ...) -> Dict[Union[int, str], models.Model]: ...
self, id_list: Any = ..., *, field_name: str = ...
) -> Union[Dict[int, models.Model], Dict[str, models.Model]]: ...
def delete(self) -> Tuple[int, Dict[str, int]]: ... def delete(self) -> Tuple[int, Dict[str, int]]: ...
def update(self, **kwargs: Any) -> int: ... def update(self, **kwargs: Any) -> int: ...
def _update(self, values: Any) -> Optional[Any]: ...
def exists(self) -> bool: ... def exists(self) -> bool: ...
def explain(self, *, format: Optional[Any] = ..., **options: Any) -> str: ... def explain(self, *, format: Optional[Any] = ..., **options: Any) -> str: ...
def raw( def raw(
self, raw_query: str, params: Any = ..., translations: Optional[Dict[str, str]] = ..., using: None = ... self, raw_query: str, params: Any = ..., translations: Optional[Dict[str, str]] = ..., using: None = ...
) -> RawQuerySet: ... ) -> RawQuerySet: ...
def values(self, *fields: Any, **expressions: Any) -> QuerySet: ... def values(self, *fields: Union[str, Combinable], **expressions: Any) -> QuerySet: ...
def values_list(self, *fields: Any, flat: bool = ..., named: bool = ...) -> List[Any]: ... def values_list(self, *fields: Union[str, Combinable], flat: bool = ..., named: bool = ...) -> QuerySet: ...
def dates(self, field_name: str, kind: str, order: str = ...) -> QuerySet: ... def dates(self, field_name: str, kind: str, order: str = ...) -> QuerySet: ...
def datetimes(self, field_name: str, kind: str, order: str = ..., tzinfo: None = ...) -> QuerySet: ... def datetimes(self, field_name: str, kind: str, order: str = ..., tzinfo: None = ...) -> QuerySet: ...
def none(self) -> QuerySet[_T]: ... def none(self) -> QuerySet[_T]: ...
@@ -93,9 +112,10 @@ class QuerySet(Iterable[_T], Sized):
def __getattr__(self, item: str) -> Any: ... def __getattr__(self, item: str) -> Any: ...
class RawQuerySet(Iterable[_T], Sized): class RawQuerySet(Iterable[_T], Sized):
query: RawQuery
def __init__( def __init__(
self, self,
raw_query: RawQuery, raw_query: Union[RawQuery, str],
model: Optional[Type[models.Model]] = ..., model: Optional[Type[models.Model]] = ...,
query: Optional[Query] = ..., query: Optional[Query] = ...,
params: Tuple[Any] = ..., params: Tuple[Any] = ...,
@@ -144,3 +164,6 @@ class Prefetch(object):
def get_current_queryset(self, level) -> Optional[QuerySet]: ... def get_current_queryset(self, level) -> Optional[QuerySet]: ...
def prefetch_related_objects(model_instances: Iterable[_T], *related_lookups: str) -> None: ... def prefetch_related_objects(model_instances: Iterable[_T], *related_lookups: str) -> None: ...
class InstanceCheckMeta(type): ...
class EmptyQuerySet(metaclass=InstanceCheckMeta): ...

View File

@@ -50,6 +50,7 @@ class DeferredAttribute:
def __get__(self, instance: Optional[Model], cls: Type[Model] = ...) -> Any: ... def __get__(self, instance: Optional[Model], cls: Type[Model] = ...) -> Any: ...
class RegisterLookupMixin: class RegisterLookupMixin:
lookup_name: str
@classmethod @classmethod
def get_lookups(cls) -> Dict[str, Any]: ... def get_lookups(cls) -> Dict[str, Any]: ...
def get_lookup(self, lookup_name: str) -> Optional[Any]: ... def get_lookup(self, lookup_name: str) -> Optional[Any]: ...
@@ -58,6 +59,8 @@ class RegisterLookupMixin:
def merge_dicts(dicts: List[Dict[str, Any]]) -> Dict[str, Any]: ... def merge_dicts(dicts: List[Dict[str, Any]]) -> Dict[str, Any]: ...
@classmethod @classmethod
def register_lookup(cls, lookup: Any, lookup_name: Optional[str] = ...) -> Type[Any]: ... def register_lookup(cls, lookup: Any, lookup_name: Optional[str] = ...) -> Type[Any]: ...
@classmethod
def _unregister_lookup(cls, lookup: Any, lookup_name: Optional[str] = ...): ...
def select_related_descend( def select_related_descend(
field: Field, field: Field,

View File

@@ -1 +1,8 @@
from ..query import Query as Query, RawQuery as RawQuery from .query import Query as Query, RawQuery as RawQuery
from .subqueries import (
InsertQuery as InsertQuery,
AggregateQuery as AggregateQuery,
DeleteQuery as DeleteQuery,
UpdateQuery as UpdateQuery,
)

View File

@@ -6,7 +6,8 @@ from uuid import UUID
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.expressions import BaseExpression, Expression from django.db.models.expressions import BaseExpression, Expression
from django.db.models.sql import Query, RawQuery
from django.db.models.sql.query import Query, RawQuery
FORCE: Any FORCE: Any

View File

@@ -0,0 +1,14 @@
from typing import Dict, Pattern, Tuple
GET_ITERATOR_CHUNK_SIZE: int = ...
MULTI: str = ...
SINGLE: str = ...
CURSOR: str = ...
NO_RESULTS: str = ...
ORDER_PATTERN: Pattern = ...
ORDER_DIR: Dict[str, Tuple[str, str]] = ...
INNER: str = ...
LOUTER: str = ...

View File

@@ -5,6 +5,8 @@ from decimal import Decimal
from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Tuple, Type, Union from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Tuple, Type, Union
from uuid import UUID from uuid import UUID
from django.db.models.sql.datastructures import BaseTable
from django.db.models import Model, Field, Q, FilteredRelation, Expression, QuerySet from django.db.models import Model, Field, Q, FilteredRelation, Expression, QuerySet
from django.db.models.query_utils import PathInfo from django.db.models.query_utils import PathInfo
from django.db.models.sql.compiler import SQLCompiler from django.db.models.sql.compiler import SQLCompiler
@@ -13,13 +15,14 @@ from django.db.models.sql.where import WhereNode
JoinInfo = namedtuple("JoinInfo", ["final_field", "targets", "opts", "joins", "path", "transform_function"]) JoinInfo = namedtuple("JoinInfo", ["final_field", "targets", "opts", "joins", "path", "transform_function"])
class RawQuery: class RawQuery:
high_mark: None high_mark: Optional[int]
low_mark: int low_mark: Optional[int]
params: Union[Any] = ... params: Union[Any] = ...
sql: str = ... sql: str = ...
using: str = ... using: str = ...
extra_select: Dict[Any, Any] = ... extra_select: Dict[Any, Any] = ...
annotation_select: Dict[Any, Any] = ... annotation_select: Dict[Any, Any] = ...
cursor: object = ...
def __init__(self, sql: str, using: str, params: Any = ...) -> None: ... def __init__(self, sql: str, using: str, params: Any = ...) -> None: ...
def chain(self, using: str) -> RawQuery: ... def chain(self, using: str) -> RawQuery: ...
def clone(self, using: str) -> RawQuery: ... def clone(self, using: str) -> RawQuery: ...
@@ -28,7 +31,7 @@ class RawQuery:
class Query: class Query:
base_table: str base_table: str
related_ids: None related_ids: Optional[List[int]]
related_updates: Dict[Type[Model], List[Tuple[Field, None, Union[int, str]]]] related_updates: Dict[Type[Model], List[Tuple[Field, None, Union[int, str]]]]
values: List[Any] values: List[Any]
alias_prefix: str = ... alias_prefix: str = ...
@@ -36,7 +39,7 @@ class Query:
compiler: str = ... compiler: str = ...
model: Optional[Type[Model]] = ... model: Optional[Type[Model]] = ...
alias_refcount: Dict[str, int] = ... alias_refcount: Dict[str, int] = ...
alias_map: OrderedDict = ... alias_map: Dict[str, BaseTable] = ...
external_aliases: Set[str] = ... external_aliases: Set[str] = ...
table_map: Dict[str, List[str]] = ... table_map: Dict[str, List[str]] = ...
default_cols: bool = ... default_cols: bool = ...

View File

@@ -1,12 +1,15 @@
from typing import Any, Dict, List, Optional, Tuple, Type, Union import collections
import uuid
from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Type, Union
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.expressions import Case from django.db.models.expressions import Case
from django.db.models.fields import DateTimeCheckMixin, Field
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.db.models.sql.datastructures import BaseTable
from django.db.models.sql.query import Query from django.db.models.sql.query import Query
from django.db.models.sql.where import WhereNode from django.db.models.sql.where import WhereNode
from django.utils.datastructures import ImmutableList
from django.db.models.fields import Field
class DeleteQuery(Query): class DeleteQuery(Query):
alias_refcount: Dict[str, int] alias_refcount: Dict[str, int]
@@ -46,16 +49,14 @@ class DeleteQuery(Query):
table_map: Dict[str, List[str]] table_map: Dict[str, List[str]]
used_aliases: Set[str] used_aliases: Set[str]
values_select: Tuple values_select: Tuple
where_class: Type[django.db.models.sql.where.WhereNode] where_class: Type[WhereNode]
compiler: str = ... compiler: str = ...
alias_map: Union[Dict[str, django.db.models.sql.datastructures.BaseTable], collections.OrderedDict] = ... where: WhereNode = ...
where: django.db.models.sql.where.WhereNode = ...
def do_query(self, table: str, where: WhereNode, using: str) -> int: ... def do_query(self, table: str, where: WhereNode, using: str) -> int: ...
def delete_batch(self, pk_list: Union[List[int], List[str]], using: str) -> int: ... def delete_batch(self, pk_list: Union[List[int], List[str]], using: str) -> int: ...
def delete_qs(self, query: QuerySet, using: str) -> int: ... def delete_qs(self, query: QuerySet, using: str) -> int: ...
class UpdateQuery(Query): class UpdateQuery(Query):
alias_map: collections.OrderedDict
alias_refcount: Dict[str, int] alias_refcount: Dict[str, int]
annotation_select_mask: Optional[Set[Any]] annotation_select_mask: Optional[Set[Any]]
base_table: str base_table: str
@@ -81,8 +82,6 @@ class UpdateQuery(Query):
max_depth: int max_depth: int
model: Type[Model] model: Type[Model]
order_by: Tuple order_by: Tuple
related_ids: Optional[List[int]]
related_updates: Dict[Type[Model], List[Tuple[Field, None, Union[int, str]]]]
select: Tuple select: Tuple
select_for_update: bool select_for_update: bool
select_for_update_nowait: bool select_for_update_nowait: bool
@@ -94,13 +93,13 @@ class UpdateQuery(Query):
subquery: bool subquery: bool
table_map: Dict[str, List[str]] table_map: Dict[str, List[str]]
used_aliases: Set[str] used_aliases: Set[str]
values: List[Tuple[Field, Optional[Type[Model]], Union[django.db.models.expressions.Case, uuid.UUID]]] values: List[Tuple[Field, Optional[Type[Model]], Union[Case, uuid.UUID]]]
values_select: Tuple values_select: Tuple
where_class: Type[django.db.models.sql.where.WhereNode] where_class: Type[WhereNode]
compiler: str = ... compiler: str = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def clone(self) -> UpdateQuery: ... def clone(self) -> UpdateQuery: ...
where: django.db.models.sql.where.WhereNode = ... where: WhereNode = ...
def update_batch(self, pk_list: List[int], values: Dict[str, Optional[int]], using: str) -> None: ... def update_batch(self, pk_list: List[int], values: Dict[str, Optional[int]], using: str) -> None: ...
def add_update_values(self, values: Dict[str, Any]) -> None: ... def add_update_values(self, values: Dict[str, Any]) -> None: ...
def add_update_fields(self, values_seq: List[Tuple[Field, Optional[Type[Model]], Case]]) -> None: ... def add_update_fields(self, values_seq: List[Tuple[Field, Optional[Type[Model]], Case]]) -> None: ...
@@ -108,7 +107,6 @@ class UpdateQuery(Query):
def get_related_updates(self) -> List[UpdateQuery]: ... def get_related_updates(self) -> List[UpdateQuery]: ...
class InsertQuery(Query): class InsertQuery(Query):
alias_map: collections.OrderedDict
alias_refcount: Dict[str, int] alias_refcount: Dict[str, int]
annotation_select_mask: None annotation_select_mask: None
combinator: None combinator: None
@@ -144,21 +142,16 @@ class InsertQuery(Query):
table_map: Dict[str, List[str]] table_map: Dict[str, List[str]]
used_aliases: Set[Any] used_aliases: Set[Any]
values_select: Tuple values_select: Tuple
where: django.db.models.sql.where.WhereNode where: WhereNode
where_class: Type[django.db.models.sql.where.WhereNode] where_class: Type[WhereNode]
compiler: str = ... compiler: str = ...
fields: Union[ fields: Iterable[Field] = ...
List[django.db.models.fields.DateTimeCheckMixin], List[Field], django.utils.datastructures.ImmutableList
] = ...
objs: List[Model] = ... objs: List[Model] = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
raw: bool = ... raw: bool = ...
def insert_values( def insert_values(self, fields: Iterable[Field], objs: List[Model], raw: bool = ...) -> None: ...
self, fields: Union[List[DateTimeCheckMixin], List[Field], ImmutableList], objs: List[Model], raw: bool = ...
) -> None: ...
class AggregateQuery(Query): class AggregateQuery(Query):
alias_map: collections.OrderedDict
alias_refcount: Dict[Any, Any] alias_refcount: Dict[Any, Any]
annotation_select_mask: None annotation_select_mask: None
combinator: None combinator: None
@@ -191,11 +184,10 @@ class AggregateQuery(Query):
select_related: bool select_related: bool
standard_ordering: bool standard_ordering: bool
sub_params: Tuple sub_params: Tuple
subquery: Union[bool, str]
table_map: Dict[Any, Any] table_map: Dict[Any, Any]
used_aliases: Set[Any] used_aliases: Set[Any]
values_select: Tuple values_select: Tuple
where: django.db.models.sql.where.WhereNode where: WhereNode
where_class: Type[django.db.models.sql.where.WhereNode] where_class: Type[WhereNode]
compiler: str = ... compiler: str = ...
def add_subquery(self, query: Query, using: str) -> None: ... def add_subquery(self, query: Query, using: str) -> None: ...

View File

@@ -2,8 +2,66 @@ from django.core.exceptions import ValidationError as ValidationError
from .forms import Form as Form, BaseForm as BaseForm from .forms import Form as Form, BaseForm as BaseForm
from .models import ModelForm as ModelForm from .models import (
ModelForm as ModelForm,
ModelChoiceField as ModelChoiceField,
ModelMultipleChoiceField as ModelMultipleChoiceField,
)
from .widgets import Widget as Widget, ChoiceWidget as ChoiceWidget from .widgets import (
Widget as Widget,
ChoiceWidget as ChoiceWidget,
NumberInput as NumberInput,
Select as Select,
CheckboxInput as CheckboxInput,
CheckboxSelectMultiple as CheckboxSelectMultiple,
Media as Media,
MultiWidget as MultiWidget,
TextInput as TextInput,
Textarea as Textarea,
Input as Input,
ClearableFileInput as ClearableFileInput,
DateInput as DateInput,
DateTimeBaseInput as DateTimeBaseInput,
DateTimeInput as DateTimeInput,
EmailInput as EmailInput,
FileInput as FileInput,
HiddenInput as HiddenInput,
MultipleHiddenInput as MultipleHiddenInput,
NullBooleanSelect as NullBooleanSelect,
PasswordInput as PasswordInput,
RadioSelect as RadioSelect,
SelectMultiple as SelectMultiple,
TimeInput as TimeInput,
URLInput as URLInput,
)
from .fields import Field as Field, CharField as CharField from .fields import (
Field as Field,
CharField as CharField,
ChoiceField as ChoiceField,
DurationField as DurationField,
FileField as FileField,
ImageField as ImageField,
DateTimeField as DateTimeField,
DateField as DateField,
BooleanField as BooleanField,
EmailField as EmailField,
FloatField as FloatField,
MultiValueField as MultiValueField,
MultipleChoiceField as MultipleChoiceField,
NullBooleanField as NullBooleanField,
SplitDateTimeField as SplitDateTimeField,
TimeField as TimeField,
IntegerField as IntegerField,
FilePathField as FilePathField,
DecimalField as DecimalField,
UUIDField as UUIDField,
URLField as URLField,
ComboField as ComboField,
GenericIPAddressField as GenericIPAddressField,
RegexField as RegexField,
SlugField as SlugField,
TypedChoiceField as TypedChoiceField,
TypedMultipleChoiceField as TypedMultipleChoiceField,
)

View File

@@ -6,6 +6,16 @@ from django.forms.utils import ErrorList
from django.forms import Form from django.forms import Form
TOTAL_FORM_COUNT: str = ...
INITIAL_FORM_COUNT: str = ...
MIN_NUM_FORM_COUNT: str = ...
MAX_NUM_FORM_COUNT: str = ...
ORDERING_FIELD_NAME: str = ...
DELETION_FIELD_NAME: str = ...
DEFAULT_MIN_NUM: int = ...
DEFAULT_MAX_NUM: int = ...
class ManagementForm(Form): class ManagementForm(Form):
auto_id: Union[bool, str] auto_id: Union[bool, str]
cleaned_data: Dict[str, Optional[int]] cleaned_data: Dict[str, Optional[int]]

View File

@@ -1,10 +1,11 @@
from collections import OrderedDict from collections import OrderedDict
from datetime import date, datetime from datetime import date, datetime
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type, Union, Sequence
from unittest.mock import MagicMock from unittest.mock import MagicMock
from uuid import UUID from uuid import UUID
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.db.models import ForeignKey
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.manager import Manager from django.db.models.manager import Manager
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
@@ -136,23 +137,23 @@ class BaseModelFormSet(BaseFormSet):
def modelformset_factory( def modelformset_factory(
model: Type[Model], model: Type[Model],
form: Type[ModelForm] = ..., form: Type[ModelForm] = ...,
formfield_callback: None = ..., formfield_callback: Optional[Callable] = ...,
formset: Type[BaseModelFormSet] = ..., formset: Type[BaseModelFormSet] = ...,
extra: int = ..., extra: int = ...,
can_delete: bool = ..., can_delete: bool = ...,
can_order: bool = ..., can_order: bool = ...,
max_num: None = ..., min_num: Optional[int] = ...,
fields: None = ..., max_num: Optional[int] = ...,
exclude: None = ..., fields: Optional[Union[str, Sequence[str]]] = ...,
widgets: None = ..., exclude: Optional[Sequence[str]] = ...,
widgets: Optional[Dict[str, Any]] = ...,
validate_max: bool = ..., validate_max: bool = ...,
localized_fields: None = ..., localized_fields: None = ...,
labels: None = ..., labels: Optional[Dict[str, str]] = ...,
help_texts: None = ..., help_texts: Optional[Dict[str, str]] = ...,
error_messages: None = ..., error_messages: Optional[Dict[str, Dict[str, str]]] = ...,
min_num: None = ...,
validate_min: bool = ..., validate_min: bool = ...,
field_classes: None = ..., field_classes: Optional[Dict[str, Any]] = ...,
) -> Any: ... ) -> Any: ...
class BaseInlineFormSet(BaseModelFormSet): class BaseInlineFormSet(BaseModelFormSet):
@@ -182,22 +183,22 @@ def inlineformset_factory(
form: Type[ModelForm] = ..., form: Type[ModelForm] = ...,
formset: Type[BaseInlineFormSet] = ..., formset: Type[BaseInlineFormSet] = ...,
fk_name: Optional[str] = ..., fk_name: Optional[str] = ...,
fields: Optional[str] = ..., fields: Optional[Union[str, Sequence[str]]] = ...,
exclude: None = ..., exclude: Optional[Sequence[str]] = ...,
extra: int = ..., extra: int = ...,
can_order: bool = ..., can_order: bool = ...,
can_delete: bool = ..., can_delete: bool = ...,
max_num: None = ..., max_num: Optional[int] = ...,
formfield_callback: None = ..., formfield_callback: Optional[Callable] = ...,
widgets: None = ..., widgets: Optional[Dict[str, Any]] = ...,
validate_max: bool = ..., validate_max: bool = ...,
localized_fields: None = ..., localized_fields: None = ...,
labels: None = ..., labels: Optional[Dict[str, str]] = ...,
help_texts: None = ..., help_texts: Optional[Dict[str, str]] = ...,
error_messages: None = ..., error_messages: Optional[Dict[str, Dict[str, str]]] = ...,
min_num: None = ..., min_num: Optional[int] = ...,
validate_min: bool = ..., validate_min: bool = ...,
field_classes: None = ..., field_classes: Optional[Dict[str, Any]] = ...,
) -> Any: ... ) -> Any: ...
class InlineForeignKeyField(Field): class InlineForeignKeyField(Field):
@@ -266,3 +267,7 @@ class ModelMultipleChoiceField(ModelChoiceField):
hidden_widget: Any = ... hidden_widget: Any = ...
default_error_messages: Any = ... default_error_messages: Any = ...
def __init__(self, queryset: QuerySet, **kwargs: Any) -> None: ... def __init__(self, queryset: QuerySet, **kwargs: Any) -> None: ...
def _get_foreign_key(
parent_model: Type[Model], model: Type[Model], fk_name: Optional[str] = ..., can_fail: bool = ...
) -> ForeignKey: ...

View File

@@ -15,6 +15,7 @@ from django.utils.safestring import SafeText
class MediaOrderConflictWarning(RuntimeWarning): ... class MediaOrderConflictWarning(RuntimeWarning): ...
class Media: class Media:
_js: str
def __init__( def __init__(
self, self,
media: Optional[type] = ..., media: Optional[type] = ...,

View File

@@ -4,6 +4,7 @@
from io import BytesIO from io import BytesIO
from typing import Any, BinaryIO, Dict, Iterable, Iterator, List, Optional, overload, Pattern, Tuple, Union from typing import Any, BinaryIO, Dict, Iterable, Iterator, List, Optional, overload, Pattern, Tuple, Union
from django.contrib.sessions.backends.base import SessionBase
from django.core.files import uploadhandler, uploadedfile from django.core.files import uploadhandler, uploadedfile
from django.utils.datastructures import MultiValueDict, ImmutableList from django.utils.datastructures import MultiValueDict, ImmutableList
from django.urls import ResolverMatch from django.urls import ResolverMatch
@@ -17,17 +18,18 @@ class RawPostDataException(Exception): ...
UploadHandlerList = Union[List[uploadhandler.FileUploadHandler], ImmutableList[uploadhandler.FileUploadHandler]] UploadHandlerList = Union[List[uploadhandler.FileUploadHandler], ImmutableList[uploadhandler.FileUploadHandler]]
class HttpRequest(BytesIO): class HttpRequest(BytesIO):
GET = ... # type: QueryDict GET: QueryDict = ...
POST = ... # type: QueryDict POST: QueryDict = ...
COOKIES = ... # type: Dict[str, str] COOKIES: Dict[str, str] = ...
META = ... # type: Dict[str, str] META: Dict[str, str] = ...
FILES = ... # type: MultiValueDict[str, uploadedfile.UploadedFile] FILES: MultiValueDict[str, uploadedfile.UploadedFile] = ...
path = ... # type: str path: str = ...
path_info = ... # type: str path_info: str = ...
method = ... # type: Optional[str] method: Optional[str] = ...
resolver_match = ... # type: ResolverMatch resolver_match: ResolverMatch = ...
content_type = ... # type: Optional[str] content_type: Optional[str] = ...
content_params = ... # type: Optional[Dict[str, str]] content_params: Optional[Dict[str, str]] = ...
session: SessionBase
def __init__(self) -> None: ... def __init__(self) -> None: ...
def get_host(self) -> str: ... def get_host(self) -> str: ...
def get_port(self) -> str: ... def get_port(self) -> str: ...
@@ -58,6 +60,7 @@ class HttpRequest(BytesIO):
class QueryDict(MultiValueDict[str, str]): class QueryDict(MultiValueDict[str, str]):
encoding = str # type: Any encoding = str # type: Any
_mutable: bool = ...
def __init__( def __init__(
self, query_string: Union[str, bytes, None] = None, mutable: bool = False, encoding: Optional[str] = None self, query_string: Union[str, bytes, None] = None, mutable: bool = False, encoding: Optional[str] = None
) -> None: ... ) -> None: ...
@@ -68,7 +71,6 @@ class QueryDict(MultiValueDict[str, str]):
def setlist(self, key: str, list_: List[str]) -> None: ... def setlist(self, key: str, list_: List[str]) -> None: ...
def setlistdefault(self, key: str, default_list: List[str] = None) -> List[str]: ... def setlistdefault(self, key: str, default_list: List[str] = None) -> List[str]: ...
def appendlist(self, key: str, value: str) -> None: ... def appendlist(self, key: str, value: str) -> None: ...
def pop(self, key: str, default: List[str] = None) -> List[str]: ... # type: ignore
def popitem(self) -> Tuple[str, str]: ... def popitem(self) -> Tuple[str, str]: ...
def clear(self) -> None: ... def clear(self) -> None: ...
def setdefault(self, key: str, default: Optional[str] = None) -> str: ... def setdefault(self, key: str, default: Optional[str] = None) -> str: ...

View File

@@ -1,9 +1,7 @@
# Stubs for django.http.response (Python 3.5)
import datetime import datetime
from io import BytesIO from io import BytesIO
from json import JSONEncoder from json import JSONEncoder
from typing import Any, Dict, Iterable, Iterator, List, Optional, overload, Tuple, Type, Union from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union, overload
import six import six
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
@@ -16,21 +14,23 @@ from django.urls import ResolverMatch
class BadHeaderError(ValueError): ... class BadHeaderError(ValueError): ...
class HttpResponseBase(six.Iterator): class HttpResponseBase(six.Iterator):
status_code = ... # type: int status_code: int = ...
cookies = ... # type: SimpleCookie cookies: SimpleCookie = ...
closed = ... # type: bool closed: bool = ...
reason_phrase = ... # type: str reason_phrase: str = ...
charset = ... # type: str charset: str = ...
def __init__( def __init__(
self, content_type: str = None, status: int = None, reason: str = None, charset: str = None self,
content_type: Optional[str] = ...,
status: Optional[int] = ...,
reason: Optional[str] = ...,
charset: Optional[str] = ...,
) -> None: ... ) -> None: ...
def serialize_headers(self) -> bytes: ... def serialize_headers(self) -> bytes: ...
def __bytes__(self) -> bytes: ...
def __setitem__(self, header: str, value: Union[str, bytes]) -> None: ... def __setitem__(self, header: str, value: Union[str, bytes]) -> None: ...
def __delitem__(self, header: str) -> None: ... def __delitem__(self, header: str) -> None: ...
def __getitem__(self, header: str) -> str: ... def __getitem__(self, header: str) -> str: ...
def has_header(self, header: str) -> bool: ... def has_header(self, header: str) -> bool: ...
def __contains__(self, item: object) -> bool: ...
def items(self) -> Iterable[Tuple[str, str]]: ... def items(self) -> Iterable[Tuple[str, str]]: ...
@overload @overload
def get(self, header: str, alternate: str) -> str: ... def get(self, header: str, alternate: str) -> str: ...
@@ -39,13 +39,14 @@ class HttpResponseBase(six.Iterator):
def set_cookie( def set_cookie(
self, self,
key: str, key: str,
value: str = "", value: str = ...,
max_age: int = None, max_age: Optional[int] = ...,
expires: Union[str, datetime.datetime] = None, expires: Optional[Union[str, datetime.datetime]] = ...,
path: str = "", path: str = ...,
domain: str = None, domain: Optional[str] = ...,
secure: bool = False, secure: bool = ...,
httponly: bool = False, httponly: bool = ...,
samesite: str = ...,
) -> None: ... ) -> None: ...
def setdefault(self, key: str, value: str) -> None: ... def setdefault(self, key: str, value: str) -> None: ...
def set_signed_cookie(self, key: str, value: str, salt: str = "", **kwargs: Any) -> None: ... def set_signed_cookie(self, key: str, value: str, salt: str = "", **kwargs: Any) -> None: ...
@@ -145,9 +146,9 @@ class Http404(Exception): ...
class JsonResponse(HttpResponse): class JsonResponse(HttpResponse):
def __init__( def __init__(
self, self,
data: object, data: Any,
encoder: Type[JSONEncoder] = ..., encoder: Type[JSONEncoder] = ...,
safe: bool = True, safe: bool = ...,
json_dumps_params: Dict[str, Any] = None, json_dumps_params: Optional[Dict[str, Any]] = ...,
**kwargs: Any **kwargs: Any
) -> None: ... ) -> None: ...

View File

@@ -25,3 +25,5 @@ class CsrfViewMiddleware(MiddlewareMixin):
self, request: HttpRequest, callback: Callable, callback_args: Tuple, callback_kwargs: Dict[str, Any] self, request: HttpRequest, callback: Callable, callback_args: Tuple, callback_kwargs: Dict[str, Any]
) -> Optional[HttpResponseForbidden]: ... ) -> Optional[HttpResponseForbidden]: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def _compare_salted_tokens(request_csrf_token: str, csrf_token: str) -> bool: ...

View File

@@ -1,5 +1,6 @@
from typing import Any, Callable, Dict, List, Optional, Type, Union from typing import Any, Callable, Dict, List, Optional, Type, Union
from django.db.models import Manager, QuerySet
from django.db.models.base import Model from django.db.models.base import Model
from django.http.response import HttpResponse, HttpResponseRedirect from django.http.response import HttpResponse, HttpResponseRedirect
@@ -21,6 +22,6 @@ def render(
using: Optional[str] = ..., using: Optional[str] = ...,
) -> HttpResponse: ... ) -> HttpResponse: ...
def redirect(to: Union[Callable, str], *args: Any, permanent: bool = ..., **kwargs: Any) -> HttpResponseRedirect: ... def redirect(to: Union[Callable, str], *args: Any, permanent: bool = ..., **kwargs: Any) -> HttpResponseRedirect: ...
def get_object_or_404(klass: Union[Type[Model], str], *args: Any, **kwargs: Any) -> Model: ... def get_object_or_404(klass: Union[Type[Model], Manager, QuerySet], *args: Any, **kwargs: Any) -> Model: ...
def get_list_or_404(klass: List[Type[Model]], *args: Any, **kwargs: Any) -> List[Model]: ... def get_list_or_404(klass: Union[Type[Model], Manager, QuerySet], *args: Any, **kwargs: Any) -> List[Model]: ...
def resolve_url(to: Union[Callable, Model, str], *args: Any, **kwargs: Any) -> str: ... def resolve_url(to: Union[Callable, Model, str], *args: Any, **kwargs: Any) -> str: ...

View File

@@ -3,8 +3,18 @@ from .testcases import (
TransactionTestCase as TransactionTestCase, TransactionTestCase as TransactionTestCase,
SimpleTestCase as SimpleTestCase, SimpleTestCase as SimpleTestCase,
LiveServerTestCase as LiveServerTestCase, LiveServerTestCase as LiveServerTestCase,
skipIfDBFeature as skipIfDBFeature,
skipUnlessDBFeature as skipUnlessDBFeature,
skipUnlessAnyDBFeature as skipUnlessAnyDBFeature,
) )
from .utils import override_settings as override_settings, modify_settings as modify_settings from .utils import (
override_settings as override_settings,
modify_settings as modify_settings,
override_script_prefix as override_script_prefix,
override_system_checks as override_system_checks,
ignore_warnings as ignore_warnings,
tag as tag,
)
from .client import Client as Client from .client import Client as Client, RequestFactory as RequestFactory

View File

@@ -36,12 +36,12 @@ class RequestFactory:
errors: BytesIO = ... errors: BytesIO = ...
def __init__(self, *, json_encoder: Any = ..., **defaults: Any) -> None: ... def __init__(self, *, json_encoder: Any = ..., **defaults: Any) -> None: ...
def request(self, **request: Any) -> WSGIRequest: ... def request(self, **request: Any) -> WSGIRequest: ...
def get(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> HttpResponseBase: ... def get(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> WSGIRequest: ...
def post( def post(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> HttpResponseBase: ... ) -> WSGIRequest: ...
def head(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> HttpResponseBase: ... def head(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> WSGIRequest: ...
def trace(self, path: str, secure: bool = ..., **extra: Any) -> HttpResponseBase: ... def trace(self, path: str, secure: bool = ..., **extra: Any) -> WSGIRequest: ...
def options( def options(
self, self,
path: str, path: str,
@@ -49,16 +49,16 @@ class RequestFactory:
content_type: str = ..., content_type: str = ...,
secure: bool = ..., secure: bool = ...,
**extra: Any **extra: Any
) -> HttpResponseBase: ... ) -> WSGIRequest: ...
def put( def put(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> HttpResponseBase: ... ) -> WSGIRequest: ...
def patch( def patch(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> HttpResponseBase: ... ) -> WSGIRequest: ...
def delete( def delete(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> HttpResponseBase: ... ) -> WSGIRequest: ...
def generic( def generic(
self, self,
method: str, method: str,
@@ -67,7 +67,7 @@ class RequestFactory:
content_type: Optional[str] = ..., content_type: Optional[str] = ...,
secure: bool = ..., secure: bool = ...,
**extra: Any **extra: Any
) -> HttpResponseBase: ... ) -> WSGIRequest: ...
class Client(RequestFactory): class Client(RequestFactory):
defaults: Dict[str, str] defaults: Dict[str, str]

View File

@@ -176,6 +176,7 @@ class CheckCondition:
def skipIfDBFeature(*features: Any) -> Callable: ... def skipIfDBFeature(*features: Any) -> Callable: ...
def skipUnlessDBFeature(*features: Any) -> Callable: ... def skipUnlessDBFeature(*features: Any) -> Callable: ...
def skipUnlessAnyDBFeature(*features: Any) -> Callable: ...
class QuietWSGIRequestHandler(WSGIRequestHandler): class QuietWSGIRequestHandler(WSGIRequestHandler):
def log_message(*args: Any) -> None: ... def log_message(*args: Any) -> None: ...

View File

@@ -1,7 +1,8 @@
import decimal import decimal
import warnings import warnings
from contextlib import contextmanager
from decimal import Decimal from decimal import Decimal
from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Tuple, Type, Union from typing import Any, Callable, Dict, Iterator, List, Optional, Set, Tuple, Type, Union, IO
from django.apps.registry import Apps from django.apps.registry import Apps
from django.core.checks.registry import CheckRegistry from django.core.checks.registry import CheckRegistry
@@ -38,7 +39,7 @@ class TestContextDecorator:
def __exit__(self, exc_type: None, exc_value: None, traceback: None) -> None: ... def __exit__(self, exc_type: None, exc_value: None, traceback: None) -> None: ...
def decorate_class(self, cls: _TestClass) -> _TestClass: ... def decorate_class(self, cls: _TestClass) -> _TestClass: ...
def decorate_callable(self, func: Callable) -> Callable: ... def decorate_callable(self, func: Callable) -> Callable: ...
def __call__(self, decorated: _DecoratedTest) -> _DecoratedTest: ... def __call__(self, decorated: _DecoratedTest) -> Any: ...
class override_settings(TestContextDecorator): class override_settings(TestContextDecorator):
options: Dict[str, Any] = ... options: Dict[str, Any] = ...
@@ -102,3 +103,17 @@ class isolate_apps(TestContextDecorator):
installed_apps: Tuple[str] = ... installed_apps: Tuple[str] = ...
def __init__(self, *installed_apps: Any, **kwargs: Any) -> None: ... def __init__(self, *installed_apps: Any, **kwargs: Any) -> None: ...
old_apps: Apps = ... old_apps: Apps = ...
@contextmanager
def extend_sys_path(*paths: str) -> Iterator[None]: ...
@contextmanager
def captured_output(stream_name) -> Iterator[IO[str]]: ...
@contextmanager
def captured_stdin() -> Iterator[IO[str]]: ...
@contextmanager
def captured_stdout() -> Iterator[IO[str]]: ...
@contextmanager
def captured_stderr() -> Iterator[IO[str]]: ...
@contextmanager
def freeze_time(t: float) -> Iterator[None]: ...
def tag(*tags: str): ...

View File

@@ -1,10 +1,17 @@
from typing import Any, Dict, Optional, Tuple from typing import Any, Dict, Iterable, Optional, Tuple, Union
from django.db.models.sql.where import NothingNode
class Node: class Node:
default: str = ... default: str = ...
connector: str = ... connector: str = ...
negated: bool = ... negated: bool = ...
def __init__(self, children: Optional[Node] = ..., connector: Optional[str] = ..., negated: bool = ...) -> None: ... def __init__(
self,
children: Optional[Iterable[Union[Node, NothingNode]]] = ...,
connector: Optional[str] = ...,
negated: bool = ...,
) -> None: ...
def __deepcopy__(self, memodict: Dict[Any, Any]) -> Node: ... def __deepcopy__(self, memodict: Dict[Any, Any]) -> Node: ...
def __len__(self) -> int: ... def __len__(self) -> int: ...
def __bool__(self) -> bool: ... def __bool__(self) -> bool: ...

View File

@@ -21,6 +21,9 @@ def determine_model_cls_from_string_for_migrations(ctx: MethodContext) -> Type:
if app_label is None: if app_label is None:
return ctx.default_return_type return ctx.default_return_type
if 'model_name' not in ctx.callee_arg_names:
return ctx.default_return_type
model_name_expr = ctx.args[ctx.callee_arg_names.index('model_name')][0] model_name_expr = ctx.args[ctx.callee_arg_names.index('model_name')][0]
model_name = get_string_value_from_expr(model_name_expr) model_name = get_string_value_from_expr(model_name_expr)
if model_name is None: if model_name is None:

View File

@@ -0,0 +1 @@
gitpython

View File

@@ -1,56 +0,0 @@
import os
if not os.path.exists('./django-sources'):
git clone -b stable/2.1.x https://github.com/django/django.git django-sources
IGNORED_ERROR_PATTERNS = [
'Need type annotation for',
'already defined on',
'Cannot assign to a',
'cannot perform relative import',
'broken_app',
'LazySettings',
'Cannot infer type of lambda',
'Incompatible types in assignment (expression has type "Callable[',
'"Callable[[Any], Any]" has no attribute',
'Invalid value for a to= parameter'
]
TESTS_DIRS = [
'absolute_url_overrides',
'admin_*',
'aggregation*',
'annotations'
]
def check_file_in_the_current_directory(directory, fname):
cd @(directory)
with ${...}.swap(FNAME=fname):
for line in $(mypy --config-file ../../../scripts/mypy.ini $FNAME).split('\n'):
for pattern in IGNORED_ERROR_PATTERNS:
if pattern in line:
break
else:
if line:
print(line)
cd -
def parse_ls_output_into_fnames(output):
fnames = []
for line in output.splitlines()[1:]:
fnames.append(line.split()[-1])
return fnames
all_tests_dirs = []
for test_dir in TESTS_DIRS:
with ${...}.swap(TEST_DIR=test_dir):
dirs = g`django-sources/tests/$TEST_DIR`
all_tests_dirs.extend(dirs)
for tests_dir in all_tests_dirs:
print('Checking ' + tests_dir)
abs_dir = os.path.join(os.getcwd(), tests_dir)
with ${...}.swap(ABS_DIR=abs_dir):
ls_output = $(ls -lhv --color=auto -F --group-directories-first $ABS_DIR)
for fname in parse_ls_output_into_fnames(ls_output):
path_to_check = os.path.join(abs_dir, fname)
check_file_in_the_current_directory(abs_dir, fname)

345
scripts/typecheck_tests.py Normal file
View File

@@ -0,0 +1,345 @@
import os
import re
import sys
from contextlib import contextmanager
from pathlib import Path
from typing import Pattern
from git import Repo
from mypy import build
from mypy.main import process_options
# Django branch to typecheck against
DJANGO_BRANCH = 'stable/2.1.x'
# Specific commit in the Django repository to check against
DJANGO_COMMIT_SHA = '03219b5f709dcd5b0bfacd963508625557ec1ef0'
# Some errors occur for the test suite itself, and cannot be addressed via django-stubs. They should be ignored
# using this constant.
IGNORED_ERROR_PATTERNS = [
'Need type annotation for',
'already defined on',
'Cannot assign to a',
'cannot perform relative import',
'broken_app',
'cache_clear',
'call_count',
'call_args_list',
'call_args',
'"password_changed" does not return a value',
'"validate_password" does not return a value',
'LazySettings',
'Cannot infer type of lambda',
'"refresh_from_db" of "Model"',
'"as_sql" undefined in superclass',
'Incompatible types in assignment (expression has type "str", target has type "type")',
'Incompatible types in assignment (expression has type "Callable[',
'Invalid value for a to= parameter',
'Incompatible types in assignment (expression has type "FilteredChildAdmin", variable has type "ChildAdmin")',
'Incompatible types in assignment (expression has type "RelatedFieldWidgetWrapper", variable has type "AdminRadioSelect")',
'has incompatible type "MockRequest"; expected "WSGIRequest"',
'"NullTranslations" has no attribute "_catalog"',
'Definition of "as_sql" in base class',
'expression has type "property"',
'"object" has no attribute "__iter__"',
'Too few arguments for "dates" of "QuerySet"',
'has no attribute "vendor"',
'Argument 1 to "get_list_or_404" has incompatible type "List',
'error: "AdminRadioSelect" has no attribute "can_add_related"',
'MockCompiler',
'SessionTestsMixin',
'Argument 1 to "Paginator" has incompatible type "ObjectList"',
'"Type[Morsel[Any]]" has no attribute "_reserved"',
'Argument 1 to "append" of "list"',
'Argument 1 to "bytes"',
'"full_clean" of "Model" does not return a value',
'"object" not callable',
re.compile('Cannot determine type of \'(objects|stuff|specimens|normal_manager)\''),
re.compile(r'"Callable\[\[(Any(, )?)+\], Any\]" has no attribute'),
re.compile(r'"HttpResponseBase" has no attribute "[A-Za-z_]+"'),
re.compile(r'Incompatible types in assignment \(expression has type "Tuple\[\]", '
r'variable has type "Tuple\[[A-Za-z, ]+\]"'),
re.compile(r'"validate" of "[A-Za-z]+" does not return a value'),
re.compile(r'Module has no attribute "[A-Za-z_]+"'),
re.compile(r'"[A-Za-z\[\]]+" has no attribute "getvalue"'),
# TODO: remove when reassignment will be possible (in 0.670? )
re.compile(r'Incompatible types in assignment \(expression has type "(QuerySet|List)\[[A-Za-z, ]+\]", '
r'variable has type "(QuerySet|List)\[[A-Za-z, ]+\]"\)'),
re.compile(r'"(MockRequest|DummyRequest|DummyUser)" has no attribute "[a-zA-Z_]+"'),
# TODO: remove when form <-> model plugin support is added
re.compile(r'"Model" has no attribute "[A-Za-z_]+"'),
re.compile(r'Argument 1 to "get_object_or_404" has incompatible type "(str|Type\[CustomClass\])"'),
re.compile(r'"None" has no attribute "[a-zA-Z_0-9]+"'),
]
# Test folders to typecheck
TESTS_DIRS = [
'absolute_url_overrides',
'admin_autodiscover',
'admin_changelist',
'admin_checks',
'admin_custom_urls',
'admin_default_site',
'admin_docs',
# TODO: 'admin_filters',
'admin_inlines',
'admin_ordering',
'admin_registration',
'admin_scripts',
# TODO: 'admin_utils',
# TODO: 'admin_views',
'admin_widgets',
'aggregation',
'aggregation_regress',
'annotations',
'app_loading',
# TODO: 'apps',
# TODO: 'auth_tests'
'base',
'bash_completion',
'basic',
'builtin_server',
'bulk_create',
# TODO: 'cache',
# TODO: 'check_framework',
'choices',
'conditional_processing',
# TODO: 'contenttypes_tests',
'context_processors',
'csrf_tests',
'custom_columns',
# TODO: 'custom_lookups',
# TODO: 'custom_managers',
'custom_methods',
'custom_migration_operations',
'custom_pk',
'datatypes',
'dates',
'datetimes',
'db_functions',
'db_typecasts',
'db_utils',
'dbshell',
# TODO: 'decorators',
'defer',
# TODO: 'defer_regress',
'delete',
'delete_regress',
# TODO: 'deprecation',
# TODO: 'dispatch',
'distinct_on_fields',
'empty',
# TODO: 'expressions',
'expressions_case',
# TODO: 'expressions_window',
# TODO: 'extra_regress',
# TODO: 'field_deconstruction',
'field_defaults',
'field_subclassing',
# TODO: 'file_storage',
# TODO: 'file_uploads',
# TODO: 'files',
'filtered_relation',
# TODO: 'fixtures',
'fixtures_model_package',
# TODO: 'fixtures_regress',
# TODO: 'flatpages_tests',
'force_insert_update',
'foreign_object',
# TODO: 'forms_tests',
'from_db_value',
# TODO: 'generic_inline_admin',
# TODO: 'generic_relations',
'generic_relations_regress',
# TODO: 'generic_views',
'get_earliest_or_latest',
'get_object_or_404',
# TODO: 'get_or_create',
# TODO: 'gis_tests',
'handlers',
# TODO: 'httpwrappers',
'humanize_tests',
# TODO: 'i18n',
'import_error_package',
'indexes',
'inline_formsets',
'inspectdb',
'introspection',
# TODO: 'invalid_models_tests',
'known_related_objects',
# TODO: 'logging_tests',
# TODO: 'lookup',
'm2m_and_m2o',
'm2m_intermediary',
'm2m_multiple',
'm2m_recursive',
'm2m_regress',
'm2m_signals',
'm2m_through',
'm2m_through_regress',
'm2o_recursive',
# TODO: 'mail',
'managers_regress',
'many_to_many',
'many_to_one',
'many_to_one_null',
'max_lengths',
# TODO: 'messages_tests',
# TODO: 'middleware',
# TODO: 'middleware_exceptions',
# SKIPPED (all errors are false positives) 'migrate_signals',
'migration_test_data_persistence',
# TODO: 'migrations',
'migrations2',
# TODO: 'model_fields',
# TODO: 'model_forms',
'model_formsets',
'model_formsets_regress',
'model_indexes',
# TODO: 'model_inheritance',
'model_inheritance_regress',
# SKIPPED (all errors are false positives) 'model_meta',
'model_options',
'model_package',
'model_regress',
# TODO: 'modeladmin',
# TODO: 'multiple_database',
'mutually_referential',
'nested_foreign_keys',
'no_models',
'null_fk',
'null_fk_ordering',
'null_queries',
'one_to_one',
'or_lookups',
'order_with_respect_to',
'ordering',
'pagination',
# TODO: 'postgres_tests',
# TODO: 'prefetch_related',
'project_template',
'properties',
'proxy_model_inheritance',
# TODO: 'proxy_models',
# TODO: 'queries',
'queryset_pickle',
'raw_query',
'redirects_tests',
# TODO: 'requests',
'reserved_names',
'resolve_url',
# TODO: 'responses',
'reverse_lookup',
'save_delete_hooks',
'schema',
# TODO: 'select_for_update',
'select_related',
'select_related_onetoone',
'select_related_regress',
# TODO: 'serializers',
# TODO: 'servers',
'sessions_tests',
'settings_tests',
'shell',
# TODO: 'shortcuts',
# TODO: 'signals',
'signed_cookies_tests',
# TODO: 'signing',
# TODO: 'sitemaps_tests',
'sites_framework',
# TODO: 'sites_tests',
# TODO: 'staticfiles_tests',
'str',
'string_lookup',
'swappable_models',
# TODO: 'syndication_tests',
# TODO: 'template_backends',
'template_loader',
# TODO: 'template_tests',
# TODO: 'test_client',
# TODO: 'test_client_regress',
'test_exceptions',
# TODO: 'test_runner',
'test_runner_apps',
# TODO: 'test_utils',
# TODO: 'timezones',
'transaction_hooks',
# TODO: 'transactions',
'unmanaged_models',
# TODO: 'update',
'update_only_fields',
'urlpatterns',
# TODO: 'urlpatterns_reverse',
'user_commands',
# TODO: 'utils_tests',
# TODO: 'validation',
'validators',
'version',
# TODO: 'view_tests',
# TODO: 'wsgi',
]
@contextmanager
def cd(path):
"""Context manager to temporarily change working directories"""
if not path:
return
prev_cwd = Path.cwd().as_posix()
if isinstance(path, Path):
path = path.as_posix()
os.chdir(str(path))
try:
yield
finally:
os.chdir(prev_cwd)
def is_ignored(line: str) -> bool:
for pattern in IGNORED_ERROR_PATTERNS:
if isinstance(pattern, Pattern):
if pattern.search(line):
return True
else:
if pattern in line:
return True
return False
def check_with_mypy(abs_path: Path, config_file_path: Path) -> int:
error_happened = False
with cd(abs_path):
sources, options = process_options(['--config-file', str(config_file_path), str(abs_path)])
res = build.build(sources, options)
for error_line in res.errors:
if not is_ignored(error_line):
error_happened = True
print(error_line)
return int(error_happened)
if __name__ == '__main__':
project_directory = Path(__file__).parent.parent
mypy_config_file = (project_directory / 'scripts' / 'mypy.ini').absolute()
repo_directory = project_directory / 'django-sources'
tests_root = repo_directory / 'tests'
global_rc = 0
# clone Django repository, if it does not exist
if not repo_directory.exists():
repo = Repo.clone_from('https://github.com/django/django.git', repo_directory)
else:
repo = Repo(repo_directory)
repo.remotes['origin'].pull(DJANGO_BRANCH)
repo.git.checkout(DJANGO_COMMIT_SHA)
for dirname in TESTS_DIRS:
abs_path = (project_directory / tests_root / dirname).absolute()
print(f'Checking {abs_path.as_uri()}')
rc = check_with_mypy(abs_path, mypy_config_file)
if rc != 0:
global_rc = 1
sys.exit(rc)