Merge branch 'master' into queryset_in_bulk

This commit is contained in:
Seth Yastrov
2019-02-22 08:16:48 +01:00
65 changed files with 374 additions and 567 deletions

View File

@@ -1,5 +1,5 @@
from collections import OrderedDict
from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Type, Union, Iterator
from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple, Type, Union
from django.contrib.admin.filters import ListFilter
from django.contrib.admin.models import LogEntry
@@ -8,7 +8,6 @@ from django.contrib.admin.views.main import ChangeList
from django.contrib.auth.forms import AdminPasswordChangeForm
from django.contrib.contenttypes.models import ContentType
from django.core.checks.messages import Error
from django.core.handlers.wsgi import WSGIRequest
from django.core.paginator import Paginator
from django.db.models.base import Model
from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField
@@ -17,12 +16,13 @@ from django.db.models.query import QuerySet
from django.forms.fields import TypedChoiceField
from django.forms.models import ModelChoiceField, ModelMultipleChoiceField
from django.forms.widgets import Media
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirect, JsonResponse
from django.template.response import TemplateResponse
from django.urls.resolvers import URLPattern
from django.utils.safestring import SafeText
from django.db.models.fields import Field
from django.template.response import TemplateResponse
IS_POPUP_VAR: str
TO_FIELD_VAR: str
@@ -58,40 +58,40 @@ class BaseModelAdmin:
def check(self, **kwargs: Any) -> List[Union[str, Error]]: ...
def __init__(self) -> None: ...
def formfield_for_dbfield(
self, db_field: Field, request: Optional[WSGIRequest], **kwargs: Any
self, db_field: Field, request: Optional[HttpRequest], **kwargs: Any
) -> Optional[Field]: ...
def formfield_for_choice_field(
self, db_field: Field, request: Optional[WSGIRequest], **kwargs: Any
self, db_field: Field, request: Optional[HttpRequest], **kwargs: Any
) -> TypedChoiceField: ...
def get_field_queryset(
self, db: None, db_field: RelatedField, request: Optional[WSGIRequest]
self, db: None, db_field: RelatedField, request: Optional[HttpRequest]
) -> Optional[QuerySet]: ...
def formfield_for_foreignkey(
self, db_field: ForeignKey, request: Optional[WSGIRequest], **kwargs: Any
self, db_field: ForeignKey, request: Optional[HttpRequest], **kwargs: Any
) -> Optional[ModelChoiceField]: ...
def formfield_for_manytomany(
self, db_field: ManyToManyField, request: Optional[WSGIRequest], **kwargs: Any
self, db_field: ManyToManyField, request: Optional[HttpRequest], **kwargs: Any
) -> ModelMultipleChoiceField: ...
def get_autocomplete_fields(self, request: WSGIRequest) -> Tuple: ...
def get_autocomplete_fields(self, request: HttpRequest) -> Tuple: ...
def get_view_on_site_url(self, obj: Optional[Model] = ...) -> Optional[str]: ...
def get_empty_value_display(self) -> SafeText: ...
def get_exclude(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Any: ...
def get_fields(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Sequence[Union[Callable, str]]: ...
def get_exclude(self, request: HttpRequest, obj: Optional[Model] = ...) -> Any: ...
def get_fields(self, request: HttpRequest, obj: Optional[Model] = ...) -> Sequence[Union[Callable, str]]: ...
def get_fieldsets(
self, request: WSGIRequest, obj: Optional[Model] = ...
self, request: HttpRequest, obj: Optional[Model] = ...
) -> List[Tuple[Optional[str], Dict[str, Any]]]: ...
def get_ordering(self, request: WSGIRequest) -> Union[List[str], Tuple]: ...
def get_readonly_fields(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Union[List[str], Tuple]: ...
def get_prepopulated_fields(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Dict[str, Tuple[str]]: ...
def get_queryset(self, request: WSGIRequest) -> QuerySet: ...
def get_sortable_by(self, request: WSGIRequest) -> Union[List[Callable], List[str], Tuple]: ...
def get_ordering(self, request: HttpRequest) -> Union[List[str], Tuple]: ...
def get_readonly_fields(self, request: HttpRequest, obj: Optional[Model] = ...) -> Union[List[str], Tuple]: ...
def get_prepopulated_fields(self, request: HttpRequest, obj: Optional[Model] = ...) -> Dict[str, Tuple[str]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet: ...
def get_sortable_by(self, request: HttpRequest) -> Union[List[Callable], List[str], Tuple]: ...
def lookup_allowed(self, lookup: str, value: str) -> bool: ...
def to_field_allowed(self, request: WSGIRequest, to_field: str) -> bool: ...
def has_add_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ...
def has_change_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ...
def has_delete_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ...
def has_view_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ...
def has_module_permission(self, request: WSGIRequest) -> bool: ...
def to_field_allowed(self, request: HttpRequest, to_field: str) -> 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_delete_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: ...
class ModelAdmin(BaseModelAdmin):
formfield_overrides: Any
@@ -127,54 +127,54 @@ class ModelAdmin(BaseModelAdmin):
opts: Options = ...
admin_site: AdminSite = ...
def __init__(self, model: Type[Model], admin_site: Optional[AdminSite]) -> None: ...
def get_inline_instances(self, request: WSGIRequest, obj: Optional[Model] = ...) -> List[InlineModelAdmin]: ...
def get_inline_instances(self, request: HttpRequest, obj: Optional[Model] = ...) -> List[InlineModelAdmin]: ...
def get_urls(self) -> List[URLPattern]: ...
@property
def urls(self) -> List[URLPattern]: ...
@property
def media(self) -> Media: ...
def get_model_perms(self, request: WSGIRequest) -> Dict[str, bool]: ...
def get_model_perms(self, request: HttpRequest) -> Dict[str, bool]: ...
def get_form(self, request: Any, obj: Optional[Any] = ..., change: bool = ..., **kwargs: Any): ...
def get_changelist(self, request: WSGIRequest, **kwargs: Any) -> Type[ChangeList]: ...
def get_changelist_instance(self, request: WSGIRequest) -> ChangeList: ...
def get_object(self, request: WSGIRequest, object_id: str, from_field: None = ...) -> Optional[Model]: ...
def get_changelist(self, request: HttpRequest, **kwargs: Any) -> Type[ChangeList]: ...
def get_changelist_instance(self, request: HttpRequest) -> ChangeList: ...
def get_object(self, request: HttpRequest, object_id: str, from_field: None = ...) -> Optional[Model]: ...
def get_changelist_form(self, request: Any, **kwargs: Any): ...
def get_changelist_formset(self, request: Any, **kwargs: Any): ...
def get_formsets_with_inlines(self, request: WSGIRequest, obj: Optional[Model] = ...) -> Iterator[Any]: ...
def get_formsets_with_inlines(self, request: HttpRequest, obj: Optional[Model] = ...) -> Iterator[Any]: ...
def get_paginator(
self,
request: WSGIRequest,
request: HttpRequest,
queryset: QuerySet,
per_page: int,
orphans: int = ...,
allow_empty_first_page: bool = ...,
) -> Paginator: ...
def log_addition(self, request: WSGIRequest, object: Model, message: Any) -> LogEntry: ...
def log_change(self, request: WSGIRequest, object: Model, message: Any) -> LogEntry: ...
def log_deletion(self, request: WSGIRequest, object: Model, object_repr: str) -> LogEntry: ...
def log_addition(self, request: HttpRequest, object: Model, message: Any) -> LogEntry: ...
def log_change(self, request: HttpRequest, object: Model, message: Any) -> LogEntry: ...
def log_deletion(self, request: HttpRequest, object: Model, object_repr: str) -> LogEntry: ...
def action_checkbox(self, obj: Model) -> SafeText: ...
def get_actions(self, request: WSGIRequest) -> OrderedDict: ...
def get_actions(self, request: HttpRequest) -> OrderedDict: ...
def get_action_choices(
self, request: WSGIRequest, default_choices: List[Tuple[str, str]] = ...
self, request: HttpRequest, default_choices: List[Tuple[str, str]] = ...
) -> List[Tuple[str, str]]: ...
def get_action(self, action: Union[Callable, str]) -> Tuple[Callable, str, str]: ...
def get_list_display(self, request: WSGIRequest) -> Sequence[str]: ...
def get_list_display_links(self, request: WSGIRequest, list_display: Sequence[str]) -> Optional[Sequence[str]]: ...
def get_list_filter(self, request: WSGIRequest) -> Sequence[str]: ...
def get_list_select_related(self, request: WSGIRequest) -> Sequence[str]: ...
def get_search_fields(self, request: WSGIRequest) -> List[str]: ...
def get_list_display(self, request: HttpRequest) -> Sequence[str]: ...
def get_list_display_links(self, request: HttpRequest, list_display: Sequence[str]) -> Optional[Sequence[str]]: ...
def get_list_filter(self, request: HttpRequest) -> Sequence[str]: ...
def get_list_select_related(self, request: HttpRequest) -> Sequence[str]: ...
def get_search_fields(self, request: HttpRequest) -> List[str]: ...
def get_search_results(
self, request: WSGIRequest, queryset: QuerySet, search_term: str
self, request: HttpRequest, queryset: QuerySet, search_term: str
) -> Tuple[QuerySet, bool]: ...
def get_preserved_filters(self, request: WSGIRequest) -> str: ...
def _get_edited_object_pks(self, request: WSGIRequest, prefix: str) -> List[str]: ...
def _get_list_editable_queryset(self, request: WSGIRequest, prefix: str) -> QuerySet: ...
def get_preserved_filters(self, request: HttpRequest) -> str: ...
def _get_edited_object_pks(self, request: HttpRequest, prefix: str) -> List[str]: ...
def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> QuerySet: ...
def construct_change_message(
self, request: WSGIRequest, form: AdminPasswordChangeForm, formsets: None, add: bool = ...
self, request: HttpRequest, form: AdminPasswordChangeForm, formsets: None, add: bool = ...
) -> List[Dict[str, Dict[str, List[str]]]]: ...
def message_user(
self,
request: WSGIRequest,
request: HttpRequest,
message: str,
level: Union[int, str] = ...,
extra_tags: str = ...,
@@ -182,8 +182,8 @@ class ModelAdmin(BaseModelAdmin):
) -> None: ...
def save_form(self, request: Any, form: Any, change: Any): ...
def save_model(self, request: Any, obj: Any, form: Any, change: Any) -> None: ...
def delete_model(self, request: WSGIRequest, obj: Model) -> None: ...
def delete_queryset(self, request: WSGIRequest, queryset: QuerySet) -> None: ...
def delete_model(self, request: HttpRequest, obj: Model) -> None: ...
def delete_queryset(self, request: HttpRequest, queryset: QuerySet) -> None: ...
def save_formset(self, request: Any, form: Any, formset: Any, change: Any) -> None: ...
def save_related(self, request: Any, form: Any, formsets: Any, change: Any) -> None: ...
def render_change_form(
@@ -196,52 +196,51 @@ class ModelAdmin(BaseModelAdmin):
obj: Optional[Any] = ...,
): ...
def response_add(
self, request: WSGIRequest, obj: Model, post_url_continue: Optional[str] = ...
self, request: HttpRequest, obj: Model, post_url_continue: Optional[str] = ...
) -> HttpResponse: ...
def response_change(self, request: WSGIRequest, obj: Model) -> HttpResponse: ...
def response_post_save_add(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ...
def response_post_save_change(self, request: WSGIRequest, obj: Model) -> HttpResponseRedirect: ...
def response_action(self, request: WSGIRequest, queryset: QuerySet) -> Optional[HttpResponseBase]: ...
def response_delete(self, request: WSGIRequest, obj_display: str, obj_id: int) -> HttpResponse: ...
def response_change(self, request: HttpRequest, obj: Model) -> HttpResponse: ...
def response_post_save_add(self, request: HttpRequest, obj: Model) -> HttpResponseRedirect: ...
def response_post_save_change(self, request: HttpRequest, obj: Model) -> HttpResponseRedirect: ...
def response_action(self, request: HttpRequest, queryset: QuerySet) -> Optional[HttpResponseBase]: ...
def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ...
def render_delete_form(self, request: Any, context: Any): ...
def get_inline_formsets(
self, request: WSGIRequest, formsets: List[Any], inline_instances: List[Any], obj: Optional[Model] = ...
self, request: HttpRequest, formsets: List[Any], inline_instances: List[Any], obj: Optional[Model] = ...
) -> List[Any]: ...
def get_changeform_initial_data(self, request: WSGIRequest) -> Dict[str, str]: ...
def get_changeform_initial_data(self, request: HttpRequest) -> Dict[str, str]: ...
def changeform_view(
self,
request: WSGIRequest,
request: HttpRequest,
object_id: Optional[str] = ...,
form_url: str = ...,
extra_context: Optional[Dict[str, bool]] = ...,
) -> Any: ...
def autocomplete_view(self, request: WSGIRequest) -> JsonResponse: ...
def add_view(self, request: WSGIRequest, form_url: str = ..., extra_context: None = ...) -> HttpResponse: ...
def autocomplete_view(self, request: HttpRequest) -> JsonResponse: ...
def add_view(self, request: HttpRequest, form_url: str = ..., extra_context: None = ...) -> HttpResponse: ...
def change_view(
self, request: WSGIRequest, object_id: str, form_url: str = ..., extra_context: Optional[Dict[str, bool]] = ...
self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: Optional[Dict[str, bool]] = ...
) -> HttpResponse: ...
def changelist_view(
self, request: WSGIRequest, extra_context: Optional[Dict[str, str]] = ...
self, request: HttpRequest, extra_context: Optional[Dict[str, str]] = ...
) -> TemplateResponse: ...
def get_deleted_objects(
self, objs: QuerySet, request: WSGIRequest
self, objs: QuerySet, request: HttpRequest
) -> Tuple[List[Any], Dict[Any, Any], Set[Any], List[Any]]: ...
def delete_view(self, request: WSGIRequest, object_id: str, extra_context: None = ...) -> Any: ...
def history_view(self, request: WSGIRequest, object_id: str, extra_context: None = ...) -> HttpResponse: ...
def delete_view(self, request: HttpRequest, object_id: str, extra_context: None = ...) -> Any: ...
def history_view(self, request: HttpRequest, object_id: str, extra_context: None = ...) -> HttpResponse: ...
class InlineModelAdmin(BaseModelAdmin):
model: Any = ...
fk_name: Any = ...
formset: Any = ...
extra: int = ...
min_num: Any = ...
max_num: Any = ...
template: Any = ...
verbose_name: Any = ...
verbose_name_plural: Any = ...
min_num: Optional[int] = ...
max_num: Optional[int] = ...
template: str = ...
verbose_name: Optional[str] = ...
verbose_name_plural: Optional[str] = ...
can_delete: bool = ...
show_change_link: bool = ...
checks_class: Any = ...
classes: Any = ...
admin_site: Any = ...
parent_model: Any = ...
@@ -250,18 +249,10 @@ class InlineModelAdmin(BaseModelAdmin):
def __init__(self, parent_model: Union[Type[Model], Model], admin_site: AdminSite) -> None: ...
@property
def media(self) -> Media: ...
def get_extra(self, request: WSGIRequest, obj: Optional[Model] = ..., **kwargs: Any) -> int: ...
def get_min_num(self, request: WSGIRequest, obj: Optional[Model] = ..., **kwargs: Any) -> None: ...
def get_max_num(self, request: WSGIRequest, obj: Optional[Model] = ..., **kwargs: Any) -> Optional[int]: ...
fields: Any = ...
def get_extra(self, request: HttpRequest, obj: Optional[Model] = ..., **kwargs: Any) -> int: ...
def get_min_num(self, request: HttpRequest, obj: Optional[Model] = ..., **kwargs: Any) -> Optional[int]: ...
def get_max_num(self, request: HttpRequest, obj: Optional[Model] = ..., **kwargs: Any) -> Optional[int]: ...
def get_formset(self, request: Any, obj: Optional[Any] = ..., **kwargs: Any): ...
def get_queryset(self, request: WSGIRequest) -> QuerySet: ...
def has_change_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ...
def has_delete_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ...
def has_view_permission(self, request: WSGIRequest, obj: Optional[Model] = ...) -> bool: ...
class StackedInline(InlineModelAdmin):
template: str = ...
class TabularInline(InlineModelAdmin):
template: str = ...
class StackedInline(InlineModelAdmin): ...
class TabularInline(InlineModelAdmin): ...

View File

@@ -1,10 +1,10 @@
from typing import Any
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class RedirectFallbackMiddleware(MiddlewareMixin):
response_gone_class: Any = ...
response_redirect_class: Any = ...
def process_response(self, request: WSGIRequest, response: HttpResponse) -> HttpResponse: ...
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...

View File

@@ -1,20 +1,19 @@
from datetime import datetime
from typing import Any, Dict, Optional
from typing import Any, Dict, Optional, Type
from django.contrib.sessions.backends.base import SessionBase
from django.db import models
class BaseSessionManager(models.Manager):
creation_counter: int
model: None
name: None
def encode(self, session_dict: Dict[str, int]) -> str: ...
def save(self, session_key: str, session_dict: Dict[str, int], expire_date: datetime) -> AbstractBaseSession: ...
class AbstractBaseSession(models.Model):
session_key: Any = ...
session_data: Any = ...
expire_date: Any = ...
expire_date: datetime
session_data: str
session_key: str
objects: Any = ...
@classmethod
def get_session_store_class(cls) -> None: ...
def get_session_store_class(cls) -> Optional[Type[SessionBase]]: ...
def get_decoded(self) -> Dict[str, int]: ...

View File

@@ -1,18 +1,4 @@
from typing import Any, Optional, Type
from django.contrib.sessions.backends.db import SessionStore
from django.contrib.sessions.base_session import AbstractBaseSession, BaseSessionManager
class SessionManager(BaseSessionManager):
creation_counter: int
model: None
name: None
use_in_migrations: bool = ...
class Session(AbstractBaseSession):
expire_date: datetime.datetime
session_data: str
session_key: str
objects: Any = ...
@classmethod
def get_session_store_class(cls) -> Type[SessionStore]: ...
class SessionManager(BaseSessionManager): ...
class Session(AbstractBaseSession): ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, Optional
from typing import Dict
from django.core.signing import JSONSerializer as BaseJSONSerializer
from django.db.models.base import Model

View File

@@ -11,7 +11,7 @@ PING_URL: str
class SitemapNotFound(Exception): ...
def ping_google(sitemap_url: None = ..., ping_url: str = ...) -> None: ...
def ping_google(sitemap_url: Optional[str] = ..., ping_url: str = ...) -> None: ...
class Sitemap:
limit: int = ...
@@ -22,14 +22,14 @@ class Sitemap:
def paginator(self) -> Paginator: ...
def get_urls(
self, page: Union[int, str] = ..., site: Optional[Union[Site, RequestSite]] = ..., protocol: Optional[str] = ...
) -> List[Dict[str, Optional[Union[datetime, Model, str]]]]: ...
) -> List[Dict[str, Any]]: ...
class GenericSitemap(Sitemap):
priority: None = ...
changefreq: None = ...
priority: Optional[float] = ...
changefreq: Optional[str] = ...
queryset: QuerySet = ...
date_field: None = ...
protocol: None = ...
protocol: Optional[str] = ...
def __init__(
self,
info_dict: Dict[str, Union[datetime, QuerySet, str]],

View File

@@ -1,20 +1,21 @@
from collections import OrderedDict
from typing import Any, Callable, Dict, Optional, Type, Union
from typing import Callable, Dict, Optional, Type, Union
from django.http.request import HttpRequest
from django.template.response import TemplateResponse
from django.contrib.sitemaps import GenericSitemap, Sitemap
from django.core.handlers.wsgi import WSGIRequest
from django.template.response import TemplateResponse
def x_robots_tag(func: Callable) -> Callable: ...
def index(
request: WSGIRequest,
request: HttpRequest,
sitemaps: Dict[str, Union[Type[Sitemap], Sitemap]],
template_name: str = ...,
content_type: str = ...,
sitemap_url_name: str = ...,
) -> TemplateResponse: ...
def sitemap(
request: WSGIRequest,
request: HttpRequest,
sitemaps: Union[Dict[str, Type[Sitemap]], Dict[str, GenericSitemap], OrderedDict],
section: Optional[str] = ...,
template_name: str = ...,

View File

@@ -1,7 +1,7 @@
from collections import OrderedDict
from typing import Any, Callable, Dict, Union
from django.core.cache.backends.base import BaseCache as BaseCache
from .backends.base import BaseCache as BaseCache
DEFAULT_CACHE_ALIAS: str

View File

@@ -1,5 +1,5 @@
from typing import Any, List, Optional, Union
from typing import Any, Iterable, Optional
TEMPLATE_FRAGMENT_KEY_TEMPLATE: str
def make_template_fragment_key(fragment_name: str, vary_on: Optional[Union[List[int], List[str]]] = ...) -> str: ...
def make_template_fragment_key(fragment_name: str, vary_on: Optional[Iterable[Any]] = ...) -> str: ...

View File

@@ -1,6 +1,6 @@
from typing import Any, Callable
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
logger: Any
@@ -13,5 +13,5 @@ class BaseHandler:
def load_middleware(self) -> None: ...
def make_view_atomic(self, view: Callable) -> Callable: ...
def get_exception_response(self, request: Any, resolver: Any, status_code: Any, exception: Any): ...
def get_response(self, request: WSGIRequest) -> HttpResponseBase: ...
def process_exception_by_middleware(self, exception: Exception, request: WSGIRequest) -> HttpResponse: ...
def get_response(self, request: HttpRequest) -> HttpResponseBase: ...
def process_exception_by_middleware(self, exception: Exception, request: HttpRequest) -> HttpResponse: ...

View File

@@ -1,12 +1,12 @@
from typing import Any, Callable
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.urls.resolvers import URLResolver
def convert_exception_to_response(get_response: Callable) -> Callable: ...
def response_for_exception(request: WSGIRequest, exc: Exception) -> HttpResponse: ...
def response_for_exception(request: HttpRequest, exc: Exception) -> HttpResponse: ...
def get_exception_response(
request: WSGIRequest, resolver: URLResolver, status_code: int, exception: Exception, sender: None = ...
request: HttpRequest, resolver: URLResolver, status_code: int, exception: Exception, sender: None = ...
) -> HttpResponse: ...
def handle_uncaught_exception(request: Any, resolver: Any, exc_info: Any): ...

View File

@@ -1,15 +1,16 @@
from typing import Any, List, Optional, Tuple
from django.core.mail.backends.base import BaseEmailBackend
from django.core.mail.message import DEFAULT_ATTACHMENT_MIME_TYPE as DEFAULT_ATTACHMENT_MIME_TYPE
from django.core.mail.message import BadHeaderError as BadHeaderError
from django.core.mail.message import EmailMessage as EmailMessage
from django.core.mail.message import EmailMultiAlternatives as EmailMultiAlternatives
from django.core.mail.message import SafeMIMEMultipart as SafeMIMEMultipart
from django.core.mail.message import SafeMIMEText as SafeMIMEText
from django.core.mail.message import forbid_multi_line_headers as forbid_multi_line_headers
from django.core.mail.utils import DNS_NAME as DNS_NAME
from django.core.mail.utils import CachedDnsName as CachedDnsName
from .backends.base import BaseEmailBackend
from .message import (
BadHeaderError as BadHeaderError,
DEFAULT_ATTACHMENT_MIME_TYPE as DEFAULT_ATTACHMENT_MIME_TYPE,
EmailMessage as EmailMessage,
EmailMultiAlternatives as EmailMultiAlternatives,
SafeMIMEMultipart as SafeMIMEMultipart,
SafeMIMEText as SafeMIMEText,
forbid_multi_line_headers as forbid_multi_line_headers,
)
from .utils import CachedDnsName as CachedDnsName, DNS_NAME as DNS_NAME
def get_connection(backend: Optional[str] = ..., fail_silently: bool = ..., **kwds: Any) -> BaseEmailBackend: ...
def send_mail(
@@ -18,17 +19,17 @@ def send_mail(
from_email: Optional[str],
recipient_list: List[str],
fail_silently: bool = ...,
auth_user: None = ...,
auth_password: None = ...,
auth_user: Optional[str] = ...,
auth_password: Optional[str] = ...,
connection: Optional[BaseEmailBackend] = ...,
html_message: Optional[str] = ...,
) -> int: ...
def send_mass_mail(
datatuple: List[Tuple[str, str, str, List[str]]],
fail_silently: bool = ...,
auth_user: None = ...,
auth_password: None = ...,
connection: BaseEmailBackend = ...,
auth_user: Optional[str] = ...,
auth_password: Optional[str] = ...,
connection: Optional[BaseEmailBackend] = ...,
) -> int: ...
def mail_admins(
subject: str,
@@ -45,4 +46,4 @@ def mail_managers(
html_message: Optional[str] = ...,
) -> None: ...
outbox = [EmailMessage()]
outbox: List[EmailMessage] = ...

View File

@@ -1,8 +1,8 @@
import email
from email._policybase import Policy
from email.mime.message import MIMEMessage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from typing import Any, Dict, List, Optional, Tuple, Union
from typing import Any, Dict, List, Optional, Tuple, Union, Sequence
from django.core.mail.backends.base import BaseEmailBackend
from django.utils.safestring import SafeText
@@ -27,14 +27,14 @@ class MIMEMixin:
class SafeMIMEMessage(MIMEMixin, MIMEMessage):
defects: List[Any]
epilogue: None
policy: email._policybase.Compat32
policy: Policy
preamble: None
def __setitem__(self, name: str, val: str) -> None: ...
class SafeMIMEText(MIMEMixin, MIMEText):
defects: List[Any]
epilogue: None
policy: email._policybase.Compat32
policy: Policy
preamble: None
encoding: str = ...
def __init__(self, _text: str, _subtype: str = ..., _charset: str = ...) -> None: ...
@@ -44,7 +44,7 @@ class SafeMIMEText(MIMEMixin, MIMEText):
class SafeMIMEMultipart(MIMEMixin, MIMEMultipart):
defects: List[Any]
epilogue: None
policy: email._policybase.Compat32
policy: Policy
preamble: None
encoding: str = ...
def __init__(
@@ -71,12 +71,12 @@ class EmailMessage:
subject: str = ...,
body: Optional[str] = ...,
from_email: Optional[str] = ...,
to: Optional[Union[List[str], Tuple[str, str], str]] = ...,
bcc: Optional[Union[List[str], Tuple[str], str]] = ...,
to: Optional[Union[Sequence[str], str]] = ...,
bcc: Optional[Union[Sequence[str], str]] = ...,
connection: Optional[BaseEmailBackend] = ...,
attachments: Optional[Union[List[Tuple[str, str]], List[MIMEText]]] = ...,
headers: Optional[Dict[str, str]] = ...,
cc: Optional[Union[List[str], Tuple[str, str], str]] = ...,
cc: Optional[Union[Sequence[str], str]] = ...,
reply_to: Optional[Union[List[Optional[str]], str]] = ...,
) -> None: ...
def get_connection(self, fail_silently: bool = ...) -> BaseEmailBackend: ...

View File

@@ -11,7 +11,6 @@ class Node:
parents: Set[Any] = ...
def __init__(self, key: Tuple[str, str]) -> None: ...
def __lt__(self, other: Union[Tuple[str, str], Node]) -> bool: ...
def __hash__(self) -> int: ...
def __getitem__(self, item: int) -> str: ...
def add_child(self, child: Node) -> None: ...
def add_parent(self, parent: Node) -> None: ...
@@ -19,13 +18,9 @@ class Node:
def descendants(self) -> List[Tuple[str, str]]: ...
class DummyNode(Node):
children: Set[Any]
key: Tuple[str, str]
parents: Set[Any]
origin: Any = ...
error_message: Any = ...
def __init__(self, key: Tuple[str, str], origin: Union[Migration, str], error_message: str) -> None: ...
__class__: Any = ...
def promote(self) -> None: ...
def raise_error(self) -> None: ...

View File

@@ -1,11 +1,11 @@
from typing import Any, Dict, Optional, Set, Tuple, Union, Sequence
from typing import Any, Dict, Optional, Sequence, Set, Tuple, Union
from django.db import DefaultConnectionProxy
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.db.migrations.migration import Migration, SwappableTuple
from django.db.migrations.state import ProjectState
from django.db import DefaultConnectionProxy
MIGRATIONS_MODULE_NAME: str
class MigrationLoader:

View File

@@ -13,7 +13,6 @@ class Migration:
name: str = ...
app_label: str = ...
def __init__(self, name: str, app_label: str) -> None: ...
def __hash__(self) -> int: ...
def mutate_state(self, project_state: ProjectState, preserve: bool = ...) -> ProjectState: ...
def apply(
self, project_state: ProjectState, schema_editor: BaseDatabaseSchemaEditor, collect_sql: bool = ...
@@ -24,6 +23,6 @@ class Migration:
class SwappableTuple(tuple):
setting: str = ...
def __new__(cls: Type[SwappableTuple], value: Tuple[str, str], setting: str) -> SwappableTuple: ...
def __new__(cls, value: Tuple[str, str], setting: str) -> SwappableTuple: ...
def swappable_dependency(value: str) -> SwappableTuple: ...

View File

@@ -1,7 +1,3 @@
# Stubs for django.db.migrations.operations (Python 3.6)
#
# NOTE: This dynamically typed stub was automatically generated by stubgen.
from .fields import (
AddField as AddField,
AlterField as AlterField,

View File

@@ -1,4 +1,4 @@
from typing import Any, List, Optional, Type
from typing import Any, List
class Operation:
reversible: bool = ...
@@ -6,7 +6,6 @@ class Operation:
atomic: bool = ...
elidable: bool = ...
serialization_expand_args: Any = ...
def __new__(cls: Type[Operation], *args: Any, **kwargs: Any) -> Operation: ...
def deconstruct(self): ...
def state_forwards(self, app_label: Any, state: Any) -> None: ...
def database_forwards(self, app_label: Any, schema_editor: Any, from_state: Any, to_state: Any) -> None: ...

View File

@@ -12,7 +12,6 @@ class ModelOperation(Operation):
def name_lower(self) -> str: ...
class CreateModel(ModelOperation):
serialization_expand_args: Any = ...
fields: Sequence[Tuple[str, Field]] = ...
options: Any = ...
bases: Optional[Sequence[Union[type, str]]] = ...
@@ -63,7 +62,6 @@ class AlterModelOptions(ModelOptionOperation):
def __init__(self, name: str, options: Dict[str, Any]) -> None: ...
class AlterModelManagers(ModelOptionOperation):
serialization_expand_args: Any = ...
managers: Any = ...
def __init__(self, name: Any, managers: Any) -> None: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Optional, Sequence, Dict
from typing import Any, Callable, Dict, Optional, Sequence
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
@@ -6,7 +6,6 @@ from django.db.migrations.state import StateApps
from .base import Operation
class SeparateDatabaseAndState(Operation):
serialization_expand_args: Any = ...
database_operations: Sequence[Operation] = ...
state_operations: Sequence[Operation] = ...
def __init__(
@@ -19,7 +18,6 @@ class RunSQL(Operation):
reverse_sql: Any = ...
state_operations: Any = ...
hints: Any = ...
elidable: Any = ...
def __init__(
self,
sql: Any,
@@ -30,12 +28,9 @@ class RunSQL(Operation):
) -> None: ...
class RunPython(Operation):
reduces_to_sql: bool = ...
atomic: bool = ...
code: Callable = ...
reverse_code: Optional[Callable] = ...
hints: Optional[Dict[str, Any]] = ...
elidable: bool = ...
def __init__(
self,
code: Callable,

View File

@@ -1,6 +1,5 @@
from typing import Any, Optional
from django.db.migrations.state import ProjectState
from django.db.models.fields import Field
def is_referenced_by_foreign_key(state: ProjectState, model_name_lower: str, field: Field, field_name: str) -> bool: ...

View File

@@ -1,7 +1,7 @@
from typing import Any, List, Optional
from typing import List, Optional
from django.db.migrations.operations.base import Operation
class MigrationOptimizer:
def optimize(self, operations: List[Operation], app_label: str = ...) -> List[Operation]: ...
def optimize_inner(self, operations: List[Operation], app_label: str = ...) -> List[Operation]: ...
def optimize(self, operations: List[Operation], app_label: Optional[str] = ...) -> List[Operation]: ...
def optimize_inner(self, operations: List[Operation], app_label: Optional[str] = ...) -> List[Operation]: ...

View File

@@ -1,14 +1,13 @@
from typing import Any, Dict, Optional, Set
from django.db.migrations.state import ModelState
from django.db.models.fields import Field
from .loader import MigrationLoader
class MigrationQuestioner:
defaults: Dict[Any, Any] = ...
specified_apps: Set[Any] = ...
dry_run: None = ...
defaults: Dict[str, Any] = ...
specified_apps: Set[str] = ...
dry_run: Optional[bool] = ...
def __init__(
self,
defaults: Optional[Dict[str, bool]] = ...,
@@ -23,21 +22,5 @@ class MigrationQuestioner:
def ask_merge(self, app_label: str) -> bool: ...
def ask_auto_now_add_addition(self, field_name: str, model_name: str) -> None: ...
class InteractiveMigrationQuestioner(MigrationQuestioner):
defaults: Dict[Any, Any]
dry_run: bool
specified_apps: Set[str]
def ask_not_null_addition(self, field_name: str, model_name: str) -> None: ...
def ask_not_null_alteration(self, field_name: Any, model_name: Any): ...
def ask_rename(self, model_name: Any, old_name: Any, new_name: Any, field_instance: Any): ...
def ask_rename_model(self, old_model_state: Any, new_model_state: Any): ...
def ask_merge(self, app_label: str) -> bool: ...
def ask_auto_now_add_addition(self, field_name: str, model_name: str) -> int: ...
class NonInteractiveMigrationQuestioner(MigrationQuestioner):
defaults: Dict[Any, Any]
dry_run: bool
specified_apps: Set[str]
def ask_not_null_addition(self, field_name: Any, model_name: Any) -> None: ...
def ask_not_null_alteration(self, field_name: Any, model_name: Any): ...
def ask_auto_now_add_addition(self, field_name: Any, model_name: Any) -> None: ...
class InteractiveMigrationQuestioner(MigrationQuestioner): ...
class NonInteractiveMigrationQuestioner(MigrationQuestioner): ...

View File

@@ -1,9 +1,10 @@
from typing import Any, Optional, Set, Tuple, Union
from typing import Any, Optional, Set, Tuple
from django.db import models
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.query import QuerySet
from django.db import models
class MigrationRecorder:
class Migration(models.Model):
app: Any = ...

View File

@@ -1,88 +1,40 @@
from typing import Any, Callable, Dict, List, Set, Tuple, Union
from django.db.models.fields import Field
class BaseSerializer:
value: Any = ...
def __init__(self, value: Any) -> None: ...
def serialize(self) -> None: ...
def serialize(self) -> Any: ...
class BaseSequenceSerializer(BaseSerializer):
def serialize(self) -> Tuple[str, Set[str]]: ...
class BaseSimpleSerializer(BaseSerializer):
value: str
def serialize(self) -> Tuple[str, Set[Any]]: ...
class DatetimeSerializer(BaseSerializer):
value: Any = ...
def serialize(self): ...
class DateSerializer(BaseSerializer):
def serialize(self): ...
class DecimalSerializer(BaseSerializer):
def serialize(self): ...
class BaseSequenceSerializer(BaseSerializer): ...
class BaseSimpleSerializer(BaseSerializer): ...
class DatetimeSerializer(BaseSerializer): ...
class DateSerializer(BaseSerializer): ...
class DecimalSerializer(BaseSerializer): ...
class DeconstructableSerializer(BaseSerializer):
@staticmethod
def serialize_deconstructed(
path: str, args: List[Any], kwargs: Dict[str, Union[Callable, int, str]]
) -> Tuple[str, Set[str]]: ...
def serialize(self): ...
class DictionarySerializer(BaseSerializer):
def serialize(self): ...
class EnumSerializer(BaseSerializer):
def serialize(self): ...
class FloatSerializer(BaseSimpleSerializer):
def serialize(self): ...
class DictionarySerializer(BaseSerializer): ...
class EnumSerializer(BaseSerializer): ...
class FloatSerializer(BaseSimpleSerializer): ...
class FrozensetSerializer(BaseSequenceSerializer): ...
class FunctionTypeSerializer(BaseSerializer):
value: Callable
def serialize(self) -> Tuple[str, Set[str]]: ...
class FunctoolsPartialSerializer(BaseSerializer):
def serialize(self): ...
class IterableSerializer(BaseSerializer):
def serialize(self): ...
class ModelFieldSerializer(DeconstructableSerializer):
value: Field
def serialize(self) -> Tuple[str, Set[str]]: ...
class ModelManagerSerializer(DeconstructableSerializer):
def serialize(self): ...
class OperationSerializer(BaseSerializer):
def serialize(self): ...
class RegexSerializer(BaseSerializer):
def serialize(self): ...
class FunctionTypeSerializer(BaseSerializer): ...
class FunctoolsPartialSerializer(BaseSerializer): ...
class IterableSerializer(BaseSerializer): ...
class ModelFieldSerializer(DeconstructableSerializer): ...
class ModelManagerSerializer(DeconstructableSerializer): ...
class OperationSerializer(BaseSerializer): ...
class RegexSerializer(BaseSerializer): ...
class SequenceSerializer(BaseSequenceSerializer): ...
class SetSerializer(BaseSequenceSerializer): ...
class SettingsReferenceSerializer(BaseSerializer):
def serialize(self): ...
class TimedeltaSerializer(BaseSerializer):
def serialize(self): ...
class TimeSerializer(BaseSerializer):
def serialize(self): ...
class SettingsReferenceSerializer(BaseSerializer): ...
class TimedeltaSerializer(BaseSerializer): ...
class TimeSerializer(BaseSerializer): ...
class TupleSerializer(BaseSequenceSerializer): ...
class TypeSerializer(BaseSerializer):
def serialize(self): ...
class UUIDSerializer(BaseSerializer):
def serialize(self): ...
class TypeSerializer(BaseSerializer): ...
class UUIDSerializer(BaseSerializer): ...
def serializer_factory(value: Any) -> BaseSerializer: ...

View File

@@ -1,9 +1,8 @@
from typing import Any, Dict, Iterator, List, Optional, Tuple, Type, DefaultDict, Union, Sequence
from typing import Any, DefaultDict, Dict, Iterator, List, Optional, Sequence, Tuple, Type, Union
from django.apps.registry import Apps
from django.db.models.base import Model
from django.db.models.manager import Manager
from django.utils.functional import cached_property
from django.db.models.fields import Field

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, Iterator, List, Optional, Set
from typing import Dict, Iterator, List, Set
from django.db.migrations.operations.base import Operation

View File

@@ -1,12 +1,10 @@
from typing import Any, Optional
from django.utils.functional import SimpleLazyObject
from typing import Any
COMPILED_REGEX_TYPE: Any
class RegexObject:
pattern: str = ...
flags: int = ...
def __init__(self, obj: SimpleLazyObject) -> None: ...
def __init__(self, obj: Any) -> None: ...
def get_migration_name_timestamp() -> str: ...

View File

@@ -1,13 +1,10 @@
from typing import Any, Optional, Set, Tuple, Type, List, Union
from typing import Any, List, Set, Tuple, Union
from django.db.migrations.migration import Migration
from django.db.migrations.operations.base import Operation
from django.db.migrations.operations.models import CreateModel
class SettingsReference(str):
def __new__(self: Type[SettingsReference], value: str, setting_name: str) -> SettingsReference: ...
setting_name: str = ...
def __init__(self, value: str, setting_name: str) -> None: ...
class OperationWriter:

View File

@@ -1,6 +1,6 @@
from collections import UserList
from datetime import datetime
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union, Sequence
from typing import Any, Dict, List, Optional, Sequence, Union
from django.core.exceptions import ValidationError
from django.utils.safestring import SafeText
@@ -28,9 +28,6 @@ class ErrorList(UserList):
def as_json(self, escape_html: bool = ...) -> str: ...
def as_ul(self) -> str: ...
def as_text(self) -> str: ...
def __reduce_ex__(
self, *args: Any, **kwargs: Any
) -> Tuple[Callable, Tuple[Type[ErrorList]], Dict[str, Union[List[ValidationError], str]], None, None]: ...
def from_current_timezone(value: datetime) -> datetime: ...
def to_current_timezone(value: datetime) -> datetime: ...

View File

@@ -1,9 +1,8 @@
import datetime
from io import BytesIO
from json import JSONEncoder
from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union, overload, AnyStr, IO
from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union, overload
import six
from django.core.handlers.wsgi import WSGIRequest
from django.http.cookie import SimpleCookie
from django.test.client import Client
@@ -13,7 +12,7 @@ from django.urls import ResolverMatch
class BadHeaderError(ValueError): ...
class HttpResponseBase(Iterable[AnyStr]):
class HttpResponseBase(Iterable[Any]):
status_code: int = ...
cookies: SimpleCookie = ...
reason_phrase: str = ...
@@ -60,7 +59,7 @@ class HttpResponseBase(Iterable[AnyStr]):
def seekable(self) -> bool: ...
def writable(self) -> bool: ...
def writelines(self, lines: Iterable[object]): ...
def __iter__(self) -> Iterator[AnyStr]: ...
def __iter__(self) -> Iterator[Any]: ...
class HttpResponse(HttpResponseBase):
client: Client
@@ -70,7 +69,6 @@ class HttpResponse(HttpResponseBase):
request: Dict[str, Any]
resolver_match: ResolverMatch
sameorigin: bool
status_code: int
templates: List[Template]
test_server_port: str
test_was_secure_request: bool
@@ -88,21 +86,13 @@ class HttpResponse(HttpResponseBase):
def json(self) -> Dict[str, Any]: ...
class StreamingHttpResponse(HttpResponseBase):
def __init__(self, streaming_content: Iterable[AnyStr] = ..., *args: Any, **kwargs: Any) -> None: ...
@property
def content(self) -> AnyStr: ...
@content.setter
def content(self, value: AnyStr) -> None: ...
@property
def streaming_content(self) -> Iterator[AnyStr]: ...
@streaming_content.setter
def streaming_content(self, value: Iterable[AnyStr]) -> None: ...
def __iter__(self) -> Iterator[AnyStr]: ...
def getvalue(self) -> AnyStr: ...
content: Any
streaming_content: Iterator[Any]
def __init__(self, streaming_content: Iterable[Any] = ..., *args: Any, **kwargs: Any) -> None: ...
def getvalue(self) -> Any: ...
class FileResponse(StreamingHttpResponse):
client: Client
closed: bool
context: None
file_to_stream: Optional[BytesIO]
request: Dict[str, str]
@@ -119,8 +109,6 @@ class FileResponse(StreamingHttpResponse):
class HttpResponseRedirectBase(HttpResponse):
allowed_schemes = ... # type: List[str]
def __init__(self, redirect_to: str, *args: Any, **kwargs: Any) -> None: ...
@property
def url(self) -> str: ...
class HttpResponseRedirect(HttpResponseRedirectBase): ...
class HttpResponsePermanentRedirect(HttpResponseRedirectBase): ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Optional, Union
from typing import Any, Optional, Union, Callable
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
@@ -26,4 +26,6 @@ class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware):
cache_alias: str = ...
cache_timeout: float = ...
cache: BaseCache = ...
def __init__(self, get_response: None = ..., cache_timeout: Optional[float] = ..., **kwargs: Any) -> None: ...
def __init__(
self, get_response: Optional[Callable] = ..., cache_timeout: Optional[float] = ..., **kwargs: Any
) -> None: ...

View File

@@ -1,10 +1,10 @@
from typing import Any
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
re_accepts_gzip: Any
class GZipMiddleware(MiddlewareMixin):
def process_response(self, request: WSGIRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...

View File

@@ -1,7 +1,7 @@
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
class ConditionalGetMiddleware(MiddlewareMixin):
def process_response(self, request: WSGIRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def needs_etag(self, response: HttpResponseBase) -> bool: ...

View File

@@ -1,10 +1,10 @@
from typing import Any
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponseBase
from django.utils.deprecation import MiddlewareMixin
class LocaleMiddleware(MiddlewareMixin):
response_redirect_class: Any = ...
def process_request(self, request: WSGIRequest) -> None: ...
def process_response(self, request: WSGIRequest, response: HttpResponseBase) -> HttpResponseBase: ...
def process_request(self, request: HttpRequest) -> None: ...
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ...

View File

@@ -1,6 +1,6 @@
from typing import Any, Optional, List
from typing import Any, List, Optional
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponsePermanentRedirect
from django.utils.deprecation import MiddlewareMixin
@@ -13,5 +13,5 @@ class SecurityMiddleware(MiddlewareMixin):
redirect: bool = ...
redirect_host: Optional[str] = ...
redirect_exempt: List[Any] = ...
def process_request(self, request: WSGIRequest) -> Optional[HttpResponsePermanentRedirect]: ...
def process_response(self, request: WSGIRequest, response: HttpResponse) -> HttpResponse: ...
def process_request(self, request: HttpRequest) -> Optional[HttpResponsePermanentRedirect]: ...
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...

View File

@@ -9,8 +9,6 @@ from django.http.cookie import SimpleCookie
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponseBase
from django.core.handlers.wsgi import WSGIRequest
BOUNDARY: str = ...
MULTIPART_CONTENT: str = ...
CONTENT_TYPE_RE: Pattern = ...
@@ -42,13 +40,13 @@ class RequestFactory:
cookies: SimpleCookie = ...
errors: BytesIO = ...
def __init__(self, *, json_encoder: Any = ..., **defaults: Any) -> None: ...
def request(self, **request: Any) -> WSGIRequest: ...
def get(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> WSGIRequest: ...
def request(self, **request: Any) -> HttpRequest: ...
def get(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> HttpRequest: ...
def post(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> WSGIRequest: ...
def head(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> WSGIRequest: ...
def trace(self, path: str, secure: bool = ..., **extra: Any) -> WSGIRequest: ...
) -> HttpRequest: ...
def head(self, path: str, data: Any = ..., secure: bool = ..., **extra: Any) -> HttpRequest: ...
def trace(self, path: str, secure: bool = ..., **extra: Any) -> HttpRequest: ...
def options(
self,
path: str,
@@ -56,16 +54,16 @@ class RequestFactory:
content_type: str = ...,
secure: bool = ...,
**extra: Any
) -> WSGIRequest: ...
) -> HttpRequest: ...
def put(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> WSGIRequest: ...
) -> HttpRequest: ...
def patch(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> WSGIRequest: ...
) -> HttpRequest: ...
def delete(
self, path: str, data: Any = ..., content_type: str = ..., secure: bool = ..., **extra: Any
) -> WSGIRequest: ...
) -> HttpRequest: ...
def generic(
self,
method: str,
@@ -74,7 +72,7 @@ class RequestFactory:
content_type: Optional[str] = ...,
secure: bool = ...,
**extra: Any
) -> WSGIRequest: ...
) -> HttpRequest: ...
class Client:
json_encoder: Type[DjangoJSONEncoder] = ...

View File

@@ -1,5 +1,5 @@
from html.parser import HTMLParser
from typing import Any, List, Optional, Tuple, Union, TypeVar, Iterable, Sequence
from typing import Any, List, Optional, Sequence, Tuple, TypeVar, Union
_Self = TypeVar("_Self")

View File

@@ -1,22 +1,14 @@
from typing import Any, Callable, Dict, List, Tuple, Type, Union
from typing import Any
from django.test import LiveServerTestCase
class SeleniumTestCaseBase:
browsers: Any = ...
browser: Any = ...
def __new__(
cls: Type[SeleniumTestCaseBase],
name: str,
bases: Tuple[Type[SeleniumTestCase]],
attrs: Dict[str, Union[Callable, List[str], str]],
) -> Type[SeleniumTestCase]: ...
@classmethod
def import_webdriver(cls, browser: Any): ...
def create_webdriver(self): ...
class SeleniumTestCase(LiveServerTestCase):
implicit_wait: int = ...
@classmethod
def setUpClass(cls) -> None: ...
def disable_implicit_wait(self) -> None: ...

View File

@@ -18,14 +18,9 @@ from django.utils.safestring import SafeText
from django.db import connections as connections
class _AssertNumQueriesContext(CaptureQueriesContext):
connection: Any
final_queries: Optional[int]
force_debug_cursor: bool
initial_queries: int
test_case: SimpleTestCase = ...
num: int = ...
def __init__(self, test_case: Any, num: Any, connection: Any) -> None: ...
def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any): ...
class _AssertTemplateUsedContext:
test_case: SimpleTestCase = ...
@@ -40,14 +35,7 @@ class _AssertTemplateUsedContext:
def __enter__(self): ...
def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any): ...
class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext):
context: ContextList
rendered_template_names: List[str]
rendered_templates: List[Template]
template_name: str
test_case: SimpleTestCase
def test(self): ...
def message(self): ...
class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext): ...
class _CursorFailure:
cls_name: str = ...
@@ -59,10 +47,6 @@ class SimpleTestCase(unittest.TestCase):
client_class: Any = ...
client: Client
allow_database_queries: bool = ...
@classmethod
def setUpClass(cls) -> None: ...
@classmethod
def tearDownClass(cls) -> None: ...
def __call__(self, result: unittest.TestResult = ...) -> None: ...
def settings(self, **kwargs: Any) -> Any: ...
def modify_settings(self, **kwargs: Any) -> Any: ...
@@ -150,7 +134,6 @@ class TransactionTestCase(SimpleTestCase):
fixtures: Any = ...
multi_db: bool = ...
serialized_rollback: bool = ...
allow_database_queries: bool = ...
def assertQuerysetEqual(
self,
qs: Union[Iterator[Any], List[Model], QuerySet, RawQuerySet],
@@ -164,10 +147,6 @@ class TransactionTestCase(SimpleTestCase):
) -> Optional[_AssertNumQueriesContext]: ...
class TestCase(TransactionTestCase):
@classmethod
def setUpClass(cls) -> None: ...
@classmethod
def tearDownClass(cls) -> None: ...
@classmethod
def setUpTestData(cls) -> None: ...
@@ -181,17 +160,14 @@ def skipIfDBFeature(*features: Any) -> Callable: ...
def skipUnlessDBFeature(*features: Any) -> Callable: ...
def skipUnlessAnyDBFeature(*features: Any) -> Callable: ...
class QuietWSGIRequestHandler(WSGIRequestHandler):
def log_message(*args: Any) -> None: ...
class QuietWSGIRequestHandler(WSGIRequestHandler): ...
class FSFilesHandler(WSGIHandler):
application: Any = ...
base_url: Any = ...
def __init__(self, application: Any) -> None: ...
def file_path(self, url: Any): ...
def get_response(self, request: Any): ...
def serve(self, request: Any): ...
def __call__(self, environ: Any, start_response: Any): ...
class _StaticFilesHandler(FSFilesHandler):
def get_base_dir(self): ...
@@ -216,7 +192,6 @@ class LiveServerThread(threading.Thread):
port: int = ...,
) -> None: ...
httpd: ThreadedWSGIServer = ...
def run(self) -> None: ...
def terminate(self) -> None: ...
class LiveServerTestCase(TransactionTestCase):
@@ -225,10 +200,6 @@ class LiveServerTestCase(TransactionTestCase):
server_thread_class: Any = ...
static_handler: Any = ...
def live_server_url(cls): ...
@classmethod
def setUpClass(cls) -> None: ...
@classmethod
def tearDownClass(cls) -> None: ...
class SerializeMixin:
lockfile: Any = ...

View File

@@ -66,15 +66,15 @@ class override_system_checks(TestContextDecorator):
class CaptureQueriesContext:
connection: Any = ...
force_debug_cursor: bool = ...
initial_queries: int = ...
final_queries: Optional[int] = ...
def __init__(self, connection: Any) -> None: ...
def __iter__(self): ...
def __getitem__(self, index: int) -> Dict[str, str]: ...
def __len__(self) -> int: ...
@property
def captured_queries(self) -> List[Dict[str, str]]: ...
force_debug_cursor: bool = ...
initial_queries: int = ...
final_queries: Optional[int] = ...
def __enter__(self) -> CaptureQueriesContext: ...
def __exit__(self, exc_type: None, exc_value: None, traceback: None) -> None: ...

View File

@@ -1,3 +1 @@
from django.views.generic.base import View
__all__ = ["View"]
from .generic.base import View as View

View File

@@ -1,5 +1,3 @@
from typing import Any, Optional
from django.http.request import HttpRequest
from django.http.response import HttpResponseForbidden

View File

@@ -34,9 +34,9 @@ class SafeExceptionReporterFilter(ExceptionReporterFilter):
class ExceptionReporter:
request: Optional[HttpRequest] = ...
filter: ExceptionReporterFilter = ...
exc_type: None = ...
exc_type: Optional[Type[BaseException]] = ...
exc_value: Optional[str] = ...
tb: None = ...
tb: Optional[TracebackType] = ...
is_email: bool = ...
template_info: None = ...
template_does_not_exist: bool = ...
@@ -59,7 +59,7 @@ class ExceptionReporter:
lineno: int,
context_lines: int,
loader: Optional[SourceLoader] = ...,
module_name: Optional[str] = None,
module_name: Optional[str] = ...,
): ...
def technical_404_response(request: HttpRequest, exception: Http404) -> HttpResponse: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Optional
from typing import Callable
def xframe_options_deny(view_func: Callable) -> Callable: ...
def xframe_options_sameorigin(view_func: Callable) -> Callable: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Optional
from typing import Any, Callable
from django.middleware.csrf import CsrfViewMiddleware

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Optional
from typing import Any, Callable
def sensitive_variables(*variables: Any) -> Callable: ...
def sensitive_post_parameters(*parameters: Any) -> Callable: ...

View File

@@ -1,4 +1,4 @@
from typing import Any, Callable, Optional
from typing import Any, Callable
def vary_on_headers(*headers: Any) -> Callable: ...
def vary_on_cookie(func: Callable) -> Callable: ...

View File

@@ -1,8 +1,7 @@
from typing import Any, Optional
from typing import Optional
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import (
Http404,
HttpResponseBadRequest,
HttpResponseForbidden,
HttpResponseNotFound,
@@ -15,10 +14,10 @@ ERROR_400_TEMPLATE_NAME: str
ERROR_500_TEMPLATE_NAME: str
def page_not_found(
request: WSGIRequest, exception: Optional[Http404], template_name: str = ...
request: HttpRequest, exception: Optional[Exception], template_name: str = ...
) -> HttpResponseNotFound: ...
def server_error(request: WSGIRequest, template_name: str = ...) -> HttpResponseServerError: ...
def bad_request(request: WSGIRequest, exception: Exception, template_name: str = ...) -> HttpResponseBadRequest: ...
def server_error(request: HttpRequest, template_name: str = ...) -> HttpResponseServerError: ...
def bad_request(request: HttpRequest, exception: Exception, template_name: str = ...) -> HttpResponseBadRequest: ...
def permission_denied(
request: WSGIRequest, exception: Exception, template_name: str = ...
request: HttpRequest, exception: Exception, template_name: str = ...
) -> HttpResponseForbidden: ...

View File

@@ -1,5 +1,5 @@
from django.views.generic.base import RedirectView as RedirectView, TemplateView as TemplateView, View as View
from django.views.generic.dates import (
from .base import RedirectView as RedirectView, TemplateView as TemplateView, View as View
from .dates import (
ArchiveIndexView as ArchiveIndexView,
DateDetailView as DateDetailView,
DayArchiveView as DayArchiveView,
@@ -8,13 +8,8 @@ from django.views.generic.dates import (
WeekArchiveView as WeekArchiveView,
YearArchiveView as YearArchiveView,
)
from django.views.generic.detail import DetailView as DetailView
from django.views.generic.edit import (
CreateView as CreateView,
DeleteView as DeleteView,
FormView as FormView,
UpdateView as UpdateView,
)
from django.views.generic.list import ListView as ListView
from .detail import DetailView as DetailView
from .edit import CreateView as CreateView, DeleteView as DeleteView, FormView as FormView, UpdateView as UpdateView
from .list import ListView as ListView
class GenericViewError(Exception): ...

View File

@@ -38,7 +38,6 @@ class RedirectView(View):
def get(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ...
def head(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ...
def post(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ...
def options(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ...
def delete(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ...
def put(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ...
def patch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http.HttpResponse: ...

View File

@@ -8,49 +8,49 @@ from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResp
from django.views.generic.list import MultipleObjectMixin, MultipleObjectTemplateResponseMixin
class YearMixin:
year_format = ... # type: str
year = ... # type: Optional[str]
kwargs = ... # type: Dict[str, object]
request = ... # type: HttpRequest
year_format: str = ...
year: Optional[str] = ...
kwargs: Dict[str, Any] = ...
request: HttpRequest = ...
def get_year_format(self) -> str: ...
def get_year(self) -> str: ...
def get_next_year(self, date: datetime.date) -> Optional[datetime.date]: ...
def get_previous_year(self, date: datetime.date) -> Optional[datetime.date]: ...
class MonthMixin:
month_format = ... # type: str
month = ... # type: Optional[str]
request = ... # type: HttpRequest
kwargs = ... # type: Dict[str, object]
month_format: str = ...
month: Optional[str] = ...
request: HttpRequest = ...
kwargs: Dict[str, Any] = ...
def get_month_format(self) -> str: ...
def get_month(self) -> str: ...
def get_next_month(self, date: datetime.date) -> Optional[datetime.date]: ...
def get_previous_month(self, date: datetime.date) -> Optional[datetime.date]: ...
class DayMixin:
day_format = ... # type: str
day = ... # type: Optional[str]
request = ... # type: HttpRequest
kwargs = ... # type: Dict[str, object]
day_format: str = ...
day: Optional[str] = ...
request: HttpRequest = ...
kwargs: Dict[str, Any] = ...
def get_day_format(self) -> str: ...
def get_day(self) -> str: ...
def get_next_day(self, date: datetime.date) -> Optional[datetime.date]: ...
def get_previous_day(self, date: datetime.date) -> Optional[datetime.date]: ...
class WeekMixin:
week_format = ... # type: str
week = ... # type: Optional[str]
request = ... # type: HttpRequest
kwargs = ... # type: Dict[str, object]
week_format: str = ...
week: Optional[str] = ...
request: HttpRequest = ...
kwargs: Dict[str, Any] = ...
def get_week_format(self) -> str: ...
def get_week(self) -> str: ...
def get_next_week(self, date: datetime.date) -> Optional[datetime.date]: ...
def get_previous_week(self, date: datetime.date) -> Optional[datetime.date]: ...
class DateMixin:
date_field = ... # type: Optional[str]
allow_future = ... # type: bool
model = ... # type: Optional[Type[models.Model]]
date_field: Optional[str] = ...
allow_future: bool = ...
model: Optional[Type[models.Model]] = ...
def get_date_field(self) -> str: ...
def get_allow_future(self) -> bool: ...
def uses_datetime_field(self) -> bool: ...
@@ -58,63 +58,33 @@ class DateMixin:
DatedItems = Tuple[Optional[Sequence[datetime.date]], Sequence[object], Dict[str, Any]]
class BaseDateListView(MultipleObjectMixin, DateMixin, View):
allow_empty = ... # type: bool
date_list_period = ... # type: str
def render_to_response(self, context: Dict[str, object], **response_kwargs: object) -> HttpResponse: ...
def get(self, request: HttpRequest, *args: object, **kwargs: object) -> HttpResponse: ...
date_list_period: str = ...
def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ...
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_dated_items(self) -> DatedItems: ...
def get_ordering(self) -> Sequence[str]: ...
def get_dated_queryset(self, **lookup: object) -> models.query.QuerySet: ...
def get_dated_queryset(self, **lookup: Any) -> models.query.QuerySet: ...
def get_date_list_period(self) -> str: ...
def get_date_list(
self, queryset: models.query.QuerySet, date_type: str = None, ordering: str = ...
self, queryset: models.query.QuerySet, date_type: Optional[str] = ..., ordering: str = ...
) -> models.query.QuerySet: ...
class BaseArchiveIndexView(BaseDateListView):
context_object_name = ... # type: str
def get_dated_items(self) -> DatedItems: ...
class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView):
template_name_suffix = ... # type: str
class BaseArchiveIndexView(BaseDateListView): ...
class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView): ...
class BaseYearArchiveView(YearMixin, BaseDateListView):
date_list_period = ... # type: str
make_object_list = ... # type: bool
def get_dated_items(self) -> DatedItems: ...
make_object_list: bool = ...
def get_make_object_list(self) -> bool: ...
class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView):
template_name_suffix = ... # type: str
class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView):
date_list_period = ... # type: str
def get_dated_items(self) -> DatedItems: ...
class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView):
template_name_suffix = ... # type: str
class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView):
def get_dated_items(self) -> DatedItems: ...
class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView):
template_name_suffix = ... # type: str
class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView):
def get_dated_items(self) -> DatedItems: ...
class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView):
template_name_suffix = ... # type: str
class BaseTodayArchiveView(BaseDayArchiveView):
def get_dated_items(self) -> DatedItems: ...
class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView):
template_name_suffix = ... # type: str
class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView):
def get_object(self, queryset: models.query.QuerySet = None) -> models.Model: ...
class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView):
template_name_suffix = ... # type: str
class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView): ...
class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView): ...
class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView): ...
class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView): ...
class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView): ...
class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView): ...
class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView): ...
class BaseTodayArchiveView(BaseDayArchiveView): ...
class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView): ...
class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView): ...
class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView): ...
def timezone_today() -> datetime.date: ...

View File

@@ -1,8 +1,9 @@
from typing import Any, Dict, List, Optional, Type
from typing import Any, Dict, Optional, Type
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from django.db import models
from django.http import HttpResponse, HttpRequest
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from django.http import HttpRequest, HttpResponse
class SingleObjectMixin(ContextMixin):
model: Optional[Type[models.Model]] = ...
@@ -14,11 +15,10 @@ class SingleObjectMixin(ContextMixin):
query_pk_and_slug: bool = ...
object: models.Model = ...
kwargs: Dict[str, Any] = ...
def get_object(self, queryset: Optional[models.query.QuerySet] = None) -> models.Model: ...
def get_object(self, queryset: Optional[models.query.QuerySet] = ...) -> models.Model: ...
def get_queryset(self) -> models.query.QuerySet: ...
def get_slug_field(self) -> str: ...
def get_context_object_name(self, obj: Any) -> Optional[str]: ...
def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ...
class BaseDetailView(SingleObjectMixin, View):
def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ...
@@ -29,6 +29,5 @@ class SingleObjectTemplateResponseMixin(TemplateResponseMixin):
template_name_suffix: str = ...
model: Optional[Type[models.Model]] = ...
object: models.Model = ...
def get_template_names(self) -> List[str]: ...
class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView): ...

View File

@@ -1,24 +1,25 @@
from typing import Any, Dict, List, Optional, Sequence, Tuple, Type
from typing import Any, Dict, Optional, Sequence, Tuple, Type
from django.db.models import Model
from django.core.paginator import Paginator
from django.db.models.query import QuerySet
from django.core.paginator import Paginator # type: ignore # This will be fixed when adding the paginator module
from django.http import HttpRequest, HttpResponse
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View
from django.db.models import Model
from django.http import HttpRequest, HttpResponse
class MultipleObjectMixin(ContextMixin):
allow_empty = ... # type: bool
queryset = ... # type: Optional[QuerySet]
model = ... # type: Optional[Type[Model]]
paginate_by = ... # type: Optional[int]
paginate_orphans = ... # type: int
context_object_name = ... # type: Optional[str]
paginator_class = ... # type: Type[Paginator]
page_kwarg = ... # type: str
ordering = ... # type: Sequence[str]
request = ... # type: HttpRequest
kwargs = ... # type: Dict[str, object]
object_list = ... # type: QuerySet
allow_empty: bool = ...
queryset: Optional[QuerySet] = ...
model: Optional[Type[Model]] = ...
paginate_by: Optional[int] = ...
paginate_orphans: int = ...
context_object_name: Optional[str] = ...
paginator_class: Type[Paginator] = ...
page_kwarg: str = ...
ordering: Sequence[str] = ...
request: HttpRequest = ...
kwargs: Dict[str, Any] = ...
object_list: QuerySet = ...
def get_queryset(self) -> QuerySet: ...
def get_ordering(self) -> Sequence[str]: ...
def paginate_queryset(self, queryset: QuerySet, page_size: int) -> Tuple[Paginator, int, QuerySet, bool]: ...
@@ -29,16 +30,13 @@ class MultipleObjectMixin(ContextMixin):
def get_paginate_orphans(self) -> int: ...
def get_allow_empty(self) -> bool: ...
def get_context_object_name(self, object_list: QuerySet) -> Optional[str]: ...
def get_context_data(self, **kwargs: object) -> Dict[str, Any]: ...
class BaseListView(MultipleObjectMixin, View):
object_list = ... # type: QuerySet
def render_to_response(self, context: Dict[str, object], **response_kwargs: object) -> HttpResponse: ...
def get(self, request: HttpRequest, *args: object, **kwargs: object) -> HttpResponse: ...
def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ...
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
class MultipleObjectTemplateResponseMixin(TemplateResponseMixin):
template_name_suffix = ... # type: str
object_list = ... # type: QuerySet
def get_template_names(self) -> List[str]: ...
template_name_suffix: str = ...
object_list: QuerySet = ...
class ListView(MultipleObjectTemplateResponseMixin, BaseListView): ...

View File

@@ -1,12 +1,14 @@
from typing import Any, Dict, List, Optional, Union
from typing import Any, Callable, Dict, List, Optional, Union
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.translation.trans_real import DjangoTranslation
from django.views.generic import View
LANGUAGE_QUERY_PARAMETER: str
def set_language(request: WSGIRequest) -> HttpResponse: ...
def set_language(request: HttpRequest) -> HttpResponse: ...
def get_formats() -> Dict[str, Union[List[str], int, str]]: ...
js_catalog_template: str
@@ -15,21 +17,15 @@ def render_javascript_catalog(catalog: Optional[Any] = ..., plural: Optional[Any
def null_javascript_catalog(request: Any, domain: Optional[Any] = ..., packages: Optional[Any] = ...): ...
class JavaScriptCatalog(View):
args: Tuple
head: Callable
kwargs: Dict[Any, Any]
request: WSGIRequest
domain: str = ...
packages: List[str] = ...
translation: django.utils.translation.trans_real.DjangoTranslation = ...
def get(self, request: WSGIRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
translation: DjangoTranslation = ...
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
def get_paths(self, packages: List[str]) -> List[str]: ...
def get_plural(self) -> None: ...
def get_catalog(self) -> Dict[str, Union[List[str], str]]: ...
def get_context_data(self, **kwargs: Any) -> Dict[str, Optional[Dict[str, Union[List[str], int, str]]]]: ...
def render_to_response(
self, context: Dict[str, Optional[Dict[str, Union[List[str], int, str]]]], **response_kwargs: Any
) -> HttpResponse: ...
def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ...
def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ...
class JSONCatalog(JavaScriptCatalog):
def render_to_response(self, context: Any, **response_kwargs: Any): ...
class JSONCatalog(JavaScriptCatalog): ...

View File

@@ -1,9 +1,9 @@
from typing import Any, Optional
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import FileResponse
def serve(request: WSGIRequest, path: str, document_root: str = ..., show_indexes: bool = ...) -> FileResponse: ...
def serve(request: HttpRequest, path: str, document_root: str = ..., show_indexes: bool = ...) -> FileResponse: ...
DEFAULT_DIRECTORY_INDEX_TEMPLATE: str
template_translatable: Any

View File

@@ -1,11 +1,12 @@
import os
from typing import Callable, Optional, Set, Union, cast, Dict
from typing import Callable, Dict, Optional, Union, cast
from mypy.checker import TypeChecker
from mypy.nodes import MemberExpr, TypeInfo
from mypy.options import Options
from mypy.plugin import AttributeContext, ClassDefContext, FunctionContext, MethodContext, Plugin
from mypy.types import AnyType, Instance, Type, TypeOfAny, TypeType, UnionType
from mypy_django_plugin import helpers, monkeypatch
from mypy_django_plugin.config import Config
from mypy_django_plugin.transformers import fields, init_create
@@ -211,10 +212,6 @@ class DjangoPlugin(Plugin):
def get_function_hook(self, fullname: str
) -> Optional[Callable[[FunctionContext], Type]]:
sym = self.lookup_fully_qualified(fullname)
if sym and isinstance(sym.node, TypeInfo) and sym.node.has_base(helpers.FIELD_FULLNAME):
return fields.adjust_return_type_of_field_instantiation
if fullname == 'django.contrib.auth.get_user_model':
return return_user_model_hook
@@ -223,24 +220,34 @@ class DjangoPlugin(Plugin):
return determine_proper_manager_type
sym = self.lookup_fully_qualified(fullname)
if sym and isinstance(sym.node, TypeInfo):
if sym is not None and isinstance(sym.node, TypeInfo):
if sym.node.has_base(helpers.FIELD_FULLNAME):
return fields.adjust_return_type_of_field_instantiation
if sym.node.metadata.get('django', {}).get('generated_init'):
return init_create.redefine_and_typecheck_model_init
def get_method_hook(self, fullname: str
) -> Optional[Callable[[MethodContext], Type]]:
if fullname in {'django.apps.registry.Apps.get_model',
'django.db.migrations.state.StateApps.get_model'}:
return determine_model_cls_from_string_for_migrations
manager_classes = self._get_current_manager_bases()
class_fullname, _, method_name = fullname.rpartition('.')
if class_fullname in manager_classes and method_name == 'create':
return init_create.redefine_and_typecheck_model_create
if fullname in {'django.apps.registry.Apps.get_model',
'django.db.migrations.state.StateApps.get_model'}:
return determine_model_cls_from_string_for_migrations
return None
def get_base_class_hook(self, fullname: str
) -> Optional[Callable[[ClassDefContext], None]]:
if fullname == helpers.DUMMY_SETTINGS_BASE_CLASS:
settings_modules = ['django.conf.global_settings']
if self.django_settings_module:
settings_modules.append(self.django_settings_module)
return AddSettingValuesToDjangoConfObject(settings_modules,
self.config.ignore_missing_settings)
if fullname in self._get_current_model_bases():
return transform_model_class
@@ -250,17 +257,13 @@ class DjangoPlugin(Plugin):
if fullname in self._get_current_modelform_bases():
return transform_modelform_class
if fullname == helpers.DUMMY_SETTINGS_BASE_CLASS:
settings_modules = ['django.conf.global_settings']
if self.django_settings_module:
settings_modules.append(self.django_settings_module)
return AddSettingValuesToDjangoConfObject(settings_modules,
self.config.ignore_missing_settings)
return None
def get_attribute_hook(self, fullname: str
) -> Optional[Callable[[AttributeContext], Type]]:
if fullname == 'builtins.object.id':
return return_integer_type_for_id_for_non_defined_primary_key_in_models
module, _, name = fullname.rpartition('.')
sym = self.lookup_fully_qualified('django.conf.LazySettings')
if sym and isinstance(sym.node, TypeInfo):
@@ -268,9 +271,6 @@ class DjangoPlugin(Plugin):
if module == 'builtins.object' and name in metadata:
return ExtractSettingType(module_fullname=metadata[name])
if fullname == 'builtins.object.id':
return return_integer_type_for_id_for_non_defined_primary_key_in_models
return extract_and_return_primary_key_of_bound_related_field_parameter

View File

@@ -4,6 +4,5 @@ testpaths = ./test-data
addopts =
--tb=native
--mypy-ini-file=./test-data/plugins.ini
--mypy-no-cache
-s
-v

View File

@@ -31,7 +31,7 @@ if sys.version_info[:2] < (3, 7):
setup(
name="django-stubs",
version="0.6.0",
version="0.7.0",
description='Django mypy stubs',
long_description=readme,
long_description_content_type='text/markdown',

View File

@@ -1,5 +1,5 @@
[mypy]
incremental = False
incremental = True
strict_optional = True
plugins =
mypy_django_plugin.main

View File

@@ -1,28 +1,30 @@
[CASE missing_settings_ignored_flag]
[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini]
[disable_cache]
from django.conf import settings
reveal_type(settings.NO_SUCH_SETTING) # E: Revealed type is 'Any'
[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini]
[file mypy_django.ini]
[[mypy_django_plugin]
ignore_missing_settings = True
[out]
[/CASE]
[CASE django_settings_via_config_file]
[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini]
[disable_cache]
from django.conf import settings
reveal_type(settings.MY_SETTING) # E: Revealed type is 'builtins.int'
[env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini]
[file mypy_django.ini]
[[mypy_django_plugin]
django_settings = mysettings
[file mysettings.py]
MY_SETTING: int = 1
[out]
[/CASE]
[CASE mypy_django_ini_in_current_directory_is_a_default]
[disable_cache]
from django.conf import settings
reveal_type(settings.MY_SETTING) # E: Revealed type is 'builtins.int'
@@ -32,4 +34,4 @@ django_settings = mysettings
[file mysettings.py]
MY_SETTING: int = 1
[out]
[/CASE]

View File

@@ -7,6 +7,7 @@ class User(models.Model):
user = User()
reveal_type(user.array) # E: Revealed type is 'builtins.list*[Any]'
[/CASE]
[CASE array_field_base_field_parsed_into_generic_typevar]
from django.db import models
@@ -19,6 +20,7 @@ class User(models.Model):
user = User()
reveal_type(user.members) # E: Revealed type is 'builtins.list*[builtins.int]'
reveal_type(user.members_as_text) # E: Revealed type is 'builtins.list*[builtins.str]'
[/CASE]
[CASE test_model_fields_classes_present_as_primitives]
from django.db import models
@@ -36,6 +38,7 @@ reveal_type(user.small_int) # E: Revealed type is 'builtins.int*'
reveal_type(user.name) # E: Revealed type is 'builtins.str*'
reveal_type(user.slug) # E: Revealed type is 'builtins.str*'
reveal_type(user.text) # E: Revealed type is 'builtins.str*'
[/CASE]
[CASE test_model_field_classes_from_existing_locations]
from django.db import models
@@ -51,6 +54,7 @@ booking = Booking()
reveal_type(booking.id) # E: Revealed type is 'builtins.int*'
reveal_type(booking.time_range) # E: Revealed type is 'Any'
reveal_type(booking.some_decimal) # E: Revealed type is 'decimal.Decimal*'
[/CASE]
[CASE test_add_id_field_if_no_primary_key_defined]
from django.db import models
@@ -59,6 +63,7 @@ class User(models.Model):
pass
reveal_type(User().id) # E: Revealed type is 'builtins.int'
[/CASE]
[CASE test_do_not_add_id_if_field_with_primary_key_True_defined]
from django.db import models
@@ -68,7 +73,7 @@ class User(models.Model):
reveal_type(User().my_pk) # E: Revealed type is 'builtins.int*'
reveal_type(User().id) # E: Revealed type is 'Any'
[out]
[/CASE]
[CASE test_meta_nested_class_allows_subclassing_in_multiple_inheritance]
from typing import Any
@@ -84,7 +89,7 @@ class Mixin2(models.Model):
class User(Mixin1, Mixin2):
pass
[out]
[/CASE]
[CASE test_inheritance_from_abstract_model_does_not_fail_if_field_with_id_exists]
from django.db import models
@@ -93,7 +98,7 @@ class Abstract(models.Model):
abstract = True
class User(Abstract):
id = models.AutoField(primary_key=True)
[out]
[/CASE]
[CASE standard_it_from_parent_model_could_be_overridden_with_non_integer_field_in_child_model]
from django.db import models
@@ -103,11 +108,11 @@ class ParentModel(models.Model):
class MyModel(ParentModel):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
reveal_type(MyModel().id) # E: Revealed type is 'uuid.UUID*'
[out]
[/CASE]
[CASE blank_for_charfield_is_the_same_as_null]
from django.db import models
class MyModel(models.Model):
text = models.CharField(max_length=30, blank=True)
MyModel(text=None)
[out]
[/CASE]

View File

@@ -191,6 +191,8 @@ class Profile(models.Model):
from django.db import models
class App(models.Model):
owner = models.ForeignKey(to='myapp.User', on_delete=models.CASCADE, related_name='apps')
[disable_cache]
[/CASE]
[CASE many_to_many_field_converts_to_queryset_of_model_type]
from django.db import models

View File

@@ -1,4 +1,6 @@
[CASE test_settings_are_parsed_into_django_conf_settings]
[env DJANGO_SETTINGS_MODULE=mysettings]
[disable_cache]
from django.conf import settings
reveal_type(settings.ROOT_DIR) # E: Revealed type is 'builtins.str'
@@ -6,7 +8,6 @@ reveal_type(settings.APPS_DIR) # E: Revealed type is 'pathlib.Path'
reveal_type(settings.OBJ) # E: Revealed type is 'django.utils.functional.LazyObject'
reveal_type(settings.NUMBERS) # E: Revealed type is 'builtins.list[builtins.str]'
reveal_type(settings.DICT) # E: Revealed type is 'builtins.dict[Any, Any]'
[env DJANGO_SETTINGS_MODULE=mysettings]
[file base.py]
from pathlib import Path
ROOT_DIR = '/etc'
@@ -18,14 +19,16 @@ NUMBERS = ['one', 'two']
DICT = {} # type: ignore
from django.utils.functional import LazyObject
OBJ = LazyObject()
[/CASE]
[CASE test_settings_could_be_defined_in_different_module_and_imported_with_star]
[env DJANGO_SETTINGS_MODULE=mysettings]
[disable_cache]
from django.conf import settings
reveal_type(settings.ROOT_DIR) # E: Revealed type is 'pathlib.Path'
reveal_type(settings.SETUP) # E: Revealed type is 'builtins.int'
reveal_type(settings.DATABASES) # E: Revealed type is 'builtins.dict[builtins.str, builtins.str]'
[env DJANGO_SETTINGS_MODULE=mysettings]
[file mysettings.py]
from local import *
DATABASES = {'default': 'mydb'}
@@ -36,24 +39,25 @@ SETUP = 3
from pathlib import Path
ROOT_DIR = Path(__file__)
[/CASE]
[CASE global_settings_are_always_loaded]
from django.conf import settings
reveal_type(settings.AUTH_USER_MODEL) # E: Revealed type is 'builtins.str'
reveal_type(settings.AUTHENTICATION_BACKENDS) # E: Revealed type is 'typing.Sequence[builtins.str]'
[out]
[/CASE]
[CASE test_circular_dependency_in_settings_works_if_settings_have_annotations]
[env DJANGO_SETTINGS_MODULE=mysettings]
[disable_cache]
from django.conf import settings
class Class:
pass
reveal_type(settings.MYSETTING) # E: Revealed type is 'builtins.int'
reveal_type(settings.REGISTRY) # E: Revealed type is 'Union[main.Class, None]'
reveal_type(settings.LIST) # E: Revealed type is 'builtins.list[builtins.str]'
[out]
[env DJANGO_SETTINGS_MODULE=mysettings]
[file mysettings.py]
from typing import TYPE_CHECKING, Optional, List
@@ -63,13 +67,16 @@ if TYPE_CHECKING:
MYSETTING = 1122
REGISTRY: Optional['Class'] = None
LIST: List[str] = ['1', '2']
[/CASE]
[CASE fail_if_there_is_no_setting]
from django.conf import settings
reveal_type(settings.NOT_EXISTING)
[env DJANGO_SETTINGS_MODULE=mysettings]
[disable_cache]
[file mysettings.py]
[out]
main:2: error: Revealed type is 'Any'
main:2: error: "LazySettings" has no attribute "NOT_EXISTING"
main:2: error: "LazySettings" has no attribute "NOT_EXISTING"
[/CASE]

View File

@@ -11,9 +11,11 @@ reveal_type(get_object_or_404(MyModel.objects.get_queryset())) # E: Revealed ty
reveal_type(get_list_or_404(MyModel)) # E: Revealed type is 'builtins.list[main.MyModel*]'
reveal_type(get_list_or_404(MyModel.objects)) # E: Revealed type is 'builtins.list[main.MyModel*]'
reveal_type(get_list_or_404(MyModel.objects.get_queryset())) # E: Revealed type is 'builtins.list[main.MyModel*]'
[out]
[/CASE]
[CASE get_user_model_returns_proper_class]
[env DJANGO_SETTINGS_MODULE=mysettings]
[disable_cache]
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from myapp.models import MyUser
@@ -22,7 +24,6 @@ from django.contrib.auth import get_user_model
UserModel = get_user_model()
reveal_type(UserModel.objects) # E: Revealed type is 'django.db.models.manager.Manager[myapp.models.MyUser]'
[env DJANGO_SETTINGS_MODULE=mysettings]
[file mysettings.py]
INSTALLED_APPS = ('myapp',)
AUTH_USER_MODEL = 'myapp.MyUser'
@@ -32,15 +33,16 @@ AUTH_USER_MODEL = 'myapp.MyUser'
from django.db import models
class MyUser(models.Model):
pass
[out]
[/CASE]
[CASE return_type_model_and_show_error_if_model_not_yet_imported]
[env DJANGO_SETTINGS_MODULE=mysettings]
[disable_cache]
from django.contrib.auth import get_user_model
UserModel = get_user_model()
reveal_type(UserModel.objects)
[env DJANGO_SETTINGS_MODULE=mysettings]
[file mysettings.py]
INSTALLED_APPS = ('myapp',)
AUTH_USER_MODEL = 'myapp.MyUser'
@@ -53,4 +55,5 @@ class MyUser(models.Model):
[out]
main:3: error: "myapp.MyUser" model class is not imported so far. Try to import it (under if TYPE_CHECKING) at the beginning of the current file
main:4: error: Revealed type is 'Any'
main:4: error: "Type[Model]" has no attribute "objects"
main:4: error: "Type[Model]" has no attribute "objects"
[/CASE]