From 638e9e7f5ff0d6cb26e7a7d3efb2985eb8a58fad Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Thu, 5 Jan 2023 13:28:26 +0200 Subject: [PATCH] Revert "Used _ContextKeys for context like dicts" This reverts commit cb2f2339 --- django-stubs/contrib/admin/options.pyi | 23 ++++++++-------------- django-stubs/contrib/admin/sites.pyi | 25 ++++++++---------------- django-stubs/forms/renderers.pyi | 6 +----- django-stubs/shortcuts.pyi | 3 +-- django-stubs/template/backends/base.pyi | 3 +-- django-stubs/template/backends/dummy.pyi | 4 +--- django-stubs/template/base.pyi | 5 ++--- django-stubs/template/context.pyi | 6 +++--- django-stubs/template/defaulttags.pyi | 7 +++---- django-stubs/template/engine.pyi | 3 +-- django-stubs/template/loader.pyi | 2 +- django-stubs/template/response.pyi | 14 ++++++------- tests/typecheck/test_shortcuts.yml | 12 ++++++++++++ 13 files changed, 49 insertions(+), 64 deletions(-) diff --git a/django-stubs/contrib/admin/options.pyi b/django-stubs/contrib/admin/options.pyi index 401913637..af42ea939 100644 --- a/django-stubs/contrib/admin/options.pyi +++ b/django-stubs/contrib/admin/options.pyi @@ -28,7 +28,6 @@ from django.forms.models import ( from django.forms.widgets import Media from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseRedirect -from django.template.context import _ContextKeys from django.template.response import _TemplateForResponseT from django.urls.resolvers import URLPattern from django.utils.datastructures import _ListOrTuple @@ -232,7 +231,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): def render_change_form( self, request: HttpRequest, - context: Mapping[_ContextKeys, Any], + context: dict[str, Any], add: bool = ..., change: bool = ..., form_url: str = ..., @@ -245,7 +244,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): # Probably FileResponse cannot come from ModelAdmin views def response_action(self, request: HttpRequest, queryset: QuerySet) -> HttpResponse | None: ... def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ... - def render_delete_form(self, request: HttpRequest, context: Mapping[_ContextKeys, Any]) -> HttpResponse: ... + def render_delete_form(self, request: HttpRequest, context: dict[str, Any]) -> HttpResponse: ... def get_inline_formsets( self, request: HttpRequest, formsets: list[Any], inline_instances: list[Any], obj: _ModelT | None = ... ) -> list[Any]: ... @@ -255,29 +254,23 @@ class ModelAdmin(BaseModelAdmin[_ModelT]): request: HttpRequest, object_id: str | None = ..., form_url: str = ..., - extra_context: Mapping[_ContextKeys, Any] | None = ..., + extra_context: dict[str, Any] | None = ..., ) -> HttpResponse: ... def add_view( - self, request: HttpRequest, form_url: str = ..., extra_context: Mapping[_ContextKeys, Any] | None = ... + self, request: HttpRequest, form_url: str = ..., extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... def change_view( - self, - request: HttpRequest, - object_id: str, - form_url: str = ..., - extra_context: Mapping[_ContextKeys, Any] | None = ..., - ) -> HttpResponse: ... - def changelist_view( - self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... + self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... + def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... def get_deleted_objects( self, objs: Sequence[_ModelT] | QuerySet[_ModelT], request: HttpRequest ) -> tuple[list[Model], dict[str, int], set[str], list[str]]: ... def delete_view( - self, request: HttpRequest, object_id: str, extra_context: Mapping[_ContextKeys, Any] | None = ... + self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... def history_view( - self, request: HttpRequest, object_id: str, extra_context: Mapping[_ContextKeys, Any] | None = ... + self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... _ChildModelT = TypeVar("_ChildModelT", bound=Model) diff --git a/django-stubs/contrib/admin/sites.pyi b/django-stubs/contrib/admin/sites.pyi index 9ed277db0..1f3d55951 100644 --- a/django-stubs/contrib/admin/sites.pyi +++ b/django-stubs/contrib/admin/sites.pyi @@ -1,5 +1,5 @@ import sys -from collections.abc import Callable, Iterable, Mapping +from collections.abc import Callable, Iterable from typing import Any from django.apps.config import AppConfig @@ -10,7 +10,6 @@ from django.db.models.base import Model from django.db.models.query import QuerySet from django.http.request import HttpRequest from django.http.response import HttpResponse -from django.template.context import _ContextKeys from django.template.response import TemplateResponse from django.urls import URLPattern, URLResolver from django.utils.functional import LazyObject, _StrOrPromise @@ -71,26 +70,18 @@ class AdminSite: @property def urls(self) -> tuple[list[URLResolver | URLPattern], str, str]: ... def each_context(self, request: HttpRequest) -> dict[str, Any]: ... - def password_change( - self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... - ) -> TemplateResponse: ... + def password_change(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... def password_change_done( - self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... - ) -> TemplateResponse: ... - def i18n_javascript( - self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... - ) -> HttpResponse: ... - def logout( - self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... + self, request: HttpRequest, extra_context: dict[str, Any] | None = ... ) -> TemplateResponse: ... - def login(self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ...) -> HttpResponse: ... + def i18n_javascript(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... + def logout(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... + def login(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... def _build_app_dict(self, request: HttpRequest, label: _StrOrPromise | None = ...) -> dict[str, Any]: ... def get_app_list(self, request: HttpRequest) -> list[Any]: ... - def index( - self, request: HttpRequest, extra_context: Mapping[_ContextKeys, Any] | None = ... - ) -> TemplateResponse: ... + def index(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... def app_index( - self, request: HttpRequest, app_label: str, extra_context: Mapping[_ContextKeys, Any] | None = ... + self, request: HttpRequest, app_label: str, extra_context: dict[str, Any] | None = ... ) -> TemplateResponse: ... def autocomplete_view(self, request: HttpRequest) -> HttpResponse: ... def catch_all_view(self, request: HttpRequest, url: str) -> HttpResponse: ... diff --git a/django-stubs/forms/renderers.pyi b/django-stubs/forms/renderers.pyi index cddbc5a2c..d8d759409 100644 --- a/django-stubs/forms/renderers.pyi +++ b/django-stubs/forms/renderers.pyi @@ -1,4 +1,3 @@ -from collections.abc import Mapping from typing import Any from django.http import HttpRequest @@ -6,15 +5,12 @@ from django.template.backends.base import BaseEngine from django.template.backends.django import DjangoTemplates as DjangoTemplatesR from django.template.backends.jinja2 import Jinja2 as Jinja2R from django.template.base import Template -from django.template.context import _ContextKeys def get_default_renderer() -> BaseRenderer: ... class BaseRenderer: def get_template(self, template_name: str) -> Any: ... - def render( - self, template_name: str, context: Mapping[_ContextKeys, Any], request: HttpRequest | None = ... - ) -> str: ... + def render(self, template_name: str, context: dict[str, Any], request: HttpRequest | None = ...) -> str: ... class EngineMixin: def get_template(self, template_name: str) -> Any: ... diff --git a/django-stubs/shortcuts.pyi b/django-stubs/shortcuts.pyi index b9624ce4c..34aa2b713 100644 --- a/django-stubs/shortcuts.pyi +++ b/django-stubs/shortcuts.pyi @@ -7,13 +7,12 @@ from django.http import HttpRequest from django.http.response import HttpResponse as HttpResponse from django.http.response import HttpResponsePermanentRedirect as HttpResponsePermanentRedirect from django.http.response import HttpResponseRedirect as HttpResponseRedirect -from django.template.context import _ContextKeys from typing_extensions import Literal def render( request: HttpRequest | None, template_name: str | Sequence[str], - context: Mapping[_ContextKeys, Any] | None = ..., + context: Mapping[str, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., using: str | None = ..., diff --git a/django-stubs/template/backends/base.pyi b/django-stubs/template/backends/base.pyi index 85d7ed526..83437b387 100644 --- a/django-stubs/template/backends/base.pyi +++ b/django-stubs/template/backends/base.pyi @@ -4,7 +4,6 @@ from typing import Any, Protocol from django.http.request import HttpRequest from django.template import TemplateDoesNotExist from django.template.base import Context -from django.template.context import _ContextKeys from django.utils.safestring import SafeString class BaseEngine: @@ -23,6 +22,6 @@ class BaseEngine: class _EngineTemplate(Protocol): def render( self, - context: Context | Mapping[_ContextKeys, Any] | None = ..., + context: Context | dict[str, Any] | None = ..., request: HttpRequest | None = ..., ) -> SafeString: ... diff --git a/django-stubs/template/backends/dummy.pyi b/django-stubs/template/backends/dummy.pyi index 285a0cc28..3a6109dc6 100644 --- a/django-stubs/template/backends/dummy.pyi +++ b/django-stubs/template/backends/dummy.pyi @@ -1,9 +1,7 @@ import string -from collections.abc import Mapping from typing import Any from django.http.request import HttpRequest -from django.template.context import _ContextKeys from .base import BaseEngine @@ -13,4 +11,4 @@ class TemplateStrings(BaseEngine): class Template(string.Template): template: str - def render(self, context: Mapping[_ContextKeys, Any] | None = ..., request: HttpRequest | None = ...) -> str: ... + def render(self, context: dict[str, str] | None = ..., request: HttpRequest | None = ...) -> str: ... diff --git a/django-stubs/template/base.pyi b/django-stubs/template/base.pyi index 71127bf29..d2f5e4530 100644 --- a/django-stubs/template/base.pyi +++ b/django-stubs/template/base.pyi @@ -5,7 +5,6 @@ from re import Pattern from typing import Any from django.template.context import Context as Context -from django.template.context import _ContextKeys from django.template.engine import Engine from django.template.library import Library from django.template.loaders.base import Loader @@ -60,7 +59,7 @@ class Template: engine: Engine | None = ..., ) -> None: ... def __iter__(self) -> Iterator[Node]: ... - def render(self, context: Context | Mapping[_ContextKeys, Any] | None) -> SafeString: ... + def render(self, context: Context | dict[str, Any] | None) -> SafeString: ... def compile_nodelist(self) -> NodeList: ... def get_exception_info(self, exception: Exception, token: Token) -> dict[str, Any]: ... @@ -139,7 +138,7 @@ class Variable: translate: bool message_context: str | None def __init__(self, var: dict[Any, Any] | str) -> None: ... - def resolve(self, context: Mapping[_ContextKeys, Any] | Context | int | str) -> Any: ... + def resolve(self, context: Mapping[str, Mapping[str, Any]] | Context | int | str) -> Any: ... class Node: must_be_first: bool diff --git a/django-stubs/template/context.pyi b/django-stubs/template/context.pyi index bdef4eda0..5b79664c4 100644 --- a/django-stubs/template/context.pyi +++ b/django-stubs/template/context.pyi @@ -1,4 +1,4 @@ -from collections.abc import Callable, Iterable, Iterator, Mapping +from collections.abc import Callable, Iterable, Iterator from contextlib import contextmanager from types import TracebackType from typing import Any, TypeVar @@ -40,7 +40,7 @@ class BaseContext(Iterable[Any]): def get(self, key: _ContextKeys, otherwise: Any | None = ...) -> Any | None: ... def setdefault(self, key: _ContextKeys, default: list[Origin] | int | None = ...) -> list[Origin] | int | None: ... def new(self, values: _ContextValues | None = ...) -> Context: ... - def flatten(self) -> Mapping[_ContextKeys, Any]: ... + def flatten(self) -> dict[_ContextKeys, dict[_ContextKeys, type[Any] | str] | int | str | None]: ... class Context(BaseContext): dicts: Any @@ -55,7 +55,7 @@ class Context(BaseContext): ) -> None: ... @contextmanager def bind_template(self, template: Template) -> Iterator[None]: ... - def update(self, other_dict: Mapping[_ContextKeys, Any] | Context) -> ContextDict: ... + def update(self, other_dict: dict[str, Any] | Context) -> ContextDict: ... class RenderContext(BaseContext): dicts: list[dict[IncludeNode | str, str]] diff --git a/django-stubs/template/defaulttags.pyi b/django-stubs/template/defaulttags.pyi index 23b061d45..a9c708c49 100644 --- a/django-stubs/template/defaulttags.pyi +++ b/django-stubs/template/defaulttags.pyi @@ -1,5 +1,5 @@ from collections import namedtuple -from collections.abc import Iterator, Mapping, Sequence +from collections.abc import Iterator, Sequence from datetime import date as real_date from typing import Any @@ -8,7 +8,6 @@ from django.template.context import Context from django.utils.safestring import SafeString from .base import Node, NodeList -from .context import _ContextKeys from .library import Library from .smartif import IfParser, Literal @@ -155,13 +154,13 @@ class WidthRatioNode(Node): class WithNode(Node): nodelist: NodeList - extra_context: Mapping[_ContextKeys, Any] + extra_context: dict[str, Any] def __init__( self, var: str | None, name: str | None, nodelist: NodeList | Sequence[Node], - extra_context: Mapping[_ContextKeys, Any] | None = ..., + extra_context: dict[str, Any] | None = ..., ) -> None: ... def autoescape(parser: Parser, token: Token) -> AutoEscapeControlNode: ... diff --git a/django-stubs/template/engine.pyi b/django-stubs/template/engine.pyi index 2b76ba17e..2f5d9bcee 100644 --- a/django-stubs/template/engine.pyi +++ b/django-stubs/template/engine.pyi @@ -1,4 +1,4 @@ -from collections.abc import Callable, Mapping, Sequence +from collections.abc import Callable, Sequence from typing import Any from django.template.base import Origin @@ -8,7 +8,6 @@ from django.utils.safestring import SafeString from typing_extensions import TypeAlias from .base import Template -from .context import _ContextKeys _Loader: TypeAlias = Any diff --git a/django-stubs/template/loader.pyi b/django-stubs/template/loader.pyi index 1380760e1..4722c686c 100644 --- a/django-stubs/template/loader.pyi +++ b/django-stubs/template/loader.pyi @@ -12,7 +12,7 @@ def get_template(template_name: str, using: str | None = ...) -> _EngineTemplate def select_template(template_name_list: Sequence[str] | str, using: str | None = ...) -> Any: ... def render_to_string( template_name: Sequence[str] | str, - context: dict[str, Any] | None = ..., + context: Mapping[str, Any] | None = ..., request: HttpRequest | None = ..., using: str | None = ..., ) -> SafeString: ... diff --git a/django-stubs/template/response.pyi b/django-stubs/template/response.pyi index 9f5e875b9..4a3982174 100644 --- a/django-stubs/template/response.pyi +++ b/django-stubs/template/response.pyi @@ -1,5 +1,5 @@ import functools -from collections.abc import Callable, Iterator, Mapping, Sequence +from collections.abc import Callable, Iterator, Sequence from http.cookies import SimpleCookie from typing import Any, Union # noqa: Y037 # https://github.com/python/mypy/issues/12211 @@ -7,7 +7,7 @@ from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponse from django.http.request import HttpRequest from django.template.base import Template -from django.template.context import RequestContext, _ContextKeys +from django.template.context import RequestContext from django.test.client import Client from django.utils.datastructures import _ListOrTuple from typing_extensions import TypeAlias @@ -24,12 +24,12 @@ class SimpleTemplateResponse(HttpResponse): status_code: int rendering_attrs: Any template_name: _TemplateForResponseT - context_data: Mapping[_ContextKeys, Any] | None + context_data: dict[str, Any] | None using: str | None def __init__( self, template: _TemplateForResponseT, - context: Mapping[_ContextKeys, Any] | None = ..., + context: dict[str, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., @@ -37,7 +37,7 @@ class SimpleTemplateResponse(HttpResponse): headers: dict[str, Any] | None = ..., ) -> None: ... def resolve_template(self, template: Sequence[str] | Template | str) -> Template: ... - def resolve_context(self, context: Mapping[_ContextKeys, Any] | None) -> Mapping[_ContextKeys, Any] | None: ... + def resolve_context(self, context: dict[str, Any] | None) -> dict[str, Any] | None: ... @property def rendered_content(self) -> str: ... def add_post_render_callback(self, callback: Callable) -> None: ... @@ -50,7 +50,7 @@ class TemplateResponse(SimpleTemplateResponse): client: Client closed: bool context: RequestContext - context_data: Mapping[_ContextKeys, Any] | None + context_data: dict[str, Any] | None cookies: SimpleCookie[str] csrf_cookie_set: bool json: functools.partial @@ -65,7 +65,7 @@ class TemplateResponse(SimpleTemplateResponse): self, request: HttpRequest, template: _TemplateForResponseT, - context: Mapping[_ContextKeys, Any] | None = ..., + context: dict[str, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., diff --git a/tests/typecheck/test_shortcuts.yml b/tests/typecheck/test_shortcuts.yml index d794bb67a..99769feef 100644 --- a/tests/typecheck/test_shortcuts.yml +++ b/tests/typecheck/test_shortcuts.yml @@ -37,6 +37,18 @@ class MyUser(models.Model): pass +- case: check_render_function_arguments_annotations + main: | + from typing import Any + from typing_extensions import TypedDict + from django.shortcuts import render + from django.http.request import HttpRequest + + TestContext = TypedDict("TestContext", {"user": Any}) + test_context: TestContext = {"user": "test"} + reveal_type(test_context) # N: Revealed type is "TypedDict('main.TestContext', {'user': Any})" + reveal_type(render(HttpRequest(), '', test_context)) # N: Revealed type is "django.http.response.HttpResponse" + - case: check_redirect_return_annotation main: | from django.shortcuts import redirect