1 """Decorators for the Home Assistant API."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Coroutine
6 from functools
import wraps
7 from typing
import Any, Concatenate, overload
9 from aiohttp.web
import Request, Response, StreamResponse
14 from .view
import HomeAssistantView
16 type _ResponseType = Response | StreamResponse
17 type _FuncType[_T, **_P, _R] = Callable[
18 Concatenate[_T, Request, _P], Coroutine[Any, Any, _R]
24 _HomeAssistantViewT: HomeAssistantView,
26 _ResponseT: _ResponseType,
30 error: Unauthorized |
None =
None,
32 [_FuncType[_HomeAssistantViewT, _P, _ResponseT]],
33 _FuncType[_HomeAssistantViewT, _P, _ResponseT],
39 _HomeAssistantViewT: HomeAssistantView,
41 _ResponseT: _ResponseType,
43 _func: _FuncType[_HomeAssistantViewT, _P, _ResponseT],
44 ) -> _FuncType[_HomeAssistantViewT, _P, _ResponseT]: ...
48 _HomeAssistantViewT: HomeAssistantView,
50 _ResponseT: _ResponseType,
52 _func: _FuncType[_HomeAssistantViewT, _P, _ResponseT] |
None =
None,
54 error: Unauthorized |
None =
None,
57 [_FuncType[_HomeAssistantViewT, _P, _ResponseT]],
58 _FuncType[_HomeAssistantViewT, _P, _ResponseT],
60 | _FuncType[_HomeAssistantViewT, _P, _ResponseT]
62 """Home Assistant API decorator to require user to be an admin."""
64 def decorator_require_admin(
65 func: _FuncType[_HomeAssistantViewT, _P, _ResponseT],
66 ) -> _FuncType[_HomeAssistantViewT, _P, _ResponseT]:
67 """Wrap the provided with_admin function."""
71 self: _HomeAssistantViewT,
76 """Check admin and call function."""
77 user: User = request[
"hass_user"]
81 return await func(self, request, *args, **kwargs)
88 return decorator_require_admin
91 return decorator_require_admin(_func)
const .WebSocketCommandHandler require_admin(const .WebSocketCommandHandler func)