1from typing import Any, Callable, Dict, Iterator, List, Optional, Type, Union, Iterable
2
3from django.http.request import HttpRequest
4from django.template.base import Node, Origin, Template
5from django.template.defaulttags import IfChangedNode
6from django.template.loader_tags import IncludeNode
7
8_ContextValues = Union[Dict[str, Any], "Context"]
9
10class ContextPopException(Exception): ...
11
12class ContextDict(dict):
13    context: BaseContext = ...
14    def __init__(self, context: BaseContext, *args: Any, **kwargs: Any) -> None: ...
15    def __enter__(self) -> ContextDict: ...
16    def __exit__(self, *args: Any, **kwargs: Any) -> None: ...
17
18class BaseContext(Iterable[Any]):
19    def __init__(self, dict_: Any = ...) -> None: ...
20    def __copy__(self) -> BaseContext: ...
21    def __iter__(self) -> Iterator[Any]: ...
22    def push(self, *args: Any, **kwargs: Any) -> ContextDict: ...
23    def pop(self) -> ContextDict: ...
24    def __setitem__(self, key: Union[Node, str], value: Any) -> None: ...
25    def set_upward(self, key: str, value: Union[int, str]) -> None: ...
26    def __getitem__(self, key: Union[int, str]) -> Any: ...
27    def __delitem__(self, key: Any) -> None: ...
28    def __contains__(self, key: str) -> bool: ...
29    def get(self, key: str, otherwise: Optional[Any] = ...) -> Optional[Any]: ...
30    def setdefault(
31        self, key: Union[IfChangedNode, str], default: Optional[Union[List[Origin], int]] = ...
32    ) -> Optional[Union[List[Origin], int]]: ...
33    def new(self, values: Optional[_ContextValues] = ...) -> Context: ...
34    def flatten(self) -> Dict[str, Optional[Union[Dict[str, Union[Type[Any], str]], int, str]]]: ...
35
36class Context(BaseContext):
37    dicts: Any
38    autoescape: bool = ...
39    use_l10n: Optional[bool] = ...
40    use_tz: Optional[bool] = ...
41    template_name: Optional[str] = ...
42    render_context: RenderContext = ...
43    template: Optional[Template] = ...
44    def __init__(
45        self, dict_: Any = ..., autoescape: bool = ..., use_l10n: Optional[bool] = ..., use_tz: None = ...
46    ) -> None: ...
47    def bind_template(self, template: Template) -> Iterator[None]: ...
48    def update(self, other_dict: Union[Dict[str, Any], Context]) -> ContextDict: ...
49
50class RenderContext(BaseContext):
51    dicts: List[Dict[Union[IncludeNode, str], str]]
52    template: Optional[Template] = ...
53    def push_state(self, template: Template, isolated_context: bool = ...) -> Iterator[None]: ...
54
55class RequestContext(Context):
56    autoescape: bool
57    dicts: List[Dict[str, str]]
58    render_context: RenderContext
59    template_name: Optional[str]
60    use_l10n: None
61    use_tz: None
62    request: HttpRequest = ...
63    def __init__(
64        self,
65        request: HttpRequest,
66        dict_: Optional[Dict[str, Any]] = ...,
67        processors: Optional[List[Callable]] = ...,
68        use_l10n: None = ...,
69        use_tz: None = ...,
70        autoescape: bool = ...,
71    ) -> None: ...
72    template: Optional[Template] = ...
73    def bind_template(self, template: Template) -> Iterator[None]: ...
74    def new(self, values: Optional[_ContextValues] = ...) -> RequestContext: ...
75
76def make_context(context: Any, request: Optional[HttpRequest] = ..., **kwargs: Any) -> Context: ...
77