86 Commits

Author SHA1 Message Date
Aleksander Vognild Burkow
ac40b80764 Mention solution to potential PYTHONPATH pitfall. (#115) 2019-07-26 18:48:38 +03:00
Maxim Kurnikov
6b21a0476d Remove psycopg2 from dependencies (#117)
* remove psycopg2 from direct dependencies, only add it in tests

* bump to 1.0.1

* fix mypy
2019-07-26 18:39:42 +03:00
Maxim Kurnikov
735b58e9bf values_list for related model id flat True (#113) 2019-07-25 21:33:45 +03:00
Maxim Kurnikov
b4cd9757b0 Merge pull request #109 from mkurnikov/new-semanal
New semanal support, rewrite to use Django app registry
2019-07-25 20:14:03 +03:00
Maxim Kurnikov
1b6c337aef enable mypy typechecking for plugin code 2019-07-25 20:03:10 +03:00
Maxim Kurnikov
bc42cc2fa1 add python3.6 tests typechecking 2019-07-25 19:56:37 +03:00
Maxim Kurnikov
62dac1d468 remove some asserts that could be validly triggered 2019-07-25 19:53:12 +03:00
Maxim Kurnikov
409c01eb24 allow to specify QuerySet with one parameter 2019-07-25 19:22:59 +03:00
Maxim Kurnikov
a0a2ecaf46 fix additional mypy config and auto settings 2019-07-25 19:14:36 +03:00
Maxim Kurnikov
4c21855641 fix mypy errors 2019-07-25 18:52:51 +03:00
Maxim Kurnikov
6466c57c69 update setup.py 2019-07-25 17:28:39 +03:00
Maxim Kurnikov
0bb41bc791 add notes about new manager types to README 2019-07-25 17:17:47 +03:00
Maxim Kurnikov
8894de0a04 add new config options to README 2019-07-25 17:03:37 +03:00
Maxim Kurnikov
a019fe9715 csrf middleware callable can be none 2019-07-25 15:03:10 +03:00
Maxim Kurnikov
a97d76020c enable tests typechecking using django submodule 2019-07-24 23:44:57 +03:00
Maxim Kurnikov
ae8e42dd53 lint 2019-07-24 22:56:14 +03:00
Maxim Kurnikov
64049b60b0 add missing psycopg2 dependency 2019-07-24 22:54:12 +03:00
Maxim Kurnikov
b6a5ccabdf move configuration to [mypy.plugins.django-stubs] inside mypy config file 2019-07-24 22:32:52 +03:00
Maxim Kurnikov
e6d7a570e8 fix merge artifact 2019-07-24 22:05:05 +03:00
Maxim Kurnikov
6332620443 rewrite pytest-mypy-plugin extension code to use new hook 2019-07-24 13:39:24 +03:00
Maxim Kurnikov
df021f6baa add some support for proxy models 2019-07-24 13:39:23 +03:00
Maxim Kurnikov
57796077c6 create(id=None) is valid, if id is AutoField 2019-07-24 13:38:50 +03:00
Maxim Kurnikov
46c48b504f tweak travis config to use new tests properly 2019-07-24 13:38:50 +03:00
Maxim Kurnikov
4dfa363521 lint fixes 2019-07-24 13:38:50 +03:00
Maxim Kurnikov
5b2aacddba add missing field methods 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
2c001fd8a7 cleanups 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
a0db24c764 add objects to model, trade false positive for false negative 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
39fb48b08a fix httprequest other fields 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
d7d379e1cd create dummy classes for custom_manager_of_model usecase 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
6962b42cba allow to use fields as Field objects outside Model classes 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
df77299c2f cleanups 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
b86d33c718 allow custom app label for ForeignKey 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
fa57fb0cbf request.user has type of AUTH_USER_MODEL 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
248504c25a various fixes 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
fee4aad3d0 fix OneToOneField without related_name 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
fc9843bea6 add support for _meta.get_field() typechecking 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
5bb1bc250d add get_next_by_FOO, get_previous_by_FOO for date,datetime fields 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
1721c997be add support for get_FIELD_display for choices fields 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
bba6f769b5 add django.contrib.contenttypes to all tests by default 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
07a9bcd4cb remove dataclasses dependency 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
6ece759ca0 remove runtime dependency on pytest-mypy-plugins 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
caf69ec1c9 add Django dependency 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
f2e79d3bfb add GenericForeignKey support, remove some false-positives 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
bfa77efef5 one more edge case for values() 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
4f935edd47 add reverse lookups to values(), values_list() 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
03b59b872d cleanups, fallback to Any in some corner cases 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
0e72b2e6fc more values(), values_list() cases 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
b81fbdeaa9 remove -semanal suffix 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
dc6101b569 remove old semanal plugin data 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
d53121baae add support for forms, values, values_list 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
3c3122a93f add settings support 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
7b1b1b6bfe add related managers support 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
2cb1f257eb add proper __init__, create() support 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
b11a9a85f9 new semanal wip 1 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
9c5a6be9a7 split helpers into smaller files 2019-07-24 13:38:49 +03:00
Maxim Kurnikov
a9c1bcbbc6 Merge pull request #111 from rik/has_perm
More accurate `PermissionsMixin.has_perm`
2019-07-21 19:23:18 +03:00
Anthony Ricaud
f365297baf Allow any Collection to be passed to has_perms 2019-07-21 02:09:05 +01:00
Anthony Ricaud
6859ec94b6 More accurate PermissionsMixin.has_perm
It only accepts `str` for `perm`
2019-07-19 12:42:03 +01:00
Maxim Kurnikov
335c5765c3 enable test folders: select_for_update, i18n, httpwrappers, auth_tests, extra_regress (#107) 2019-07-10 19:38:36 +03:00
Maxim Kurnikov
b397ec04a9 add utils_tests test folder to typechecking (#106) 2019-07-10 18:19:37 +03:00
Nikita Sobolev
f7db296e8b Makes localtime/localdate accept optional params (#105)
* Makes localtime/localdate accept optional params

Closes #104

* Removed None from default values
2019-07-10 15:58:10 +03:00
Maxim Kurnikov
2f6af159f7 add correct return annotation to get_storage_class (#103)
Co-Authored-By: cs-cordero <chris.s.cordero@gmail.com>
2019-07-10 14:06:09 +03:00
Maxim Kurnikov
2799646723 add missing files throughout the codebase (#102) 2019-07-09 05:18:15 +03:00
Maxim Kurnikov
d8230a4147 Add typechecking for 'file_storage', 'files' test folders (#101)
* add typechecking for 'file_storage', 'files' test folders

* fix File class annotations
2019-07-07 03:58:00 +03:00
Peter Law
861c6653fd Make SuccessMessageMixin fully compatible with FormMixin (#86)
This ensures that the order in which these mixins are included
into a derrived class does not matter and ends up more accurately
reflecting the return type of SuccessMessageMixin in the process
(its code doesn't appear to enforce that the returned response
is a redirect).

This provides a fix to a secondary aspect of
https://github.com/mkurnikov/django-stubs/issues/79.
2019-07-02 13:34:05 +03:00
Konstantin Alekseev
db7b46589f Add timezone.localdate() (#87) 2019-07-02 13:33:28 +03:00
Maxim Kurnikov
90cab6c5bf revert meta: Options annotation (#99) 2019-07-01 22:33:00 +03:00
Peter Law
25165de80f Add get_candidate_relations_to_delete (#92)
* Set a precise type for Model._meta

* Add missing 'get_candidate_relations_to_delete' function signature

Fixes https://github.com/mkurnikov/django-stubs/issues/77.
2019-07-01 18:50:01 +03:00
Peter Law
2295b14214 Allow any iterable to be passed to method_decorator (#90)
From reading the source of Django 2.1.9, this seems to be what's
allowed there.

Fixes https://github.com/mkurnikov/django-stubs/issues/78.
2019-07-01 18:49:40 +03:00
Maxim Kurnikov
a77d5b27d8 Update typecheck_tests to django 2.2 branch, remove unused ignores (#98)
* update typecheck_tests to django 2.2 branch, remove unused ignores

* lint fixes
2019-07-01 18:44:34 +03:00
Maxim Kurnikov
4e1c32f6a3 Fix mypy==0.710 errors (#97)
* error -> note for revealed type for tests

* fixes for latest mypy
2019-07-01 00:51:56 +03:00
Maxim Kurnikov
ea1294bd30 set version to 0.13.0, bump mypy to 0.710 2019-07-01 00:02:41 +03:00
Maxim Kurnikov
79d691732d do not release if uncommitted changes 2019-07-01 00:02:41 +03:00
Anton Agestam
629ba954b4 fix: remove SuccessMessageMixin.form_valid violation of Liskov substitution principle (#84) 2019-06-02 13:23:37 +03:00
Ran Benita
0e60b70ae4 A couple of small fixes (#81)
* Fix type of django.contrib.postgres.fields.JSONField(verbose_name)

* Improve type for CursorWrapper.execute(params)

Not perfect. Based on simple cases from
http://initd.org/psycopg/docs/usage.html#adaptation-of-python-values-to-sql-types
2019-05-21 21:26:45 +03:00
Ville Skyttä
dd5b98faf0 django.contrib.messages.api: use HttpRequest instead of WSGIRequest (#73)
Its error messages explicitly note that an HttpRequest is required.
https://docs.djangoproject.com/en/2.1/_modules/django/contrib/messages/api/#add_message
2019-05-21 17:23:19 +03:00
Ethan Smith
e634a5d460 Re-export names from django.core.cache.backend.base (#71) 2019-05-19 19:59:14 +03:00
aszlig
d7d7e6c66e Fix type of prefix arg in staticfiles_urlpatterns (#74)
Using a *type* of None for the prefix keyword argument is not going to
typecheck very well, so it might be a typo here because the default
value (rather than the type) is None.

Signed-off-by: aszlig <aszlig@nix.build>
2019-05-19 19:59:00 +03:00
Anthony Ricaud
b66727657d Type non-parametrised views.decorators.http (#80)
Fixes `error: Untyped decorator makes function "view" untyped`
2019-05-17 20:40:40 +03:00
Maxim Kurnikov
86642e3ddd bump version 2019-04-15 14:50:43 +03:00
Maciej Gol
952e1c3ee9 Preserve callable type in view decorators (#67) 2019-04-13 22:31:49 +03:00
Maxim Kurnikov
5dd6eccdb5 make ignore_missing_model_attributes behaviour optional (#66)
make "ignore_missing_model_attributes" behaviour opt-in
2019-04-12 17:22:18 +03:00
Maxim Kurnikov
fd06816cbb Work around "no settings module" crash (#65)
Workaround "no settings module" crash
2019-04-12 17:14:23 +03:00
Maxim Kurnikov
aeb435c8b3 Disable monkeypatches, add dependencies via new hook (#60)
* code cleanups, disable monkeypatches, move to add_additional_deps

* disable incremental mode for tests

* add pip-wheel-metadata

* move some code from get_base_hook to get_attribute_hook to reduce dependencies

* simplify values/values_list tests and code

* disable cache for some tests failing with incremental mode

* enable incremental mode for tests typechecking

* pin mypy version

* fix tests

* lint

* fix internal crashes
2019-04-12 14:54:00 +03:00
Maxim Kurnikov
13d19017b7 bump version 2019-04-01 19:40:13 +03:00
Maxim Kurnikov
28a3f126ee make mypy.checker import locally to prevent import cycles 2019-04-01 19:39:50 +03:00
198 changed files with 5821 additions and 5216 deletions

5
.gitignore vendored
View File

@@ -5,6 +5,7 @@ out/
/django
.idea/
.mypy_cache/
django-sources
build/
dist/
dist/
pip-wheel-metadata/
.pytest_cache/

4
.gitmodules vendored Normal file
View File

@@ -0,0 +1,4 @@
[submodule "django-sources"]
path = django-sources
url = https://github.com/django/django.git
branch = stable/2.2.x

View File

@@ -10,16 +10,18 @@ jobs:
set -e
pytest
- name: Run plugin test suite with python 3.6
python: 3.6
script: |
set -e
pytest
- name: Typecheck Django test suite
- name: Typecheck Django test suite with python 3.7
python: 3.7
script: 'python ./scripts/typecheck_tests.py'
- name: Typecheck Django test suite with python 3.6
python: 3.6
script: 'python ./scripts/typecheck_tests.py'
- name: Mypy for plugin code
python: 3.7
script: 'mypy ./mypy_django_plugin'
- name: Lint with black
python: 3.7
script: 'black --check --line-length=120 django-stubs/'
@@ -36,13 +38,4 @@ before_install: |
# Upgrade pip, setuptools, and wheel
pip install -U pip setuptools wheel
install: |
pip install -r ./dev-requirements.txt
pip install -r ./scripts/typecheck-tests-requirements.txt
#deploy:
# provider: pypi
# user: "mkurnikov"
# password:
# secure: 0E+hkaIdtpEtyL1KZeglunZ5/PKjouFfa8ljakAwoig7VNUL+2sO/bTyg38wRQl0NvzDzEHSMEt1bzg4Tq7b7Zp6nLuewG/w7mGLzqaOlTySiPEfRsg8s6uO2KrTn7g9VhlXH6UtyTXoQdMt6aE8+bt/GmEesanS57NB2mhwmylFgQwlJFu4LfIv/+aGmc4eLeGI2Qhvs9QYf7qvYlLQldgFh8mAckQEEvaBg35sf+puypZgf4nkx1k/dfG9wnFWZU8PJ41LbMw/Wj+k/9NpF8ePwiAr0fvRMErZd8nvoiWjQQjhzgrLVHhXEP5pTHh3zjDuGFMWyKuBhC6WLsG4qOQz/HvxeYvNI+jaTp15BgxtefG/pCNDUl/8GlCde7xVt7xzEcYNJSRaZPY2oofEFSd9qDnr4kqmyCXpNsaHRHvkL61bFjXUcfOsMMYvQCC6N2Jjb7S97RbnDdkOZO/lnFhVANT2rigsaXlSlWyN6f7ApxDNvu6Ehu5yrx6IjlPZJ0sI9vvY3IoS6Fik7w9E6zjNVjbmUn1D4MKFP4v5ppNASOqYcZeLd42j8rjEp0gIc3ccz9aUIT9q8VqSXSdUbqA6SVwvHXIVPxJMXj0bqWBG1iKs0cPBuzRVpRrwkENWCSWElDAewM1qFEnK0LppyoYFbqoQ8F5FG0+re7QttKQ=
# on:
# tags: true
pip install -r ./dev-requirements.txt

View File

@@ -7,7 +7,7 @@
This package contains type stubs and mypy plugin to provide more precise static types and type inference for Django framework. Django uses some Python "magic" that makes having precise types for some code patterns problematic. This is why we need to accompany the stubs with mypy plugins. The final goal is to be able to get precise types for most common patterns.
Supports Python 3.6/3.7, and Django 2.1.x series.
Supports Python 3.6/3.7, and Django 2.1/2.2.
Could be run on earlier versions of Django, but expect some missing imports warnings.
@@ -17,6 +17,10 @@ Could be run on earlier versions of Django, but expect some missing imports warn
pip install django-stubs
```
### WARNING: All configuration from pre-1.0.0 versions is dropped, use one below.
### WARNING: 1.0.0 breaks `dmypy`, if you need it, stay on the 0.12.x series.
To make mypy aware of the plugin, you need to add
```
@@ -27,27 +31,41 @@ plugins =
in your `mypy.ini` file.
## Configuration
In order to specify config file, set `MYPY_DJANGO_CONFIG` environment variable with path to the config file. Default is `./mypy_django.ini`
Config file format (.ini):
Plugin requires Django settings module (what you put into `DJANGO_SETTINGS_MODULE` variable) to be specified inside `mypy.ini` file.
```
[mypy_django_plugin]
[mypy]
strict_optional = True
# specify settings module to use for django.conf.settings, this setting
# could also be specified with DJANGO_SETTINGS_MODULE environment variable
# (it also takes priority over config file)
django_settings = mysettings.local
# if True, all unknown settings in django.conf.settings will fallback to Any,
# specify it if your settings are loaded dynamically to avoid false positives
ignore_missing_settings = True
; this one is new
[mypy.plugins.django-stubs]
django_settings_module = mysettings
```
where `mysettings` is a value of `DJANGO_SETTINGS_MODULE` (with or without quotes)
Do you have trouble with mypy / the django plugin not finding your settings module? Try adding the root path of your project to your PYTHONPATH environment variable. If you use pipenv you can add the following to an `.env` file in your project root which pipenv will run automatically before executing any commands.:
```
PYTHONPATH=${PYTHONPATH}:${PWD}
```
New implementation uses Django runtime to extract models information, so it will crash, if your installed apps `models.py` is not correct. For this same reason, you cannot use `reveal_type` inside global scope of any Python file that will be executed for `django.setup()`.
In other words, if your `manage.py runserver` crashes, mypy will crash too.
## Notes
Implementation monkey-patches Django to add `__class_getitem__` to the `Manager` class. If you'd use Python3.7 and do that too in your code, you can make things like
```
class MyUserManager(models.Manager['MyUser']):
pass
class MyUser(models.Model):
objects = UserManager()
```
work, which should make a error messages a bit better.
Otherwise, custom type will be created in mypy, named `MyUser__MyUserManager`, which will rewrite base manager as `models.Manager[User]` to make methods like `get_queryset()` and others return properly typed `QuerySet`.
## 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.
If you think you have more generic typing issue, please refer to https://github.com/python/mypy and their Gitter.

View File

@@ -1,5 +1,6 @@
black
pytest-mypy-plugins
pytest-mypy-plugins==1.0.3
psycopg2
flake8
isort==4.3.4
-e .

1
django-sources Submodule

Submodule django-sources added at 4d6449e125

View File

@@ -1,5 +1,6 @@
import collections
from typing import Any, Callable, List, Optional, Tuple, Type, Union, Iterable, DefaultDict
import threading
from collections import OrderedDict
from typing import Any, Callable, List, Optional, Tuple, Type, Union, Iterable, DefaultDict, Dict
from django.db.migrations.state import AppConfigStub
from django.db.models.base import Model
@@ -7,22 +8,24 @@ from django.db.models.base import Model
from .config import AppConfig
class Apps:
all_models: collections.defaultdict = ...
app_configs: collections.OrderedDict = ...
all_models: "Dict[str, OrderedDict[str, Type[Model]]]" = ...
app_configs: "OrderedDict[str, AppConfig]" = ...
stored_app_configs: List[Any] = ...
apps_ready: bool = ...
ready_event: threading.Event = ...
loading: bool = ...
_pending_operations: DefaultDict[Tuple[str, str], List]
def __init__(self, installed_apps: Optional[Union[List[AppConfigStub], List[str], Tuple]] = ...) -> None: ...
models_ready: bool = ...
ready: bool = ...
def __init__(self, installed_apps: Optional[Union[List[AppConfigStub], List[str], Tuple]] = ...) -> None: ...
def populate(self, installed_apps: Union[List[AppConfigStub], List[str], Tuple] = ...) -> None: ...
def check_apps_ready(self) -> None: ...
def check_models_ready(self) -> None: ...
def get_app_configs(self) -> Iterable[AppConfig]: ...
def get_app_config(self, app_label: str) -> AppConfig: ...
def get_models(self, include_auto_created: bool = ..., include_swapped: bool = ...) -> List[Type[Model]]: ...
def get_model(self, app_label: str, model_name: Optional[str] = ..., require_ready: bool = ...) -> Type[Model]: ...
# it's not possible to support it in plugin properly now
def get_models(self, include_auto_created: bool = ..., include_swapped: bool = ...) -> List[Type[Any]]: ...
def get_model(self, app_label: str, model_name: Optional[str] = ..., require_ready: bool = ...) -> Type[Any]: ...
def register_model(self, app_label: str, model: Type[Model]) -> None: ...
def is_installed(self, app_name: str) -> bool: ...
def get_containing_app_config(self, object_name: str) -> Optional[AppConfig]: ...

View File

@@ -2,10 +2,16 @@ from typing import Any
from django.utils.functional import LazyObject
# explicit dependency on standard settings to make it loaded
from . import global_settings
ENVIRONMENT_VARIABLE: str = ...
DEFAULT_CONTENT_TYPE_DEPRECATED_MSG: str = ...
FILE_CHARSET_DEPRECATED_MSG: str = ...
# required for plugin to be able to distinguish this specific instance of LazySettings from others
class _DjangoConfLazyObject(LazyObject): ...
class _DjangoConfLazyObject(LazyObject):
def __getattr__(self, item: Any) -> Any: ...
class LazySettings(_DjangoConfLazyObject):
configured: bool
@@ -18,3 +24,6 @@ class Settings:
def is_overridden(self, setting: str) -> bool: ...
class UserSettingsHolder: ...
class SettingsReference(str):
def __init__(self, value: str, setting_name: str) -> None: ...

View File

@@ -5,14 +5,11 @@ 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.
from typing import Any, Dict, List, Optional, Pattern, Tuple, Protocol, Union, Callable, TYPE_CHECKING, Sequence
from typing import Any, Dict, List, Optional, Pattern, Protocol, Sequence, Tuple, Union
####################
# CORE #
####################
if TYPE_CHECKING:
from django.db.models.base import Model
DEBUG: bool = ...
# Whether the framework should propagate raw exceptions rather than catching
@@ -153,7 +150,7 @@ FORCE_SCRIPT_NAME = None
# ]
DISALLOWED_USER_AGENTS: List[Pattern] = ...
ABSOLUTE_URL_OVERRIDES: Dict[str, Callable[[Model], str]] = ...
ABSOLUTE_URL_OVERRIDES: Dict[str, Any] = ...
# List of compiled regular expression objects representing URLs that need not
# be reported by BrokenLinkEmailsMiddleware. Here are a few examples:

View File

@@ -0,0 +1,3 @@
from typing import Dict, Any
LANG_INFO: Dict[str, Any] = ...

View File

@@ -0,0 +1,23 @@
from typing import Any, Callable
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.test.selenium import SeleniumTestCase
from django.utils.deprecation import MiddlewareMixin
class CSPMiddleware(MiddlewareMixin): ...
class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase):
def wait_until(self, callback: Callable, timeout: int = ...) -> None: ...
def wait_for_popup(self, num_windows: int = ..., timeout: int = ...) -> None: ...
def wait_for(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_for_text(self, css_selector: str, text: str, timeout: int = ...) -> None: ...
def wait_for_value(self, css_selector: str, text: str, timeout: int = ...) -> None: ...
def wait_until_visible(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_until_invisible(self, css_selector: str, timeout: int = ...) -> None: ...
def wait_page_loaded(self) -> None: ...
def admin_login(self, username: str, password: str, login_url: str = ...) -> None: ...
def get_css_value(self, selector: str, attribute: str) -> Any: ...
def get_select_option(self, selector: str, value: Any) -> Any: ...
def assertSelectOptions(self, selector: str, values: Any) -> None: ...
def assertSelectedOptions(self, selector: str, values: Any) -> None: ...
def has_css_class(self, selector: str, klass: str) -> bool: ...

View File

@@ -2,7 +2,7 @@ from collections import OrderedDict
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
from django.contrib.admin.filters import ListFilter, SimpleListFilter
from django.contrib.admin.options import ModelAdmin
from django.contrib.admin.options import ModelAdmin, IS_POPUP_VAR as IS_POPUP_VAR, TO_FIELD_VAR as TO_FIELD_VAR
from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model
from django.db.models.expressions import Combinable, CombinedExpression, OrderBy

View File

@@ -1,10 +1,10 @@
from typing import Any, Dict, List, Optional, Set, Tuple, Union
from typing import Any, Dict, Optional, Tuple, Union
from uuid import UUID
from django.contrib.admin.sites import AdminSite
from django.db.models.fields.reverse_related import ForeignObjectRel, ManyToOneRel
from django.forms.models import ModelChoiceIterator
from django.forms.widgets import ChoiceWidget, Media
from django.forms.widgets import Media
from django import forms
@@ -43,7 +43,7 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): ...
class RelatedFieldWidgetWrapper(forms.Widget):
template_name: str = ...
choices: ModelChoiceIterator = ...
widget: AutocompleteSelect = ...
widget: forms.Widget = ...
rel: ManyToOneRel = ...
can_add_related: bool = ...
can_change_related: bool = ...
@@ -52,7 +52,7 @@ class RelatedFieldWidgetWrapper(forms.Widget):
admin_site: AdminSite = ...
def __init__(
self,
widget: ChoiceWidget,
widget: forms.Widget,
rel: ForeignObjectRel,
admin_site: AdminSite,
can_add_related: Optional[bool] = ...,
@@ -74,6 +74,9 @@ class AdminIntegerFieldWidget(forms.NumberInput):
class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget): ...
class AdminUUIDInputWidget(forms.TextInput):
def __init__(self, attrs: Optional[Dict[str, str]] = ...) -> None: ...
SELECT2_TRANSLATIONS: Any
class AutocompleteMixin:

View File

@@ -1,16 +1,20 @@
from typing import Any, Optional, Tuple, List, overload
from typing import Any, Optional, Tuple, List, overload, TypeVar
from django.db.models.base import Model
from django.db import models
class BaseUserManager(models.Manager):
_T = TypeVar("_T", bound=Model)
class BaseUserManager(models.Manager[_T]):
@classmethod
def normalize_email(cls, email: Optional[str]) -> str: ...
def make_random_password(self, length: int = ..., allowed_chars: str = ...) -> str: ...
def get_by_natural_key(self, username: Optional[str]) -> AbstractBaseUser: ...
def get_by_natural_key(self, username: Optional[str]) -> _T: ...
class AbstractBaseUser(models.Model):
password: models.CharField = ...
last_login: Optional[models.DateTimeField] = ...
last_login: models.DateTimeField = ...
is_active: models.BooleanField = ...
REQUIRED_FIELDS: List[str] = ...
class Meta: ...

View File

@@ -23,7 +23,7 @@ class BasePasswordHasher:
memory_cost: int = ...
parallelism: int = ...
digest: Any = ...
iterations: Optional[int] = ...
iterations: int = ...
def salt(self) -> str: ...
def verify(self, password: str, encoded: str) -> bool: ...
def encode(self, password: str, salt: str) -> Any: ...

View File

@@ -1,4 +1,9 @@
import getpass as getpass
from typing import Any
from django.core.management.base import BaseCommand
class NotRunningInTTYException(Exception): ...
class Command(BaseCommand): ...
class Command(BaseCommand):
stdin: Any

View File

@@ -1,10 +1,11 @@
from typing import Any, List, Optional, Set, Tuple, Type, Union
from typing import Any, Collection, Optional, Set, Tuple, Type, TypeVar
from django.contrib.auth.base_user import AbstractBaseUser as AbstractBaseUser, BaseUserManager as BaseUserManager
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.contrib.contenttypes.models import ContentType
from django.db.models.base import Model
from django.db.models.manager import EmptyManager
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.db import models
def update_last_login(sender: Type[AbstractBaseUser], user: AbstractBaseUser, **kwargs: Any) -> None: ...
@@ -27,13 +28,15 @@ class Group(models.Model):
permissions: models.ManyToManyField = models.ManyToManyField(Permission)
def natural_key(self): ...
class UserManager(BaseUserManager):
_T = TypeVar("_T", bound=Model)
class UserManager(BaseUserManager[_T]):
def create_user(
self, username: str, email: Optional[str] = ..., password: Optional[str] = ..., **extra_fields: Any
) -> AbstractUser: ...
) -> _T: ...
def create_superuser(
self, username: str, email: Optional[str], password: Optional[str], **extra_fields: Any
) -> AbstractBaseUser: ...
) -> _T: ...
class PermissionsMixin(models.Model):
is_superuser: models.BooleanField = ...
@@ -41,8 +44,8 @@ class PermissionsMixin(models.Model):
user_permissions: models.ManyToManyField = models.ManyToManyField(Permission)
def get_group_permissions(self, obj: None = ...) -> Set[str]: ...
def get_all_permissions(self, obj: Optional[str] = ...) -> Set[str]: ...
def has_perm(self, perm: Union[Tuple[str, Any], str], obj: Optional[str] = ...) -> bool: ...
def has_perms(self, perm_list: Union[List[str], Set[str], Tuple[str]], obj: None = ...) -> bool: ...
def has_perm(self, perm: str, obj: Optional[str] = ...) -> bool: ...
def has_perms(self, perm_list: Collection[str], obj: None = ...) -> bool: ...
def has_module_perms(self, app_label: str) -> bool: ...
class AbstractUser(AbstractBaseUser, PermissionsMixin): # type: ignore
@@ -80,7 +83,7 @@ class AnonymousUser:
def get_group_permissions(self, obj: None = ...) -> Set[Any]: ...
def get_all_permissions(self, obj: Any = ...) -> Set[str]: ...
def has_perm(self, perm: str, obj: None = ...) -> bool: ...
def has_perms(self, perm_list: Union[List[str], Tuple[str]], obj: None = ...) -> bool: ...
def has_perms(self, perm_list: Collection[str], obj: None = ...) -> bool: ...
def has_module_perms(self, module: str) -> bool: ...
@property
def is_anonymous(self) -> bool: ...

View File

@@ -2,21 +2,20 @@ from pathlib import Path, PosixPath
from typing import Any, List, Mapping, Optional, Protocol, Sequence, Set, Union
from django.contrib.auth.base_user import AbstractBaseUser
from django.db.models.base import Model
_UserModel = Model
class PasswordValidator(Protocol):
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...): ...
def password_changed(self, password: str, user: Optional[_UserModel] = ...): ...
def get_default_password_validators() -> List[PasswordValidator]: ...
def get_password_validators(validator_config: Sequence[Mapping[str, Any]]) -> List[PasswordValidator]: ...
def validate_password(
password: str,
user: Optional[AbstractBaseUser] = ...,
password_validators: Optional[Sequence[PasswordValidator]] = ...,
password: str, user: Optional[_UserModel] = ..., password_validators: Optional[Sequence[PasswordValidator]] = ...
) -> None: ...
def password_changed(
password: str,
user: Optional[AbstractBaseUser] = ...,
password_validators: Optional[Sequence[PasswordValidator]] = ...,
password: str, user: Optional[_UserModel] = ..., password_validators: Optional[Sequence[PasswordValidator]] = ...
) -> None: ...
def password_validators_help_texts(password_validators: Optional[Sequence[PasswordValidator]] = ...) -> List[str]: ...
@@ -25,7 +24,7 @@ password_validators_help_text_html: Any
class MinimumLengthValidator:
min_length: int = ...
def __init__(self, min_length: int = ...) -> None: ...
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...
class UserAttributeSimilarityValidator:
@@ -33,16 +32,16 @@ class UserAttributeSimilarityValidator:
user_attributes: Sequence[str] = ...
max_similarity: float = ...
def __init__(self, user_attributes: Sequence[str] = ..., max_similarity: float = ...) -> None: ...
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...
class CommonPasswordValidator:
DEFAULT_PASSWORD_LIST_PATH: Path = ...
passwords: Set[str] = ...
def __init__(self, password_list_path: Union[PosixPath, str] = ...) -> None: ...
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...
class NumericPasswordValidator:
def validate(self, password: str, user: Optional[AbstractBaseUser] = ...) -> None: ...
def validate(self, password: str, user: Optional[_UserModel] = ...) -> None: ...
def get_help_text(self) -> str: ...

View File

@@ -0,0 +1,3 @@
from typing import Any, List
urlpatterns: List[Any] = ...

View File

@@ -7,6 +7,7 @@ from django.db.models.fields.related import ForeignObject
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.expressions import Combinable
from django.db.models.fields import Field, PositiveIntegerField
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.query import QuerySet
@@ -14,6 +15,10 @@ from django.db.models.query_utils import FilteredRelation, PathInfo
from django.db.models.sql.where import WhereNode
class GenericForeignKey(FieldCacheMixin):
# django-stubs implementation only fields
_pyi_private_set_type: Union[Any, Combinable]
_pyi_private_get_type: Any
# attributes
auto_created: bool = ...
concrete: bool = ...
editable: bool = ...
@@ -44,36 +49,21 @@ class GenericForeignKey(FieldCacheMixin):
def get_prefetch_queryset(
self, instances: Union[List[Model], QuerySet], queryset: Optional[QuerySet] = ...
) -> Tuple[List[Model], Callable, Callable, bool, str, bool]: ...
def __get__(
self, instance: Optional[Model], cls: Type[Model] = ...
) -> Optional[Union[GenericForeignKey, Model]]: ...
def __set__(self, instance: Model, value: Optional[Model]) -> None: ...
def __get__(self, instance: Optional[Model], cls: Type[Model] = ...) -> Optional[Any]: ...
def __set__(self, instance: Model, value: Optional[Any]) -> None: ...
class GenericRel(ForeignObjectRel):
field: GenericRelation
limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any]]]
model: Type[Model]
multiple: bool
on_delete: Callable
parent_link: bool
related_name: str
related_query_name: None
symmetrical: bool
def __init__(
self,
field: GenericRelation,
to: Union[Type[Model], str],
related_name: None = ...,
related_name: Optional[str] = ...,
related_query_name: Optional[str] = ...,
limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any]]] = ...,
) -> None: ...
class GenericRelation(ForeignObject):
auto_created: bool = ...
many_to_many: bool = ...
many_to_one: bool = ...
one_to_many: bool = ...
one_to_one: bool = ...
rel_class: Any = ...
mti_inherited: bool = ...
object_id_field_name: Any = ...
@@ -90,23 +80,16 @@ class GenericRelation(ForeignObject):
limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any]]] = ...,
**kwargs: Any
) -> None: ...
def check(self, **kwargs: Any) -> List[Error]: ...
def resolve_related_fields(self) -> List[Tuple[PositiveIntegerField, Field]]: ...
def get_path_info(self, filtered_relation: Optional[FilteredRelation] = ...) -> List[PathInfo]: ...
def get_reverse_path_info(self, filtered_relation: None = ...) -> List[PathInfo]: ...
def value_to_string(self, obj: Model) -> str: ...
model: Any = ...
def set_attributes_from_rel(self) -> None: ...
def get_internal_type(self) -> str: ...
def get_content_type(self) -> ContentType: ...
def get_extra_restriction(
self, where_class: Type[WhereNode], alias: Optional[str], remote_alias: str
) -> WhereNode: ...
def bulk_related_objects(self, objs: List[Model], using: str = ...) -> QuerySet: ...
class ReverseGenericManyToOneDescriptor(ReverseManyToOneDescriptor):
field: GenericRelation
rel: GenericRel
def related_manager_cls(self): ...
class ReverseGenericManyToOneDescriptor(ReverseManyToOneDescriptor): ...
def create_generic_related_manager(superclass: Any, rel: Any): ...

View File

@@ -1,13 +1,12 @@
from typing import Any, List, Optional, Union
from django.contrib.messages.storage.base import BaseStorage
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
class MessageFailure(Exception): ...
def add_message(
request: Optional[WSGIRequest],
request: Optional[HttpRequest],
level: int,
message: str,
extra_tags: str = ...,
@@ -16,12 +15,12 @@ def add_message(
def get_messages(request: HttpRequest) -> Union[List[Any], BaseStorage]: ...
def get_level(request: HttpRequest) -> int: ...
def set_level(request: HttpRequest, level: int) -> bool: ...
def debug(request: WSGIRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...) -> None: ...
def info(request: WSGIRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...) -> None: ...
def debug(request: HttpRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...) -> None: ...
def info(request: HttpRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...) -> None: ...
def success(
request: WSGIRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...
request: HttpRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...
) -> None: ...
def warning(
request: WSGIRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...
request: HttpRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...
) -> None: ...
def error(request: WSGIRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...) -> None: ...
def error(request: HttpRequest, message: str, extra_tags: str = ..., fail_silently: Union[bool, str] = ...) -> None: ...

View File

@@ -1,9 +1,9 @@
from typing import Any, Dict, Optional
from django.forms.forms import Form
from django.http.response import HttpResponseRedirect
from django.forms.forms import BaseForm
from django.http.response import HttpResponse
class SuccessMessageMixin:
success_message: str = ...
def form_valid(self, form: Form) -> HttpResponseRedirect: ...
def form_valid(self, form: BaseForm) -> HttpResponse: ...
def get_success_message(self, cleaned_data: Dict[str, str]) -> str: ...

View File

@@ -4,8 +4,15 @@ from .ranges import (
RangeField as RangeField,
IntegerRangeField as IntegerRangeField,
BigIntegerRangeField as BigIntegerRangeField,
DecimalRangeField as DecimalRangeField,
FloatRangeField as FloatRangeField,
DateRangeField as DateRangeField,
DateTimeRangeField as DateTimeRangeField,
)
from .hstore import HStoreField as HStoreField
from .citext import (
CICharField as CICharField,
CIEmailField as CIEmailField,
CIText as CIText,
CITextField as CITextField,
)

View File

@@ -1,10 +1,11 @@
from json import JSONEncoder
from typing import Any, Dict, List, Optional, Tuple, Type, Union
from typing import Any, Optional, Type
from django.db.models import Field
from django.db.models.lookups import Transform
from .mixins import CheckFieldDefaultMixin
class JsonAdapter(object):
class JsonAdapter:
encoder: Any = ...
def __init__(self, adapted: Any, dumps: Optional[Any] = ..., encoder: Optional[Any] = ...) -> None: ...
def dumps(self, obj: Any): ...
@@ -15,12 +16,17 @@ class JSONField(CheckFieldDefaultMixin, Field):
default_error_messages: Any = ...
encoder: Any = ...
def __init__(
self, verbose_name: None = ..., name: None = ..., encoder: Optional[Type[JSONEncoder]] = ..., **kwargs: Any
self,
verbose_name: Optional[str] = ...,
name: Optional[str] = ...,
encoder: Optional[Type[JSONEncoder]] = ...,
**kwargs: Any
) -> None: ...
def db_type(self, connection: Any): ...
def deconstruct(self) -> Tuple[None, str, List[Any], Dict[str, Union[Type[JSONEncoder], bool]]]: ...
def get_transform(self, name: Any): ...
def get_prep_value(self, value: Any): ...
def validate(self, value: Any, model_instance: Any) -> None: ...
def value_to_string(self, obj: Any): ...
def formfield(self, **kwargs: Any): ...
class KeyTransform(Transform):
operator: str = ...
nested_operator: str = ...
def __init__(self, key_name: str, *args: Any, **kwargs: Any) -> None: ...
class KeyTextTransform(KeyTransform): ...

View File

@@ -18,6 +18,9 @@ class IntegerRangeField(RangeField):
class BigIntegerRangeField(RangeField):
def __get__(self, instance, owner) -> NumericRange: ...
class DecimalRangeField(RangeField):
def __get__(self, instance, owner) -> NumericRange: ...
class FloatRangeField(RangeField):
def __get__(self, instance, owner) -> NumericRange: ...

View File

@@ -0,0 +1,4 @@
from django.db.models import Func
class RandomUUID(Func): ...
class TransactionNow(Func): ...

View File

@@ -0,0 +1,29 @@
from typing import Any, Optional
from django.db.models import Index
class PostgresIndex(Index):
@property
def max_name_length(self) -> int: ...
class BrinIndex(PostgresIndex):
def __init__(
self, *, autosummarize: Optional[bool] = ..., pages_per_range: Optional[int] = ..., **kwargs: Any
) -> None: ...
class BTreeIndex(PostgresIndex):
def __init__(self, *, fillfactor: Optional[int] = ..., **kwargs: Any): ...
class GinIndex(PostgresIndex):
def __init__(
self, *, fastupdate: Optional[bool] = ..., gin_pending_list_limit: Optional[int] = ..., **kwargs: Any
) -> None: ...
class GistIndex(PostgresIndex):
def __init__(self, *, buffering: Optional[bool] = ..., fillfactor: Optional[int] = ..., **kwargs: Any) -> None: ...
class HashIndex(PostgresIndex):
def __init__(self, *, fillfactor: Optional[int] = ..., **kwargs: Any) -> None: ...
class SpGistIndex(PostgresIndex):
def __init__(self, *, fillfactor: Optional[int] = ..., **kwargs: Any) -> None: ...

View File

@@ -0,0 +1,47 @@
from typing import Any, Dict, Optional, TypeVar, Union
from django.db.models.expressions import Combinable, CombinedExpression, Func, Value
from django.db.models.lookups import Lookup
from django.db.models import Field
class SearchVectorExact(Lookup): ...
class SearchVectorField(Field): ...
class SearchQueryField(Field): ...
class SearchVectorCombinable:
ADD: str = ...
class SearchVector(SearchVectorCombinable, Func):
config: Optional[Any] = None
def __init__(self, *expressions: Union[str, Combinable], **extra: Any): ...
class CombinedSearchVector(SearchVectorCombinable, CombinedExpression):
def __init__(self, lhs, connector, rhs, config, output_field: Optional[Field, str] = ...): ...
_T = TypeVar("_T", bound="SearchQueryCombinable")
class SearchQueryCombinable:
BITAND: str = ...
BITOR: str = ...
def __or__(self: _T, other: SearchQueryCombinable) -> _T: ...
def __ror__(self: _T, other: SearchQueryCombinable) -> _T: ...
def __and__(self: _T, other: SearchQueryCombinable) -> _T: ...
def __rand__(self: _T, other: SearchQueryCombinable) -> _T: ...
class SearchQuery(SearchQueryCombinable, Value):
SEARCH_TYPES: Dict[str, str] = {"plain": "plainto_tsquery", "phrase": "phraseto_tsquery", "raw": "to_tsquery"}
def __init__(self, value, output_field=None, *, config=None, invert=False, search_type="plain"): ...
def __invert__(self: _T) -> _T: ...
class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression):
def __init__(self, lhs, connector, rhs, config, output_field=None) -> None: ...
class SearchRank(Func):
def __init__(self, vector, query, **extra: Any) -> None: ...
class TrigramBase(Func):
def __init__(self, expression, string, **extra: Any) -> None: ...
class TrigramSimilarity(TrigramBase): ...
class TrigramDistance(TrigramBase): ...

View File

@@ -0,0 +1,5 @@
from typing import Any, Tuple
def get_hstore_oids(connection_alias: str) -> Tuple[Any, ...]: ...
def get_citext_oids(connection_alias: str) -> Tuple[Any, ...]: ...
def register_type_handlers(connection: Any, **kwargs: Any) -> None: ...

View File

@@ -0,0 +1,17 @@
from typing import Any, Dict, Iterable, Mapping, Optional
from django.core.validators import MaxLengthValidator, MaxValueValidator, MinLengthValidator, MinValueValidator
class ArrayMaxLengthValidator(MaxLengthValidator): ...
class ArrayMinLengthValidator(MinLengthValidator): ...
class KeysValidator:
messages: Dict[str, str] = ...
strict: bool = ...
def __init__(
self, keys: Iterable[str], strict: bool = ..., messages: Optional[Mapping[str, str]] = ...
) -> None: ...
def __call__(self, value: Any) -> None: ...
class RangeMaxValueValidator(MaxValueValidator): ...
class RangeMinValueValidator(MinValueValidator): ...

View File

@@ -0,0 +1,4 @@
from django.core.exceptions import SuspiciousOperation
class InvalidSessionKey(SuspiciousOperation): ...
class SuspiciousSession(SuspiciousOperation): ...

View File

@@ -1,15 +1,6 @@
from typing import Any, List, Optional
from django.core.checks.messages import Error
from django.db.models.query import QuerySet
from typing import Optional
from django.db import models
class CurrentSiteManager(models.Manager):
creation_counter: int
model: None
name: None
use_in_migrations: bool = ...
def __init__(self, field_name: Optional[str] = ...) -> None: ...
def check(self, **kwargs: Any) -> List[Error]: ...
def get_queryset(self) -> QuerySet: ...

View File

@@ -4,4 +4,4 @@ from django.urls.resolvers import URLPattern
urlpatterns: Any
def staticfiles_urlpatterns(prefix: None = ...) -> List[URLPattern]: ...
def staticfiles_urlpatterns(prefix: Optional[str] = ...) -> List[URLPattern]: ...

View File

@@ -1,7 +1,11 @@
from collections import OrderedDict
from typing import Any, Callable, Dict, Union
from .backends.base import BaseCache as BaseCache
from .backends.base import (
BaseCache as BaseCache,
CacheKeyWarning as CacheKeyWarning,
InvalidCacheBackendError as InvalidCacheBackendError,
)
DEFAULT_CACHE_ALIAS: str

View File

@@ -1,3 +1,5 @@
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
from . import model_checks as model_checks

View File

@@ -0,0 +1,7 @@
from typing import Any, List
from . import Error
E001: Error = ...
def check_setting_language_code(app_configs: Any, **kwargs: Any) -> List[Error]: ...

View File

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

View File

@@ -1,5 +1,4 @@
from io import BytesIO
from typing import Any, Union
from typing import Any, IO, Union
from django.core.files import File
@@ -11,4 +10,4 @@ class ImageFile(File):
@property
def height(self) -> int: ...
def get_image_dimensions(file_or_path: Union[BytesIO, str], close: bool = ...) -> Any: ...
def get_image_dimensions(file_or_path: Union[str, IO[bytes]], close: bool = ...) -> Any: ...

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Any, IO, List, Optional, Tuple
from typing import Any, IO, List, Optional, Tuple, Type
from django.core.files.base import File
from django.utils.functional import LazyObject
@@ -13,7 +13,7 @@ class Storage:
def path(self, name: str) -> str: ...
def delete(self, name: str) -> None: ...
def exists(self, name: str) -> bool: ...
def listdir(self, path: Any) -> Optional[Tuple[List[str], List[str]]]: ...
def listdir(self, path: str) -> Tuple[List[str], List[str]]: ...
def size(self, name: str) -> int: ...
def url(self, name: Optional[str]) -> str: ...
def get_accessed_time(self, name: str) -> datetime: ...
@@ -21,6 +21,7 @@ class Storage:
def get_modified_time(self, name: str) -> datetime: ...
class FileSystemStorage(Storage):
OS_OPEN_FLAGS: int = ...
def __init__(
self,
location: Optional[str] = ...,
@@ -42,3 +43,5 @@ class FileSystemStorage(Storage):
class DefaultStorage(LazyObject): ...
default_storage: Any
def get_storage_class(import_path: Optional[str] = ...) -> Type[Storage]: ...

View File

@@ -1,5 +1,5 @@
from typing import Any, Dict, IO, Iterator, Optional, Union
from django.core.files import temp as tempfile
from typing import Any, Dict, IO, Optional, Union
from django.core.files.base import File
class UploadedFile(File):
@@ -39,8 +39,6 @@ class InMemoryUploadedFile(UploadedFile):
charset: Optional[str],
content_type_extra: Dict[str, str] = ...,
) -> None: ...
def chunks(self, chunk_size: Optional[int] = ...) -> Iterator[bytes]: ...
def multiple_chunks(self, chunk_size: Optional[int] = ...) -> bool: ...
class SimpleUploadedFile(InMemoryUploadedFile):
def __init__(self, name: str, content: Optional[Union[bytes, str]], content_type: str = ...) -> None: ...

View File

@@ -0,0 +1,16 @@
import types
from typing import Any, TypeVar, Type, Iterable
from django.core.mail.message import EmailMessage
_T = TypeVar("_T", bound="BaseEmailBackend")
class BaseEmailBackend:
def __init__(self, fail_silently: bool = ..., **kwargs: Any) -> None: ...
def open(self) -> bool: ...
def close(self) -> None: ...
def __enter__(self: _T) -> _T: ...
def __exit__(
self, exc_type: Type[BaseException], exc_value: BaseException, traceback: types.TracebackType
) -> None: ...
def send_messages(self, email_messages: Iterable[EmailMessage]) -> int: ...

View File

@@ -71,7 +71,8 @@ class EmailMessage:
reply_to: Optional[Union[List[Optional[str]], str]] = ...,
) -> None: ...
def get_connection(self, fail_silently: bool = ...) -> Any: ...
def message(self) -> MIMEMixin: ...
# TODO: when typeshed gets more types for email.Message, move it to MIMEMessage, now it has too many false-positives
def message(self) -> Any: ...
def recipients(self) -> List[str]: ...
def send(self, fail_silently: bool = ...) -> int: ...
def attach(

View File

@@ -1,11 +1,11 @@
from typing import Any, Dict, List, Optional, Tuple, Union
from typing import Any, Dict, List, Tuple, Union
from django.core.management.base import BaseCommand as BaseCommand, CommandError as CommandError
from .base import BaseCommand as BaseCommand, CommandError as CommandError
def find_commands(management_dir: str) -> List[str]: ...
def load_command_class(app_name: str, name: str) -> BaseCommand: ...
def get_commands() -> Dict[str, str]: ...
def call_command(command_name: Union[Tuple[str], BaseCommand, str], *args: Any, **options: Any) -> Optional[str]: ...
def call_command(command_name: Union[Tuple[str], BaseCommand, str], *args: Any, **options: Any) -> str: ...
class ManagementUtility:
argv: List[str] = ...

View File

@@ -42,10 +42,14 @@ class BaseCommand:
stderr: OutputWrapper = ...
style: Style = ...
def __init__(
self, stdout: Optional[StringIO] = ..., stderr: Optional[StringIO] = ..., no_color: bool = ...
self,
stdout: Optional[StringIO] = ...,
stderr: Optional[StringIO] = ...,
no_color: bool = ...,
force_color: bool = ...,
) -> None: ...
def get_version(self) -> str: ...
def create_parser(self, prog_name: str, subcommand: str) -> CommandParser: ...
def create_parser(self, prog_name: str, subcommand: str, **kwargs: Any) -> CommandParser: ...
def add_arguments(self, parser: CommandParser) -> None: ...
def print_help(self, prog_name: str, subcommand: str) -> None: ...
def run_from_argv(self, argv: List[str]) -> None: ...

View File

@@ -1,7 +1,14 @@
from collections import Callable
def supports_color() -> bool: ...
class Style: ...
class Style:
def DEBUG(self, text: str) -> str: ...
def INFO(self, text: str) -> str: ...
def SUCCESS(self, text: str) -> str: ...
def WARNING(self, text: str) -> str: ...
def ERROR(self, text: str) -> str: ...
def make_style(config_string: str = ...) -> Style: ...
def no_style(): ...
def no_style() -> Style: ...
def color_style() -> Style: ...

View File

@@ -0,0 +1,4 @@
from django.core.management.base import BaseCommand
class ProxyModelWarning(Warning): ...
class Command(BaseCommand): ...

View File

@@ -0,0 +1,19 @@
import zipfile
from typing import Iterable, List, Optional, Tuple
from django.core.management.base import BaseCommand
READ_STDIN: str = ...
class Command(BaseCommand):
missing_args_message: str = ...
def loaddata(self, fixture_labels: Iterable[str]) -> None: ...
def load_label(self, fixture_label: str) -> None: ...
def find_fixtures(self, fixture_label: str) -> List[Optional[str]]: ...
@property
def fixture_dirs(self) -> List[str]: ...
def parse_name(self, fixture_name: str) -> Tuple[str, str, str]: ...
class SingleZipReader(zipfile.ZipFile): ...
def humanize(dirname: str) -> str: ...

View File

@@ -0,0 +1,45 @@
import os
import re
from typing import Any, Pattern, Type, Optional
from django.core.management.base import BaseCommand
from django.utils.functional import cached_property
from django.utils.jslex import prepare_js_for_gettext
from django.conf import settings
from django.utils.translation import templatize
plural_forms_re: Pattern = ...
STATUS_OK: int = ...
NO_LOCALE_DIR: Any = ...
def check_programs(*programs: str) -> None: ...
class TranslatableFile:
dirpath: str
file_name: str
locale_dir: str
def __init__(self, dirpath: str, file_name: str, locale_dir: Optional[str]) -> None: ...
class BuildFile:
"""
Represent the state of a translatable file during the build process.
"""
def __init__(self, command: BaseCommand, domain: str, translatable: TranslatableFile) -> None: ...
@property
def is_templatized(self) -> bool: ...
@property
def path(self) -> str: ...
@property
def work_path(self) -> str: ...
def preprocess(self) -> None: ...
def postprocess_messages(self, msgs: str) -> str: ...
def cleanup(self) -> None: ...
def normalize_eols(raw_contents: str) -> str: ...
def write_pot_file(potfile: str, msgs: str) -> None: ...
class Command(BaseCommand):
translatable_file_class: Type[TranslatableFile] = ...
build_file_class: Type[BuildFile] = ...

View File

@@ -0,0 +1,3 @@
from django.core.management.base import BaseCommand
class Command(BaseCommand): ...

View File

@@ -0,0 +1,3 @@
from django.core.management.base import BaseCommand
class Command(BaseCommand): ...

View File

@@ -1,24 +1,23 @@
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type, Union, Iterable
from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Type, Union
from django.apps.config import AppConfig
from django.db.models.base import Model
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,
DeserializedObject,
Deserializer as Deserializer,
M2MDeserializationError as M2MDeserializationError,
SerializationError as SerializationError,
Serializer as Serializer,
SerializerDoesNotExist as SerializerDoesNotExist,
)
BUILTIN_SERIALIZERS: Any
class BadSerializer:
internal_use_only: bool = ...
exception: ModuleNotFoundError = ...
def __init__(self, exception: ImportError) -> None: ...
exception: BaseException = ...
def __init__(self, exception: BaseException) -> None: ...
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
def register_serializer(format: str, serializer_module: str, serializers: Optional[Dict[str, Any]] = ...) -> None: ...
@@ -27,10 +26,6 @@ def get_serializer(format: str) -> Union[Type[Serializer], BadSerializer]: ...
def get_serializer_formats() -> List[str]: ...
def get_public_serializer_formats() -> List[str]: ...
def get_deserializer(format: str) -> Union[Callable, Type[Deserializer]]: ...
def serialize(
format: str, queryset: Union[Iterator[Any], List[Model], QuerySet], **options: Any
) -> Optional[Union[bytes, str]]: ...
def deserialize(format: str, stream_or_string: Any, **options: Any) -> Union[Iterator[Any], Deserializer]: ...
def sort_dependencies(
app_list: Union[Iterable[Tuple[AppConfig, None]], Iterable[Tuple[str, Iterable[Type[Model]]]]]
) -> List[Type[Model]]: ...
def serialize(format: str, queryset: Iterable[Model], **options: Any) -> Any: ...
def deserialize(format: str, stream_or_string: Any, **options: Any) -> Iterator[DeserializedObject]: ...
def sort_dependencies(app_list: Iterable[Any]) -> List[Type[Model]]: ...

View File

@@ -1,13 +1,13 @@
from collections import OrderedDict
from datetime import date
from io import BufferedReader, StringIO, TextIOWrapper
from typing import Any, Dict, Iterator, List, Optional, Tuple, Type, Union
from typing import Any, Dict, Iterable, List, Mapping, Optional, Type, Union
from uuid import UUID
from django.core.management.base import OutputWrapper
from django.db.models.base import Model
from django.db.models.fields.related import ForeignKey, ManyToManyField
from django.db.models.query import QuerySet
from django.db.models.fields import Field
class SerializerDoesNotExist(KeyError): ...
class SerializationError(Exception): ...
@@ -43,7 +43,7 @@ class Serializer:
first: bool = ...
def serialize(
self,
queryset: Union[Iterator[Any], List[Model], QuerySet],
queryset: Iterable[Model],
*,
stream: Optional[Any] = ...,
fields: Optional[Any] = ...,
@@ -52,7 +52,7 @@ class Serializer:
progress_output: Optional[Any] = ...,
object_count: int = ...,
**options: Any
) -> Optional[Union[List[OrderedDict], bytes, str]]: ...
) -> Any: ...
def start_serialization(self) -> None: ...
def end_serialization(self) -> None: ...
def start_object(self, obj: Any) -> None: ...
@@ -70,15 +70,18 @@ class Deserializer:
def __next__(self) -> None: ...
class DeserializedObject:
object: Model = ...
m2m_data: Dict[Any, Any] = ...
def __init__(self, obj: Model, m2m_data: Optional[Dict[str, List[int]]] = ...) -> None: ...
object: Any = ...
m2m_data: Dict[str, List[int]] = ...
deferred_fields: Mapping[Field, Any]
def __init__(
self,
obj: Model,
m2m_data: Optional[Dict[str, List[int]]] = ...,
deferred_fields: Optional[Mapping[Field, Any]] = ...,
) -> None: ...
def save(self, save_m2m: bool = ..., using: Optional[str] = ..., **kwargs: Any) -> None: ...
def save_deferred_fields(self, using: Optional[str] = ...) -> None: ...
def build_instance(Model: Type[Model], data: Dict[str, Optional[Union[date, int, str, UUID]]], db: str) -> Model: ...
def deserialize_m2m_values(
field: ManyToManyField, field_value: Union[List[List[str]], List[int]], using: str
) -> List[int]: ...
def deserialize_fk_value(
field: ForeignKey, field_value: Optional[Union[List[str], Tuple[str], int, str]], using: str
) -> Optional[Union[int, str, UUID]]: ...
def deserialize_m2m_values(field: ManyToManyField, field_value: Any, using: str) -> List[Any]: ...
def deserialize_fk_value(field: ForeignKey, field_value: Any, using: str) -> Any: ...

View File

@@ -27,4 +27,5 @@ class DefaultConnectionProxy:
def __setattr__(self, name: str, value: Any) -> None: ...
def __delattr__(self, name: str) -> None: ...
def close_old_connections(**kwargs): ...
def close_old_connections(**kwargs: Any) -> None: ...
def reset_queries(**kwargs: Any) -> None: ...

View File

@@ -25,7 +25,7 @@ class BaseDatabaseOperations:
CURRENT_ROW: str = ...
explain_prefix: Any = ...
connection: Any = ...
def __init__(self, connection: Union[DefaultConnectionProxy, BaseDatabaseWrapper]) -> None: ...
def __init__(self, connection: Optional[Union[DefaultConnectionProxy, BaseDatabaseWrapper]]) -> None: ...
def autoinc_sql(self, table: str, column: str) -> None: ...
def bulk_batch_size(self, fields: Any, objs: Any): ...
def cache_key_culling_sql(self) -> str: ...

View File

@@ -0,0 +1,17 @@
from typing import Dict, Tuple
from django.db.backends.base.base import BaseDatabaseWrapper
def psycopg2_version() -> Tuple[int, ...]: ...
PSYCOPG2_VERSION: Tuple[int, ...] = ...
class DatabaseWrapper(BaseDatabaseWrapper):
operators: Dict[str, str] = ...
pattern_esc: str = ...
pattern_ops: Dict[str, str] = ...
# PostgreSQL backend-specific attributes.
_named_cursor_idx: int = ...
@property
def pg_version(self) -> str: ...

View File

@@ -0,0 +1,3 @@
from django.db.backends.base.creation import BaseDatabaseCreation
class DatabaseCreation(BaseDatabaseCreation): ...

View File

@@ -0,0 +1,3 @@
from django.db.backends.base.operations import BaseDatabaseOperations
class DatabaseOperations(BaseDatabaseOperations): ...

View File

@@ -0,0 +1,3 @@
from django.dispatch import Signal
connection_created: Signal = ...

View File

@@ -1,9 +1,13 @@
from datetime import date, datetime, time
from decimal import Decimal
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Tuple, Union
from uuid import UUID
logger: Any
# Python types that can be adapted to SQL.
_SQLType = Union[None, bool, int, float, Decimal, str, bytes, datetime, UUID]
class CursorWrapper:
cursor: Any = ...
db: Any = ...
@@ -15,10 +19,10 @@ class CursorWrapper:
def __exit__(self, type: None, value: None, traceback: None) -> None: ...
def callproc(self, procname: str, params: List[Any] = ..., kparams: Dict[str, int] = ...) -> Any: ...
def execute(
self, sql: str, params: Optional[Union[List[bool], List[datetime], List[float], Tuple]] = ...
self, sql: str, params: Optional[Union[Sequence[_SQLType], Mapping[str, _SQLType]]] = ...
) -> Optional[Any]: ...
def executemany(
self, sql: str, param_list: Union[Iterator[Any], List[Tuple[Union[int, str]]]]
self, sql: str, param_list: Sequence[Optional[Union[Sequence[_SQLType], Mapping[str, _SQLType]]]]
) -> Optional[Any]: ...
class CursorDebugWrapper(CursorWrapper):

View File

@@ -47,7 +47,7 @@ class MigrationGraph:
def iterative_dfs(self, start: Any, forwards: bool = ...): ...
def root_nodes(self, app: Optional[str] = ...) -> List[Tuple[str, str]]: ...
def leaf_nodes(self, app: Optional[str] = ...) -> List[Tuple[str, str]]: ...
def ensure_not_cyclic(self, start: Union[Tuple[str, str], Node], get_children: Callable) -> None: ...
def ensure_not_cyclic(self) -> None: ...
def make_state(
self, nodes: Optional[Tuple[str, str]] = ..., at_end: bool = ..., real_apps: List[str] = ...
) -> ProjectState: ...

View File

@@ -8,7 +8,7 @@ MIGRATIONS_MODULE_NAME: str
class MigrationLoader:
connection: Any = ...
disk_migrations: Dict[Tuple[str, str], Migration] = ...
applied_migrations: None = ...
applied_migrations: Set[Tuple[str, str]] = ...
ignore_no_migrations: bool = ...
def __init__(self, connection: Any, load: bool = ..., ignore_no_migrations: bool = ...) -> None: ...
@classmethod

View File

@@ -16,41 +16,7 @@ from .models import (
DeleteModel as DeleteModel,
RemoveIndex as RemoveIndex,
RenameModel as RenameModel,
AddConstraint as AddConstraint,
RemoveConstraint as RemoveConstraint,
)
from .special import RunPython as RunPython, RunSQL as RunSQL, SeparateDatabaseAndState as SeparateDatabaseAndState
from .fields import AddField, AlterField, RemoveField, RenameField
from .models import (
AddIndex,
AlterIndexTogether,
AlterModelManagers,
AlterModelOptions,
AlterModelTable,
AlterOrderWithRespectTo,
AlterUniqueTogether,
CreateModel,
DeleteModel,
RemoveIndex,
RenameModel,
)
from .special import RunPython, RunSQL, SeparateDatabaseAndState
__all__ = [
"CreateModel",
"DeleteModel",
"AlterModelTable",
"AlterUniqueTogether",
"RenameModel",
"AlterIndexTogether",
"AlterModelOptions",
"AddIndex",
"RemoveIndex",
"AddField",
"RemoveField",
"AlterField",
"RenameField",
"SeparateDatabaseAndState",
"RunSQL",
"RunPython",
"AlterOrderWithRespectTo",
"AlterModelManagers",
]

View File

@@ -1,20 +1,20 @@
from typing import Any
from typing import Any, Optional
from django.db.models.fields import Field
from .base import Operation
class FieldOperation(Operation):
model_name: Any = ...
model_name: str = ...
model_name_lower: str
name: Any = ...
def __init__(self, model_name: str, name: str) -> None: ...
name: str = ...
def __init__(self, model_name: str, name: str, field: Optional[Field] = ...) -> None: ...
def name_lower(self) -> str: ...
def is_same_model_operation(self, operation: FieldOperation) -> bool: ...
def is_same_field_operation(self, operation: AddField) -> bool: ...
class AddField(FieldOperation):
field: Any = ...
preserve_default: Any = ...
field: Field = ...
preserve_default: bool = ...
def __init__(self, model_name: str, name: str, field: Field, preserve_default: bool = ...) -> None: ...
class RemoveField(FieldOperation): ...

View File

@@ -4,6 +4,7 @@ from django.db.migrations.operations.base import Operation
from django.db.models.indexes import Index
from django.db.models.manager import Manager
from django.db.models.constraints import BaseConstraint
from django.db.models.fields import Field
class ModelOperation(Operation):
@@ -78,3 +79,9 @@ class RemoveIndex(IndexOperation):
model_name: str = ...
name: str = ...
def __init__(self, model_name: str, name: Union[str, Index]) -> None: ...
class AddConstraint(IndexOperation):
def __init__(self, model_name: str, constraint: BaseConstraint): ...
class RemoveConstraint(IndexOperation):
def __init__(self, model_name: str, name: str) -> None: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Dict, List, Set, Tuple, Union
from typing import Any, Callable, Dict, List, Set, Tuple, Union, Type
class BaseSerializer:
value: Any = ...
@@ -38,3 +38,9 @@ class TypeSerializer(BaseSerializer): ...
class UUIDSerializer(BaseSerializer): ...
def serializer_factory(value: Any) -> BaseSerializer: ...
class Serializer:
@classmethod
def register(cls, type_: type, serializer: Type[BaseSerializer]) -> None: ...
@classmethod
def unregister(cls, type_: type) -> None: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, DefaultDict, Dict, Iterator, List, Optional, Sequence, Tuple, Type, Union
from typing import Any, DefaultDict, Dict, Iterator, List, Optional, Sequence, Tuple, Type, Union, Set
from django.apps.registry import Apps
from django.db.models.base import Model
@@ -42,6 +42,9 @@ class ModelState:
def name_lower(self) -> str: ...
def render(self, apps: Apps) -> Any: ...
def get_related_models_tuples(model: Type[Model]) -> Set[Tuple[str, str]]: ...
def get_related_models_recursive(model: Type[Model]) -> Set[Tuple[str, str]]: ...
class ProjectState:
is_delayed: bool
models: Dict[Any, Any]

View File

@@ -1,4 +1,4 @@
from typing import Any
from typing import Any, Iterable, Union, Optional, List
COMPILED_REGEX_TYPE: Any

View File

@@ -1,8 +1,9 @@
from typing import Any, List, Set, Tuple, Union
from typing import Any, List, Set, Tuple, Union, Type
from django.db.migrations.migration import Migration
from django.db.migrations.operations.base import Operation
from django.db.migrations.operations.models import CreateModel
from django.db.migrations.serializer import BaseSerializer
class SettingsReference(str):
def __init__(self, value: str, setting_name: str) -> None: ...
@@ -21,7 +22,7 @@ class OperationWriter:
class MigrationWriter:
migration: Migration = ...
needs_manual_porting: bool = ...
def __init__(self, migration: Union[type, Migration]) -> None: ...
def __init__(self, migration: Union[type, Migration], include_header: bool = ...) -> None: ...
def as_string(self) -> str: ...
@property
def basedir(self) -> str: ...
@@ -31,5 +32,9 @@ class MigrationWriter:
def path(self) -> str: ...
@classmethod
def serialize(cls, value: Any) -> Tuple[str, Set[str]]: ...
@classmethod
def register_serializer(cls, type_: type, serializer: Type[BaseSerializer]) -> None: ...
@classmethod
def unregister_serializer(cls, type_: type) -> None: ...
MIGRATION_TEMPLATE: str

View File

@@ -99,6 +99,10 @@ from .expressions import (
ExpressionList as ExpressionList,
Random as Random,
Ref as Ref,
Window as Window,
WindowFrame as WindowFrame,
RowRange as RowRange,
ValueRange as ValueRange,
)
from .manager import BaseManager as BaseManager, Manager as Manager
@@ -118,3 +122,9 @@ from .aggregates import (
from .indexes import Index as Index
from . import signals as signals
from .constraints import (
BaseConstraint as BaseConstraint,
CheckConstraint as CheckConstraint,
UniqueConstraint as UniqueConstraint,
)

View File

@@ -1,21 +1,14 @@
from typing import Any, Optional
from django.db.models.expressions import Func
from django.db.models.query_utils import Q
class Aggregate(Func):
name: Any = ...
filter_template: str = ...
window_compatible: bool = ...
filter: Any = ...
def __init__(self, *args: Any, filter: Optional[Any] = ..., **kwargs: Any) -> None: ...
def __init__(self, *expressions: Any, distinct: bool = ..., filter: Optional[Any] = ..., **extra: Any) -> None: ...
class Avg(Aggregate): ...
class Count(Aggregate):
template: str = ...
def __init__(self, expression: str, distinct: bool = ..., filter: Optional[Q] = ..., **extra: Any) -> None: ...
class Count(Aggregate): ...
class Max(Aggregate): ...
class Min(Aggregate): ...
class StdDev(Aggregate): ...

View File

@@ -1,17 +1,22 @@
from typing import Any, Dict, List, Optional, Set, Tuple, TypeVar, Union, ClassVar, Sequence, Generic
from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, TypeVar, Union, ClassVar, Type
from django.db.models.manager import Manager
class ModelBase(type): ...
from django.core.checks.messages import CheckMessage
from django.db.models.options import Options
_Self = TypeVar("_Self", bound="Model")
class ModelBase(type): ...
class Model(metaclass=ModelBase):
class DoesNotExist(Exception): ...
class MultipleObjectsReturned(Exception): ...
class Meta: ...
_meta: Any
_default_manager: Manager[Model]
_meta: Options[Any]
objects: Manager[Any]
pk: Any = ...
def __init__(self: _Self, *args, **kwargs) -> None: ...
def delete(self, using: Any = ..., keep_parents: bool = ...) -> Tuple[int, Dict[str, int]]: ...
@@ -36,6 +41,8 @@ class Model(metaclass=ModelBase):
): ...
def refresh_from_db(self: _Self, using: Optional[str] = ..., fields: Optional[List[str]] = ...) -> _Self: ...
def get_deferred_fields(self) -> Set[str]: ...
@classmethod
def check(cls, **kwargs: Any) -> List[CheckMessage]: ...
def __getstate__(self) -> dict: ...
class ModelStateFieldsCacheDescriptor: ...

View File

@@ -0,0 +1,27 @@
from typing import Any, Optional, Sequence, Tuple, Type, TypeVar
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.models.base import Model
from django.db.models.query_utils import Q
_T = TypeVar("_T", bound="BaseConstraint")
class BaseConstraint:
name: str
def __init__(self, name: str) -> None: ...
def constraint_sql(
self, model: Optional[Type[Model]], schema_editor: Optional[BaseDatabaseSchemaEditor]
) -> str: ...
def create_sql(self, model: Optional[Type[Model]], schema_editor: Optional[BaseDatabaseSchemaEditor]) -> str: ...
def remove_sql(self, model: Optional[Type[Model]], schema_editor: Optional[BaseDatabaseSchemaEditor]) -> str: ...
def deconstruct(self) -> Any: ...
def clone(self: _T) -> _T: ...
class CheckConstraint(BaseConstraint):
check: Q
def __init__(self, *, check: Q, name: str) -> None: ...
class UniqueConstraint(BaseConstraint):
fields: Tuple[str]
condition: Optional[Q]
def __init__(self, *, fields: Sequence[str], name: str, condition: Optional[Q] = ...): ...

View File

@@ -1,6 +1,10 @@
from typing import Any, Callable
from typing import Any, Callable, Iterable, Optional, Union
from django.db.models.base import Model
from django.db import IntegrityError
from django.db.models.fields import Field
from django.db.models.options import Options
def CASCADE(collector, field, sub_objs, using): ...
def SET_NULL(collector, field, sub_objs, using): ...
@@ -8,6 +12,10 @@ def SET_DEFAULT(collector, field, sub_objs, using): ...
def DO_NOTHING(collector, field, sub_objs, using): ...
def PROTECT(collector, field, sub_objs, using): ...
def SET(value: Any) -> Callable: ...
def get_candidate_relations_to_delete(opts: Options) -> Iterable[Field]: ...
class ProtectedError(IntegrityError): ...
class Collector: ...
class Collector:
def __init__(self, using: str) -> None: ...
def can_fast_delete(self, objs: Union[Model, Iterable[Model]], from_field: Optional[Field] = ...) -> bool: ...

View File

@@ -1,5 +1,5 @@
from datetime import datetime, timedelta
from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, TypeVar, Union
from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, TypeVar, Union, Iterable
from django.db.models.lookups import Lookup
from django.db.models.sql.compiler import SQLCompiler
@@ -52,7 +52,6 @@ class BaseExpression:
is_summary: bool = ...
filterable: bool = ...
window_compatible: bool = ...
output_field: Any
def __init__(self, output_field: Optional[_OutputField] = ...) -> None: ...
def get_db_converters(self, connection: Any) -> List[Callable]: ...
def get_source_expressions(self) -> List[Any]: ...
@@ -184,10 +183,36 @@ class ExpressionWrapper(Expression):
class Col(Expression):
def __init__(self, alias: str, target: str, output_field: Optional[_OutputField] = ...): ...
class SimpleCol(Expression):
contains_column_references: bool = ...
def __init__(self, target: Field, output_field: Optional[_OutputField] = ...): ...
class Ref(Expression):
def __init__(self, refs: str, source: Expression): ...
class ExpressionList(Func):
def __init__(self, *expressions: Union[BaseExpression, Combinable], **extra: Any) -> None: ...
class Random(Expression): ...
class Ref(Expression):
def __init__(self, refs: str, source: Expression): ...
class Window(Expression):
template: str = ...
contains_aggregate: bool = ...
contains_over_clause: bool = ...
def __init__(
self,
expression: BaseExpression,
partition_by: Optional[Union[str, Iterable[Union[BaseExpression, F]], F, BaseExpression]] = ...,
order_by: Optional[Union[Sequence[Union[BaseExpression, F]], Union[BaseExpression, F]]] = ...,
frame: Optional[WindowFrame] = ...,
output_field: Optional[_OutputField] = ...,
) -> None: ...
class WindowFrame(Expression):
template: str = ...
frame_type: str = ...
def __init__(self, start: Optional[int] = ..., end: Optional[int] = ...) -> None: ...
def window_frame_start_end(self, connection: Any, start: Optional[int], end: Optional[int]) -> Tuple[int, int]: ...
class RowRange(WindowFrame): ...
class ValueRange(WindowFrame): ...

View File

@@ -1,11 +1,27 @@
import decimal
import uuid
from datetime import date, datetime, time, timedelta
from typing import Any, Callable, Dict, Generic, Iterable, Optional, Tuple, Type, TypeVar, Union
from typing import (
Any,
Callable,
Dict,
Generic,
Iterable,
Optional,
Tuple,
Type,
TypeVar,
Union,
Sequence,
List,
overload,
)
from django.core import checks
from django.db.models import Model
from django.core.exceptions import FieldDoesNotExist as FieldDoesNotExist
from django.db.models.expressions import Combinable
from django.db.models.expressions import Combinable, Col
from django.db.models.query_utils import RegisterLookupMixin
from django.forms import Field as FormField, Widget
@@ -18,6 +34,7 @@ _FieldChoices = Iterable[Union[_Choice, _ChoiceNamedGroup]]
_ValidatorCallable = Callable[..., None]
_ErrorMessagesToOverride = Dict[str, Any]
_T = TypeVar("_T", bound="Field")
# __set__ value type
_ST = TypeVar("_ST")
# __get__ return type
@@ -30,10 +47,21 @@ class Field(RegisterLookupMixin, Generic[_ST, _GT]):
widget: Widget
help_text: str
db_table: str
attname: str
auto_created: bool
primary_key: bool
remote_field: Field
max_length: Optional[int]
max_length: int
model: Type[Model]
name: str
verbose_name: str
blank: bool = ...
null: bool = ...
editable: bool = ...
choices: Optional[_FieldChoices] = ...
db_column: Optional[str]
column: str
error_messages: _ErrorMessagesToOverride
def __init__(
self,
verbose_name: Optional[Union[str, bytes]] = ...,
@@ -59,7 +87,15 @@ class Field(RegisterLookupMixin, Generic[_ST, _GT]):
error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ...
def __set__(self, instance, value: _ST) -> None: ...
def __get__(self, instance, owner) -> _GT: ...
# class access
@overload
def __get__(self: _T, instance: None, owner) -> _T: ...
# Model instance access
@overload
def __get__(self, instance: Model, owner) -> _GT: ...
# non-Model instances
@overload
def __get__(self: _T, instance, owner) -> _T: ...
def deconstruct(self) -> Any: ...
def set_attributes_from_name(self, name: str) -> None: ...
def db_type(self, connection: Any) -> str: ...
@@ -67,8 +103,28 @@ class Field(RegisterLookupMixin, Generic[_ST, _GT]):
def get_prep_value(self, value: Any) -> Any: ...
def get_internal_type(self) -> str: ...
def formfield(self, **kwargs) -> FormField: ...
def save_form_data(self, instance: Model, data: Any) -> None: ...
def contribute_to_class(self, cls: Type[Model], name: str, private_only: bool = ...) -> None: ...
def to_python(self, value: Any) -> Any: ...
def clean(self, value: Any, model_instance: Optional[Model]) -> Any: ...
def get_choices(
self,
include_blank: bool = ...,
blank_choice: _Choice = ...,
limit_choices_to: Optional[Any] = ...,
ordering: Sequence[str] = ...,
) -> Sequence[Union[_Choice, _ChoiceNamedGroup]]: ...
def has_default(self) -> bool: ...
def get_default(self) -> Any: ...
def check(self, **kwargs: Any) -> List[checks.Error]: ...
@property
def validators(self) -> List[_ValidatorCallable]: ...
def validate(self, value: Any, model_instance: Model) -> None: ...
def run_validators(self, value: Any) -> None: ...
def get_col(self, alias: str, output_field: Optional[Field] = ...) -> Col: ...
@property
def cached_col(self) -> Col: ...
def value_from_object(self, obj: Model) -> _GT: ...
class IntegerField(Field[_ST, _GT]):
_pyi_private_set_type: Union[float, int, str, Combinable]
@@ -89,6 +145,9 @@ class FloatField(Field[_ST, _GT]):
class DecimalField(Field[_ST, _GT]):
_pyi_private_set_type: Union[str, float, decimal.Decimal, Combinable]
_pyi_private_get_type: decimal.Decimal
# attributes
max_digits: int = ...
decimal_places: int = ...
def __init__(
self,
verbose_name: Optional[Union[str, bytes]] = ...,

View File

@@ -1,39 +1,25 @@
from typing import (
Type,
Union,
TypeVar,
Any,
Generic,
List,
Optional,
Dict,
Callable,
Tuple,
Sequence,
TYPE_CHECKING,
Iterable,
)
from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, TYPE_CHECKING, Tuple, Type, TypeVar, Union
from uuid import UUID
from django.db import models
from django.db.models import Field, Model, QuerySet
from django.db.models.expressions import Combinable
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.query_utils import PathInfo, Q
from django.db import models
from django.db.models import Field, Model
from django.db.models.fields.related_descriptors import (
ReverseManyToOneDescriptor as ReverseManyToOneDescriptor,
ReverseOneToOneDescriptor as ReverseOneToOneDescriptor,
ForwardManyToOneDescriptor as ForwardManyToOneDescriptor,
ForwardOneToOneDescriptor as ForwardOneToOneDescriptor,
ForwardManyToOneDescriptor as ForwardManyToOneDescriptor,
ManyToManyDescriptor as ManyToManyDescriptor,
ReverseOneToOneDescriptor as ReverseOneToOneDescriptor,
ReverseManyToOneDescriptor as ReverseManyToOneDescriptor,
)
from django.db.models.fields.reverse_related import (
ForeignObjectRel as ForeignObjectRel,
ManyToManyRel as ManyToManyRel,
ManyToOneRel as ManyToOneRel,
OneToOneRel as OneToOneRel,
ManyToOneRel as ManyToOneRel,
ManyToManyRel as ManyToManyRel,
)
from django.db.models.query_utils import PathInfo, Q
from django.db.models.expressions import Combinable
if TYPE_CHECKING:
from django.db.models.manager import RelatedManager
@@ -59,16 +45,13 @@ class RelatedField(FieldCacheMixin, Field[_ST, _GT]):
one_to_one: bool = ...
many_to_many: bool = ...
many_to_one: bool = ...
def related_model(self) -> Union[Type[Model], str]: ...
def check(self, **kwargs: Any) -> List[Any]: ...
opts: Any = ...
def deconstruct(self) -> Tuple[Optional[str], str, List[Any], Dict[str, str]]: ...
@property
def related_model(self) -> Type[Model]: ...
def get_forward_related_filter(self, obj: Model) -> Dict[str, Union[int, UUID]]: ...
def get_reverse_related_filter(self, obj: Model) -> Q: ...
@property
def swappable_setting(self) -> Optional[str]: ...
name: Any = ...
verbose_name: Any = ...
def set_attributes_from_rel(self) -> None: ...
def do_related_class(self, other: Type[Model], cls: Type[Model]) -> None: ...
def get_limit_choices_to(self) -> Dict[str, int]: ...
@@ -76,7 +59,7 @@ class RelatedField(FieldCacheMixin, Field[_ST, _GT]):
@property
def target_field(self) -> Field: ...
class ForeignObject(RelatedField):
class ForeignObject(RelatedField[_ST, _GT]):
def __init__(
self,
to: Union[Type[Model], str],
@@ -109,7 +92,7 @@ class ForeignObject(RelatedField):
error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ...
class ForeignKey(RelatedField[_ST, _GT]):
class ForeignKey(ForeignObject[_ST, _GT]):
_pyi_private_set_type: Union[Any, Combinable]
_pyi_private_get_type: Any
def __init__(
@@ -185,14 +168,10 @@ class ManyToManyField(RelatedField[_ST, _GT]):
_pyi_private_set_type: Sequence[Any]
_pyi_private_get_type: RelatedManager[Any]
many_to_many: bool = ...
many_to_one: bool = ...
one_to_many: bool = ...
one_to_one: bool = ...
rel_class: Any = ...
description: Any = ...
has_null_arg: Any = ...
swappable: Any = ...
swappable: bool = ...
def __init__(
self,
to: Union[Type[_T], str],
@@ -227,20 +206,15 @@ class ManyToManyField(RelatedField[_ST, _GT]):
validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ...,
) -> None: ...
def check(self, **kwargs: Any) -> List[Any]: ...
def deconstruct(self) -> Tuple[Optional[str], str, List[Any], Dict[str, str]]: ...
def __get__(self, instance, owner) -> _GT: ... # type: ignore
def get_path_info(self, filtered_relation: None = ...) -> List[PathInfo]: ...
def get_reverse_path_info(self, filtered_relation: None = ...) -> List[PathInfo]: ...
m2m_db_table: Any = ...
m2m_column_name: Any = ...
m2m_reverse_name: Any = ...
m2m_field_name: Any = ...
m2m_reverse_field_name: Any = ...
m2m_target_field_name: Any = ...
m2m_reverse_target_field_name: Any = ...
def contribute_to_related_class(self, cls: Type[Model], related: RelatedField) -> None: ...
def set_attributes_from_rel(self) -> None: ...
def value_from_object(self, obj: Model) -> List[Model]: ...
def save_form_data(self, instance: Model, data: QuerySet) -> None: ...
def m2m_db_table(self) -> str: ...
def m2m_column_name(self) -> str: ...
def m2m_reverse_name(self) -> str: ...
def m2m_reverse_field_name(self) -> str: ...
def m2m_target_field_name(self) -> str: ...
def m2m_reverse_target_field_name(self) -> str: ...
def create_many_to_many_intermediary_model(field: Type[Field], klass: Type[Model]) -> Type[Model]: ...

View File

@@ -10,13 +10,10 @@ from django.db.models.sql.where import WhereNode
from .mixins import FieldCacheMixin
class ForeignObjectRel(FieldCacheMixin):
hidden: bool
many_to_many: bool
many_to_one: bool
name: str
one_to_many: bool
one_to_one: bool
related_model: Type[Model]
auto_created: bool = ...
concrete: bool = ...
editable: bool = ...
@@ -43,6 +40,12 @@ class ForeignObjectRel(FieldCacheMixin):
on_delete: Optional[Callable] = ...,
) -> None: ...
@property
def hidden(self) -> bool: ...
@property
def name(self) -> str: ...
@property
def related_model(self) -> Type[Model]: ...
@property
def remote_field(self) -> RelatedField: ...
@property
def target_field(self) -> AutoField: ...
@@ -63,22 +66,6 @@ class ForeignObjectRel(FieldCacheMixin):
def get_path_info(self, filtered_relation: Optional[FilteredRelation] = ...) -> List[PathInfo]: ...
class ManyToOneRel(ForeignObjectRel):
field: RelatedField
hidden: bool
limit_choices_to: Any
many_to_many: bool
many_to_one: bool
model: Union[Type[Model], str]
multiple: bool
name: str
on_delete: Callable
one_to_many: bool
one_to_one: bool
parent_link: bool
related_model: Type[Model]
related_name: Optional[str]
related_query_name: Optional[str]
symmetrical: bool
def __init__(
self,
field: ForeignKey,
@@ -91,25 +78,8 @@ class ManyToOneRel(ForeignObjectRel):
on_delete: Callable = ...,
) -> None: ...
def get_related_field(self) -> Field: ...
def set_field_name(self) -> None: ...
class OneToOneRel(ManyToOneRel):
field_name: Optional[str]
hidden: bool
limit_choices_to: Dict[str, str]
many_to_many: bool
many_to_one: bool
model: Union[Type[Model], str]
name: str
on_delete: Callable
one_to_many: bool
one_to_one: bool
parent_link: bool
related_model: Type[Model]
related_name: Optional[str]
related_query_name: Optional[str]
symmetrical: bool
multiple: bool = ...
def __init__(
self,
field: OneToOneField,
@@ -123,14 +93,8 @@ class OneToOneRel(ManyToOneRel):
) -> None: ...
class ManyToManyRel(ForeignObjectRel):
field_name: None
multiple: bool
name: str
parent_link: bool
related_model: Type[Model]
through: Optional[Union[Type[Model], str]] = ...
through_fields: Optional[Tuple[str, str]] = ...
symmetrical: bool = ...
db_constraint: bool = ...
def __init__(
self,

View File

@@ -17,6 +17,7 @@ from .text import (
StrIndex as StrIndex,
Replace as Replace,
Substr as Substr,
Reverse as Reverse,
)
from .window import (
@@ -44,6 +45,7 @@ from .datetime import (
ExtractWeek as ExtractWeek,
ExtractWeekDay as ExtractWeekDay,
ExtractYear as ExtractYear,
ExtractIsoYear as ExtractIsoYear,
Trunc as Trunc,
TruncDate as TruncDate,
TruncDay as TruncDay,
@@ -58,4 +60,28 @@ from .datetime import (
Now as Now,
)
from .comparison import Coalesce as Coalesce, Greatest as Greatest, Least as Least, Cast as Cast
from .comparison import Coalesce as Coalesce, Greatest as Greatest, Least as Least, Cast as Cast, NullIf as NullIf
from .math import (
Abs as Abs,
ACos as ACos,
ASin as ASin,
ATan as ATan,
ATan2 as ATan2,
Ceil as Ceil,
Cos as Cos,
Cot as Cot,
Degrees as Degrees,
Floor as Floor,
Exp as Exp,
Ln as Ln,
Log as Log,
Mod as Mod,
Pi as Pi,
Power as Power,
Radians as Radians,
Round as Round,
Sin as Sin,
Sqrt as Sqrt,
Tan as Tan,
)

View File

@@ -9,3 +9,4 @@ class Cast(Func):
class Coalesce(Func): ...
class Greatest(Func): ...
class Least(Func): ...
class NullIf(Func): ...

View File

@@ -8,6 +8,7 @@ class TimezoneMixin:
class Extract(TimezoneMixin, Transform): ...
class ExtractYear(Extract): ...
class ExtractIsoYear(Extract): ...
class ExtractMonth(Extract): ...
class ExtractDay(Extract): ...
class ExtractWeek(Extract): ...

View File

@@ -0,0 +1,25 @@
from django.db.models.expressions import Func
from django.db.models.functions.mixins import FixDecimalInputMixin, NumericOutputFieldMixin
from django.db.models.lookups import Transform
class Abs(Transform): ...
class ACos(NumericOutputFieldMixin, Transform): ...
class ASin(NumericOutputFieldMixin, Transform): ...
class ATan(NumericOutputFieldMixin, Transform): ...
class ATan2(NumericOutputFieldMixin, Func): ...
class Ceil(Transform): ...
class Cos(NumericOutputFieldMixin, Transform): ...
class Cot(NumericOutputFieldMixin, Transform): ...
class Degrees(NumericOutputFieldMixin, Transform): ...
class Exp(NumericOutputFieldMixin, Transform): ...
class Floor(Transform): ...
class Ln(NumericOutputFieldMixin, Transform): ...
class Log(FixDecimalInputMixin, NumericOutputFieldMixin, Func): ...
class Mod(FixDecimalInputMixin, NumericOutputFieldMixin, Func): ...
class Pi(NumericOutputFieldMixin, Func): ...
class Power(NumericOutputFieldMixin, Func): ...
class Radians(NumericOutputFieldMixin, Transform): ...
class Round(Transform): ...
class Sin(NumericOutputFieldMixin, Transform): ...
class Sqrt(NumericOutputFieldMixin, Transform): ...
class Tan(NumericOutputFieldMixin, Transform): ...

View File

@@ -0,0 +1,3 @@
class FixDecimalInputMixin: ...
class FixDurationInputMixin: ...
class NumericOutputFieldMixin: ...

View File

@@ -25,13 +25,15 @@ class Length(Transform): ...
class Lower(Transform): ...
class LPad(BytesToCharFieldConversionMixin, Func):
def __init__(self, expression: str, length: Union[Length, int], fill_text: Value = ..., **extra: Any) -> None: ...
def __init__(
self, expression: str, length: Optional[Union[Length, int]], fill_text: Value = ..., **extra: Any
) -> None: ...
class LTrim(Transform): ...
class Ord(Transform): ...
class Repeat(BytesToCharFieldConversionMixin, Func):
def __init__(self, expression: Union[Value, str], number: Union[Length, int], **extra: Any) -> None: ...
def __init__(self, expression: Union[Value, str], number: Optional[Union[Length, int]], **extra: Any) -> None: ...
class Replace(Func):
def __init__(self, expression: Combinable, text: Value, replacement: Value = ..., **extra: Any) -> None: ...
@@ -52,3 +54,4 @@ class Substr(Func):
class Trim(Transform): ...
class Upper(Transform): ...
class Reverse(Transform): ...

View File

@@ -1,23 +1,34 @@
from typing import Any, Dict, List, Optional, Tuple, Type, Union
from typing import Any, List, Optional, Sequence, Tuple, Type
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.ddl_references import Statement
from django.db.models.base import Model
from django.db.models.query_utils import Q
class Index:
model: Type[Model]
suffix: str = ...
max_name_length: int = ...
fields: List[str] = ...
fields_orders: List[Tuple[str, str]] = ...
fields: Sequence[str] = ...
fields_orders: Sequence[Tuple[str, str]] = ...
name: str = ...
db_tablespace: Optional[str] = ...
def __init__(self, *, fields: Any = ..., name: Optional[Any] = ..., db_tablespace: Optional[Any] = ...) -> None: ...
opclasses: Sequence[str] = ...
condition: Optional[Q] = ...
def __init__(
self,
*,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...
) -> None: ...
def check_name(self) -> List[str]: ...
def create_sql(
self, model: Type[Model], schema_editor: BaseDatabaseSchemaEditor, using: str = ...
) -> Statement: ...
def remove_sql(self, model: Type[Model], schema_editor: BaseDatabaseSchemaEditor) -> str: ...
def deconstruct(self) -> Tuple[str, Tuple, Dict[str, Union[List[str], str]]]: ...
def deconstruct(self) -> Any: ...
def clone(self) -> Index: ...
def set_name_with_model(self, model: Type[Model]) -> None: ...

View File

@@ -1,6 +1,6 @@
from collections import OrderedDict
from datetime import datetime
from typing import Any, Dict, List, Optional, Tuple, Type, Union, Iterable
from typing import Any, Dict, Iterable, List, Optional, Tuple, Type, Union, Mapping
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.db.models.expressions import Combinable, Expression, Func
@@ -10,22 +10,21 @@ from django.db.models.sql.query import Query
from django.utils.datastructures import OrderedSet
from django.utils.safestring import SafeText
from django.db.models import lookups
from django.db.models.fields import TextField, related_lookups, Field
from django.db.models.fields import TextField, related_lookups
class Lookup:
lookup_name: Any = ...
lookup_name: str = ...
prepare_rhs: bool = ...
can_use_none_as_rhs: bool = ...
lhs: Any = ...
rhs: Any = ...
bilateral_transforms: Any = ...
bilateral_transforms: List[Type[Transform]] = ...
def __init__(self, lhs: Union[Expression, TextField, related_lookups.MultiColSource], rhs: Any) -> None: ...
def apply_bilateral_transforms(self, value: Expression) -> Transform: ...
def batch_process_rhs(
self, compiler: SQLCompiler, connection: DatabaseWrapper, rhs: Optional[OrderedSet] = ...
) -> Tuple[List[str], List[str]]: ...
def get_source_expressions(self) -> List[Expression]: ...
lhs: Any = ...
def set_source_expressions(self, new_exprs: List[Expression]) -> None: ...
def get_prep_lookup(self) -> Any: ...
def get_db_prep_lookup(self, value: Union[int, str], connection: DatabaseWrapper) -> Tuple[str, List[SafeText]]: ...
@@ -36,20 +35,16 @@ class Lookup:
self, compiler: SQLCompiler, connection: DatabaseWrapper
) -> Tuple[str, Union[List[Union[int, str]], Tuple[int, int]]]: ...
def rhs_is_direct_value(self) -> bool: ...
def relabeled_clone(
self, relabels: Union[Dict[Optional[str], str], OrderedDict]
) -> Union[BuiltinLookup, FieldGetDbPrepValueMixin]: ...
def relabeled_clone(self, relabels: Mapping[str, str]) -> Union[BuiltinLookup, FieldGetDbPrepValueMixin]: ...
def get_group_by_cols(self) -> List[Expression]: ...
def as_sql(self, compiler: Any, connection: Any) -> None: ...
def as_sql(self, compiler: Any, connection: Any) -> Any: ...
def contains_aggregate(self) -> bool: ...
def contains_over_clause(self) -> bool: ...
@property
def is_summary(self): ...
def is_summary(self) -> bool: ...
class Transform(RegisterLookupMixin, Func):
bilateral: bool = ...
arity: int = ...
output_field: Field
@property
def lhs(self) -> Expression: ...
def get_bilateral_transforms(self) -> List[Type[Transform]]: ...
@@ -61,122 +56,51 @@ class FieldGetDbPrepValueMixin:
get_db_prep_lookup_value_is_iterable: bool = ...
class FieldGetDbPrepValueIterableMixin(FieldGetDbPrepValueMixin):
get_db_prep_lookup_value_is_iterable: bool = ...
def get_prep_lookup(self) -> Iterable[Any]: ...
def resolve_expression_parameter(
self, compiler: SQLCompiler, connection: DatabaseWrapper, sql: str, param: Optional[Union[Combinable, int, str]]
) -> Tuple[str, List[None]]: ...
self, compiler: SQLCompiler, connection: DatabaseWrapper, sql: str, param: Any
) -> Any: ...
class Exact(FieldGetDbPrepValueMixin, BuiltinLookup):
bilateral_transforms: List[Type[lookups.Transform]]
lookup_name: str = ...
class IExact(BuiltinLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class GreaterThan(FieldGetDbPrepValueMixin, BuiltinLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class GreaterThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class LessThan(FieldGetDbPrepValueMixin, BuiltinLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class LessThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup):
bilateral_transforms: List[Type[lookups.Transform]]
lookup_name: str = ...
class Exact(FieldGetDbPrepValueMixin, BuiltinLookup): ...
class IExact(BuiltinLookup): ...
class GreaterThan(FieldGetDbPrepValueMixin, BuiltinLookup): ...
class GreaterThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup): ...
class LessThan(FieldGetDbPrepValueMixin, BuiltinLookup): ...
class LessThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup): ...
class IntegerFieldFloatRounding:
rhs: Any = ...
def get_prep_lookup(self) -> Union[Combinable, Query, int]: ...
def get_prep_lookup(self) -> Any: ...
class IntegerGreaterThanOrEqual(IntegerFieldFloatRounding, GreaterThanOrEqual): ...
class IntegerLessThan(IntegerFieldFloatRounding, LessThan): ...
class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup):
bilateral_transforms: List[Type[lookups.Transform]]
lookup_name: str = ...
def get_rhs_op(self, connection: DatabaseWrapper, rhs: str) -> str: ...
def split_parameter_list_as_sql(self, compiler: Any, connection: Any): ...
class PatternLookup(BuiltinLookup):
param_pattern: str = ...
prepare_rhs: bool = ...
def get_rhs_op(self, connection: DatabaseWrapper, rhs: str) -> str: ...
class Contains(PatternLookup):
bilateral_transforms: List[Type[lookups.Transform]]
lookup_name: str = ...
class IContains(Contains):
bilateral_transforms: List[Any]
lookup_name: str = ...
class StartsWith(PatternLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
param_pattern: str = ...
class IStartsWith(StartsWith):
bilateral_transforms: List[Any]
lookup_name: str = ...
class EndsWith(PatternLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
param_pattern: str = ...
class IEndsWith(EndsWith):
bilateral_transforms: List[Any]
lookup_name: str = ...
class Range(FieldGetDbPrepValueIterableMixin, BuiltinLookup):
bilateral_transforms: List[Type[lookups.Transform]]
lookup_name: str = ...
class IsNull(BuiltinLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
prepare_rhs: bool = ...
class Regex(BuiltinLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
prepare_rhs: bool = ...
class IRegex(Regex):
bilateral_transforms: List[Any]
lookup_name: str = ...
class Contains(PatternLookup): ...
class IContains(Contains): ...
class StartsWith(PatternLookup): ...
class IStartsWith(StartsWith): ...
class EndsWith(PatternLookup): ...
class IEndsWith(EndsWith): ...
class Range(FieldGetDbPrepValueIterableMixin, BuiltinLookup): ...
class IsNull(BuiltinLookup): ...
class Regex(BuiltinLookup): ...
class IRegex(Regex): ...
class YearLookup(Lookup):
def year_lookup_bounds(self, connection: DatabaseWrapper, year: int) -> List[str]: ...
class YearComparisonLookup(YearLookup):
bilateral_transforms: List[Any]
def get_rhs_op(self, connection: DatabaseWrapper, rhs: str) -> str: ...
def get_bound(self, start: datetime, finish: datetime) -> Any: ...
class YearExact(YearLookup, Exact):
bilateral_transforms: List[Any]
lookup_name: str = ...
class YearGt(YearComparisonLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class YearGte(YearComparisonLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class YearLt(YearComparisonLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class YearLte(YearComparisonLookup):
bilateral_transforms: List[Any]
lookup_name: str = ...
class YearExact(YearLookup, Exact): ...
class YearGt(YearComparisonLookup): ...
class YearGte(YearComparisonLookup): ...
class YearLt(YearComparisonLookup): ...
class YearLte(YearComparisonLookup): ...

View File

@@ -9,9 +9,9 @@ class BaseManager(QuerySet[_T, _T]):
creation_counter: int = ...
auto_created: bool = ...
use_in_migrations: bool = ...
def __new__(cls: Type[BaseManager], *args: Any, **kwargs: Any) -> BaseManager: ...
model: Optional[Any] = ...
name: Optional[Any] = ...
name: str = ...
model: Type[Model] = ...
db: str
def __init__(self) -> None: ...
def deconstruct(self) -> Tuple[bool, str, None, Tuple, Dict[str, int]]: ...
def check(self, **kwargs: Any) -> List[Any]: ...
@@ -35,8 +35,4 @@ class ManagerDescriptor:
def __get__(self, instance: Optional[Model], cls: Type[Model] = ...) -> Manager: ...
class EmptyManager(Manager):
creation_counter: int
name: None
model: Optional[Type[Model]] = ...
def __init__(self, model: Type[Model]) -> None: ...
def get_queryset(self) -> QuerySet: ...

View File

@@ -1,5 +1,5 @@
import collections
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, TypeVar, Generic, Sequence
from django.apps.config import AppConfig
from django.apps.registry import Apps
@@ -29,14 +29,14 @@ def make_immutable_fields_list(
name: str, data: Union[Iterator[Any], List[Union[ArrayField, CIText]], List[Union[Field, FieldCacheMixin]]]
) -> ImmutableList: ...
class Options:
_M = TypeVar("_M", bound=Model)
class Options(Generic[_M]):
base_manager: Manager
concrete_fields: ImmutableList
default_manager: Manager
fields: ImmutableList
local_concrete_fields: ImmutableList
managers: ImmutableList
managers_map: Dict[str, Manager]
related_objects: ImmutableList
FORWARD_PROPERTIES: Any = ...
REVERSE_PROPERTIES: Any = ...
@@ -45,22 +45,22 @@ class Options:
local_many_to_many: List[ManyToManyField] = ...
private_fields: List[Any] = ...
local_managers: List[Manager] = ...
base_manager_name: None = ...
default_manager_name: None = ...
base_manager_name: Optional[str] = ...
default_manager_name: Optional[str] = ...
model_name: Optional[str] = ...
verbose_name: Optional[str] = ...
verbose_name_plural: Optional[str] = ...
db_table: str = ...
ordering: List[str] = ...
ordering: Optional[List[str]] = ...
indexes: List[Any] = ...
unique_together: Union[List[Any], Tuple] = ...
index_together: Union[List[Any], Tuple] = ...
select_on_save: bool = ...
default_permissions: Tuple[str, str, str, str] = ...
default_permissions: Sequence[str] = ...
permissions: List[Any] = ...
object_name: Optional[str] = ...
app_label: str = ...
get_latest_by: None = ...
get_latest_by: Optional[Sequence[str]] = ...
order_with_respect_to: None = ...
db_tablespace: str = ...
required_db_features: List[Any] = ...
@@ -78,7 +78,9 @@ class Options:
auto_created: bool = ...
related_fkey_lookups: List[Any] = ...
apps: Apps = ...
default_related_name: None = ...
default_related_name: Optional[str] = ...
model: Type[Model] = ...
original_attrs: Dict[str, Any] = ...
def __init__(self, meta: Optional[type], app_label: Optional[str] = ...) -> None: ...
@property
def label(self) -> str: ...
@@ -88,8 +90,6 @@ class Options:
def app_config(self) -> AppConfig: ...
@property
def installed(self): ...
model: Type[Model] = ...
original_attrs: Dict[str, Union[List[str], Apps, str]] = ...
def contribute_to_class(self, cls: Type[Model], name: str) -> None: ...
def add_manager(self, manager: Manager) -> None: ...
def add_field(self, field: Union[GenericForeignKey, Field], private: bool = ...) -> None: ...
@@ -100,12 +100,20 @@ class Options:
def verbose_name_raw(self) -> Any: ...
@property
def swapped(self) -> Optional[str]: ...
def many_to_many(self) -> ImmutableList: ...
def fields_map(self) -> Dict[str, ForeignObjectRel]: ...
@property
def many_to_many(self) -> List[ManyToManyField]: ...
@property
def fields_map(self) -> Dict[str, Union[Field, ForeignObjectRel]]: ...
@property
def managers(self) -> List[Manager]: ...
@property
def managers_map(self) -> Dict[str, Manager]: ...
def get_field(self, field_name: Union[Callable, str]) -> Field: ...
def get_base_chain(self, model: Type[Model]) -> List[Type[Model]]: ...
def get_parent_list(self) -> List[Type[Model]]: ...
def get_ancestor_link(self, ancestor: Type[Model]) -> Optional[OneToOneField]: ...
def get_path_to_parent(self, parent: Type[Model]) -> List[PathInfo]: ...
def get_path_from_parent(self, parent: Type[Model]) -> List[PathInfo]: ...
def get_fields(self, include_parents: bool = ..., include_hidden: bool = ...) -> ImmutableList: ...
def get_fields(
self, include_parents: bool = ..., include_hidden: bool = ...
) -> List[Union[Field, ForeignObjectRel]]: ...

View File

@@ -78,24 +78,30 @@ class QuerySet(Generic[_T, _Row], Collection[_Row], Sized):
def iterator(self, chunk_size: int = ...) -> Iterator[_Row]: ...
def aggregate(self, *args: Any, **kwargs: Any) -> Dict[str, Any]: ...
def get(self, *args: Any, **kwargs: Any) -> _Row: ...
def create(self, **kwargs: Any) -> _T: ...
def bulk_create(self, objs: Iterable[Model], batch_size: Optional[int] = ...) -> List[_T]: ...
def create(self, *args: Any, **kwargs: Any) -> _T: ...
def bulk_create(
self, objs: Iterable[Model], batch_size: Optional[int] = ..., ignore_conflicts: bool = ...
) -> List[_T]: ...
def get_or_create(self, defaults: Optional[MutableMapping[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] = ...) -> _Row: ...
def latest(self, *fields: Any, field_name: Optional[Any] = ...) -> _Row: ...
def first(self) -> Optional[_Row]: ...
def last(self) -> Optional[_Row]: ...
# technically it's Optional[_Row], but it creates a lot of false-positives (same for last())
def first(self) -> _Row: ...
def last(self) -> _Row: ...
def in_bulk(self, id_list: Iterable[Any] = ..., *, field_name: str = ...) -> Dict[Any, _T]: ...
def delete(self) -> Tuple[int, Dict[str, int]]: ...
def update(self, **kwargs: Any) -> int: ...
def _update(self, values: Any) -> Optional[Any]: ...
def exists(self) -> bool: ...
def explain(self, *, format: Optional[Any] = ..., **options: Any) -> str: ...
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: Optional[str] = ...,
) -> RawQuerySet: ...
# The type of values may be overridden to be more specific in the mypy plugin, depending on the fields param
def values(self, *fields: Union[str, Combinable], **expressions: Any) -> QuerySet[_T, Dict[str, Any]]: ...
@@ -119,9 +125,11 @@ class QuerySet(Generic[_T, _Row], Collection[_Row], Sized):
def select_for_update(self, nowait: bool = ..., skip_locked: bool = ..., of: Tuple = ...) -> QuerySet[_T, _Row]: ...
def select_related(self, *fields: Any) -> QuerySet[_T, _Row]: ...
def prefetch_related(self, *lookups: Any) -> QuerySet[_T, _Row]: ...
def annotate(self, *args: Any, **kwargs: Any) -> QuerySet[_T, _Row]: ...
# TODO: return type
def annotate(self, *args: Any, **kwargs: Any) -> QuerySet[Any, Any]: ...
def order_by(self, *field_names: Any) -> QuerySet[_T, _Row]: ...
def distinct(self, *field_names: Any) -> QuerySet[_T, _Row]: ...
# extra() return type won't be supported any time soon
def extra(
self,
select: Optional[Dict[str, Any]] = ...,
@@ -130,7 +138,7 @@ class QuerySet(Generic[_T, _Row], Collection[_Row], Sized):
tables: Optional[List[str]] = ...,
order_by: Optional[Sequence[str]] = ...,
select_params: Optional[Sequence[Any]] = ...,
) -> QuerySet[_T, _Row]: ...
) -> QuerySet[Any, Any]: ...
def reverse(self) -> QuerySet[_T, _Row]: ...
def defer(self, *fields: Any) -> QuerySet[_T, _Row]: ...
def only(self, *fields: Any) -> QuerySet[_T, _Row]: ...

View File

@@ -20,7 +20,7 @@ class QueryWrapper:
contains_aggregate: bool = ...
data: Tuple[str, List[Any]] = ...
def __init__(self, sql: str, params: List[Any]) -> None: ...
def as_sql(self, compiler: SQLCompiler = ..., connection: Any = ...) -> Tuple[str, List[Any]]: ...
def as_sql(self, compiler: SQLCompiler = ..., connection: Any = ...) -> Any: ...
class Q(tree.Node):
children: Union[List[Dict[str, str]], List[Tuple[str, Any]], List[Q]]
@@ -84,4 +84,4 @@ class FilteredRelation:
def __init__(self, relation_name: str, *, condition: Any = ...) -> None: ...
def clone(self) -> FilteredRelation: ...
def resolve_expression(self, *args: Any, **kwargs: Any) -> None: ...
def as_sql(self, compiler: SQLCompiler, connection: Any) -> Tuple[str, List[Union[int, str]]]: ...
def as_sql(self, compiler: SQLCompiler, connection: Any) -> Any: ...

View File

@@ -105,3 +105,5 @@ class SQLCompiler:
) -> Optional[Any]: ...
def as_subquery_condition(self, alias: str, columns: List[str], compiler: SQLCompiler) -> Tuple[str, Tuple]: ...
def explain_query(self) -> Iterator[str]: ...
def cursor_iter(cursor: Any, sentinel: Any, col_count: Optional[int], itersize: int) -> Iterator[Any]: ...

View File

@@ -2,13 +2,14 @@ import collections
from collections import OrderedDict, namedtuple
from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, Union
from django.db.models.lookups import Lookup
from django.db.models.query_utils import PathInfo
from django.db.models.lookups import Lookup, Transform
from django.db.models.query_utils import PathInfo, RegisterLookupMixin
from django.db.models.sql.compiler import SQLCompiler
from django.db.models.sql.datastructures import BaseTable
from django.db.models.sql.where import WhereNode
from django.db.models import Expression, Field, FilteredRelation, Model, Q, QuerySet
from django.db.models.expressions import Combinable
JoinInfo = namedtuple("JoinInfo", ["final_field", "targets", "opts", "joins", "path", "transform_function"])
@@ -46,6 +47,7 @@ class Query:
used_aliases: Set[str] = ...
filter_is_sticky: bool = ...
subquery: bool = ...
group_by: Optional[Union[Sequence[Combinable], Sequence[str], bool]] = ...
order_by: Tuple = ...
distinct: bool = ...
distinct_fields: Tuple = ...
@@ -67,6 +69,8 @@ class Query:
explain_query: bool = ...
explain_format: Optional[str] = ...
explain_options: Dict[str, int] = ...
high_mark: Optional[int] = ...
low_mark: int = ...
def __init__(self, model: Optional[Type[Model]], where: Type[WhereNode] = ...) -> None: ...
@property
def extra(self) -> OrderedDict: ...
@@ -96,8 +100,9 @@ class Query:
def get_initial_alias(self) -> str: ...
def count_active_tables(self) -> int: ...
def resolve_expression(self, query: Query, *args: Any, **kwargs: Any) -> Query: ...
def as_sql(self, compiler: SQLCompiler, connection: Any) -> Tuple[str, Tuple]: ...
def as_sql(self, compiler: SQLCompiler, connection: Any) -> Any: ...
def resolve_lookup_value(self, value: Any, can_reuse: Optional[Set[str]], allow_joins: bool) -> Any: ...
def solve_lookup_type(self, lookup: str) -> Tuple[Sequence[str], Sequence[str], bool]: ...
def build_filter(
self,
filter_expr: Union[Dict[str, str], Tuple[str, Tuple[int, int]]],
@@ -110,6 +115,7 @@ class Query:
) -> Tuple[WhereNode, List[Any]]: ...
def add_filter(self, filter_clause: Tuple[str, Union[List[int], List[str]]]) -> None: ...
def add_q(self, q_object: Q) -> None: ...
def build_where(self, q_object: Q) -> Any: ...
def build_filtered_relation_q(
self, q_object: Q, reuse: Set[str], branch_negated: bool = ..., current_negated: bool = ...
) -> WhereNode: ...
@@ -137,8 +143,6 @@ class Query:
) -> Tuple[WhereNode, Tuple]: ...
def set_empty(self) -> None: ...
def is_empty(self) -> bool: ...
high_mark: Optional[int] = ...
low_mark: int = ...
def set_limits(self, low: Optional[int] = ..., high: Optional[int] = ...) -> None: ...
def clear_limits(self) -> None: ...
def has_limit_one(self) -> bool: ...
@@ -174,7 +178,10 @@ class Query:
def set_values(self, fields: Union[List[str], Tuple]) -> None: ...
def trim_start(self, names_with_path: List[Tuple[str, List[PathInfo]]]) -> Tuple[str, bool]: ...
def is_nullable(self, field: Field) -> bool: ...
def build_lookup(self, lookups: Sequence[str], lhs: Query, rhs: Optional[Query]) -> Lookup: ...
def build_lookup(
self, lookups: Sequence[str], lhs: Union[RegisterLookupMixin, Query], rhs: Optional[Query]
) -> Lookup: ...
def try_transform(self, lhs: Union[RegisterLookupMixin, Query], name: str) -> Transform: ...
class JoinPromoter:
connector: str = ...

View File

@@ -1,104 +1,25 @@
import collections
import uuid
from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Type, Union
from typing import Any, Dict, Iterable, List, Optional, Tuple, Type, Union
from django.db.models.base import Model
from django.db.models.expressions import Case
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.where import WhereNode
from django.db.models.fields import Field
class DeleteQuery(Query):
alias_refcount: Dict[str, int]
annotation_select_mask: None
base_table: str
combinator: None
combinator_all: bool
combined_queries: Tuple
default_cols: bool
default_ordering: bool
deferred_loading: Tuple[frozenset, bool]
distinct: bool
distinct_fields: Tuple
explain_format: None
explain_options: Dict[Any, Any]
explain_query: bool
external_aliases: Set[Any]
extra_order_by: Tuple
extra_select_mask: None
extra_tables: Tuple
filter_is_sticky: bool
group_by: None
high_mark: None
low_mark: int
max_depth: int
model: Type[Model]
order_by: Tuple
select: Tuple
select_for_update: bool
select_for_update_nowait: bool
select_for_update_of: Tuple
select_for_update_skip_locked: bool
select_related: bool
standard_ordering: bool
subq_aliases: frozenset
subquery: bool
table_map: Dict[str, List[str]]
used_aliases: Set[str]
values_select: Tuple
where_class: Type[WhereNode]
compiler: str = ...
where: WhereNode = ...
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_qs(self, query: QuerySet, using: str) -> int: ...
class UpdateQuery(Query):
alias_refcount: Dict[str, int]
annotation_select_mask: Optional[Set[Any]]
base_table: str
combinator: None
combinator_all: bool
combined_queries: Tuple
default_cols: bool
default_ordering: bool
deferred_loading: Tuple[frozenset, bool]
distinct: bool
distinct_fields: Tuple
explain_format: None
explain_options: Dict[Any, Any]
explain_query: bool
external_aliases: Set[Any]
extra_order_by: Tuple
extra_select_mask: Optional[Set[Any]]
extra_tables: Tuple
filter_is_sticky: bool
group_by: Optional[bool]
high_mark: None
low_mark: int
max_depth: int
model: Type[Model]
order_by: Tuple
select: Tuple
select_for_update: bool
select_for_update_nowait: bool
select_for_update_of: Tuple
select_for_update_skip_locked: bool
select_related: bool
standard_ordering: bool
subq_aliases: frozenset
subquery: bool
table_map: Dict[str, List[str]]
used_aliases: Set[str]
values: List[Tuple[Field, Optional[Type[Model]], Union[Case, uuid.UUID]]]
values_select: Tuple
where_class: Type[WhereNode]
compiler: str = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def clone(self) -> UpdateQuery: ...
where: WhereNode = ...
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: ...
@@ -107,87 +28,18 @@ class UpdateQuery(Query):
def get_related_updates(self) -> List[UpdateQuery]: ...
class InsertQuery(Query):
alias_refcount: Dict[str, int]
annotation_select_mask: None
combinator: None
combinator_all: bool
combined_queries: Tuple
default_cols: bool
default_ordering: bool
deferred_loading: Tuple[frozenset, bool]
distinct: bool
distinct_fields: Tuple
explain_format: None
explain_options: Dict[Any, Any]
explain_query: bool
external_aliases: Set[Any]
extra_order_by: Tuple
extra_select_mask: None
extra_tables: Tuple
filter_is_sticky: bool
group_by: None
high_mark: None
low_mark: int
max_depth: int
model: Type[Model]
order_by: Tuple
select: Tuple
select_for_update: bool
select_for_update_nowait: bool
select_for_update_of: Tuple
select_for_update_skip_locked: bool
select_related: bool
standard_ordering: bool
subquery: bool
table_map: Dict[str, List[str]]
used_aliases: Set[Any]
values_select: Tuple
where: WhereNode
where_class: Type[WhereNode]
compiler: str = ...
fields: Iterable[Field] = ...
objs: List[Model] = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
raw: bool = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def insert_values(self, fields: Iterable[Field], objs: List[Model], raw: bool = ...) -> None: ...
class AggregateQuery(Query):
alias_refcount: Dict[Any, Any]
annotation_select_mask: None
combinator: None
combinator_all: bool
combined_queries: Tuple
default_cols: bool
default_ordering: bool
deferred_loading: Tuple[frozenset, bool]
distinct: bool
distinct_fields: Tuple
explain_format: None
explain_options: Dict[Any, Any]
explain_query: bool
external_aliases: Set[Any]
extra_order_by: Tuple
extra_select_mask: None
extra_tables: Tuple
filter_is_sticky: bool
group_by: None
high_mark: None
low_mark: int
max_depth: int
model: Type[Model]
order_by: Tuple
select: Tuple
select_for_update: bool
select_for_update_nowait: bool
select_for_update_of: Tuple
select_for_update_skip_locked: bool
select_related: bool
standard_ordering: bool
sub_params: Tuple
table_map: Dict[Any, Any]
used_aliases: Set[Any]
values_select: Tuple
where: WhereNode
where_class: Type[WhereNode]
compiler: str = ...
def add_subquery(self, query: Query, using: str) -> None: ...

View File

@@ -18,7 +18,7 @@ class WhereNode(tree.Node):
resolved: bool = ...
conditional: bool = ...
def split_having(self, negated: bool = ...) -> Tuple[Optional[WhereNode], Optional[WhereNode]]: ...
def as_sql(self, compiler: SQLCompiler, connection: Any) -> Tuple[str, List[Union[int, str]]]: ...
def as_sql(self, compiler: SQLCompiler, connection: Any) -> Any: ...
def get_group_by_cols(self) -> List[Expression]: ...
def relabel_aliases(self, change_map: Union[Dict[Optional[str], str], OrderedDict]) -> None: ...
def clone(self) -> WhereNode: ...

View File

@@ -1,4 +1,5 @@
from typing import Any, Callable, Optional, overload, TypeVar
from contextlib import contextmanager
from typing import Any, Callable, Optional, overload, TypeVar, Iterator
from django.db import ProgrammingError
@@ -6,16 +7,18 @@ class TransactionManagementError(ProgrammingError): ...
def get_connection(using: Optional[str] = ...) -> Any: ...
def get_autocommit(using: Optional[str] = ...) -> bool: ...
def set_autocommit(autocommit: bool, using: None = ...) -> Any: ...
def commit(using: None = ...) -> Any: ...
def rollback(using: None = ...) -> Any: ...
def savepoint(using: None = ...) -> str: ...
def savepoint_rollback(sid: str, using: None = ...) -> None: ...
def set_autocommit(autocommit: bool, using: Optional[str] = ...) -> Any: ...
def commit(using: Optional[str] = ...) -> Any: ...
def rollback(using: Optional[str] = ...) -> Any: ...
def savepoint(using: Optional[str] = ...) -> str: ...
def savepoint_rollback(sid: str, using: Optional[str] = ...) -> None: ...
def savepoint_commit(sid: Any, using: Optional[Any] = ...) -> None: ...
def clean_savepoints(using: Optional[Any] = ...) -> None: ...
def get_rollback(using: None = ...) -> bool: ...
def get_rollback(using: Optional[str] = ...) -> bool: ...
def set_rollback(rollback: bool, using: Optional[str] = ...) -> None: ...
def on_commit(func: Callable, using: None = ...) -> None: ...
@contextmanager
def mark_for_rollback_on_error(using: Optional[str] = ...) -> Iterator[None]: ...
def on_commit(func: Callable, using: Optional[str] = ...) -> None: ...
_C = TypeVar("_C", bound=Callable) # Any callable

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, List, Optional
from typing import Any, Dict, Iterable, List, Optional
DEFAULT_DB_ALIAS: str
DJANGO_VERSION_PICKLE_KEY: str
@@ -28,3 +28,8 @@ class ConnectionHandler:
def __iter__(self): ...
def all(self) -> List[Any]: ...
def close_all(self) -> None: ...
class ConnectionRouter:
def __init__(self, routers: Optional[Iterable[Any]] = ...) -> None: ...
@property
def routers(self) -> List[Any]: ...

View File

@@ -1,12 +1,16 @@
from datetime import datetime, timedelta
from decimal import Decimal
from typing import Any, Callable, List, Optional, Pattern, Sequence, Type, Union
from typing import Any, Callable, List, Optional, Pattern, Sequence, Type, Union, Tuple, Iterable
from django.core.validators import BaseValidator
from django.forms.boundfield import BoundField
from django.forms.forms import BaseForm
from django.forms.widgets import Widget
_Choice = Tuple[Any, str]
_ChoiceNamedGroup = Tuple[str, Iterable[_Choice]]
_FieldChoices = Iterable[Union[_Choice, _ChoiceNamedGroup]]
class Field:
initial: Any
label: Optional[str]
@@ -23,6 +27,9 @@ class Field:
localize: bool = ...
error_messages: Any = ...
validators: List[BaseValidator] = ...
max_length: Optional[Union[int, str]] = ...
choices: _FieldChoices = ...
base_field: Field
def __init__(
self,
*,
@@ -47,9 +54,9 @@ class Field:
def widget_attrs(self, widget: Widget) -> Any: ...
def has_changed(self, initial: Any, data: Any) -> bool: ...
def get_bound_field(self, form: BaseForm, field_name: str) -> BoundField: ...
def deconstruct(self) -> Any: ...
class CharField(Field):
max_length: Optional[Union[int, str]] = ...
min_length: Optional[Union[int, str]] = ...
strip: bool = ...
empty_value: Optional[str] = ...
@@ -93,8 +100,7 @@ class IntegerField(Field):
label_suffix: Optional[Any] = ...,
) -> None: ...
class FloatField(IntegerField):
def validate(self, value: Optional[float]) -> None: ...
class FloatField(IntegerField): ...
class DecimalField(IntegerField):
decimal_places: Optional[int]
@@ -118,7 +124,6 @@ class DecimalField(IntegerField):
disabled: bool = ...,
label_suffix: Optional[Any] = ...,
) -> None: ...
def validate(self, value: Optional[Decimal]) -> None: ...
class BaseTemporalField(Field):
input_formats: Any = ...
@@ -171,7 +176,6 @@ class RegexField(CharField):
class EmailField(CharField): ...
class FileField(Field):
max_length: Optional[int] = ...
allow_empty_file: bool = ...
def __init__(
self,

View File

@@ -1,9 +1,6 @@
from datetime import datetime
from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Type, Union
from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Type, Union, Tuple
from django.core.exceptions import ValidationError as ValidationError
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db.models.query import QuerySet
from django.forms.boundfield import BoundField
from django.forms.fields import Field
from django.forms.renderers import BaseRenderer
@@ -15,6 +12,8 @@ class DeclarativeFieldsMetaclass(MediaDefiningClass):
def __new__(mcs, name: str, bases: Sequence[Type[BaseForm]], attrs: Dict[str, Any]) -> Type[BaseForm]: ...
class BaseForm:
class Meta:
fields: Sequence[str] = ...
default_renderer: Any = ...
field_order: Any = ...
use_required_attribute: bool = ...

View File

@@ -1,9 +1,26 @@
from io import BytesIO
from typing import Any, BinaryIO, Dict, Iterable, List, Mapping, Optional, Pattern, Tuple, Union, overload
from typing import (
Any,
BinaryIO,
Dict,
Iterable,
List,
Mapping,
Optional,
Pattern,
Set,
Tuple,
Union,
overload,
TypeVar,
Type,
)
from django.contrib.sessions.backends.base import SessionBase
from django.utils.datastructures import ImmutableList, MultiValueDict
from django.db.models.base import Model
from django.utils.datastructures import CaseInsensitiveMapping, ImmutableList, MultiValueDict
from django.contrib.auth.base_user import AbstractBaseUser
from django.core.files import uploadedfile, uploadhandler
from django.urls import ResolverMatch
@@ -15,6 +32,13 @@ class RawPostDataException(Exception): ...
UploadHandlerList = Union[List[uploadhandler.FileUploadHandler], ImmutableList[uploadhandler.FileUploadHandler]]
class HttpHeaders(CaseInsensitiveMapping):
HTTP_PREFIX: str = ...
UNPREFIXED_HEADERS: Set[str] = ...
def __init__(self, environ: Mapping[str, Any]) -> None: ...
@classmethod
def parse_header_name(cls, header: str) -> Optional[str]: ...
class HttpRequest(BytesIO):
GET: QueryDict = ...
POST: QueryDict = ...
@@ -27,6 +51,7 @@ class HttpRequest(BytesIO):
resolver_match: ResolverMatch = ...
content_type: Optional[str] = ...
content_params: Optional[Dict[str, str]] = ...
user: AbstractBaseUser
session: SessionBase
encoding: Optional[str] = ...
upload_handlers: UploadHandlerList = ...
@@ -48,11 +73,15 @@ class HttpRequest(BytesIO):
self, META: Mapping[str, Any], post_data: BinaryIO
) -> Tuple[QueryDict, MultiValueDict[str, uploadedfile.UploadedFile]]: ...
@property
def headers(self) -> HttpHeaders: ...
@property
def body(self) -> bytes: ...
def _load_post_and_files(self) -> None: ...
_Q = TypeVar("_Q", bound="QueryDict")
class QueryDict(MultiValueDict[str, str]):
encoding: Any = ...
encoding: str = ...
_mutable: bool = ...
def __init__(
self, query_string: Optional[Union[str, bytes]] = ..., mutable: bool = ..., encoding: Optional[str] = ...
@@ -61,6 +90,14 @@ class QueryDict(MultiValueDict[str, str]):
def setlistdefault(self, key: str, default_list: Optional[List[str]] = ...) -> List[str]: ...
def appendlist(self, key: str, value: str) -> None: ...
def urlencode(self, safe: Optional[str] = ...) -> str: ...
@classmethod
def fromkeys(
cls: Type[_Q],
iterable: Iterable[Union[bytes, str]],
value: Any = ...,
mutable: bool = ...,
encoding: Optional[str] = ...,
) -> _Q: ...
@overload
def bytes_to_text(s: bytes, encoding: str) -> str: ...

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