diff --git a/odoo-stubs/models.pyi b/odoo-stubs/models.pyi index d165e2c..b6a4878 100644 --- a/odoo-stubs/models.pyi +++ b/odoo-stubs/models.pyi @@ -10,6 +10,7 @@ from typing import ( MutableMapping, Sequence, TypeVar, + overload, ) import dateutil.relativedelta @@ -26,6 +27,7 @@ from .tools.query import Query _T = TypeVar("_T") _ModelT = TypeVar("_ModelT", bound=BaseModel) +_Model2T = TypeVar("_Model2T", bound=BaseModel) _Domain = list regex_alphanumeric: Pattern[str] @@ -445,12 +447,28 @@ class BaseModel(metaclass=MetaModel): def _convert_to_record(self, values: dict[str, Any]): ... def _convert_to_write(self, values: dict[str, Any]) -> dict[str, Any]: ... def _mapped_func(self, func: Callable): ... - def mapped(self, func: Callable | str): ... - def filtered(self: _ModelT, func: Callable | str) -> _ModelT: ... - def grouped(self: _ModelT, key: Callable | str) -> dict[Any, _ModelT]: ... + @overload + def mapped(self: _ModelT, func: Callable[[_ModelT], _Model2T]) -> _Model2T: ... + @overload + def mapped(self: _ModelT, func: Callable[[_ModelT], _T]) -> list[_T]: ... + @overload + def mapped(self, func: str) -> Any: ... + @overload + def filtered(self: _ModelT, func: Callable[[_ModelT], bool]) -> _ModelT: ... + @overload + def filtered(self: _ModelT, func: str) -> _ModelT: ... + @overload + def grouped(self: _ModelT, key: Callable[[_ModelT], _T]) -> dict[_T, _ModelT]: ... + @overload + def grouped(self: _ModelT, key: str) -> dict[Any, _ModelT]: ... def filtered_domain(self: _ModelT, domain: _Domain) -> _ModelT: ... + @overload def sorted( - self: _ModelT, key: Callable | str | None = ..., reverse: bool = ... + self: _ModelT, key: Callable[[_ModelT], Any] = ..., reverse: bool = ... + ) -> _ModelT: ... + @overload + def sorted( + self: _ModelT, key: str | None = ..., reverse: bool = ... ) -> _ModelT: ... def update(self, values: dict[str, Any]) -> None: ... def flush_model(self, fnames: Iterable[str] | None = ...) -> None: ... @@ -483,7 +501,10 @@ class BaseModel(metaclass=MetaModel): def __int__(self) -> int: ... def __repr__(self) -> str: ... def __hash__(self) -> int: ... - def __getitem__(self, key: str | int | slice): ... + @overload + def __getitem__(self: _ModelT, key: int | slice) -> _ModelT: ... + @overload + def __getitem__(self, key: str) -> Any: ... def __setitem__(self, key: str, value): ... @property def _cache(self) -> RecordCache: ...