1 Commits

Author SHA1 Message Date
sobolevn
3881df188c Adds github tempaltes, refs #112 2019-09-05 12:45:08 +03:00
232 changed files with 1353 additions and 3995 deletions

3
.gitignore vendored
View File

@@ -9,6 +9,3 @@ build/
dist/ dist/
pip-wheel-metadata/ pip-wheel-metadata/
.pytest_cache/ .pytest_cache/
/.envrc
/.direnv
django-sources/

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

@@ -4,33 +4,19 @@ dist: xenial
sudo: required sudo: required
jobs: jobs:
include: include:
- name: Run plugin test suite with python 3.8
python: 3.8
script: 'pytest'
- name: Run plugin test suite with python 3.7 - name: Run plugin test suite with python 3.7
python: 3.7 python: 3.7
script: 'pytest'
- name: Typecheck Django 3.0 test suite with python 3.8
python: 3.8
script: | script: |
python ./scripts/typecheck_tests.py --django_version=3.0 set -e
pytest
- name: Typecheck Django 3.0 test suite with python 3.7 - name: Typecheck Django test suite with python 3.7
python: 3.7 python: 3.7
script: | script: 'python ./scripts/typecheck_tests.py'
python ./scripts/typecheck_tests.py --django_version=3.0
- name: Typecheck Django 3.0 test suite with python 3.6 - name: Typecheck Django test suite with python 3.6
python: 3.6 python: 3.6
script: | script: 'python ./scripts/typecheck_tests.py'
python ./scripts/typecheck_tests.py --django_version=3.0
- name: Typecheck Django 2.2 test suite with python 3.7
python: 3.7
script: |
python ./scripts/typecheck_tests.py --django_version=2.2
- name: Mypy for plugin code - name: Mypy for plugin code
python: 3.7 python: 3.7
@@ -38,24 +24,18 @@ jobs:
- name: Lint with black - name: Lint with black
python: 3.7 python: 3.7
script: 'black --check django-stubs/' script: 'black --check --line-length=120 django-stubs/'
- name: Lint plugin code with flake8 - name: Lint plugin code with flake8
python: 3.7 python: 3.7
script: 'flake8' script: 'flake8'
- name: Lint stubs with flake8-pyi and check for unused imports
python: 3.7
script: 'flake8 --config flake8-pyi.ini'
- name: Lint plugin code with isort - name: Lint plugin code with isort
python: 3.7 python: 3.7
script: 'isort --check --diff' script: 'isort --check'
before_install: | before_install: |
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable -y # Upgrade pip, setuptools, and wheel
sudo apt-get update
sudo apt-get install -y binutils libproj-dev gdal-bin
pip install -U pip setuptools wheel pip install -U pip setuptools wheel
install: | install: |
pip install -r ./dev-requirements.txt pip install -r ./dev-requirements.txt

View File

@@ -1,111 +0,0 @@
# How to contribute
## Tutorials
If you want to start working on this project,
you will need to get familiar with these projects:
- [Django docs](https://docs.djangoproject.com/en/dev/)
- [Typing in Python](https://inventwithpython.com/blog/2019/11/24/type-hints-for-busy-python-programmers/)
- [How to write custom mypy plugins](https://mypy.readthedocs.io/en/stable/extending_mypy.html)
- [Typechecking Django and DRF](https://sobolevn.me/2019/08/typechecking-django-and-drf) guide
- [Testing mypy stubs, plugins, and types](https://sobolevn.me/2019/08/testing-mypy-types) guide
It is also recommended to take a look at these resources:
- [Awesome Python Typing](https://github.com/typeddjango/awesome-python-typing)
## Dev documentation
TODO
## Dependencies
We use `pip` to manage the dependencies.
To install them you would need to activate your `virtualenv` and run `install` command:
```bash
pip install -r ./dev-requirements.txt
```
## Tests and linters
We use `mypy`, `pytest`, `flake8`, and `black` for quality control.
Here's [how we run our CI](https://github.com/typeddjango/django-stubs/blob/master/.travis.yml).
### Typechecking
To run typechecking use:
```bash
mypy ./mypy_django_plugin
```
### Testing
There are unit tests and type-related tests.
To run unit tests:
```bash
pytest
```
Type-related tests ensure that different Django versions do work correctly.
To run type-related tests:
```bash
python ./scripts/typecheck_tests.py --django_version=2.2
python ./scripts/typecheck_tests.py --django_version=3.0
```
Currently we only support two Django versions.
### Linting
To run auto-formatting:
```bash
isort -rc .
black django-stubs/
```
To run linting:
```bash
flake8
flake8 --config flake8-pyi.ini
```
## Submitting your code
We use [trunk based](https://trunkbaseddevelopment.com/)
development (we also sometimes call it `wemake-git-flow`).
What the point of this method?
1. We use protected `master` branch,
so the only way to push your code is via pull request
2. We use issue branches: to implement a new feature or to fix a bug
create a new branch named `issue-$TASKNUMBER`
3. Then create a pull request to `master` branch
4. We use `git tag`s to make releases, so we can track what has changed
since the latest release
So, this way we achieve an easy and scalable development process
which frees us from merging hell and long-living branches.
In this method, the latest version of the app is always in the `master` branch.
## Other help
You can contribute by spreading a word about this library.
It would also be a huge contribution to write
a short article on how you are using this project.
You can also share your best practices with us.

123
README.md
View File

@@ -1,120 +1,71 @@
<img src="http://mypy-lang.org/static/mypy_light.svg" alt="mypy logo" width="300px"/> <img src="http://mypy-lang.org/static/mypy_light.svg" alt="mypy logo" width="300px"/>
# Typesafe Django Framework # pep484 stubs for Django framework
[![Build Status](https://travis-ci.com/typeddjango/django-stubs.svg?branch=master)](https://travis-ci.com/typeddjango/django-stubs) [![Build Status](https://travis-ci.org/typeddjango/django-stubs.svg?branch=master)](https://travis-ci.org/typeddjango/django-stubs)
[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/) [![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
[![Gitter](https://badges.gitter.im/mypy-django/Lobby.svg)](https://gitter.im/mypy-django/Lobby)
This package contains [type stubs](https://www.python.org/dev/peps/pep-0561/) and a custom 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 this project. The final goal is to be able to get precise types for most common patterns. 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/2.2.
Could be run on earlier versions of Django, but expect some missing imports warnings.
## Installation ## Installation
```bash ```
pip install django-stubs pip install django-stubs
``` ```
See [Configuration](#configuration) section to get started. ### 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.
## Configuration To make mypy aware of the plugin, you need to add
To make `mypy` happy, you will need to add: ```
```ini
[mypy] [mypy]
plugins = plugins =
mypy_django_plugin.main mypy_django_plugin.main
[mypy.plugins.django-stubs]
django_settings_module = "myproject.settings"
``` ```
in your `mypy.ini` or `setup.cfg` [file](https://mypy.readthedocs.io/en/latest/config_file.html). in your `mypy.ini` file.
Two things happeining here: Plugin requires Django settings module (what you put into `DJANGO_SETTINGS_MODULE` variable) to be specified inside `mypy.ini` file.
```
[mypy]
strict_optional = True
1. We need to explicitly list our plugin to be loaded by `mypy` ; this one is new
2. Our plugin also requires `django` settings module (what you put into `DJANGO_SETTINGS_MODULE` variable) to be specified [mypy.plugins.django-stubs]
django_settings_module = mysettings
```
where `mysettings` is a value of `DJANGO_SETTINGS_MODULE` (with or without quotes)
This fully working [typed boilerplate](https://github.com/wemake-services/wemake-django-template) can serve you as an example. 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()`.
## Version compatibility
We rely on different `django` and `mypy` versions:
| django-stubs | mypy version | django version | python version
| ------------ | ---- | ---- | ---- |
| 1.5.0 | 0.780 | 2.2.x \|\| 3.x | ^3.6
| 1.4.0 | 0.770 | 2.2.x \|\| 3.x | ^3.6
| 1.3.0 | 0.750 | 2.2.x \|\| 3.x | ^3.6
| 1.2.0 | 0.730 | 2.2.x | ^3.6
| 1.1.0 | 0.720 | 2.2.x | ^3.6
| 0.12.x | old semantic analyzer (<0.711), dmypy support | 2.1.x | ^3.6
## FAQ
### Is this an official Django project?
No, it is not. We are indendepent from Django at the moment.
There's a [proposal](https://github.com/django/deps/pull/65) to merge our project into the Django itself.
You show your support by linking the PR.
### Is it safe to use this in production?
Yes, it is! This project does not affect your runtime at all.
It only affects `mypy` type checking process.
But, it does not make any sense to use this project without `mypy`.
### mypy crashes when I run it with this plugin installed
Current implementation uses Django runtime to extract models information, so it will crash, if your installed apps or `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. In other words, if your `manage.py runserver` crashes, mypy will crash too.
You can also run `mypy` with [`--tb`](https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-show-traceback)
option to get extra information about the error.
### I cannot use QuerySet or Manager with type annotations ## Notes
You can get a `TypeError: 'type' object is not subscriptable` 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
when you will try to use `QuerySet[MyModel]` or `Manager[MyModel]`.
This happens because Django classes do not support [`__class_getitem__`](https://www.python.org/dev/peps/pep-0560/#class-getitem) magic method.
You can use strings instead: `'QuerySet[MyModel]'` and `'Manager[MyModel]'`, this way it will work as a type for `mypy` and as a regular `str` in runtime.
Currently we [are working](https://github.com/django/django/pull/12405) on providing `__class_getitem__` to the classes where we need them.
### How can I use HttpRequest with custom user model?
You can subclass standard request like so:
```python
from django.http import HttpRequest
from my_user_app.models import MyUser
class MyRequest(HttpRequest):
user: MyUser
``` ```
class MyUserManager(models.Manager['MyUser']):
pass
class MyUser(models.Model):
objects = UserManager()
```
work, which should make a error messages a bit better.
And then use `MyRequest` instead of standard `HttpRequest` inside your project. 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`.
## Related projects
- [`awesome-python-typing`](https://github.com/typeddjango/awesome-python-typing) - Awesome list of all typing-related things in Python.
- [`djangorestframework-stubs`](https://github.com/typeddjango/djangorestframework-stubs) - Stubs for Django REST Framework.
- [`pytest-mypy-plugins`](https://github.com/typeddjango/pytest-mypy-plugins) - `pytest` plugin that we use for testing `mypy` stubs and plugins.
- [`wemake-django-template`](https://github.com/wemake-services/wemake-django-template) - Create new typed Django projects in seconds.
## To get help ## To get help
We have Gitter here: <https://gitter.im/mypy-django/Lobby> 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,8 +1,6 @@
black black
pytest-mypy-plugins==1.3.0 pytest-mypy-plugins==1.0.3
psycopg2 psycopg2
flake8==3.7.9 flake8
flake8-pyi==19.3.0 isort==4.3.4
isort==4.3.21
gitpython==3.1.0
-e . -e .

1
django-sources Submodule

Submodule django-sources added at 4d6449e125

View File

@@ -1,6 +1,5 @@
from typing import Any, Iterator, Type, Optional, Dict from typing import Any, Iterator, Type, Optional, Dict
from django.apps.registry import Apps
from django.db.models.base import Model from django.db.models.base import Model
MODELS_MODULE_NAME: str MODELS_MODULE_NAME: str
@@ -8,11 +7,11 @@ MODELS_MODULE_NAME: str
class AppConfig: class AppConfig:
name: str = ... name: str = ...
module: Optional[Any] = ... module: Optional[Any] = ...
apps: Optional[Apps] = ... apps: None = ...
label: str = ... label: str = ...
verbose_name: str = ... verbose_name: str = ...
path: str = ... path: str = ...
models_module: Optional[str] = ... models_module: None = ...
models: Dict[str, Type[Model]] = ... models: Dict[str, Type[Model]] = ...
def __init__(self, app_name: str, app_module: Optional[Any]) -> None: ... def __init__(self, app_name: str, app_module: Optional[Any]) -> None: ...
@classmethod @classmethod

View File

@@ -1,22 +1,24 @@
import threading import threading
from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Type, Union 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 from django.db.models.base import Model
from .config import AppConfig from .config import AppConfig
class Apps: class Apps:
all_models: Dict[str, Dict[str, Type[Model]]] = ... all_models: "Dict[str, OrderedDict[str, Type[Model]]]" = ...
app_configs: Dict[str, AppConfig] = ... app_configs: "OrderedDict[str, AppConfig]" = ...
stored_app_configs: List[Any] = ... stored_app_configs: List[Any] = ...
apps_ready: bool = ... apps_ready: bool = ...
ready_event: threading.Event = ... ready_event: threading.Event = ...
loading: bool = ... loading: bool = ...
_pending_operations: Dict[Tuple[str, str], List] _pending_operations: DefaultDict[Tuple[str, str], List]
models_ready: bool = ... models_ready: bool = ...
ready: bool = ... ready: bool = ...
def __init__(self, installed_apps: Optional[Iterable[Union[AppConfig, str]]] = ...) -> None: ... def __init__(self, installed_apps: Optional[Union[List[AppConfigStub], List[str], Tuple]] = ...) -> None: ...
def populate(self, installed_apps: Iterable[Union[AppConfig, str]] = ...) -> None: ... def populate(self, installed_apps: Union[List[AppConfigStub], List[str], Tuple] = ...) -> None: ...
def check_apps_ready(self) -> None: ... def check_apps_ready(self) -> None: ...
def check_models_ready(self) -> None: ... def check_models_ready(self) -> None: ...
def get_app_configs(self) -> Iterable[AppConfig]: ... def get_app_configs(self) -> Iterable[AppConfig]: ...
@@ -29,9 +31,9 @@ class Apps:
def get_containing_app_config(self, object_name: str) -> Optional[AppConfig]: ... def get_containing_app_config(self, object_name: str) -> Optional[AppConfig]: ...
def get_registered_model(self, app_label: str, model_name: str) -> Type[Model]: ... def get_registered_model(self, app_label: str, model_name: str) -> Type[Model]: ...
def get_swappable_settings_name(self, to_string: str) -> Optional[str]: ... def get_swappable_settings_name(self, to_string: str) -> Optional[str]: ...
def set_available_apps(self, available: Iterable[str]) -> None: ... def set_available_apps(self, available: List[str]) -> None: ...
def unset_available_apps(self) -> None: ... def unset_available_apps(self) -> None: ...
def set_installed_apps(self, installed: Iterable[str]) -> None: ... def set_installed_apps(self, installed: Union[List[str], Tuple[str]]) -> None: ...
def unset_installed_apps(self) -> None: ... def unset_installed_apps(self) -> None: ...
def clear_cache(self) -> None: ... def clear_cache(self) -> None: ...
def lazy_model_operation(self, function: Callable, *model_keys: Any) -> None: ... def lazy_model_operation(self, function: Callable, *model_keys: Any) -> None: ...

View File

@@ -345,7 +345,7 @@ SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_HTTPONLY = True
# Whether to set the flag restricting cookie leaks on cross-site requests. # Whether to set the flag restricting cookie leaks on cross-site requests.
# This can be 'Lax', 'Strict', or None to disable the flag. # This can be 'Lax', 'Strict', or None to disable the flag.
SESSION_COOKIE_SAMESITE: Optional[str] = ... SESSION_COOKIE_SAMESITE = "Lax"
# Whether to save the session data on every request. # Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST = False SESSION_SAVE_EVERY_REQUEST = False
# Whether a user's session cookie expires when the Web browser is closed. # Whether a user's session cookie expires when the Web browser is closed.
@@ -413,7 +413,7 @@ CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_PATH = "/" CSRF_COOKIE_PATH = "/"
CSRF_COOKIE_SECURE = False CSRF_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = False CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_SAMESITE: Optional[str] = ... CSRF_COOKIE_SAMESITE = "Lax"
CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN" CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN"
CSRF_TRUSTED_ORIGINS: List[str] = ... CSRF_TRUSTED_ORIGINS: List[str] = ...
CSRF_USE_SESSIONS = False CSRF_USE_SESSIONS = False

View File

@@ -5,10 +5,10 @@ from django.http.response import HttpResponse, HttpResponseBase
from django.urls import URLResolver, URLPattern from django.urls import URLResolver, URLPattern
handler400: Union[str, Callable[..., HttpResponse]] = ... handler400: Callable[..., HttpResponse] = ...
handler403: Union[str, Callable[..., HttpResponse]] = ... handler403: Callable[..., HttpResponse] = ...
handler404: Union[str, Callable[..., HttpResponse]] = ... handler404: Callable[..., HttpResponse] = ...
handler500: Union[str, Callable[..., HttpResponse]] = ... handler500: Callable[..., HttpResponse] = ...
IncludedURLConf = Tuple[List[URLResolver], Optional[str], Optional[str]] IncludedURLConf = Tuple[List[URLResolver], Optional[str], Optional[str]]

View File

@@ -1,13 +1,11 @@
from typing import Any, List, Union, Iterable, Optional from typing import Any, List, Union
from django.contrib.admin.options import BaseModelAdmin from django.contrib.admin.options import BaseModelAdmin, InlineModelAdmin, ModelAdmin
from django.core.checks.messages import Error from django.core.checks.messages import Error
from django.apps.config import AppConfig
_CheckError = Union[str, Error] _CheckError = Union[str, Error]
def check_admin_app(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[_CheckError]: ... def check_admin_app(app_configs: None, **kwargs: Any) -> List[_CheckError]: ...
def check_dependencies(**kwargs: Any) -> List[_CheckError]: ... def check_dependencies(**kwargs: Any) -> List[_CheckError]: ...
class BaseModelAdminChecks: class BaseModelAdminChecks:

View File

@@ -1,5 +1,3 @@
from typing import Any, Callable, Optional, Type from typing import Any, Callable, Optional
from django.db.models.base import Model def register(*models: Any, site: Optional[Any] = ...) -> Callable: ...
def register(*models: Type[Model], site: Optional[Any] = ...) -> Callable: ...

View File

@@ -24,7 +24,7 @@ class SimpleListFilter(ListFilter):
parameter_name: Any = ... parameter_name: Any = ...
lookup_choices: Any = ... lookup_choices: Any = ...
def value(self) -> Optional[str]: ... def value(self) -> Optional[str]: ...
def lookups(self, request: Any, model_admin: Any) -> List[Tuple[Any, str]]: ... def lookups(self, request: Any, model_admin: Any) -> None: ...
class FieldListFilter(ListFilter): class FieldListFilter(ListFilter):
field: Field = ... field: Field = ...

View File

@@ -1,7 +1,7 @@
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Union, Iterable from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Union
from django.contrib.auth.forms import AdminPasswordChangeForm
from django.forms.boundfield import BoundField from django.forms.boundfield import BoundField
from django.forms.forms import BaseForm
from django.forms.utils import ErrorDict from django.forms.utils import ErrorDict
from django.forms.widgets import Media, Widget from django.forms.widgets import Media, Widget
from django.utils.safestring import SafeText from django.utils.safestring import SafeText
@@ -23,10 +23,10 @@ class AdminForm:
readonly_fields: Any = ... readonly_fields: Any = ...
def __init__( def __init__(
self, self,
form: BaseForm, form: AdminPasswordChangeForm,
fieldsets: List[Tuple[None, Dict[str, List[str]]]], fieldsets: List[Tuple[None, Dict[str, List[str]]]],
prepopulated_fields: Dict[Any, Any], prepopulated_fields: Dict[Any, Any],
readonly_fields: Optional[Iterable[Any]] = ..., readonly_fields: Any = ...,
model_admin: Any = ..., model_admin: Any = ...,
) -> None: ... ) -> None: ...
def __iter__(self) -> Iterator[Fieldset]: ... def __iter__(self) -> Iterator[Fieldset]: ...
@@ -47,7 +47,7 @@ class Fieldset:
self, self,
form: Any, form: Any,
name: Optional[Any] = ..., name: Optional[Any] = ...,
readonly_fields: Optional[Iterable[Any]] = ..., readonly_fields: Any = ...,
fields: Any = ..., fields: Any = ...,
classes: Any = ..., classes: Any = ...,
description: Optional[Any] = ..., description: Optional[Any] = ...,
@@ -64,7 +64,7 @@ class Fieldline:
model_admin: Any = ... model_admin: Any = ...
readonly_fields: Any = ... readonly_fields: Any = ...
def __init__( def __init__(
self, form: Any, field: Any, readonly_fields: Optional[Iterable[Any]] = ..., model_admin: Optional[Any] = ... self, form: Any, field: Any, readonly_fields: Optional[Any] = ..., model_admin: Optional[Any] = ...
) -> None: ... ) -> None: ...
def __iter__(self) -> Iterator[Union[AdminField, AdminReadonlyField]]: ... def __iter__(self) -> Iterator[Union[AdminField, AdminReadonlyField]]: ...
def errors(self) -> SafeText: ... def errors(self) -> SafeText: ...

View File

@@ -1,9 +1,5 @@
from collections import OrderedDict from collections import OrderedDict
from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, Union, Mapping, TypeVar from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, Union
from django.forms.forms import BaseForm
from django.forms.formsets import BaseFormSet
from typing_extensions import Literal, TypedDict
from django.contrib.admin.filters import ListFilter from django.contrib.admin.filters import ListFilter
from django.contrib.admin.models import LogEntry from django.contrib.admin.models import LogEntry
@@ -30,10 +26,8 @@ from django.db.models.fields import Field
IS_POPUP_VAR: str IS_POPUP_VAR: str
TO_FIELD_VAR: str TO_FIELD_VAR: str
HORIZONTAL: Literal[1] = ... HORIZONTAL: Any
VERTICAL: Literal[2] = ... VERTICAL: Any
_Direction = Union[Literal[1], Literal[2]]
def get_content_type_for_model(obj: Union[Type[Model], Model]) -> ContentType: ... def get_content_type_for_model(obj: Union[Type[Model], Model]) -> ContentType: ...
def get_ul_class(radio_style: int) -> str: ... def get_ul_class(radio_style: int) -> str: ...
@@ -43,39 +37,26 @@ class IncorrectLookupParameters(Exception): ...
FORMFIELD_FOR_DBFIELD_DEFAULTS: Any FORMFIELD_FOR_DBFIELD_DEFAULTS: Any
csrf_protect_m: Any csrf_protect_m: Any
class _OptionalFieldOpts(TypedDict, total=False):
classes: Sequence[str]
description: str
class _FieldOpts(_OptionalFieldOpts, total=True):
fields: Sequence[Union[str, Sequence[str]]]
# Workaround for mypy issue, a Sequence type should be preferred here.
# https://github.com/python/mypy/issues/8921
# _FieldsetSpec = Sequence[Tuple[Optional[str], _FieldOpts]]
_T = TypeVar("_T")
_ListOrTuple = Union[Tuple[_T, ...], List[_T]]
_FieldsetSpec = _ListOrTuple[Tuple[Optional[str], _FieldOpts]]
class BaseModelAdmin: class BaseModelAdmin:
autocomplete_fields: Sequence[str] = ... autocomplete_fields: Any = ...
raw_id_fields: Sequence[str] = ... raw_id_fields: Any = ...
fields: Sequence[Union[str, Sequence[str]]] = ... fields: Any = ...
exclude: Sequence[str] = ... exclude: Any = ...
fieldsets: _FieldsetSpec = ... fieldsets: Any = ...
form: Type[BaseForm] = ... form: Any = ...
filter_vertical: Sequence[str] = ... filter_vertical: Any = ...
filter_horizontal: Sequence[str] = ... filter_horizontal: Any = ...
radio_fields: Mapping[str, _Direction] = ... radio_fields: Any = ...
prepopulated_fields: Mapping[str, Sequence[str]] = ... prepopulated_fields: Any = ...
formfield_overrides: Mapping[Type[Field], Mapping[str, Any]] = ... formfield_overrides: Any = ...
readonly_fields: Sequence[Union[str, Callable[[Model], Any]]] = ... readonly_fields: Any = ...
ordering: Sequence[str] = ... ordering: Any = ...
sortable_by: Sequence[str] = ... sortable_by: Any = ...
view_on_site: bool = ... view_on_site: bool = ...
show_full_result_count: bool = ... show_full_result_count: bool = ...
checks_class: Any = ... checks_class: Any = ...
def check(self, **kwargs: Any) -> List[Union[str, Error]]: ... def check(self, **kwargs: Any) -> List[Union[str, Error]]: ...
def __init__(self) -> None: ...
def formfield_for_dbfield( def formfield_for_dbfield(
self, db_field: Field, request: Optional[HttpRequest], **kwargs: Any self, db_field: Field, request: Optional[HttpRequest], **kwargs: Any
) -> Optional[Field]: ... ) -> Optional[Field]: ...
@@ -106,14 +87,15 @@ class BaseModelAdmin:
def get_sortable_by(self, request: HttpRequest) -> Union[List[Callable], List[str], Tuple]: ... def get_sortable_by(self, request: HttpRequest) -> Union[List[Callable], List[str], Tuple]: ...
def lookup_allowed(self, lookup: str, value: str) -> bool: ... def lookup_allowed(self, lookup: str, value: str) -> bool: ...
def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ... def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ...
def has_add_permission(self, request: HttpRequest) -> bool: ... def has_add_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ...
def has_change_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ... def has_change_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ...
def has_delete_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ... def has_delete_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ...
def has_view_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ... def has_view_permission(self, request: HttpRequest, obj: Optional[Model] = ...) -> bool: ...
def has_module_permission(self, request: HttpRequest) -> bool: ... def has_module_permission(self, request: HttpRequest) -> bool: ...
class ModelAdmin(BaseModelAdmin): class ModelAdmin(BaseModelAdmin):
list_display: Sequence[Union[str, Callable[[Model], Any]]] = ... formfield_overrides: Any
list_display: Sequence[Union[str, Callable]] = ...
list_display_links: Optional[Sequence[Union[str, Callable]]] = ... list_display_links: Optional[Sequence[Union[str, Callable]]] = ...
list_filter: Sequence[Union[str, Type[ListFilter], Tuple[str, Type[ListFilter]]]] = ... list_filter: Sequence[Union[str, Type[ListFilter], Tuple[str, Type[ListFilter]]]] = ...
list_select_related: Union[bool, Sequence[str]] = ... list_select_related: Union[bool, Sequence[str]] = ...
@@ -121,25 +103,26 @@ class ModelAdmin(BaseModelAdmin):
list_max_show_all: int = ... list_max_show_all: int = ...
list_editable: Sequence[str] = ... list_editable: Sequence[str] = ...
search_fields: Sequence[str] = ... search_fields: Sequence[str] = ...
date_hierarchy: Optional[str] = ... date_hierarchy: Optional[Any] = ...
save_as: bool = ... save_as: bool = ...
save_as_continue: bool = ... save_as_continue: bool = ...
save_on_top: bool = ... save_on_top: bool = ...
paginator: Type = ... paginator: Any = ...
preserve_filters: bool = ... preserve_filters: bool = ...
inlines: Sequence[Type[InlineModelAdmin]] = ... inlines: Sequence[Type[InlineModelAdmin]] = ...
add_form_template: str = ... add_form_template: Any = ...
change_form_template: str = ... change_form_template: Any = ...
change_list_template: str = ... change_list_template: Any = ...
delete_confirmation_template: str = ... delete_confirmation_template: Any = ...
delete_selected_confirmation_template: str = ... delete_selected_confirmation_template: Any = ...
object_history_template: str = ... object_history_template: Any = ...
popup_response_template: str = ... popup_response_template: Any = ...
actions: Sequence[Callable[[ModelAdmin, HttpRequest, QuerySet], None]] = ... actions: Any = ...
action_form: Any = ... action_form: Any = ...
actions_on_top: bool = ... actions_on_top: bool = ...
actions_on_bottom: bool = ... actions_on_bottom: bool = ...
actions_selection_counter: bool = ... actions_selection_counter: bool = ...
checks_class: Any = ...
model: Type[Model] = ... model: Type[Model] = ...
opts: Options = ... opts: Options = ...
admin_site: AdminSite = ... admin_site: AdminSite = ...
@@ -247,9 +230,9 @@ class ModelAdmin(BaseModelAdmin):
def history_view(self, request: HttpRequest, object_id: str, extra_context: None = ...) -> HttpResponse: ... def history_view(self, request: HttpRequest, object_id: str, extra_context: None = ...) -> HttpResponse: ...
class InlineModelAdmin(BaseModelAdmin): class InlineModelAdmin(BaseModelAdmin):
model: Type[Model] = ... model: Any = ...
fk_name: str = ... fk_name: Any = ...
formset: BaseFormSet = ... formset: Any = ...
extra: int = ... extra: int = ...
min_num: Optional[int] = ... min_num: Optional[int] = ...
max_num: Optional[int] = ... max_num: Optional[int] = ...
@@ -258,8 +241,8 @@ class InlineModelAdmin(BaseModelAdmin):
verbose_name_plural: Optional[str] = ... verbose_name_plural: Optional[str] = ...
can_delete: bool = ... can_delete: bool = ...
show_change_link: bool = ... show_change_link: bool = ...
classes: Optional[Sequence[str]] = ... classes: Any = ...
admin_site: AdminSite = ... admin_site: Any = ...
parent_model: Any = ... parent_model: Any = ...
opts: Any = ... opts: Any = ...
has_registered_model: Any = ... has_registered_model: Any = ...

View File

@@ -1,15 +1,13 @@
from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
from django.contrib.admin.options import ModelAdmin from django.contrib.admin.options import ModelAdmin
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.urls.resolvers import URLResolver from django.urls.resolvers import URLPattern, URLResolver
from django.utils.functional import LazyObject from django.utils.functional import LazyObject
from django.apps.config import AppConfig
all_sites: Any all_sites: Any
class AlreadyRegistered(Exception): ... class AlreadyRegistered(Exception): ...
@@ -30,16 +28,16 @@ class AdminSite:
name: str = ... name: str = ...
_registry: Dict[Type[Model], ModelAdmin] _registry: Dict[Type[Model], ModelAdmin]
def __init__(self, name: str = ...) -> None: ... def __init__(self, name: str = ...) -> None: ...
def check(self, app_configs: Optional[Iterable[AppConfig]]) -> List[Any]: ... def check(self, app_configs: None) -> List[Any]: ...
def register( def register(
self, self,
model_or_iterable: Union[Type[Model], Iterable[Type[Model]]], model_or_iterable: Union[List[Type[Model]], Tuple[Type[Model]], Type[Model]],
admin_class: Optional[Type[ModelAdmin]] = ..., admin_class: Optional[Type[ModelAdmin]] = ...,
**options: Any **options: Any
) -> None: ... ) -> None: ...
def unregister(self, model_or_iterable: Union[Type[Model], Iterable[Type[Model]]]) -> None: ... def unregister(self, model_or_iterable: Type[Model]) -> None: ...
def is_registered(self, model: Type[Model]) -> bool: ... def is_registered(self, model: Type[Model]) -> bool: ...
def add_action(self, action: Callable, name: Optional[str] = ...) -> None: ... def add_action(self, action: Callable, name: None = ...) -> None: ...
def disable_action(self, name: str) -> None: ... def disable_action(self, name: str) -> None: ...
def get_action(self, name: str) -> Callable: ... def get_action(self, name: str) -> Callable: ...
@property @property
@@ -54,21 +52,14 @@ class AdminSite:
@property @property
def urls(self) -> Tuple[List[URLResolver], str, str]: ... def urls(self) -> Tuple[List[URLResolver], str, str]: ...
def each_context(self, request: Any): ... def each_context(self, request: Any): ...
def password_change( def password_change(self, request: WSGIRequest, extra_context: Dict[str, str] = ...) -> TemplateResponse: ...
self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ... def password_change_done(self, request: WSGIRequest, extra_context: None = ...) -> TemplateResponse: ...
) -> TemplateResponse: ...
def password_change_done(
self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...
) -> TemplateResponse: ...
def i18n_javascript(self, request: WSGIRequest, extra_context: Optional[Dict[Any, Any]] = ...) -> HttpResponse: ... def i18n_javascript(self, request: WSGIRequest, extra_context: Optional[Dict[Any, Any]] = ...) -> HttpResponse: ...
def logout(self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...) -> TemplateResponse: ... def logout(self, request: WSGIRequest, extra_context: None = ...) -> TemplateResponse: ...
def login(self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...) -> HttpResponse: ... def login(self, request: WSGIRequest, extra_context: None = ...) -> HttpResponse: ...
def _build_app_dict(self, request: WSGIRequest, label: Optional[str] = ...) -> Dict[str, Any]: ...
def get_app_list(self, request: WSGIRequest) -> List[Any]: ... def get_app_list(self, request: WSGIRequest) -> List[Any]: ...
def index(self, request: WSGIRequest, extra_context: Optional[Dict[str, Any]] = ...) -> TemplateResponse: ... def index(self, request: WSGIRequest, extra_context: Optional[Dict[str, str]] = ...) -> TemplateResponse: ...
def app_index( def app_index(self, request: WSGIRequest, app_label: str, extra_context: None = ...) -> TemplateResponse: ...
self, request: WSGIRequest, app_label: str, extra_context: Optional[Dict[str, Any]] = ...
) -> TemplateResponse: ...
class DefaultAdminSite(LazyObject): ... class DefaultAdminSite(LazyObject): ...

View File

@@ -27,7 +27,7 @@ class ResultList(list):
def results(cl: ChangeList) -> Iterator[ResultList]: ... def results(cl: ChangeList) -> Iterator[ResultList]: ...
def result_hidden_fields(cl: ChangeList) -> Iterator[BoundField]: ... def result_hidden_fields(cl: ChangeList) -> Iterator[BoundField]: ...
def result_list( def result_list(
cl: ChangeList, cl: ChangeList
) -> Dict[ ) -> Dict[
str, Union[List[Dict[str, Optional[Union[int, str]]]], List[ResultList], List[BoundField], ChangeList, int] str, Union[List[Dict[str, Optional[Union[int, str]]]], List[ResultList], List[BoundField], ChangeList, int]
]: ... ]: ...

View File

@@ -1,6 +1,7 @@
from typing import Any from typing import Any, Optional
from django.contrib.admin.helpers import InlineAdminForm from django.contrib.admin.helpers import InlineAdminForm
from django.contrib.admin.templatetags.base import InclusionAdminNode
from django.template.base import Parser, Token from django.template.base import Parser, Token
from django.template.context import Context, RequestContext from django.template.context import Context, RequestContext

View File

@@ -1,4 +1,4 @@
from typing import Any from typing import Any, Optional
register: Any register: Any

View File

@@ -9,10 +9,12 @@ from django.contrib.auth.forms import AdminPasswordChangeForm
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.deletion import Collector from django.db.models.deletion import Collector
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.fields.reverse_related import ManyToOneRel from django.db.models.fields.reverse_related import ManyToOneRel
from django.db.models.options import Options from django.db.models.options import Options
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.forms.forms import BaseForm from django.forms.forms import BaseForm
from django.utils.safestring import SafeText
from django.db.models.fields import Field, reverse_related from django.db.models.fields import Field, reverse_related
@@ -25,7 +27,7 @@ def unquote(s: str) -> str: ...
def flatten(fields: Any) -> List[Union[Callable, str]]: ... def flatten(fields: Any) -> List[Union[Callable, str]]: ...
def flatten_fieldsets(fieldsets: Any) -> List[Union[Callable, str]]: ... def flatten_fieldsets(fieldsets: Any) -> List[Union[Callable, str]]: ...
def get_deleted_objects( def get_deleted_objects(
objs: Sequence[Optional[Model]], request: WSGIRequest, admin_site: AdminSite objs: QuerySet, request: WSGIRequest, admin_site: AdminSite
) -> Tuple[List[Any], Dict[Any, Any], Set[Any], List[Any]]: ... ) -> Tuple[List[Any], Dict[Any, Any], Set[Any], List[Any]]: ...
class NestedObjects(Collector): class NestedObjects(Collector):
@@ -39,14 +41,22 @@ class NestedObjects(Collector):
model_objs: Any = ... model_objs: Any = ...
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def add_edge(self, source: Optional[Model], target: Model) -> None: ... def add_edge(self, source: Optional[Model], target: Model) -> None: ...
def related_objects(self, related: ManyToOneRel, objs: Sequence[Optional[Model]]) -> QuerySet: ... def collect(
def nested(self, format_callback: Callable = ...) -> List[Any]: ... self,
objs: Union[Sequence[Optional[Model]], QuerySet],
source: Optional[Type[Model]] = ...,
source_attr: Optional[str] = ...,
**kwargs: Any
) -> None: ...
def related_objects(self, related: ManyToOneRel, objs: List[Model]) -> QuerySet: ...
def nested(self, format_callback: Callable = ...) -> Union[List[SafeText], List[int]]: ...
def can_fast_delete(self, *args: Any, **kwargs: Any) -> bool: ...
def model_format_dict(obj: Any): ... def model_format_dict(obj: Any): ...
def model_ngettext(obj: Union[Options, QuerySet], n: Optional[int] = ...) -> str: ... def model_ngettext(obj: Union[Options, QuerySet], n: Optional[int] = ...) -> str: ...
def lookup_field( def lookup_field(
name: Union[Callable, str], obj: Model, model_admin: BaseModelAdmin = ... name: Union[Callable, str], obj: Model, model_admin: BaseModelAdmin = ...
) -> Tuple[Optional[Field], Any, Any]: ... ) -> Tuple[Optional[Field], Callable, Callable]: ...
def label_for_field( def label_for_field(
name: Union[Callable, str], name: Union[Callable, str],
model: Type[Model], model: Type[Model],
@@ -55,14 +65,16 @@ def label_for_field(
form: Optional[BaseForm] = ..., form: Optional[BaseForm] = ...,
) -> Union[Tuple[Optional[str], Union[Callable, Type[str]]], str]: ... ) -> Union[Tuple[Optional[str], Union[Callable, Type[str]]], str]: ...
def help_text_for_field(name: str, model: Type[Model]) -> str: ... def help_text_for_field(name: str, model: Type[Model]) -> str: ...
def display_for_field(value: Any, field: Field, empty_value_display: str) -> str: ... def display_for_field(
value: Any, field: Union[Field, reverse_related.OneToOneRel], empty_value_display: str
) -> str: ...
def display_for_value(value: Any, empty_value_display: str, boolean: bool = ...) -> str: ... def display_for_value(value: Any, empty_value_display: str, boolean: bool = ...) -> str: ...
class NotRelationField(Exception): ... class NotRelationField(Exception): ...
def get_model_from_relation(field: Union[Field, reverse_related.ForeignObjectRel]) -> Type[Model]: ... def get_model_from_relation(field: Union[Field, reverse_related.ForeignObjectRel]) -> Type[Model]: ...
def reverse_field_path(model: Type[Model], path: str) -> Tuple[Type[Model], str]: ... def reverse_field_path(model: Type[Model], path: str) -> Tuple[Type[Model], str]: ...
def get_fields_from_path(model: Type[Model], path: str) -> List[Field]: ... def get_fields_from_path(model: Type[Model], path: str) -> List[Union[Field, FieldCacheMixin]]: ...
def construct_change_message( def construct_change_message(
form: AdminPasswordChangeForm, formsets: None, add: bool form: AdminPasswordChangeForm, formsets: None, add: bool
) -> List[Dict[str, Dict[str, List[str]]]]: ... ) -> List[Dict[str, Dict[str, List[str]]]]: ...

View File

@@ -1,7 +1,5 @@
from typing import Callable, TypeVar, overload from typing import Any, Callable, Optional
_C = TypeVar("_C", bound=Callable) def staff_member_required(
@overload view_func: Optional[Callable] = ..., redirect_field_name: str = ..., login_url: str = ...
def staff_member_required(view_func: _C = ..., redirect_field_name: str = ..., login_url: str = ...) -> _C: ... ) -> Callable: ...
@overload
def staff_member_required(view_func: None = ..., redirect_field_name: str = ..., login_url: str = ...) -> Callable: ...

View File

@@ -2,11 +2,7 @@ from collections import OrderedDict
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
from django.contrib.admin.filters import ListFilter, SimpleListFilter from django.contrib.admin.filters import ListFilter, SimpleListFilter
from django.contrib.admin.options import ( # noqa: F401 from django.contrib.admin.options import ModelAdmin, IS_POPUP_VAR as IS_POPUP_VAR, TO_FIELD_VAR as TO_FIELD_VAR
ModelAdmin,
IS_POPUP_VAR as IS_POPUP_VAR,
TO_FIELD_VAR as TO_FIELD_VAR,
)
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.expressions import Combinable, CombinedExpression, OrderBy from django.db.models.expressions import Combinable, CombinedExpression, OrderBy
@@ -81,7 +77,9 @@ class ChangeList:
paginator: Any = ... paginator: Any = ...
def get_results(self, request: WSGIRequest) -> None: ... def get_results(self, request: WSGIRequest) -> None: ...
def get_ordering_field(self, field_name: Union[Callable, str]) -> Optional[Union[CombinedExpression, str]]: ... def get_ordering_field(self, field_name: Union[Callable, str]) -> Optional[Union[CombinedExpression, str]]: ...
def get_ordering(self, request: WSGIRequest, queryset: QuerySet) -> List[Union[OrderBy, Combinable, str]]: ... def get_ordering(
self, request: WSGIRequest, queryset: QuerySet
) -> Union[List[Union[Combinable, str]], List[Union[OrderBy, str]]]: ...
def get_ordering_field_columns(self) -> OrderedDict: ... def get_ordering_field_columns(self) -> OrderedDict: ...
def get_queryset(self, request: WSGIRequest) -> QuerySet: ... def get_queryset(self, request: WSGIRequest) -> QuerySet: ...
def apply_select_related(self, qs: QuerySet) -> QuerySet: ... def apply_select_related(self, qs: QuerySet) -> QuerySet: ...

View File

@@ -3,17 +3,46 @@ from typing import Any, Optional, Union
from django.db.models.fields import Field from django.db.models.fields import Field
from django.views.generic import TemplateView from django.views.generic import TemplateView
from .utils import get_view_name
MODEL_METHODS_EXCLUDE: Any MODEL_METHODS_EXCLUDE: Any
class BaseAdminDocsView(TemplateView): ... class BaseAdminDocsView(TemplateView):
class BookmarkletsView(BaseAdminDocsView): ... template_name: str = ...
class TemplateTagIndexView(BaseAdminDocsView): ... def dispatch(self, request: Any, *args: Any, **kwargs: Any): ...
class TemplateFilterIndexView(BaseAdminDocsView): ... def get_context_data(self, **kwargs: Any): ...
class ViewIndexView(BaseAdminDocsView): ...
class ViewDetailView(BaseAdminDocsView): ... class BookmarkletsView(BaseAdminDocsView):
class ModelIndexView(BaseAdminDocsView): ... template_name: str = ...
class ModelDetailView(BaseAdminDocsView): ... def get_context_data(self, **kwargs: Any): ...
class TemplateDetailView(BaseAdminDocsView): ...
class TemplateTagIndexView(BaseAdminDocsView):
template_name: str = ...
def get_context_data(self, **kwargs: Any): ...
class TemplateFilterIndexView(BaseAdminDocsView):
template_name: str = ...
def get_context_data(self, **kwargs: Any): ...
class ViewIndexView(BaseAdminDocsView):
template_name: str = ...
def get_context_data(self, **kwargs: Any): ...
class ViewDetailView(BaseAdminDocsView):
template_name: str = ...
def get_context_data(self, **kwargs: Any): ...
class ModelIndexView(BaseAdminDocsView):
template_name: str = ...
def get_context_data(self, **kwargs: Any): ...
class ModelDetailView(BaseAdminDocsView):
template_name: str = ...
def get_context_data(self, **kwargs: Any): ...
class TemplateDetailView(BaseAdminDocsView):
template_name: str = ...
def get_context_data(self, **kwargs: Any): ...
def get_return_data_type(func_name: Any): ... def get_return_data_type(func_name: Any): ...
def get_readable_field_data_type(field: Union[Field, str]) -> str: ... def get_readable_field_data_type(field: Union[Field, str]) -> str: ...

View File

@@ -1,34 +1,23 @@
from typing import Any, Optional, Set, Union from typing import Any, Optional, Set, Union
from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import AnonymousUser, User, Permission from django.contrib.auth.models import AnonymousUser, User
from django.db.models.base import Model
_AnyUser = Union[Model, AnonymousUser]
UserModel: Any UserModel: Any
class BaseBackend: class ModelBackend:
def authenticate( def authenticate(
self, request: Any, username: Optional[str] = ..., password: Optional[str] = ..., **kwargs: Any self, request: Any, username: Optional[Union[int, str]] = ..., password: Optional[str] = ..., **kwargs: Any
) -> Optional[AbstractBaseUser]: ... ) -> Optional[AbstractBaseUser]: ...
def get_user(self, user_id: int) -> Optional[AbstractBaseUser]: ... def user_can_authenticate(self, user: Optional[AbstractBaseUser]) -> bool: ...
def get_user_permissions(self, user_obj: _AnyUser, obj: Optional[Model] = ...) -> Set[str]: ... def get_user_permissions(self, user_obj: AbstractBaseUser, obj: None = ...) -> Set[str]: ...
def get_group_permissions(self, user_obj: _AnyUser, obj: Optional[Model] = ...) -> Set[str]: ... def get_group_permissions(self, user_obj: AbstractBaseUser, obj: None = ...) -> Set[str]: ...
def get_all_permissions(self, user_obj: _AnyUser, obj: Optional[Model] = ...) -> Set[str]: ... def get_all_permissions(self, user_obj: AbstractBaseUser, obj: Optional[str] = ...) -> Set[str]: ...
def has_perm(self, user_obj: _AnyUser, perm: str, obj: Optional[Model] = ...) -> bool: ... def has_perm(
self, user_obj: Union[AbstractBaseUser, AnonymousUser], perm: str, obj: Optional[str] = ...
class ModelBackend(BaseBackend): ) -> bool: ...
def has_module_perms(self, user_obj: _AnyUser, app_label: str) -> bool: ... def has_module_perms(self, user_obj: Union[AbstractBaseUser, AnonymousUser], app_label: str) -> bool: ...
def user_can_authenticate(self, user: Optional[_AnyUser]) -> bool: ... def get_user(self, user_id: int) -> AbstractBaseUser: ...
def with_perm(
self,
perm: Union[str, Permission],
is_active: bool = ...,
include_superusers: bool = ...,
obj: Optional[Model] = ...,
): ...
class AllowAllUsersModelBackend(ModelBackend): ... class AllowAllUsersModelBackend(ModelBackend): ...

View File

@@ -1,15 +1,9 @@
import sys
from typing import Any, Optional, Tuple, List, overload, TypeVar from typing import Any, Optional, Tuple, List, overload, TypeVar
from django.db.models.base import Model from django.db.models.base import Model
from django.db import models from django.db import models
if sys.version_info < (3, 8):
from typing_extensions import Literal
else:
from typing import Literal
_T = TypeVar("_T", bound=Model) _T = TypeVar("_T", bound=Model)
class BaseUserManager(models.Manager[_T]): class BaseUserManager(models.Manager[_T]):
@@ -19,16 +13,19 @@ class BaseUserManager(models.Manager[_T]):
def get_by_natural_key(self, username: Optional[str]) -> _T: ... def get_by_natural_key(self, username: Optional[str]) -> _T: ...
class AbstractBaseUser(models.Model): class AbstractBaseUser(models.Model):
password: models.CharField = ...
last_login: models.DateTimeField = ...
is_active: models.BooleanField = ...
REQUIRED_FIELDS: List[str] = ... REQUIRED_FIELDS: List[str] = ...
class Meta: ...
password = models.CharField(max_length=128)
last_login = models.DateTimeField(blank=True, null=True)
def get_username(self) -> str: ... def get_username(self) -> str: ...
def clean(self) -> None: ...
def save(self, *args: Any, **kwargs: Any) -> None: ...
def natural_key(self) -> Tuple[str]: ... def natural_key(self) -> Tuple[str]: ...
@property @property
def is_anonymous(self) -> Literal[False]: ... def is_anonymous(self) -> bool: ...
@property @property
def is_authenticated(self) -> Literal[True]: ... def is_authenticated(self) -> bool: ...
def set_password(self, raw_password: Optional[str]) -> None: ... def set_password(self, raw_password: Optional[str]) -> None: ...
def check_password(self, raw_password: str) -> bool: ... def check_password(self, raw_password: str) -> bool: ...
def set_unusable_password(self) -> None: ... def set_unusable_password(self) -> None: ...

View File

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

View File

@@ -1,21 +1,13 @@
from typing import Callable, List, Optional, Set, Union, TypeVar, overload from typing import Any, Callable, List, Optional, Set, Union
from django.contrib.auth import REDIRECT_FIELD_NAME as REDIRECT_FIELD_NAME # noqa: F401 from django.contrib.auth import REDIRECT_FIELD_NAME as REDIRECT_FIELD_NAME
from django.http.response import HttpResponseBase
from django.contrib.auth.models import AbstractUser
_VIEW = TypeVar("_VIEW", bound=Callable[..., HttpResponseBase])
def user_passes_test( def user_passes_test(
test_func: Callable[[AbstractUser], bool], login_url: Optional[str] = ..., redirect_field_name: str = ... test_func: Callable, login_url: Optional[str] = ..., redirect_field_name: str = ...
) -> Callable[[_VIEW], _VIEW]: ... ) -> Callable: ...
def login_required(
# There are two ways of calling @login_required: @with(arguments) and @bare function: Optional[Callable] = ..., redirect_field_name: str = ..., login_url: Optional[str] = ...
@overload ) -> Callable: ...
def login_required(redirect_field_name: str = ..., login_url: Optional[str] = ...) -> Callable[[_VIEW], _VIEW]: ...
@overload
def login_required(function: _VIEW, redirect_field_name: str = ..., login_url: Optional[str] = ...) -> _VIEW: ...
def permission_required( def permission_required(
perm: Union[List[str], Set[str], str], login_url: None = ..., raise_exception: bool = ... perm: Union[List[str], Set[str], str], login_url: None = ..., raise_exception: bool = ...
) -> Callable[[_VIEW], _VIEW]: ... ) -> Callable: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict from typing import Any, Dict, Optional
UserModel: Any UserModel: Any

View File

@@ -1,4 +1,4 @@
import getpass as getpass # noqa: F401 import getpass as getpass
from typing import Any from typing import Any
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand

View File

@@ -23,6 +23,6 @@ class PermissionRequiredMixin(AccessMixin):
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
class UserPassesTestMixin(AccessMixin): class UserPassesTestMixin(AccessMixin):
def test_func(self) -> Optional[bool]: ... def test_func(self) -> None: ...
def get_test_func(self) -> Callable: ... def get_test_func(self) -> Callable: ...
def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...

View File

@@ -1,7 +1,5 @@
import sys from typing import Any, Collection, Optional, Set, Tuple, Type, TypeVar
from typing import Any, Collection, Optional, Set, Tuple, Type, TypeVar, Union
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.base_user import AbstractBaseUser as AbstractBaseUser, BaseUserManager as BaseUserManager from django.contrib.auth.base_user import AbstractBaseUser as AbstractBaseUser, BaseUserManager as BaseUserManager
from django.contrib.auth.validators import UnicodeUsernameValidator from django.contrib.auth.validators import UnicodeUsernameValidator
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@@ -10,35 +8,24 @@ from django.db.models.manager import EmptyManager
from django.db import models from django.db import models
if sys.version_info < (3, 8):
from typing_extensions import Literal
else:
from typing import Literal
_AnyUser = Union[Model, "AnonymousUser"]
def update_last_login(sender: Type[AbstractBaseUser], user: AbstractBaseUser, **kwargs: Any) -> None: ... def update_last_login(sender: Type[AbstractBaseUser], user: AbstractBaseUser, **kwargs: Any) -> None: ...
class PermissionManager(models.Manager["Permission"]): class PermissionManager(models.Manager):
def get_by_natural_key(self, codename: str, app_label: str, model: str) -> Permission: ... def get_by_natural_key(self, codename: str, app_label: str, model: str) -> Permission: ...
class Permission(models.Model): class Permission(models.Model):
content_type_id: int content_type_id: int
objects: PermissionManager name: models.CharField = ...
content_type: models.ForeignKey = models.ForeignKey(ContentType, on_delete=models.CASCADE)
name = models.CharField(max_length=255) codename: models.CharField = ...
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
codename = models.CharField(max_length=100)
def natural_key(self) -> Tuple[str, str, str]: ... def natural_key(self) -> Tuple[str, str, str]: ...
class GroupManager(models.Manager["Group"]): class GroupManager(models.Manager):
def get_by_natural_key(self, name: str) -> Group: ... def get_by_natural_key(self, name: str) -> Group: ...
class Group(models.Model): class Group(models.Model):
objects: GroupManager name: models.CharField = ...
permissions: models.ManyToManyField = models.ManyToManyField(Permission)
name = models.CharField(max_length=150)
permissions = models.ManyToManyField(Permission)
def natural_key(self): ... def natural_key(self): ...
_T = TypeVar("_T", bound=Model) _T = TypeVar("_T", bound=Model)
@@ -50,39 +37,28 @@ class UserManager(BaseUserManager[_T]):
def create_superuser( def create_superuser(
self, username: str, email: Optional[str], password: Optional[str], **extra_fields: Any self, username: str, email: Optional[str], password: Optional[str], **extra_fields: Any
) -> _T: ... ) -> _T: ...
def with_perm(
self,
perm: Union[str, Permission],
is_active: bool = ...,
include_superusers: bool = ...,
backend: Optional[Union[Type[ModelBackend], str]] = ...,
obj: Optional[Model] = ...,
): ...
class PermissionsMixin(models.Model): class PermissionsMixin(models.Model):
is_superuser = models.BooleanField() is_superuser: models.BooleanField = ...
groups = models.ManyToManyField(Group) groups: models.ManyToManyField = models.ManyToManyField(Group)
user_permissions = models.ManyToManyField(Permission) user_permissions: models.ManyToManyField = models.ManyToManyField(Permission)
def get_user_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def get_group_permissions(self, obj: None = ...) -> Set[str]: ...
def get_group_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def get_all_permissions(self, obj: Optional[str] = ...) -> Set[str]: ...
def get_all_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def has_perm(self, perm: str, obj: Optional[str] = ...) -> bool: ...
def has_perm(self, perm: str, obj: Optional[_AnyUser] = ...) -> bool: ... def has_perms(self, perm_list: Collection[str], obj: None = ...) -> bool: ...
def has_perms(self, perm_list: Collection[str], obj: Optional[_AnyUser] = ...) -> bool: ...
def has_module_perms(self, app_label: str) -> bool: ... def has_module_perms(self, app_label: str) -> bool: ...
class AbstractUser(AbstractBaseUser, PermissionsMixin): # type: ignore class AbstractUser(AbstractBaseUser, PermissionsMixin): # type: ignore
username_validator: UnicodeUsernameValidator = ... username_validator: UnicodeUsernameValidator = ...
username: models.CharField = ...
username = models.CharField(max_length=150) first_name: models.CharField = ...
first_name = models.CharField(max_length=30, blank=True) last_name: models.CharField = ...
last_name = models.CharField(max_length=150, blank=True) email: models.EmailField = ...
email = models.EmailField(blank=True) is_staff: models.BooleanField = ...
is_staff = models.BooleanField() date_joined: models.DateTimeField = ...
is_active = models.BooleanField()
date_joined = models.DateTimeField()
EMAIL_FIELD: str = ... EMAIL_FIELD: str = ...
USERNAME_FIELD: str = ... USERNAME_FIELD: str = ...
def clean(self) -> None: ...
def get_full_name(self) -> str: ... def get_full_name(self) -> str: ...
def get_short_name(self) -> str: ... def get_short_name(self) -> str: ...
def email_user(self, subject: str, message: str, from_email: str = ..., **kwargs: Any) -> None: ... def email_user(self, subject: str, message: str, from_email: str = ..., **kwargs: Any) -> None: ...
@@ -104,14 +80,13 @@ class AnonymousUser:
def groups(self) -> EmptyManager: ... def groups(self) -> EmptyManager: ...
@property @property
def user_permissions(self) -> EmptyManager: ... def user_permissions(self) -> EmptyManager: ...
def get_user_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def get_group_permissions(self, obj: None = ...) -> Set[Any]: ...
def get_group_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[Any]: ... def get_all_permissions(self, obj: Any = ...) -> Set[str]: ...
def get_all_permissions(self, obj: Optional[_AnyUser] = ...) -> Set[str]: ... def has_perm(self, perm: str, obj: None = ...) -> bool: ...
def has_perm(self, perm: str, obj: Optional[_AnyUser] = ...) -> bool: ... def has_perms(self, perm_list: Collection[str], obj: None = ...) -> bool: ...
def has_perms(self, perm_list: Collection[str], obj: Optional[_AnyUser] = ...) -> bool: ...
def has_module_perms(self, module: str) -> bool: ... def has_module_perms(self, module: str) -> bool: ...
@property @property
def is_anonymous(self) -> Literal[True]: ... def is_anonymous(self) -> bool: ...
@property @property
def is_authenticated(self) -> Literal[False]: ... def is_authenticated(self) -> bool: ...
def get_username(self) -> str: ... def get_username(self) -> str: ...

View File

@@ -1,6 +1,7 @@
from pathlib import Path, PosixPath from pathlib import Path, PosixPath
from typing import Any, List, Mapping, Optional, Protocol, Sequence, Set, Union 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 from django.db.models.base import Model
_UserModel = Model _UserModel = Model

View File

@@ -55,7 +55,6 @@ class PasswordResetDoneView(PasswordContextMixin, TemplateView):
class PasswordResetConfirmView(PasswordContextMixin, FormView): class PasswordResetConfirmView(PasswordContextMixin, FormView):
post_reset_login: bool = ... post_reset_login: bool = ...
post_reset_login_backend: Any = ... post_reset_login_backend: Any = ...
reset_url_token: str = ...
title: Any = ... title: Any = ...
token_generator: Any = ... token_generator: Any = ...
validlink: bool = ... validlink: bool = ...

View File

@@ -1,6 +1,4 @@
from typing import Any, List, Iterable, Optional from typing import Any, List, Optional
from django.apps.config import AppConfig def check_generic_foreign_keys(app_configs: None = ..., **kwargs: Any) -> List[Any]: ...
def check_model_name_lengths(app_configs: None = ..., **kwargs: Any) -> List[Any]: ...
def check_generic_foreign_keys(app_configs: Optional[Iterable[AppConfig]] = ..., **kwargs: Any) -> List[Any]: ...
def check_model_name_lengths(app_configs: Optional[Iterable[AppConfig]] = ..., **kwargs: Any) -> List[Any]: ...

View File

@@ -1,19 +1,19 @@
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union, Generic
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.checks.messages import Error from django.core.checks.messages import Error
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.expressions import Combinable
from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.fields.related import ForeignObject from django.db.models.fields.related import ForeignObject
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor
from django.db.models.fields.reverse_related import ForeignObjectRel 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 from django.db.models.query import QuerySet
from django.db.models.query_utils import FilteredRelation, PathInfo from django.db.models.query_utils import FilteredRelation, PathInfo
from django.db.models.sql.where import WhereNode from django.db.models.sql.where import WhereNode
from django.db.models.fields import Field, PositiveIntegerField
class GenericForeignKey(FieldCacheMixin): class GenericForeignKey(FieldCacheMixin):
# django-stubs implementation only fields # django-stubs implementation only fields
_pyi_private_set_type: Union[Any, Combinable] _pyi_private_set_type: Union[Any, Combinable]

View File

@@ -1,4 +1,4 @@
from typing import Union from typing import Any, Optional, Union
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.http.response import HttpResponseRedirect from django.http.response import HttpResponseRedirect

View File

@@ -1,3 +1,5 @@
from typing import Any, Optional
from django.contrib.flatpages.models import FlatPage from django.contrib.flatpages.models import FlatPage
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.http.response import HttpResponse from django.http.response import HttpResponse

View File

@@ -1,13 +0,0 @@
from django.db.models import *
from .fields import (
GeometryField as GeometryField,
LineStringField as LineStringField,
MultiLineStringField as MultiLineStringField,
MultiPointField as MultiPointField,
MultiPolygonField as MultiPolygonField,
PointField as PointField,
PolygonField as PolygonField,
GeometryCollectionField as GeometryCollectionField,
RasterField as RasterField,
)

View File

@@ -1,91 +0,0 @@
from typing import Any, Iterable, NamedTuple, Optional, TypeVar, Union, Tuple
from django.db.models.fields import Field, _ErrorMessagesToOverride, _FieldChoices, _ValidatorCallable
_Connection = Any
# __set__ value type
_ST = TypeVar("_ST")
# __get__ return type
_GT = TypeVar("_GT")
class SRIDCacheEntry(NamedTuple):
units: Any
units_name: str
geodetic: bool
spheroid: str
def get_srid_info(srid: int, connection: _Connection) -> SRIDCacheEntry: ...
class BaseSpatialField(Field[_ST, _GT]):
def __init__(
self,
verbose_name: Optional[Union[str, bytes]] = ...,
srid: int = ...,
spatial_index: bool = ...,
name: Optional[str] = ...,
primary_key: bool = ...,
max_length: Optional[int] = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: Optional[str] = ...,
unique_for_month: Optional[str] = ...,
unique_for_year: Optional[str] = ...,
choices: Optional[_FieldChoices] = ...,
help_text: str = ...,
db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ...
def spheroid(self, connection: _Connection) -> str: ...
def units(self, connection: _Connection) -> Any: ...
def units_name(self, connection: _Connection) -> str: ...
def geodetic(self, connection: _Connection) -> bool: ...
class GeometryField(BaseSpatialField):
def __init__(
self,
verbose_name: Optional[Union[str, bytes]] = ...,
dim: int = ...,
geography: bool = ...,
extent: Tuple[float, float, float, float] = ...,
tolerance: float = ...,
srid: int = ...,
spatial_index: bool = ...,
name: Optional[str] = ...,
primary_key: bool = ...,
max_length: Optional[int] = ...,
unique: bool = ...,
blank: bool = ...,
null: bool = ...,
db_index: bool = ...,
default: Any = ...,
editable: bool = ...,
auto_created: bool = ...,
serialize: bool = ...,
unique_for_date: Optional[str] = ...,
unique_for_month: Optional[str] = ...,
unique_for_year: Optional[str] = ...,
choices: Optional[_FieldChoices] = ...,
help_text: str = ...,
db_column: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
validators: Iterable[_ValidatorCallable] = ...,
error_messages: Optional[_ErrorMessagesToOverride] = ...,
): ...
class PointField(GeometryField): ...
class LineStringField(GeometryField): ...
class PolygonField(GeometryField): ...
class MultiPointField(GeometryField): ...
class MultiLineStringField(GeometryField): ...
class MultiPolygonField(GeometryField): ...
class GeometryCollectionField(GeometryField): ...
class RasterField(BaseSpatialField): ...

View File

@@ -1,14 +1,15 @@
from datetime import date, datetime as datetime from datetime import date, datetime as datetime
from typing import Any, Optional, SupportsInt, Union from decimal import Decimal
from typing import Any, Optional, Union
register: Any register: Any
def ordinal(value: Optional[Union[str, SupportsInt]]) -> Optional[str]: ... def ordinal(value: Optional[str]) -> Optional[str]: ...
def intcomma(value: Optional[Union[str, SupportsInt]], use_l10n: bool = ...) -> str: ... def intcomma(value: Optional[Union[Decimal, float, str]], use_l10n: bool = ...) -> str: ...
intword_converters: Any intword_converters: Any
def intword(value: Optional[Union[str, SupportsInt]]) -> Optional[Union[int, str]]: ... def intword(value: Optional[str]) -> Optional[Union[int, str]]: ...
def apnumber(value: Optional[Union[str, SupportsInt]]) -> Optional[Union[int, str]]: ... def apnumber(value: Optional[str]) -> Optional[Union[int, str]]: ...
def naturalday(value: Optional[Union[date, str]], arg: None = ...) -> Optional[str]: ... def naturalday(value: Optional[Union[date, str]], arg: None = ...) -> Optional[str]: ...
def naturaltime(value: datetime) -> str: ... def naturaltime(value: datetime) -> str: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, List, Union from typing import Any, Dict, List, Optional, Union
from django.contrib.messages.storage.base import BaseStorage from django.contrib.messages.storage.base import BaseStorage
from django.http.request import HttpRequest from django.http.request import HttpRequest

View File

@@ -1,4 +1,4 @@
from typing import Any, List, Optional from typing import Any, List, Optional, Union
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.http.response import HttpResponseBase from django.http.response import HttpResponseBase

View File

@@ -1,3 +1,3 @@
from typing import Dict from typing import Dict, Optional
def get_level_tags() -> Dict[int, str]: ... def get_level_tags() -> Dict[int, str]: ...

View File

@@ -1,4 +1,4 @@
from typing import Dict from typing import Any, Dict, Optional
from django.forms.forms import BaseForm from django.forms.forms import BaseForm
from django.http.response import HttpResponse from django.http.response import HttpResponse

View File

@@ -1,24 +0,0 @@
from .general import (
ArrayAgg as ArrayAgg,
BitAnd as BitAnd,
BitOr as BitOr,
BoolAnd as BoolAnd,
BoolOr as BoolOr,
JSONBAgg as JSONBAgg,
StringAgg as StringAgg,
)
from .statistics import (
Corr as Corr,
CovarPop as CovarPop,
RegrAvgX as RegrAvgX,
RegrAvgY as RegrAvgY,
RegrCount as RegrCount,
RegrIntercept as RegrIntercept,
RegrR2 as RegrR2,
RegrSlope as RegrSlope,
RegrSXX as RegrSXX,
RegrSXY as RegrSXY,
RegrSYY as RegrSYY,
StatAggregate as StatAggregate,
)

View File

@@ -1,11 +0,0 @@
from django.db.models.aggregates import Aggregate
from .mixins import OrderableAggMixin
class ArrayAgg(OrderableAggMixin, Aggregate): ...
class BitAnd(Aggregate): ...
class BitOr(Aggregate): ...
class BoolAnd(Aggregate): ...
class BoolOr(Aggregate): ...
class JSONBAgg(Aggregate): ...
class StringAgg(OrderableAggMixin, Aggregate): ...

View File

@@ -1 +0,0 @@
class OrderableAggMixin: ...

View File

@@ -1,14 +0,0 @@
from django.db.models.aggregates import Aggregate
class StatAggregate(Aggregate): ...
class Corr(StatAggregate): ...
class CovarPop(StatAggregate): ...
class RegrAvgX(StatAggregate): ...
class RegrAvgY(StatAggregate): ...
class RegrCount(StatAggregate): ...
class RegrIntercept(StatAggregate): ...
class RegrR2(StatAggregate): ...
class RegrSlope(StatAggregate): ...
class RegrSXX(StatAggregate): ...
class RegrSXY(StatAggregate): ...
class RegrSYY(StatAggregate): ...

View File

@@ -1,18 +0,0 @@
from typing import Optional, Sequence, Tuple, Union
from django.db.models.constraints import BaseConstraint
from django.db.models.expressions import Combinable
from django.db.models.query_utils import Q
class ExclusionConstraint(BaseConstraint):
expressions: Sequence[Tuple[Union[str, Combinable], str]]
index_type: str
condition: Optional[Q]
def __init__(
self,
*,
name: str,
expressions: Sequence[Tuple[Union[str, Combinable], str]],
condition: Optional[Q] = ...,
index_type: Optional[str] = ...,
): ...

View File

@@ -8,8 +8,6 @@ from .ranges import (
FloatRangeField as FloatRangeField, FloatRangeField as FloatRangeField,
DateRangeField as DateRangeField, DateRangeField as DateRangeField,
DateTimeRangeField as DateTimeRangeField, DateTimeRangeField as DateTimeRangeField,
RangeOperators as RangeOperators,
RangeBoundary as RangeBoundary,
) )
from .hstore import HStoreField as HStoreField from .hstore import HStoreField as HStoreField
from .citext import ( from .citext import (

View File

@@ -29,20 +29,3 @@ class DateTimeRangeField(RangeField):
class DateRangeField(RangeField): class DateRangeField(RangeField):
def __get__(self, instance, owner) -> DateRange: ... def __get__(self, instance, owner) -> DateRange: ...
class RangeOperators:
EQUAL: str
NOT_EQUAL: str
CONTAINS: str
CONTAINED_BY: str
OVERLAPS: str
FULLY_LT: str
FULLY_GT: str
NOT_LT: str
NOT_GT: str
ADJACENT_TO: str
class RangeBoundary(models.Expression):
lower: str
upper: str
def __init__(self, inclusive_lower: bool = ..., inclusive_upper: bool = ...): ...

View File

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

View File

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

View File

@@ -1,12 +1,10 @@
from typing import Any, Dict, Optional, TypeVar, Union from typing import Any, Dict, Optional, TypeVar, Union
from django.db.models.expressions import Combinable, CombinedExpression, Func, Value, _OutputField from django.db.models.expressions import Combinable, CombinedExpression, Func, Value
from django.db.models.lookups import Lookup from django.db.models.lookups import Lookup
from django.db.models import Field from django.db.models import Field
_Expression = Union[str, Combinable, "SearchQueryCombinable"]
class SearchVectorExact(Lookup): ... class SearchVectorExact(Lookup): ...
class SearchVectorField(Field): ... class SearchVectorField(Field): ...
class SearchQueryField(Field): ... class SearchQueryField(Field): ...
@@ -16,12 +14,10 @@ class SearchVectorCombinable:
class SearchVector(SearchVectorCombinable, Func): class SearchVector(SearchVectorCombinable, Func):
config: Optional[Any] = ... config: Optional[Any] = ...
def __init__(self, *expressions: _Expression, **extra: Any): ... def __init__(self, *expressions: Union[str, Combinable], **extra: Any): ...
class CombinedSearchVector(SearchVectorCombinable, CombinedExpression): class CombinedSearchVector(SearchVectorCombinable, CombinedExpression):
def __init__( def __init__(self, lhs, connector, rhs, config, output_field: Optional[Field, str] = ...): ...
self, lhs, connector, rhs, config: Optional[_Expression] = ..., output_field: Optional[_OutputField] = ...
): ...
_T = TypeVar("_T", bound="SearchQueryCombinable") _T = TypeVar("_T", bound="SearchQueryCombinable")
@@ -33,31 +29,19 @@ class SearchQueryCombinable:
def __and__(self: _T, other: SearchQueryCombinable) -> _T: ... def __and__(self: _T, other: SearchQueryCombinable) -> _T: ...
def __rand__(self: _T, other: SearchQueryCombinable) -> _T: ... def __rand__(self: _T, other: SearchQueryCombinable) -> _T: ...
class SearchQuery(SearchQueryCombinable, Value): # type: ignore class SearchQuery(SearchQueryCombinable, Value):
SEARCH_TYPES: Dict[str, str] = ... SEARCH_TYPES: Dict[str, str] = {"plain": "plainto_tsquery", "phrase": "phraseto_tsquery", "raw": "to_tsquery"}
def __init__( def __init__(self, value, output_field=..., *, config=..., invert=False, search_type="plain"): ...
self,
value: str,
output_field: Optional[_OutputField] = ...,
*,
config: Optional[_Expression] = ...,
invert: bool = ...,
search_type: str = ...
): ...
def __invert__(self: _T) -> _T: ... def __invert__(self: _T) -> _T: ...
class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): # type: ignore class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression):
def __init__( def __init__(self, lhs, connector, rhs, config, output_field=...) -> None: ...
self, lhs, connector, rhs, config: Optional[_Expression] = ..., output_field: Optional[_OutputField] = ...
) -> None: ...
class SearchRank(Func): class SearchRank(Func):
def __init__( def __init__(self, vector, query, **extra: Any) -> None: ...
self, vector: Union[SearchVector, _Expression], query: Union[SearchQuery, _Expression], **extra: Any
) -> None: ...
class TrigramBase(Func): class TrigramBase(Func):
def __init__(self, expression: _Expression, string, **extra: Any) -> None: ... def __init__(self, expression, string, **extra: Any) -> None: ...
class TrigramSimilarity(TrigramBase): ... class TrigramSimilarity(TrigramBase): ...
class TrigramDistance(TrigramBase): ... class TrigramDistance(TrigramBase): ...

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import Any, Dict, List, Optional, Union, Protocol from typing import Any, Dict, List, Optional, Union
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.contrib.sites.requests import RequestSite from django.contrib.sites.requests import RequestSite
@@ -13,19 +13,10 @@ class SitemapNotFound(Exception): ...
def ping_google(sitemap_url: Optional[str] = ..., ping_url: str = ...) -> None: ... def ping_google(sitemap_url: Optional[str] = ..., ping_url: str = ...) -> None: ...
class _SupportsLen(Protocol):
def __len__(self) -> int: ...
class _SupportsCount(Protocol):
def count(self) -> int: ...
class _SupportsOrdered(Protocol):
ordered: bool = ...
class Sitemap: class Sitemap:
limit: int = ... limit: int = ...
protocol: Optional[str] = ... protocol: Optional[str] = ...
def items(self) -> Union[_SupportsLen, _SupportsCount, _SupportsOrdered]: ... def items(self) -> List[Any]: ...
def location(self, obj: Model) -> str: ... def location(self, obj: Model) -> str: ...
@property @property
def paginator(self) -> Paginator: ... def paginator(self) -> Paginator: ...

View File

@@ -1,10 +1,10 @@
from typing import Any from typing import Any
from django.apps.config import AppConfig
from django.apps.registry import Apps from django.apps.registry import Apps
from django.contrib.sites.apps import SitesConfig
def create_default_site( def create_default_site(
app_config: AppConfig, app_config: SitesConfig,
verbosity: int = ..., verbosity: int = ...,
interactive: bool = ..., interactive: bool = ...,
using: str = ..., using: str = ...,

View File

@@ -6,16 +6,15 @@ from django.db import models
SITE_CACHE: Any SITE_CACHE: Any
class SiteManager(models.Manager["Site"]): class SiteManager(models.Manager):
def get_current(self, request: Optional[HttpRequest] = ...) -> Site: ... def get_current(self, request: Optional[HttpRequest] = ...) -> Site: ...
def clear_cache(self) -> None: ... def clear_cache(self) -> None: ...
def get_by_natural_key(self, domain: str) -> Site: ... def get_by_natural_key(self, domain: str) -> Site: ...
class Site(models.Model): class Site(models.Model):
objects: SiteManager domain: models.CharField = ...
name: models.CharField = ...
domain = models.CharField(max_length=100) objects: SiteManager = ...
name = models.CharField(max_length=50)
def natural_key(self) -> Tuple[str]: ... def natural_key(self) -> Tuple[str]: ...
def clear_site_cache(sender: Type[Site], **kwargs: Any) -> None: ... def clear_site_cache(sender: Type[Site], **kwargs: Any) -> None: ...

View File

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

View File

@@ -37,7 +37,7 @@ def get_finders() -> Iterator[BaseFinder]: ...
def get_finder(import_path: Literal["django.contrib.staticfiles.finders.FileSystemFinder"]) -> FileSystemFinder: ... def get_finder(import_path: Literal["django.contrib.staticfiles.finders.FileSystemFinder"]) -> FileSystemFinder: ...
@overload @overload
def get_finder( def get_finder(
import_path: Literal["django.contrib.staticfiles.finders.AppDirectoriesFinder"], import_path: Literal["django.contrib.staticfiles.finders.AppDirectoriesFinder"]
) -> AppDirectoriesFinder: ... ) -> AppDirectoriesFinder: ...
@overload @overload
def get_finder(import_path: str) -> BaseFinder: ... def get_finder(import_path: str) -> BaseFinder: ...

View File

@@ -4,6 +4,7 @@ from typing import Any, Callable, Iterator, Optional, Tuple
from django.core.files.base import File from django.core.files.base import File
from django.core.files.storage import FileSystemStorage from django.core.files.storage import FileSystemStorage
from django.utils.functional import LazyObject from django.utils.functional import LazyObject
from django.utils.safestring import SafeText
class StaticFilesStorage(FileSystemStorage): class StaticFilesStorage(FileSystemStorage):
base_location: Any = ... base_location: Any = ...

View File

@@ -1,4 +1,4 @@
from typing import Any from typing import Any, Optional
from django.template.base import Parser, Token from django.template.base import Parser, Token
from django.templatetags.static import StaticNode from django.templatetags.static import StaticNode

View File

@@ -1,3 +0,0 @@
from django.test import LiveServerTestCase
class StaticLiveServerTestCase(LiveServerTestCase): ...

View File

@@ -1,5 +1,5 @@
from collections import OrderedDict from collections import OrderedDict
from typing import Iterator, List, Optional, Tuple, Union from typing import Any, Iterator, List, Optional, Tuple, Union
from django.core.files.storage import FileSystemStorage from django.core.files.storage import FileSystemStorage

View File

@@ -1,4 +1,4 @@
from typing import Any from typing import Any, Optional
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.http.response import FileResponse from django.http.response import FileResponse

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, List from typing import Any, Dict, List, Optional
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest

View File

@@ -19,16 +19,16 @@ class BaseCache:
def __init__(self, params: Dict[str, Any]) -> None: ... def __init__(self, params: Dict[str, Any]) -> None: ...
def get_backend_timeout(self, timeout: Any = ...) -> Optional[float]: ... def get_backend_timeout(self, timeout: Any = ...) -> Optional[float]: ...
def make_key(self, key: Any, version: Optional[Any] = ...) -> str: ... def make_key(self, key: Any, version: Optional[Any] = ...) -> str: ...
def add(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> bool: ... def add(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ...
def get(self, key: Any, default: Optional[Any] = ..., version: Optional[Any] = ...) -> Any: ... def get(self, key: Any, default: Optional[Any] = ..., version: Optional[Any] = ...) -> Any: ...
def set(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ... def set(self, key: Any, value: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ...
def touch(self, key: Any, timeout: Any = ..., version: Optional[Any] = ...) -> bool: ... def touch(self, key: Any, timeout: Any = ..., version: Optional[Any] = ...) -> None: ...
def delete(self, key: Any, version: Optional[Any] = ...) -> None: ... def delete(self, key: Any, version: Optional[Any] = ...) -> None: ...
def get_many(self, keys: List[str], version: Optional[int] = ...) -> Dict[str, Union[int, str]]: ... def get_many(self, keys: List[str], version: Optional[int] = ...) -> Dict[str, Union[int, str]]: ...
def get_or_set( def get_or_set(
self, key: Any, default: Optional[Any], timeout: Any = ..., version: Optional[int] = ... self, key: Any, default: Optional[Any], timeout: Any = ..., version: Optional[int] = ...
) -> Optional[Any]: ... ) -> Optional[Any]: ...
def has_key(self, key: Any, version: Optional[Any] = ...) -> bool: ... def has_key(self, key: Any, version: Optional[Any] = ...): ...
def incr(self, key: str, delta: int = ..., version: Optional[int] = ...) -> int: ... def incr(self, key: str, delta: int = ..., version: Optional[int] = ...) -> int: ...
def decr(self, key: str, delta: int = ..., version: Optional[int] = ...) -> int: ... def decr(self, key: str, delta: int = ..., version: Optional[int] = ...) -> int: ...
def __contains__(self, key: str) -> bool: ... def __contains__(self, key: str) -> bool: ...

View File

@@ -1,17 +1,5 @@
from .messages import ( from .messages import Warning as Warning, Info as Info, Debug as Debug, Error as Error, Critical as Critical
CheckMessage as CheckMessage,
Debug as Debug,
Info as Info,
Warning as Warning,
Error as Error,
Critical as Critical,
DEBUG as DEBUG,
INFO as INFO,
WARNING as WARNING,
ERROR as ERROR,
CRITICAL as CRITICAL,
)
from .registry import register as register, run_checks as run_checks, tag_exists as tag_exists, Tags as Tags from .registry import run_checks as run_checks, Tags as Tags, register as register
from . import model_checks as model_checks from . import model_checks as model_checks

View File

@@ -1,9 +1,7 @@
from typing import Any, List, Iterable, Optional from typing import Any, List, Optional
from django.core.checks.messages import Error from django.core.checks.messages import Error
from django.apps.config import AppConfig
E001: Any E001: Any
def check_default_cache_is_configured(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Error]: ... def check_default_cache_is_configured(app_configs: None, **kwargs: Any) -> List[Error]: ...

View File

@@ -1,3 +1,3 @@
from typing import Any, List from typing import Any, List, Optional
def check_database_backends(*args: Any, **kwargs: Any) -> List[Any]: ... def check_database_backends(*args: Any, **kwargs: Any) -> List[Any]: ...

View File

@@ -7,11 +7,11 @@ ERROR: int
CRITICAL: int CRITICAL: int
class CheckMessage: class CheckMessage:
level: int = ... level: Any = ...
msg: str = ... msg: Any = ...
hint: Optional[str] = ... hint: Any = ...
obj: Any = ... obj: Any = ...
id: Optional[str] = ... id: Any = ...
def __init__( def __init__(
self, level: int, msg: str, hint: Optional[str] = ..., obj: Any = ..., id: Optional[str] = ... self, level: int, msg: str, hint: Optional[str] = ..., obj: Any = ..., id: Optional[str] = ...
) -> None: ... ) -> None: ...
@@ -25,9 +25,19 @@ class Info(CheckMessage):
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class Warning(CheckMessage): class Warning(CheckMessage):
hint: str
id: str
level: int
msg: str
obj: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class Error(CheckMessage): class Error(CheckMessage):
hint: None
id: str
level: int
msg: str
obj: Any
def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __init__(self, *args: Any, **kwargs: Any) -> None: ...
class Critical(CheckMessage): class Critical(CheckMessage):

View File

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

View File

@@ -12,7 +12,6 @@ class Tags:
security: str = ... security: str = ...
signals: str = ... signals: str = ...
templates: str = ... templates: str = ...
translation: str = ...
urls: str = ... urls: str = ...
class CheckRegistry: class CheckRegistry:

View File

@@ -1,9 +1,7 @@
from typing import Any, List, Iterable, Optional from typing import Any, List, Optional
from django.core.checks.messages import Warning from django.core.checks.messages import Warning
from django.apps.config import AppConfig
SECRET_KEY_MIN_LENGTH: int SECRET_KEY_MIN_LENGTH: int
SECRET_KEY_MIN_UNIQUE_CHARACTERS: int SECRET_KEY_MIN_UNIQUE_CHARACTERS: int
W001: Any W001: Any
@@ -19,15 +17,15 @@ W019: Any
W020: Any W020: Any
W021: Any W021: Any
def check_security_middleware(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_security_middleware(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_xframe_options_middleware(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_xframe_options_middleware(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_sts(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_sts(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_sts_include_subdomains(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_sts_include_subdomains(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_sts_preload(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_sts_preload(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_content_type_nosniff(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_content_type_nosniff(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_xss_filter(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_xss_filter(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_ssl_redirect(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_ssl_redirect(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_secret_key(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_secret_key(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_debug(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_debug(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_xframe_deny(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_xframe_deny(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_allowed_hosts(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_allowed_hosts(app_configs: None, **kwargs: Any) -> List[Warning]: ...

View File

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

View File

@@ -1,9 +1,7 @@
from typing import Any, List, Iterable, Optional from typing import Any, List, Optional
from django.core.checks.messages import Warning from django.core.checks.messages import Warning
from django.apps.config import AppConfig
def add_session_cookie_message(message: Any): ... def add_session_cookie_message(message: Any): ...
W010: Any W010: Any
@@ -16,5 +14,5 @@ W013: Any
W014: Any W014: Any
W015: Any W015: Any
def check_session_cookie_secure(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_session_cookie_secure(app_configs: None, **kwargs: Any) -> List[Warning]: ...
def check_session_cookie_httponly(app_configs: Optional[Iterable[AppConfig]], **kwargs: Any) -> List[Warning]: ... def check_session_cookie_httponly(app_configs: None, **kwargs: Any) -> List[Warning]: ...

View File

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

View File

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

View File

@@ -8,13 +8,12 @@ _T = TypeVar("_T", bound="File")
class File(FileProxyMixin, IO[Any]): class File(FileProxyMixin, IO[Any]):
DEFAULT_CHUNK_SIZE: Any = ... DEFAULT_CHUNK_SIZE: Any = ...
file: IO[Any] = ... file: StringIO = ...
name: str = ... name: str = ...
mode: str = ... mode: str = ...
def __init__(self, file: Any, name: Optional[str] = ...) -> None: ... def __init__(self, file: Any, name: Optional[str] = ...) -> None: ...
def __bool__(self) -> bool: ... def __bool__(self) -> bool: ...
def __len__(self) -> int: ... def __len__(self) -> int: ...
@property
def size(self) -> int: ... def size(self) -> int: ...
def chunks(self, chunk_size: Optional[int] = ...) -> Iterator[bytes]: ... def chunks(self, chunk_size: Optional[int] = ...) -> Iterator[bytes]: ...
def multiple_chunks(self, chunk_size: Optional[int] = ...) -> bool: ... def multiple_chunks(self, chunk_size: Optional[int] = ...) -> bool: ...

View File

@@ -8,21 +8,21 @@ from django.utils.datastructures import MultiValueDict
class UploadFileException(Exception): ... class UploadFileException(Exception): ...
class StopUpload(UploadFileException): class StopUpload(UploadFileException):
connection_reset: bool = ... connection_reset = ... # type: bool
def __init__(self, connection_reset: bool = ...) -> None: ... def __init__(self, connection_reset: bool = False) -> None: ...
class SkipFile(UploadFileException): ... class SkipFile(UploadFileException): ...
class StopFutureHandlers(UploadFileException): ... class StopFutureHandlers(UploadFileException): ...
class FileUploadHandler: class FileUploadHandler:
chunk_size: int = ... chunk_size = ... # type: int
file_name: Optional[str] = ... file_name = ... # type: Optional[str]
content_type: Optional[str] = ... content_type = ... # type: Optional[str]
content_length: Optional[int] = ... content_length = ... # type: Optional[int]
charset: Optional[str] = ... charset = ... # type: Optional[str]
content_type_extra: Optional[Dict[str, str]] = ... content_type_extra = ... # type: Optional[Dict[str, str]]
request: Optional[HttpRequest] = ... request = ... # type: Optional[HttpRequest]
field_name: str = ... field_name = ... # type: str
def __init__(self, request: Optional[HttpRequest] = ...) -> None: ... def __init__(self, request: Optional[HttpRequest] = ...) -> None: ...
def handle_raw_input( def handle_raw_input(
self, self,

View File

@@ -1,10 +1,12 @@
from io import BytesIO from io import BytesIO
from typing import Any, Callable, Dict, Optional, Union from typing import Any, Callable, Dict, Optional, Union
from django.contrib.auth.models import AbstractUser
from django.contrib.sessions.backends.base import SessionBase from django.contrib.sessions.backends.base import SessionBase
from django.http.response import HttpResponse
from django.core.handlers import base from django.core.handlers import base
from django.http import HttpRequest from django.http import HttpRequest
from django.http.response import HttpResponse
_Stream = Union[BytesIO, str] _Stream = Union[BytesIO, str]
_WSGIEnviron = Dict[str, Any] _WSGIEnviron = Dict[str, Any]
@@ -20,6 +22,7 @@ class LimitedStream:
class WSGIRequest(HttpRequest): class WSGIRequest(HttpRequest):
environ: _WSGIEnviron = ... environ: _WSGIEnviron = ...
user: AbstractUser
session: SessionBase session: SessionBase
encoding: Any = ... encoding: Any = ...
def __init__(self, environ: _WSGIEnviron) -> None: ... def __init__(self, environ: _WSGIEnviron) -> None: ...

View File

@@ -1,5 +1,5 @@
import types import types
from typing import Any, TypeVar, Type, Iterable, Optional from typing import Any, TypeVar, Type, Iterable
from django.core.mail.message import EmailMessage from django.core.mail.message import EmailMessage
@@ -7,7 +7,7 @@ _T = TypeVar("_T", bound="BaseEmailBackend")
class BaseEmailBackend: class BaseEmailBackend:
def __init__(self, fail_silently: bool = ..., **kwargs: Any) -> None: ... def __init__(self, fail_silently: bool = ..., **kwargs: Any) -> None: ...
def open(self) -> Optional[bool]: ... def open(self) -> bool: ...
def close(self) -> None: ... def close(self) -> None: ...
def __enter__(self: _T) -> _T: ... def __enter__(self: _T) -> _T: ...
def __exit__( def __exit__(

View File

@@ -1,3 +0,0 @@
from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend): ...

View File

@@ -1,3 +0,0 @@
from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend): ...

View File

@@ -1,3 +0,0 @@
from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend): ...

View File

@@ -1,3 +0,0 @@
from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend): ...

View File

@@ -1,18 +0,0 @@
import smtplib
import threading
from typing import Optional, Union
from django.core.mail.backends.base import BaseEmailBackend
class EmailBackend(BaseEmailBackend):
host: str = ...
port: int = ...
username: str = ...
password: str = ...
use_tls: bool = ...
use_ssl: bool = ...
timeout: Optional[int] = ...
ssl_keyfile: Optional[str] = ...
ssl_certfile: Optional[str] = ...
connection: Union[smtplib.SMTP_SSL, smtplib.SMTP, None] = ...
_lock: threading.RLock = ...

View File

@@ -1,10 +1,8 @@
from email._policybase import Policy # type: ignore from email._policybase import Policy # type: ignore
from email.message import Message
from email.mime.base import MIMEBase
from email.mime.message import MIMEMessage from email.mime.message import MIMEMessage
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from typing import Any, Dict, List, Optional, Sequence, Tuple, Union, overload from typing import Any, Dict, List, Optional, Sequence, Tuple, Union
utf8_charset: Any utf8_charset: Any
utf8_charset_qp: Any utf8_charset_qp: Any
@@ -45,11 +43,6 @@ class SafeMIMEMultipart(MIMEMixin, MIMEMultipart):
self, _subtype: str = ..., boundary: None = ..., _subparts: None = ..., encoding: str = ..., **_params: Any self, _subtype: str = ..., boundary: None = ..., _subparts: None = ..., encoding: str = ..., **_params: Any
) -> None: ... ) -> None: ...
_AttachmentContent = Union[bytes, EmailMessage, Message, SafeMIMEText, str]
_AttachmentTuple = Union[
Tuple[str, _AttachmentContent], Tuple[Optional[str], _AttachmentContent, str], Tuple[str, _AttachmentContent, None]
]
class EmailMessage: class EmailMessage:
content_subtype: str = ... content_subtype: str = ...
mixed_subtype: str = ... mixed_subtype: str = ...
@@ -69,42 +62,42 @@ class EmailMessage:
subject: str = ..., subject: str = ...,
body: Optional[str] = ..., body: Optional[str] = ...,
from_email: Optional[str] = ..., from_email: Optional[str] = ...,
to: Optional[Sequence[str]] = ..., to: Optional[Union[Sequence[str], str]] = ...,
bcc: Optional[Sequence[str]] = ..., bcc: Optional[Union[Sequence[str], str]] = ...,
connection: Optional[Any] = ..., connection: Optional[Any] = ...,
attachments: Optional[Sequence[Union[MIMEBase, _AttachmentTuple]]] = ..., attachments: Optional[Union[List[Tuple[str, Union[str, bytes], str]], List[MIMEText]]] = ...,
headers: Optional[Dict[str, str]] = ..., headers: Optional[Dict[str, str]] = ...,
cc: Optional[Sequence[str]] = ..., cc: Optional[Union[Sequence[str], str]] = ...,
reply_to: Optional[Sequence[str]] = ..., reply_to: Optional[Union[List[Optional[str]], str]] = ...,
) -> None: ... ) -> None: ...
def get_connection(self, fail_silently: bool = ...) -> Any: ... def get_connection(self, fail_silently: bool = ...) -> Any: ...
# TODO: when typeshed gets more types for email.Message, move it to MIMEMessage, now it has too many false-positives # 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 message(self) -> Any: ...
def recipients(self) -> List[str]: ... def recipients(self) -> List[str]: ...
def send(self, fail_silently: bool = ...) -> int: ... def send(self, fail_silently: bool = ...) -> int: ...
@overload def attach(
def attach(self, filename: MIMEText = ...) -> None: ... self,
@overload filename: Optional[Union[MIMEText, str]] = ...,
def attach(self, filename: None = ..., content: _AttachmentContent = ..., mimetype: str = ...) -> None: ... content: Optional[Union[bytes, EmailMessage, SafeMIMEText, str]] = ...,
@overload mimetype: Optional[str] = ...,
def attach(self, filename: str = ..., content: _AttachmentContent = ..., mimetype: Optional[str] = ...) -> None: ... ) -> None: ...
def attach_file(self, path: str, mimetype: Optional[str] = ...) -> None: ... def attach_file(self, path: str, mimetype: Optional[str] = ...) -> None: ...
class EmailMultiAlternatives(EmailMessage): class EmailMultiAlternatives(EmailMessage):
alternative_subtype: str = ... alternative_subtype: str = ...
alternatives: Sequence[Tuple[_AttachmentContent, str]] = ... alternatives: Any = ...
def __init__( def __init__(
self, self,
subject: str = ..., subject: str = ...,
body: str = ..., body: str = ...,
from_email: Optional[str] = ..., from_email: Optional[str] = ...,
to: Optional[Sequence[str]] = ..., to: Optional[List[str]] = ...,
bcc: Optional[Sequence[str]] = ..., bcc: Optional[List[str]] = ...,
connection: Optional[Any] = ..., connection: Optional[Any] = ...,
attachments: Optional[Sequence[Union[MIMEBase, _AttachmentTuple]]] = ..., attachments: None = ...,
headers: Optional[Dict[str, str]] = ..., headers: Optional[Dict[str, str]] = ...,
alternatives: Optional[Sequence[Tuple[_AttachmentContent, str]]] = ..., alternatives: Optional[List[Tuple[str, str]]] = ...,
cc: Optional[Sequence[str]] = ..., cc: None = ...,
reply_to: Optional[Sequence[str]] = ..., reply_to: None = ...,
) -> None: ... ) -> None: ...
def attach_alternative(self, content: _AttachmentContent, mimetype: str) -> None: ... def attach_alternative(self, content: str, mimetype: str) -> None: ...

View File

@@ -23,16 +23,13 @@ class OutputWrapper(TextIOBase):
@property @property
def style_func(self): ... def style_func(self): ...
@style_func.setter @style_func.setter
def style_func(self, style_func: Callable[[str], str]): ... def style_func(self, style_func: Any): ...
ending: str = ... ending: str = ...
def __init__( def __init__(
self, out: Union[StringIO, TextIOWrapper], style_func: Optional[Callable[[str], str]] = ..., ending: str = ... self, out: Union[StringIO, TextIOWrapper], style_func: Optional[Callable] = ..., ending: str = ...
) -> None: ... ) -> None: ...
def __getattr__(self, name: str) -> Callable: ... def __getattr__(self, name: str) -> Callable: ...
def isatty(self) -> bool: ... def isatty(self) -> bool: ...
def write( # type: ignore[override]
self, msg: str, style_func: Optional[Callable[[str], str]] = ..., ending: Optional[str] = ...
) -> None: ...
class BaseCommand: class BaseCommand:
help: str = ... help: str = ...
@@ -66,7 +63,7 @@ class BaseCommand:
fail_level: int = ..., fail_level: int = ...,
) -> None: ... ) -> None: ...
def check_migrations(self) -> None: ... def check_migrations(self) -> None: ...
def handle(self, *args: Any, **options: Any) -> Optional[str]: ... def handle(self, *args: Any, **options: Any) -> None: ...
class AppCommand(BaseCommand): class AppCommand(BaseCommand):
missing_args_message: str = ... missing_args_message: str = ...

View File

@@ -1,24 +1,13 @@
from collections import Callable
def supports_color() -> bool: ... def supports_color() -> bool: ...
class Style: class Style:
def ERROR(self, text: str) -> str: ... def DEBUG(self, text: str) -> str: ...
def INFO(self, text: str) -> str: ...
def SUCCESS(self, text: str) -> str: ... def SUCCESS(self, text: str) -> str: ...
def WARNING(self, text: str) -> str: ... def WARNING(self, text: str) -> str: ...
def NOTICE(self, text: str) -> str: ... def ERROR(self, text: str) -> str: ...
def SQL_FIELD(self, text: str) -> str: ...
def SQL_COLTYPE(self, text: str) -> str: ...
def SQL_KEYWORD(self, text: str) -> str: ...
def SQL_TABLE(self, text: str) -> str: ...
def HTTP_INFO(self, text: str) -> str: ...
def HTTP_SUCCESS(self, text: str) -> str: ...
def HTTP_REDIRECT(self, text: str) -> str: ...
def HTTP_NOT_MODIFIED(self, text: str) -> str: ...
def HTTP_BAD_REQUEST(self, text: str) -> str: ...
def HTTP_NOT_FOUND(self, text: str) -> str: ...
def HTTP_SERVER_ERROR(self, text: str) -> str: ...
def MIGRATE_HEADING(self, text: str) -> str: ...
def MIGRATE_LABEL(self, text: str) -> str: ...
def ERROR_OUTPUT(self, text: str) -> str: ...
def make_style(config_string: str = ...) -> Style: ... def make_style(config_string: str = ...) -> Style: ...
def no_style() -> Style: ... def no_style() -> Style: ...

View File

@@ -1,6 +1,13 @@
from typing import Any, Optional, Pattern, Type import os
import re
from typing import Any, Pattern, Type, Optional
from django.core.management.base import BaseCommand 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 = ... plural_forms_re: Pattern = ...
STATUS_OK: int = ... STATUS_OK: int = ...

View File

@@ -1,4 +1,4 @@
from typing import Dict, List, Optional, Protocol, Sequence, Union from typing import Dict, List, Optional, Union, Iterable, Sequence, Protocol, Any
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
@@ -8,13 +8,13 @@ class InvalidPage(Exception): ...
class PageNotAnInteger(InvalidPage): ... class PageNotAnInteger(InvalidPage): ...
class EmptyPage(InvalidPage): ... class EmptyPage(InvalidPage): ...
class _SupportsLen(Protocol): class SupportsLen(Protocol):
def __len__(self) -> int: ... def __len__(self) -> int: ...
class _SupportsCount(Protocol): class SupportsCount(Protocol):
def count(self) -> int: ... def count(self) -> int: ...
class _SupportsOrdered(Protocol): class SupportsOrdered(Protocol):
ordered: bool = ... ordered: bool = ...
class Paginator: class Paginator:
@@ -24,7 +24,7 @@ class Paginator:
allow_empty_first_page: bool = ... allow_empty_first_page: bool = ...
def __init__( def __init__(
self, self,
object_list: Union[_SupportsLen, _SupportsCount, _SupportsOrdered], object_list: Union[SupportsLen, SupportsCount, SupportsOrdered],
per_page: Union[int, str], per_page: Union[int, str],
orphans: int = ..., orphans: int = ...,
allow_empty_first_page: bool = ..., allow_empty_first_page: bool = ...,
@@ -32,9 +32,7 @@ class Paginator:
def validate_number(self, number: Optional[Union[float, str]]) -> int: ... def validate_number(self, number: Optional[Union[float, str]]) -> int: ...
def get_page(self, number: Optional[int]) -> Page: ... def get_page(self, number: Optional[int]) -> Page: ...
def page(self, number: Union[int, str]) -> Page: ... def page(self, number: Union[int, str]) -> Page: ...
@property
def count(self) -> int: ... def count(self) -> int: ...
@property
def num_pages(self) -> int: ... def num_pages(self) -> int: ...
@property @property
def page_range(self) -> range: ... def page_range(self) -> range: ...

View File

@@ -1,6 +1,6 @@
from datetime import date from datetime import date
from io import BufferedReader, StringIO, TextIOWrapper from io import BufferedReader, StringIO, TextIOWrapper
from typing import Any, Dict, Iterable, List, Mapping, Optional, Type, Union, Collection from typing import Any, Dict, Iterable, List, Mapping, Optional, Type, Union
from uuid import UUID from uuid import UUID
from django.core.management.base import OutputWrapper from django.core.management.base import OutputWrapper
@@ -35,18 +35,18 @@ class Serializer:
internal_use_only: bool = ... internal_use_only: bool = ...
progress_class: Any = ... progress_class: Any = ...
stream_class: Any = ... stream_class: Any = ...
options: Dict[str, Any] = ... options: Any = ...
stream: Any = ... stream: Any = ...
selected_fields: Optional[Collection[str]] = ... selected_fields: Any = ...
use_natural_foreign_keys: bool = ... use_natural_foreign_keys: Any = ...
use_natural_primary_keys: bool = ... use_natural_primary_keys: Any = ...
first: bool = ... first: bool = ...
def serialize( def serialize(
self, self,
queryset: Iterable[Model], queryset: Iterable[Model],
*, *,
stream: Optional[Any] = ..., stream: Optional[Any] = ...,
fields: Optional[Collection[str]] = ..., fields: Optional[Any] = ...,
use_natural_foreign_keys: bool = ..., use_natural_foreign_keys: bool = ...,
use_natural_primary_keys: bool = ..., use_natural_primary_keys: bool = ...,
progress_output: Optional[Any] = ..., progress_output: Optional[Any] = ...,
@@ -63,7 +63,7 @@ class Serializer:
def getvalue(self) -> Optional[Union[bytes, str]]: ... def getvalue(self) -> Optional[Union[bytes, str]]: ...
class Deserializer: class Deserializer:
options: Dict[str, Any] = ... options: Any = ...
stream: Any = ... stream: Any = ...
def __init__(self, stream_or_string: Union[BufferedReader, TextIOWrapper, str], **options: Any) -> None: ... def __init__(self, stream_or_string: Union[BufferedReader, TextIOWrapper, str], **options: Any) -> None: ...
def __iter__(self) -> Deserializer: ... def __iter__(self) -> Deserializer: ...

View File

@@ -1,10 +1,24 @@
import json import json
from typing import Any, Dict from datetime import datetime
from decimal import Decimal
from io import TextIOWrapper
from typing import Any, Union, Dict
from uuid import UUID
from django.core.serializers.python import Serializer as PythonSerializer from django.core.serializers.python import Serializer as PythonSerializer
from django.db.models.base import Model
class Serializer(PythonSerializer): class Serializer(PythonSerializer):
json_kwargs: Dict[str, Any] json_kwargs: Dict[str, Any]
options: Dict[str, None]
selected_fields: None
stream: TextIOWrapper
use_natural_foreign_keys: bool
use_natural_primary_keys: bool
internal_use_only: bool = ...
def start_serialization(self) -> None: ...
def end_serialization(self) -> None: ...
def end_object(self, obj: Model) -> None: ...
def Deserializer(stream_or_string: Any, **options: Any) -> None: ... def Deserializer(stream_or_string: Any, **options: Any) -> None: ...
@@ -15,3 +29,4 @@ class DjangoJSONEncoder(json.JSONEncoder):
indent: int indent: int
skipkeys: bool skipkeys: bool
sort_keys: bool sort_keys: bool
def default(self, o: Union[datetime, Decimal, UUID]) -> str: ...

View File

@@ -1,15 +1,31 @@
from collections import OrderedDict from collections import OrderedDict
from typing import Any, Dict, Iterator, List, Optional from io import TextIOWrapper
from typing import Any, Dict, Iterator, List
from django.core.serializers.base import DeserializedObject from django.core.serializers.base import DeserializedObject
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.fields.related import ForeignKey, ManyToManyField
from django.core.serializers import base from django.core.serializers import base
from django.db.models.fields import Field
class Serializer(base.Serializer): class Serializer(base.Serializer):
options: Dict[Any, Any]
selected_fields: None
stream: TextIOWrapper
use_natural_foreign_keys: bool
use_natural_primary_keys: bool
internal_use_only: bool = ...
objects: List[Any] = ... objects: List[Any] = ...
def start_serialization(self) -> None: ...
def end_serialization(self) -> None: ...
def start_object(self, obj: Model) -> None: ...
def end_object(self, obj: Model) -> None: ...
def get_dump_object(self, obj: Model) -> OrderedDict: ... def get_dump_object(self, obj: Model) -> OrderedDict: ...
def handle_field(self, obj: Model, field: Field) -> None: ...
def handle_fk_field(self, obj: Model, field: ForeignKey) -> None: ...
def handle_m2m_field(self, obj: Model, field: ManyToManyField) -> None: ...
def Deserializer( def Deserializer(
object_list: List[Dict[str, Any]], *, using: Optional[str] = ..., ignorenonexistent: bool = ..., **options: Any object_list: List[Dict[str, Any]], *, using: Any = ..., ignorenonexistent: bool = ..., **options: Any
) -> Iterator[DeserializedObject]: ... ) -> Iterator[DeserializedObject]: ...

View File

@@ -4,7 +4,7 @@ from typing import Any, Dict
from wsgiref import simple_server from wsgiref import simple_server
from django.core.handlers.wsgi import WSGIRequest, WSGIHandler from django.core.handlers.wsgi import WSGIRequest, WSGIHandler
from django.core.wsgi import get_wsgi_application as get_wsgi_application # noqa: F401 from django.core.wsgi import get_wsgi_application as get_wsgi_application
class WSGIServer(simple_server.WSGIServer): class WSGIServer(simple_server.WSGIServer):
request_queue_size: int = ... request_queue_size: int = ...

View File

@@ -1,5 +1,7 @@
from datetime import timedelta from datetime import datetime, timedelta
from typing import Any, Dict, Optional, Protocol, Type, Union from typing import Any, Dict, List, Optional, Type, Union, Protocol
from django.contrib.sessions.serializers import PickleSerializer
class BadSignature(Exception): ... class BadSignature(Exception): ...
class SignatureExpired(BadSignature): ... class SignatureExpired(BadSignature): ...
@@ -21,11 +23,7 @@ def dumps(
obj: Any, key: None = ..., salt: str = ..., serializer: Type[Serializer] = ..., compress: bool = ... obj: Any, key: None = ..., salt: str = ..., serializer: Type[Serializer] = ..., compress: bool = ...
) -> str: ... ) -> str: ...
def loads( def loads(
s: str, s: str, key: None = ..., salt: str = ..., serializer: Type[Serializer] = ..., max_age: Optional[int] = ...
key: None = ...,
salt: str = ...,
serializer: Type[Serializer] = ...,
max_age: Optional[Union[int, timedelta]] = ...,
) -> Any: ... ) -> Any: ...
class Signer: class Signer:

View File

@@ -1,26 +1,28 @@
from datetime import datetime
from decimal import Decimal from decimal import Decimal
from re import RegexFlag from re import RegexFlag
from typing import Any, Callable, Collection, Dict, List, Optional, Pattern, Tuple, Union from typing import Any, Dict, List, Optional, Union, Pattern, Collection
from uuid import UUID
from django.core.files.base import File from django.core.files.base import File
from django.core.exceptions import ValidationError as ValidationError
EMPTY_VALUES: Any EMPTY_VALUES: Any
_Regex = Union[str, Pattern[str]] _Regex = Union[str, Pattern[str]]
_ErrorMessage = Union[str, Any]
def _lazy_re_compile(regex: _Regex, flags: int = ...): ... def _lazy_re_compile(regex: _Regex, flags: int = ...): ...
class RegexValidator: class RegexValidator:
regex: _Regex = ... regex: _Regex = ...
message: str = ... message: Any = ...
code: str = ... code: str = ...
inverse_match: bool = ... inverse_match: bool = ...
flags: int = ... flags: int = ...
def __init__( def __init__(
self, self,
regex: Optional[_Regex] = ..., regex: Optional[_Regex] = ...,
message: Optional[_ErrorMessage] = ..., message: Optional[str] = ...,
code: Optional[str] = ..., code: Optional[str] = ...,
inverse_match: Optional[bool] = ..., inverse_match: Optional[bool] = ...,
flags: Optional[RegexFlag] = ..., flags: Optional[RegexFlag] = ...,
@@ -31,82 +33,95 @@ class URLValidator(RegexValidator):
ul: str = ... ul: str = ...
ipv4_re: str = ... ipv4_re: str = ...
ipv6_re: str = ... ipv6_re: str = ...
hostname_re: str = ... hostname_re: Any = ...
domain_re: str = ... domain_re: Any = ...
tld_re: str = ... tld_re: Any = ...
host_re: str = ... host_re: Any = ...
schemes: List[str] = ... schemes: Any = ...
def __init__(self, schemes: Optional[Collection[str]] = ..., **kwargs: Any) -> None: ... def __init__(self, schemes: Optional[Collection[str]] = ..., **kwargs: Any) -> None: ...
integer_validator: RegexValidator = ... integer_validator: Any
def validate_integer(value: Optional[Union[float, str]]) -> None: ... def validate_integer(value: Optional[Union[float, str]]) -> None: ...
class EmailValidator: class EmailValidator:
message: str = ... message: Any = ...
code: str = ... code: str = ...
user_regex: Pattern = ... user_regex: Any = ...
domain_regex: Pattern = ... domain_regex: Any = ...
literal_regex: Pattern = ... literal_regex: Any = ...
domain_whitelist: List[str] = ... domain_whitelist: Any = ...
def __init__( def __init__(
self, self, message: Optional[str] = ..., code: Optional[str] = ..., whitelist: Optional[Collection[str]] = ...
message: Optional[_ErrorMessage] = ...,
code: Optional[str] = ...,
whitelist: Optional[Collection[str]] = ...,
) -> None: ... ) -> None: ...
def __call__(self, value: Optional[str]) -> None: ... def __call__(self, value: Optional[str]) -> None: ...
def validate_domain_part(self, domain_part: str) -> bool: ... def validate_domain_part(self, domain_part: str) -> bool: ...
validate_email: EmailValidator = ... validate_email: Any
slug_re: Pattern = ... slug_re: Any
validate_slug: RegexValidator = ... validate_slug: Any
slug_unicode_re: Pattern = ... slug_unicode_re: Any
validate_unicode_slug: RegexValidator = ... validate_unicode_slug: Any
def validate_ipv4_address(value: str) -> None: ... def validate_ipv4_address(value: str) -> None: ...
def validate_ipv6_address(value: str) -> None: ... def validate_ipv6_address(value: str) -> None: ...
def validate_ipv46_address(value: str) -> None: ... def validate_ipv46_address(value: str) -> None: ...
_IPValidator = Tuple[Callable[[Any], None], str] ip_address_validator_map: Any
ip_address_validator_map: Dict[str, _IPValidator]
def ip_address_validators(protocol: str, unpack_ipv4: bool) -> _IPValidator: ... def ip_address_validators(protocol: str, unpack_ipv4: bool) -> Any: ...
def int_list_validator( def int_list_validator(
sep: str = ..., message: Optional[_ErrorMessage] = ..., code: str = ..., allow_negative: bool = ... sep: str = ..., message: None = ..., code: str = ..., allow_negative: bool = ...
) -> RegexValidator: ... ) -> RegexValidator: ...
validate_comma_separated_integer_list: Any validate_comma_separated_integer_list: Any
class BaseValidator: class BaseValidator:
message: str = ... message: Any = ...
code: str = ... code: str = ...
limit_value: Any = ... limit_value: Any = ...
def __init__(self, limit_value: Any, message: Optional[_ErrorMessage] = ...) -> None: ... def __init__(self, limit_value: Any, message: Optional[str] = ...) -> None: ...
def __call__(self, value: Any) -> None: ... def __call__(self, value: Any) -> None: ...
def compare(self, a: Any, b: Any) -> bool: ... def compare(self, a: bool, b: bool) -> bool: ...
def clean(self, x: Any) -> Any: ... def clean(self, x: Any) -> Any: ...
class MaxValueValidator(BaseValidator): ... class MaxValueValidator(BaseValidator):
class MinValueValidator(BaseValidator): ... message: Any = ...
class MinLengthValidator(BaseValidator): ... code: str = ...
class MaxLengthValidator(BaseValidator): ... def compare(self, a: Union[datetime, Decimal, float], b: Union[datetime, Decimal, float]) -> bool: ...
class MinValueValidator(BaseValidator):
message: Any = ...
code: str = ...
def compare(self, a: Union[datetime, Decimal, float], b: Union[datetime, Decimal, float]) -> bool: ...
class MinLengthValidator(BaseValidator):
message: Any = ...
code: str = ...
def compare(self, a: int, b: int) -> bool: ...
def clean(self, x: str) -> int: ...
class MaxLengthValidator(BaseValidator):
message: Any = ...
code: str = ...
def compare(self, a: int, b: int) -> bool: ...
def clean(self, x: Union[bytes, str]) -> int: ...
class DecimalValidator: class DecimalValidator:
messages: Dict[str, str] = ... messages: Any = ...
max_digits: int = ... max_digits: int = ...
decimal_places: int = ... decimal_places: int = ...
def __init__(self, max_digits: Optional[Union[int, str]], decimal_places: Optional[Union[int, str]]) -> None: ... def __init__(self, max_digits: Optional[Union[int, str]], decimal_places: Optional[Union[int, str]]) -> None: ...
def __call__(self, value: Decimal) -> None: ... def __call__(self, value: Decimal) -> None: ...
class FileExtensionValidator: class FileExtensionValidator:
message: str = ... message: Any = ...
code: str = ... code: str = ...
allowed_extensions: List[str] = ... allowed_extensions: List[str] = ...
def __init__( def __init__(
self, self,
allowed_extensions: Optional[Collection[str]] = ..., allowed_extensions: Optional[Collection[str]] = ...,
message: Optional[_ErrorMessage] = ..., message: Optional[str] = ...,
code: Optional[str] = ..., code: Optional[str] = ...,
) -> None: ... ) -> None: ...
def __call__(self, value: File) -> None: ... def __call__(self, value: File) -> None: ...
@@ -115,7 +130,7 @@ def get_available_image_extensions() -> List[str]: ...
def validate_image_file_extension(value: File) -> None: ... def validate_image_file_extension(value: File) -> None: ...
class ProhibitNullCharactersValidator: class ProhibitNullCharactersValidator:
message: str = ... message: Any = ...
code: str = ... code: str = ...
def __init__(self, message: Optional[_ErrorMessage] = ..., code: Optional[str] = ...) -> None: ... def __init__(self, message: Optional[str] = ..., code: Optional[str] = ...) -> None: ...
def __call__(self, value: Any) -> None: ... def __call__(self, value: Optional[Union[Dict[Any, Any], str, UUID]]) -> None: ...

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