diff --git a/odoo-stubs/api.pyi b/odoo-stubs/api.pyi index 8b6655a..a683c47 100644 --- a/odoo-stubs/api.pyi +++ b/odoo-stubs/api.pyi @@ -22,6 +22,7 @@ from .models import BaseModel from .modules.registry import Registry from .sql_db import Cursor from .tools import SQL, StackMap, frozendict +from .tools.translate import LazyGettext _T = TypeVar("_T") _ModelT = TypeVar("_ModelT", bound=BaseModel) @@ -110,6 +111,7 @@ class Environment(Mapping[str, BaseModel]): def companies(self) -> Company: ... @property def lang(self) -> str: ... + def _(self, source: str | LazyGettext, *args, **kwargs) -> str: ... def clear(self) -> None: ... def invalidate_all(self, flush: bool = ...) -> None: ... def flush_all(self) -> None: ... @@ -198,6 +200,10 @@ class Cache: def clear(self) -> None: ... def check(self, env: Environment) -> None: ... +class GroupedCompanyDependentFieldCache: + def __init__(self, company_field_cache) -> None: ... + def __getitem__(self, id_): ... + class Starred: value: Any def __init__(self, value) -> None: ... diff --git a/odoo-stubs/exceptions.pyi b/odoo-stubs/exceptions.pyi index 4e35c17..f899cbd 100644 --- a/odoo-stubs/exceptions.pyi +++ b/odoo-stubs/exceptions.pyi @@ -12,8 +12,6 @@ class RedirectWarning(Exception): button_text: str, additional_context: dict | None = ..., ) -> None: ... - @property - def name(self): ... class AccessDenied(UserError): traceback: tuple[str, str, str] diff --git a/odoo-stubs/fields.pyi b/odoo-stubs/fields.pyi index 4a027da..416ae6a 100644 --- a/odoo-stubs/fields.pyi +++ b/odoo-stubs/fields.pyi @@ -17,8 +17,9 @@ import psycopg2 from markupsafe import Markup from . import SUPERUSER_ID as SUPERUSER_ID -from .api import Environment, Registry +from .api import Environment from .models import BaseModel +from .modules.registry import Registry from .tools import date_utils, float_utils _FieldT = TypeVar("_FieldT", bound=Field) @@ -30,6 +31,7 @@ DATE_LENGTH: int DATETIME_LENGTH: int NO_ACCESS: str IR_MODELS: tuple[str, ...] +COMPANY_DEPENDENT_FIELDS: tuple[str, ...] NoneType: type[None] Default: object @@ -45,7 +47,6 @@ class Field(Generic[_FieldValueT], metaclass=MetaField): type: str relational: bool translate: bool - column_type: tuple[str, str] | None write_sequence: int args: dict[str, Any] | None automatic: bool @@ -91,7 +92,10 @@ class Field(Generic[_FieldValueT], metaclass=MetaField): def setup_related(self, model: BaseModel) -> None: ... def traverse_related(self, record: _ModelT) -> tuple[_ModelT, Field]: ... @property + def column_type(self) -> tuple[str, str] | None: ... + @property def base_field(self) -> Field: ... + def get_company_dependent_fallback(self, records: BaseModel): ... def resolve_depends(self, registry: Registry) -> Iterator[tuple]: ... def get_description( self, env: Environment, attributes: Container[str] | None = ... @@ -101,6 +105,10 @@ class Field(Generic[_FieldValueT], metaclass=MetaField): def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... ): ... + def convert_to_column_insert( + self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... + ): ... + def convert_to_column_update(self, value, record: BaseModel): ... def convert_to_cache(self, value, record: BaseModel, validate: bool = ...): ... def convert_to_record(self, value, record: BaseModel): ... def convert_to_record_multi(self, values, records: BaseModel): ... @@ -133,7 +141,6 @@ class Field(Generic[_FieldValueT], metaclass=MetaField): class Boolean(Field[bool]): type: str - column_type: tuple[str, str] def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... ) -> bool: ... @@ -144,7 +151,6 @@ class Boolean(Field[bool]): class Integer(Field[int]): type: str - column_type: tuple[str, str] aggregator: str def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... @@ -164,8 +170,6 @@ class Float(Field[float]): def __init__( self, string: str = ..., digits: tuple[int, int] | str | None = ..., **kwargs ) -> None: ... - @property - def column_type(self): ... def get_digits(self, env: Environment) -> tuple[int, int]: ... def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... @@ -182,7 +186,6 @@ class Float(Field[float]): class Monetary(Field[float]): type: str write_sequence: int - column_type: tuple[str, str] currency_field: str | None aggregator: str def __init__( @@ -191,7 +194,7 @@ class Monetary(Field[float]): def get_currency_field(self, model: BaseModel) -> str: ... def setup_nonrelated(self, model: BaseModel) -> None: ... def setup_related(self, model: BaseModel) -> None: ... - def convert_to_column( + def convert_to_column_insert( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... ) -> float: ... def convert_to_cache( @@ -202,6 +205,7 @@ class Monetary(Field[float]): self, value, record: BaseModel, use_display_name: bool = ... ): ... def convert_to_write(self, value, record: BaseModel): ... + def convert_to_export(self, value, record: BaseModel): ... class _String(Field[str]): translate: Callable | bool @@ -212,6 +216,10 @@ class _String(Field[str]): def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... ): ... + def convert_to_column_insert( + self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... + ): ... + def convert_to_column_update(self, value, record: BaseModel): ... def convert_to_cache(self, value, record: BaseModel, validate: bool = ...): ... def convert_to_record(self, value, record: BaseModel): ... def convert_to_write(self, value, record: BaseModel): ... @@ -224,8 +232,6 @@ class _String(Field[str]): class Char(_String): type: str trim: bool - @property - def column_type(self) -> tuple[str, str]: ... def update_db_column(self, model: BaseModel, column: dict | None) -> None: ... def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... @@ -233,8 +239,6 @@ class Char(_String): class Text(_String): type: str - @property - def column_type(self) -> tuple[str, str]: ... class Html(_String): type: str @@ -246,8 +250,6 @@ class Html(_String): sanitize_form: bool strip_style: bool strip_classes: bool - @property - def column_type(self) -> tuple[str, str]: ... def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... ) -> Markup | None: ... @@ -262,7 +264,6 @@ class Html(_String): class Date(Field[datetime.date]): type: str - column_type: tuple[str, str] start_of = date_utils.start_of end_of = date_utils.end_of add = date_utils.add @@ -278,6 +279,7 @@ class Date(Field[datetime.date]): from_string = to_date @staticmethod def to_string(value: datetime.datetime | datetime.date) -> str: ... + def convert_to_column_update(self, value, record: BaseModel): ... def convert_to_cache( self, value, record: BaseModel, validate: bool = ... ) -> datetime.date | None: ... @@ -286,7 +288,6 @@ class Date(Field[datetime.date]): class Datetime(Field[datetime.datetime]): type: str - column_type: tuple[str, str] start_of = date_utils.start_of end_of = date_utils.end_of add = date_utils.add @@ -304,6 +305,7 @@ class Datetime(Field[datetime.datetime]): from_string = to_datetime @staticmethod def to_string(value: datetime.datetime | datetime.date) -> str: ... + def convert_to_column_update(self, value, record: BaseModel): ... def convert_to_cache( self, value, record: BaseModel, validate: bool = ... ) -> datetime.datetime | None: ... @@ -338,7 +340,6 @@ class Image(Binary): class Selection(Field[str]): type: str - column_type: tuple[str, str] selection: list | Callable | str validate: bool ondelete: dict[str, Any] | None @@ -357,8 +358,6 @@ class Selection(Field[str]): class Reference(Selection): type: str - @property - def column_type(self) -> tuple[str, str]: ... def convert_to_column( self, value, record: BaseModel, values: Any | None = ..., validate: bool = ... ) -> str | None: ... @@ -383,7 +382,6 @@ class _Relational(Field[BaseModel]): class Many2one(_Relational): type: str - column_type: tuple[str, str] ondelete: str | None auto_join: bool delegate: bool @@ -416,7 +414,6 @@ class Many2oneReference(Integer): class Json(Field): type: str - column_type: tuple[str, str] def convert_to_record(self, value, record: BaseModel): ... def convert_to_cache(self, value, record: BaseModel, validate: bool = ...): ... def convert_to_column( @@ -426,7 +423,6 @@ class Json(Field): class Properties(Field): type: str - column_type: tuple[str, str] copy: bool prefetch: bool write_sequence: int @@ -453,7 +449,6 @@ class Properties(Field): class PropertiesDefinition(Field): type: str - column_type: tuple[str, str] copy: bool readonly: bool prefetch: bool diff --git a/odoo-stubs/http.pyi b/odoo-stubs/http.pyi index 5090db2..5e6a85c 100644 --- a/odoo-stubs/http.pyi +++ b/odoo-stubs/http.pyi @@ -50,16 +50,6 @@ def dispatch_rpc(service_name: str, method: str, params: Mapping): ... def get_session_max_inactivity(env: Environment) -> int: ... def is_cors_preflight(request: Request, endpoint) -> bool: ... def serialize_exception(exception: Exception): ... -def send_file( - filepath_or_fp, - mimetype: str | None = ..., - as_attachment: bool = ..., - filename: str | None = ..., - mtime: str | None = ..., - add_etags: bool = ..., - cache_timeout: int = ..., - conditional: bool = ..., -) -> werkzeug.Response: ... class Stream: type: str diff --git a/odoo-stubs/models.pyi b/odoo-stubs/models.pyi index 09bfd45..eeda42c 100644 --- a/odoo-stubs/models.pyi +++ b/odoo-stubs/models.pyi @@ -156,12 +156,9 @@ class BaseModel(metaclass=MetaModel): ) -> list[list]: ... def export_data(self, fields_to_export: list[str]) -> dict[str, list[list]]: ... def load(self, fields: list[str], data: list[list[str]]) -> dict[str, Any]: ... - def _add_fake_fields( - self, fields: dict[str | None, Field] - ) -> dict[str | None, Field]: ... def _extract_records( self, - fields_: Iterable[Sequence[str]], + field_paths: Iterable[Sequence[str]], data, log: Callable = ..., limit: float = ..., @@ -341,6 +338,12 @@ class BaseModel(metaclass=MetaModel): def get_base_url(self) -> str: ... def _check_company_domain(self, companies) -> list: ... def _check_company(self, fnames: Collection[str] | None = ...) -> None: ... + def check_access(self, operation: str) -> None: ... + def has_access(self, operation: str) -> bool: ... + def _filtered_access(self, operation: str): ... + def _check_access( + self: _ModelT, operation: str + ) -> tuple[_ModelT, Callable] | None: ... def check_access_rights( self, operation: str, raise_exception: bool = ... ) -> bool: ... @@ -364,8 +367,9 @@ class BaseModel(metaclass=MetaModel): def _parent_store_create(self) -> None: ... def _parent_store_update_prepare(self: _ModelT, vals_list) -> _ModelT: ... def _parent_store_update(self) -> None: ... + def _clean_properties(self) -> None: ... def _load_records_write(self, values: dict[str, Any]) -> None: ... - def _load_records_create(self, values: list[dict[str, Any]]): ... + def _load_records_create(self, vals_list: list[dict[str, Any]]): ... def _load_records( self, data_list: list[dict], update: bool = ..., ignore_duplicates: bool = ... ) -> BaseModel: ... @@ -541,12 +545,6 @@ class BaseModel(metaclass=MetaModel): fields_spec: dict, ) -> dict: ... def _get_placeholder_filename(self, field: str) -> str | bool: ... - def _populate_factories(self) -> list[tuple[str, Callable[..., Iterator]]]: ... - @property - def _populate_sizes(self) -> dict[str, int]: ... - @property - def _populate_dependencies(self) -> list[str]: ... - def _populate(self: _ModelT, size: str) -> _ModelT: ... class RecordCache(MutableMapping): def __init__(self, record: BaseModel) -> None: ... diff --git a/odoo-stubs/modules/module.pyi b/odoo-stubs/modules/module.pyi index 06294b3..38b9729 100644 --- a/odoo-stubs/modules/module.pyi +++ b/odoo-stubs/modules/module.pyi @@ -30,9 +30,6 @@ def module_manifest(path: str) -> str | None: ... def get_module_root(path: str) -> str | None: ... def load_manifest(module: str, mod_path: str | None = ...) -> dict[str, Any]: ... def get_manifest(module: str, mod_path: str | None = ...) -> dict[str, Any]: ... -def load_information_from_description_file( - module: str, mod_path: str | None = ... -) -> dict: ... def load_openerp_module(module_name: str) -> None: ... def get_modules() -> list[str]: ... def get_modules_with_version() -> dict[str, Any]: ... diff --git a/odoo-stubs/modules/registry.pyi b/odoo-stubs/modules/registry.pyi index cade2ec..08f1f24 100644 --- a/odoo-stubs/modules/registry.pyi +++ b/odoo-stubs/modules/registry.pyi @@ -31,6 +31,7 @@ class Registry(Mapping[str, type[BaseModel]]): field_depends: Collector field_depends_context: Collector field_inverses: Collector + many2one_company_dependents: Collector registry_sequence: int | None cache_sequences: dict has_unaccent: bool diff --git a/odoo-stubs/netsvc.pyi b/odoo-stubs/netsvc.pyi index eb8fdbe..7ad0a40 100644 --- a/odoo-stubs/netsvc.pyi +++ b/odoo-stubs/netsvc.pyi @@ -1,5 +1,4 @@ import logging.handlers -import warnings from logging import Logger, LogRecord from typing import TextIO @@ -52,7 +51,6 @@ def init_logger(): ... DEFAULT_LOG_CONFIGURATION: list[str] PSEUDOCONFIG_MAPPER: dict[str, list[str]] -showwarning = warnings.showwarning IGNORE: set[str] def showwarning_with_traceback( diff --git a/odoo-stubs/service/__init__.pyi b/odoo-stubs/service/__init__.pyi index 2d4b73d..beb8466 100644 --- a/odoo-stubs/service/__init__.pyi +++ b/odoo-stubs/service/__init__.pyi @@ -2,4 +2,3 @@ from . import common as common from . import db as db from . import model as model from . import server as server -from . import wsgi_server as wsgi_server diff --git a/odoo-stubs/service/wsgi_server.pyi b/odoo-stubs/service/wsgi_server.pyi deleted file mode 100644 index 6e3e995..0000000 --- a/odoo-stubs/service/wsgi_server.pyi +++ /dev/null @@ -1 +0,0 @@ -def application(environ, start_response): ... diff --git a/odoo-stubs/sql_db.pyi b/odoo-stubs/sql_db.pyi index 0cadbe2..bfe42e1 100644 --- a/odoo-stubs/sql_db.pyi +++ b/odoo-stubs/sql_db.pyi @@ -75,8 +75,8 @@ class Cursor(BaseCursor): fetch: bool = ..., ): ... def split_for_in_conditions( - self, ids: Iterable, size: int | None = ... - ) -> Iterator[tuple]: ... + self, ids: Iterable[_T], size: int = ... + ) -> Iterator[tuple[_T, ...]]: ... def print_log(self): ... def close(self): ... def commit(self): ... diff --git a/odoo-stubs/tests/common.pyi b/odoo-stubs/tests/common.pyi index 1d74416..48e073c 100644 --- a/odoo-stubs/tests/common.pyi +++ b/odoo-stubs/tests/common.pyi @@ -99,6 +99,10 @@ class BaseCase(case.TestCase, metaclass=MetaCase): self, expected, flush: bool = ... ) -> Generator[list, None, None]: ... @contextmanager + def assertQueriesContain( + self, expected, flush: bool = ... + ) -> Generator[list, None, None]: ... + @contextmanager def assertQueryCount( self, default: int = ..., flush: bool = ..., **counters ) -> Generator[None, None, None]: ... @@ -123,8 +127,11 @@ class Like: class Approx: value: float + decorate: bool cmp: Callable - def __init__(self, value: float, rounding: int | float | Currency) -> None: ... + def __init__( + self, value: float, rounding: int | float | Currency, decorate: bool + ) -> None: ... def __repr__(self) -> str: ... def __eq__(self, other: object) -> bool | NotImplemented: ... @@ -217,6 +224,10 @@ class HttpCase(TransactionCase): allow_end_on_form: bool @classmethod def setUpClass(cls) -> None: ... + @classmethod + def base_url(cls) -> str: ... + @classmethod + def http_port(cls) -> int | None: ... xmlrpc_common: xmlrpclib.ServerProxy xmlrpc_db: xmlrpclib.ServerProxy xmlrpc_object: xmlrpclib.ServerProxy @@ -253,8 +264,6 @@ class HttpCase(TransactionCase): debug: bool = ..., **kw ) -> None: ... - @classmethod - def base_url(cls) -> str: ... def start_tour( self, url_path: str, tour_name: str, step_delay: float | None = ..., **kwargs ) -> None: ... diff --git a/odoo-stubs/tests/form.pyi b/odoo-stubs/tests/form.pyi index 55ee500..0ee9831 100644 --- a/odoo-stubs/tests/form.pyi +++ b/odoo-stubs/tests/form.pyi @@ -1,6 +1,7 @@ import collections from typing import Any, Generic, Iterable, Iterator, TypeVar +from ..api import Environment from ..models import BaseModel _ModelT = TypeVar("_ModelT", bound=BaseModel) @@ -10,6 +11,8 @@ MODIFIER_ALIASES: dict class Form(Generic[_ModelT]): def __init__(self, record: _ModelT, view: Any | None = ...) -> None: ... + @classmethod + def from_action(cls, env: Environment, action: dict) -> Form: ... def __getattr__(self, field_name: str): ... def __getitem__(self, field_name: str): ... def __setattr__(self, field_name: str, value) -> None: ... diff --git a/odoo-stubs/tools/__init__.pyi b/odoo-stubs/tools/__init__.pyi index 4179571..f707c02 100644 --- a/odoo-stubs/tools/__init__.pyi +++ b/odoo-stubs/tools/__init__.pyi @@ -30,8 +30,8 @@ from .query import Query as Query from .set_expression import SetDefinitions as SetDefinitions from .sourcemap_generator import SourceMapGenerator as SourceMapGenerator from .sql import * +from .translate import LazyTranslate as LazyTranslate from .translate import _ as _ -from .translate import _lt as _lt from .translate import html_translate as html_translate from .translate import xml_translate as xml_translate from .xml_utils import cleanup_xml_node as cleanup_xml_node diff --git a/odoo-stubs/tools/config.pyi b/odoo-stubs/tools/config.pyi index 549a4ed..11f2218 100644 --- a/odoo-stubs/tools/config.pyi +++ b/odoo-stubs/tools/config.pyi @@ -19,7 +19,9 @@ class configmanager: config_file: str parser: OptionParser def __init__(self, fname: str | None = ...) -> None: ... - def parse_config(self, args: list | None = ...): ... + def parse_config( + self, args: list[str] | None = ..., *, setup_logging: bool | None = ... + ) -> None: ... def load(self) -> None: ... def save(self, keys: Any | None = ...) -> None: ... def get(self, key, default: Any | None = ...): ... diff --git a/odoo-stubs/tools/func.pyi b/odoo-stubs/tools/func.pyi index c29934c..326d637 100644 --- a/odoo-stubs/tools/func.pyi +++ b/odoo-stubs/tools/func.pyi @@ -1,31 +1,36 @@ -from typing import Callable, Generic, TypeVar +from typing import Any, Callable, Generic, TypeVar, overload _T = TypeVar("_T") class lazy_property(Generic[_T]): - fget: Callable[..., _T] - def __init__(self, fget: Callable[..., _T]) -> None: ... - def __get__(self, obj, cls) -> _T: ... + fget: Callable[[Any], _T] + def __init__(self, fget: Callable[[Any], _T]) -> None: ... + @overload + def __get__(self, obj: None, cls: Any) -> Any: ... + @overload + def __get__(self, obj: object, cls: Any) -> _T: ... @property def __doc__(self): ... @staticmethod def reset_all(obj) -> None: ... -class lazy_classproperty(lazy_property[_T]): - def __get__(self, obj, cls) -> _T: ... - def conditional(condition, decorator): ... -def filter_kwargs(func, kwargs) -> dict: ... +def filter_kwargs(func: Callable, kwargs: dict[str, Any]) -> dict[str, Any]: ... def synchronized(lock_attr: str = ...) -> Callable[[_T], _T]: ... locked: Callable[[_T], _T] def frame_codeinfo(fframe, back: int = ...) -> tuple[str | None, str | None]: ... -class _ClassProperty(property, Generic[_T]): - def __get__(self, cls, owner) -> _T: ... +class classproperty(Generic[_T]): + fget: ... + def __init__(self, fget: Callable[[Any], _T]) -> None: ... + def __get__(self, cls, owner: type | None = ...) -> _T: ... + @property + def __doc__(self): ... -def classproperty(func: Callable[..., _T]) -> _ClassProperty[_T]: ... +class lazy_classproperty(classproperty[_T], Generic[_T]): + def __get__(self, cls, owner: type | None = ...) -> _T: ... class lazy: def __init__(self, func, *args, **kwargs) -> None: ... diff --git a/odoo-stubs/tools/i18n.pyi b/odoo-stubs/tools/i18n.pyi index f959c54..98bb1f9 100644 --- a/odoo-stubs/tools/i18n.pyi +++ b/odoo-stubs/tools/i18n.pyi @@ -1,7 +1,10 @@ +from re import Pattern from typing import Literal, Sequence from ..api import Environment +XPG_LOCALE_RE: Pattern + def format_list( env: Environment, lst: Sequence[str], @@ -16,3 +19,4 @@ def format_list( ] = ..., lang_code: str | None = ..., ) -> str: ... +def py_to_js_locale(locale: str) -> str: ... diff --git a/odoo-stubs/tools/lru.pyi b/odoo-stubs/tools/lru.pyi index 931c0f4..3a48dd3 100644 --- a/odoo-stubs/tools/lru.pyi +++ b/odoo-stubs/tools/lru.pyi @@ -1,15 +1,18 @@ from collections import OrderedDict -from typing import Any +from typing import Generic, Iterable, Iterator, MutableMapping, TypeVar -class LRU: +_K = TypeVar("_K") +_V = TypeVar("_V") + +class LRU(MutableMapping[_K, _V], Generic[_K, _V]): count: int d: OrderedDict - def __init__(self, count: int, pairs: tuple[Any, Any] = ...) -> None: ... - def __contains__(self, obj) -> bool: ... - def get(self, obj, val: Any | None = ...): ... - def __getitem__(self, obj): ... - def __setitem__(self, obj, val) -> None: ... - def __delitem__(self, obj) -> None: ... + def __init__(self, count: int, pairs: Iterable[tuple[_K, _V]] = ...) -> None: ... + def __contains__(self, obj: _K) -> bool: ... + def __getitem__(self, obj: _K) -> _V: ... + def __setitem__(self, obj: _K, val: _V): ... + def __delitem__(self, obj: _K): ... def __len__(self) -> int: ... - def pop(self, key): ... + def __iter__(self) -> Iterator[_K]: ... + def pop(self, key: _K) -> _V: ... def clear(self) -> None: ... diff --git a/odoo-stubs/tools/misc.pyi b/odoo-stubs/tools/misc.pyi index 42df88e..901ab5a 100644 --- a/odoo-stubs/tools/misc.pyi +++ b/odoo-stubs/tools/misc.pyi @@ -10,11 +10,13 @@ from typing import ( Callable, Collection, Generic, - ItemsView, Iterable, Iterator, NoReturn, + Reversible, + Sequence, TypeVar, + overload, ) import markupsafe @@ -54,11 +56,11 @@ def file_open( ) -> IO: ... def file_open_temporary_directory(env: Environment) -> Iterator[str]: ... def flatten(list) -> list: ... -def reverse_enumerate(l): ... +def reverse_enumerate(lst: Sequence[_T]) -> Iterator[tuple[int, _T]]: ... def partition( pred: Callable[[_T], bool], elems: Iterable[_T] ) -> tuple[list[_T], list[_T]]: ... -def topological_sort(elems: dict[_T, Any]) -> list[_T]: ... +def topological_sort(elems: Mapping[_T, Collection[_T]]) -> list[_T]: ... def merge_sequences(*iterables: Iterable[_T]) -> list[_T]: ... class PatchedWorkbook(xlwt.Workbook): @@ -81,8 +83,15 @@ DATETIME_FORMATS_MAP: dict[str, str] POSIX_TO_LDML: dict[str, str] def posix_to_ldml(fmt: str, locale: Locale) -> str: ... +@overload +def split_every(n: int, iterable: Iterable[_T]) -> Iterator[tuple[_T, ...]]: ... +@overload def split_every( - n: int, iterable: Iterable[_T], piece_maker: Callable[[Iterable[_T]], _T1] = ... + n: int, iterable: Iterable[_T], piece_maker: type[Collection[_T]] +) -> Iterator[Collection[_T]]: ... +@overload +def split_every( + n: int, iterable: Iterable[_T], piece_maker: Callable[[Iterable[_T]], _T1] ) -> Iterator[_T1]: ... def discardattr(obj, key: str) -> None: ... def remove_accents(input_str: str) -> str: ... @@ -119,18 +128,9 @@ class lower_logging(Handler): ) -> None: ... def emit(self, record: LogRecord) -> None: ... -class CountingStream(Generic[_T]): - stream: Iterator[_T] - index: int - stopped: bool - def __init__(self, stream: Iterable[_T], start: int = ...) -> None: ... - def __iter__(self) -> CountingStream[_T]: ... - def next(self) -> _T: ... - __next__ = next - def stripped_sys_argv(*strip_args: str) -> list[str]: ... -class ConstantMapping(Mapping[_KT, _VT]): +class ConstantMapping(Mapping[Any, _VT], Generic[_VT]): def __init__(self, val: _VT) -> None: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator: ... @@ -142,7 +142,7 @@ def dumpstacks( def freehash(arg) -> int: ... def clean_context(context: dict[str, Any]) -> dict[str, Any]: ... -class frozendict(dict): +class frozendict(dict[_KT, _VT], Generic[_KT, _VT]): def __delitem__(self, key) -> NoReturn: ... def __setitem__(self, key, val) -> NoReturn: ... def clear(self) -> NoReturn: ... @@ -152,23 +152,24 @@ class frozendict(dict): def update(self, *args, **kwargs) -> NoReturn: ... def __hash__(self) -> int: ... -class Collector(dict[_KT, tuple[_T]]): - def __getitem__(self, key: _KT) -> tuple[_T]: ... - def __setitem__(self, key: _KT, val: Iterable[_T]) -> None: ... - def add(self, key: _KT, val: _T) -> None: ... - def discard_keys_and_values(self, excludes: Collection): ... +class Collector(dict[_KT, tuple[_T, ...]], Generic[_KT, _T]): + def __getitem__(self, key: _KT) -> tuple[_T, ...]: ... + def __setitem__(self, key: _KT, val: Iterable[_T]): ... + def add(self, key: _KT, val: _T): ... + def discard_keys_and_values(self, excludes: Collection[_KT | _T]) -> None: ... -class StackMap(MutableMapping): - def __init__(self, m: MutableMapping | None = ...) -> None: ... - def __getitem__(self, key): ... - def __setitem__(self, key, val) -> None: ... - def __delitem__(self, key) -> None: ... - def __iter__(self) -> Iterator: ... +class StackMap(MutableMapping[_KT, _VT], Generic[_KT, _VT]): + def __init__(self, m: MutableMapping[_KT, _VT] | None = ...) -> None: ... + def __getitem__(self, key: _KT) -> _VT: ... + def __setitem__(self, key: _KT, val: _VT): ... + def __delitem__(self, key: _KT): ... + def __iter__(self) -> Iterator[_KT]: ... def __len__(self) -> int: ... - def pushmap(self, m: MutableMapping | None = ...) -> None: ... - def popmap(self) -> MutableMapping: ... + def __str__(self) -> str: ... + def pushmap(self, m: MutableMapping[_KT, _VT] | None = ...): ... + def popmap(self) -> MutableMapping[_KT, _VT]: ... -class OrderedSet(MutableSet): +class OrderedSet(MutableSet[_T], Generic[_T]): def __init__(self, elems: Iterable = ...) -> None: ... def __contains__(self, elem) -> bool: ... def __iter__(self) -> Iterator: ... @@ -178,7 +179,7 @@ class OrderedSet(MutableSet): def update(self, elems: Iterable) -> None: ... def difference_update(self, elems: Iterable) -> None: ... -class LastOrderedSet(OrderedSet): +class LastOrderedSet(OrderedSet[_T], Generic[_T]): def add(self, elem) -> None: ... class Callbacks: @@ -188,17 +189,17 @@ class Callbacks: def run(self) -> None: ... def clear(self) -> None: ... -class ReversedIterable(Generic[_T]): - iterable: Iterable[_T] - def __init__(self, iterable: Iterable[_T]) -> None: ... +class ReversedIterable(Reversible[_T], Generic[_T]): + iterable: Reversible[_T] + def __init__(self, iterable: Reversible[_T]) -> None: ... def __iter__(self) -> Iterator[_T]: ... def __reversed__(self) -> Iterator[_T]: ... def groupby( - iterable: Iterable[_T], key: Callable[..., _T1] | None = ... -) -> ItemsView[_T1, _T]: ... + iterable: Iterable[_T], key: Callable[[_T], _T1] = ... +) -> Iterable[tuple[_T1, list[_T]]]: ... def unique(it: Iterable[_T]) -> Iterator[_T]: ... -def submap(mapping: Mapping[_KT, _VT], keys: Iterable[_KT]) -> dict[_KT, _VT]: ... +def submap(mapping: Mapping[_KT, _VT], keys: Iterable[_KT]) -> Mapping[_KT, _VT]: ... class Reverse: val: Any @@ -265,7 +266,7 @@ def format_duration(value: float) -> str: ... consteq: Callable[[str, str], bool] -class ReadonlyDict(Mapping): ... +class ReadonlyDict(Mapping[_KT, _VT], Generic[_KT, _VT]): ... class DotDict(dict): def __getattr__(self, attrib): ... diff --git a/odoo-stubs/tools/parse_version.pyi b/odoo-stubs/tools/parse_version.pyi index 199069d..3568225 100644 --- a/odoo-stubs/tools/parse_version.pyi +++ b/odoo-stubs/tools/parse_version.pyi @@ -4,4 +4,4 @@ from typing import Callable component_re: Pattern replace: Callable -def parse_version(s: str) -> tuple[str]: ... +def parse_version(s: str) -> tuple[str, ...]: ... diff --git a/odoo-stubs/tools/populate.pyi b/odoo-stubs/tools/populate.pyi index 48f232b..b810f2c 100644 --- a/odoo-stubs/tools/populate.pyi +++ b/odoo-stubs/tools/populate.pyi @@ -1,54 +1,50 @@ import datetime -import random -from typing import Any, Callable, Iterable, Iterator, Sequence, TypeVar -from dateutil.relativedelta import relativedelta +from ..api import Environment +from ..fields import Field, Many2one +from ..models import Model +from . import SQL -_T = TypeVar("_T") +MIN_DATETIME: datetime.datetime +MAX_DATETIME: datetime.datetime -def Random(seed) -> random.Random: ... -def format_str(val: _T, counter, values) -> _T: ... -def chain_factories( - field_factories: Iterable[tuple[str, Callable[..., Iterator]]], model_name: str -) -> Iterator: ... -def root_factory() -> Iterator[dict]: ... -def randomize( - vals: Sequence, - weights: Sequence | None = ..., - seed: Any = ..., - formatter: Callable[[Any, Any, Any], Any] = ..., - counter_offset: int = ..., -) -> Callable[[Iterable, str, str], dict]: ... -def cartesian( - vals: Sequence, - weights: Sequence | None = ..., - seed: Any = ..., - formatter: Callable[[Any, Any, Any], Any] = ..., - then: Callable[[Iterable, str, str], dict] | None = ..., -) -> Callable[[Iterable, str, str], Iterator[dict]]: ... -def iterate( - vals: Sequence, - weights: Sequence | None = ..., - seed: Any = ..., - formatter: Callable[[Any, Any, Any], Any] = ..., - then: Callable[[Iterable, str, str], dict] | None = ..., -) -> Callable[[Iterable, str, str], Iterator[dict]]: ... -def constant( - val: Sequence, formatter: Callable[[Any, Any, Any], Any] = ... -) -> Callable[[Iterable, str, str], Iterator[dict]]: ... -def compute( - function: Callable[[Any, Any, Any], Any], seed: Any | None = ... -) -> Callable[[Iterable, str, str], Iterator[dict]]: ... -def randint( - a: int, b: int, seed: Any | None = ... -) -> Callable[[Iterable, str, str], Iterator[dict]]: ... -def randfloat( - a: float, b: float, seed: Any | None = ... -) -> Callable[[Iterable, str, str], Iterator[dict]]: ... -def randdatetime( - *, - base_date: datetime.datetime | None = ..., - relative_before: datetime.timedelta | relativedelta | None = ..., - relative_after: datetime.timedelta | relativedelta | None = ..., - seed: Any | None = ... -) -> Callable[[Iterable, str, str], Iterator[dict]]: ... +def get_field_variation_date( + model: Model, field: Field, factor: int, series_alias: str +) -> SQL: ... +def get_field_variation_char(field: Field, postfix: str | SQL | None = ...) -> SQL: ... +def ignore_indexes(model: Model): ... +def ignore_fkey_constraints(model: Model): ... +def field_needs_variation(model: Model, field: Field) -> bool: ... +def get_field_variation( + model: Model, field: Field, factor: int, series_alias: str +) -> SQL: ... +def fetch_last_id(model: Model) -> int: ... +def populate_field( + model: Model, + field: Field, + populated: dict[Model, int], + factors: dict[Model, int], + table_alias: str = ..., + series_alias: str = ..., +) -> SQL | None: ... +def populate_model( + model: Model, + populated: dict[Model, int], + factors: dict[Model, int], + separator_code: str, +) -> None: ... + +class Many2oneFieldWrapper(Many2one): + def __init__(self, model, field_name, comodel_name) -> None: ... + +class Many2manyModelWrapper: + env: Environment + def __init__(self, env, field) -> None: ... + def __repr__(self) -> str: ... + def __eq__(self, other): ... + def __hash__(self): ... + +def infer_many2many_model( + env: Environment, field: Field +) -> Model | Many2manyModelWrapper: ... +def populate_models(model_factors: dict[Model, int], separator_code: int) -> None: ... diff --git a/odoo-stubs/tools/query.pyi b/odoo-stubs/tools/query.pyi index fa6edc9..49b5e77 100644 --- a/odoo-stubs/tools/query.pyi +++ b/odoo-stubs/tools/query.pyi @@ -47,7 +47,7 @@ class Query: def select(self, *args: str | SQL) -> SQL: ... def subselect(self, *args: str | SQL) -> SQL: ... def get_result_ids(self) -> tuple[int, ...]: ... - def set_result_ids(self, ids, ordered: bool = ...) -> None: ... + def set_result_ids(self, ids: Iterable[int], ordered: bool = ...) -> None: ... def __bool__(self) -> bool: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[int]: ... diff --git a/odoo-stubs/tools/set_expression.pyi b/odoo-stubs/tools/set_expression.pyi index c6008db..73dc21a 100644 --- a/odoo-stubs/tools/set_expression.pyi +++ b/odoo-stubs/tools/set_expression.pyi @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from collections.abc import Iterable -from typing import Any +from typing import Any, Collection, Literal class SetDefinitions: def __init__(self, definitions: dict[int, dict]) -> None: ... @@ -9,9 +9,11 @@ class SetDefinitions: @property def universe(self) -> SetExpression: ... def parse(self, refs: str, raise_if_not_found: bool = ...) -> SetExpression: ... - def from_ids(self, ids, keep_subsets: bool = ...) -> SetExpression: ... + def from_ids( + self, ids: Iterable[int], keep_subsets: bool = ... + ) -> SetExpression: ... def from_key(self, key: str) -> SetExpression: ... - def get_id(self, ref): ... + def get_id(self, ref: LeafIdType) -> LeafIdType | None: ... class SetExpression(ABC): @abstractmethod @@ -19,7 +21,7 @@ class SetExpression(ABC): @abstractmethod def is_universal(self) -> bool: ... @abstractmethod - def invert_intersect(self, factor: SetExpression) -> SetExpression: ... + def invert_intersect(self, factor: SetExpression) -> SetExpression | None: ... @abstractmethod def matches(self, user_group_ids: Iterable[int]) -> bool: ... @property @@ -32,7 +34,7 @@ class SetExpression(ABC): @abstractmethod def __invert__(self) -> SetExpression: ... @abstractmethod - def __eq__(self, other: SetExpression) -> bool: ... + def __eq__(self, other) -> bool: ... @abstractmethod def __le__(self, other: SetExpression) -> bool: ... @abstractmethod @@ -46,15 +48,15 @@ class Union(SetExpression): def key(self) -> str: ... def is_empty(self) -> bool: ... def is_universal(self) -> bool: ... - def invert_intersect(self, factor: Union) -> SetExpression: ... - def __and__(self, other: Union) -> SetExpression: ... - def __or__(self, other: Union) -> SetExpression: ... + def invert_intersect(self, factor: SetExpression) -> Union | None: ... + def __and__(self, other: SetExpression) -> Union: ... + def __or__(self, other: SetExpression) -> Union: ... def __invert__(self) -> Union: ... def matches(self, user_group_ids) -> bool: ... def __bool__(self) -> bool: ... - def __eq__(self, other: Union) -> bool: ... - def __le__(self, other: Union) -> bool: ... - def __lt__(self, other: Union) -> bool: ... + def __eq__(self, other) -> bool: ... + def __le__(self, other: SetExpression) -> bool: ... + def __lt__(self, other: SetExpression) -> bool: ... def __str__(self) -> str: ... def __repr__(self) -> str: ... def __hash__(self): ... @@ -67,29 +69,29 @@ class Inter: def is_universal(self) -> bool: ... def matches(self, user_group_ids) -> bool: ... def __and__(self, other: Inter) -> Inter: ... - def __eq__(self, other: Inter) -> bool: ... + def __eq__(self, other) -> bool: ... def __le__(self, other: Inter) -> bool: ... def __lt__(self, other: Inter) -> bool: ... def __hash__(self): ... class Leaf: - id: ... - ref: ... + id: LeafIdType + ref: str | int negative: bool - key: ... - subsets: set - supersets: set - disjoints: set + key: tuple[LeafIdType, bool] + subsets: set[LeafIdType] + supersets: set[LeafIdType] + disjoints: set[LeafIdType] inverse: Leaf | None def __init__( - self, leaf_id, ref: Any | None = ..., negative: bool = ... + self, leaf_id: LeafIdType, ref: str | int | None = ..., negative: bool = ... ) -> None: ... - def __invert__(self): ... + def __invert__(self) -> Leaf: ... def is_empty(self) -> bool: ... def is_universal(self) -> bool: ... def isdisjoint(self, other: Leaf) -> bool: ... - def matches(self, user_group_ids): ... - def __eq__(self, other: Leaf) -> bool: ... + def matches(self, user_group_ids: Collection[int]) -> bool: ... + def __eq__(self, other) -> bool: ... def __le__(self, other: Leaf) -> bool: ... def __lt__(self, other: Leaf) -> bool: ... def __hash__(self): ... @@ -98,6 +100,7 @@ class UnknownId(str): def __lt__(self, other) -> bool: ... def __gt__(self, other) -> bool: ... +LeafIdType: int | Literal["*"] | UnknownId UNIVERSAL_LEAF: Leaf EMPTY_LEAF: Leaf EMPTY_INTER: Inter diff --git a/odoo-stubs/tools/translate.pyi b/odoo-stubs/tools/translate.pyi index 39ffe75..13f1a72 100644 --- a/odoo-stubs/tools/translate.pyi +++ b/odoo-stubs/tools/translate.pyi @@ -47,18 +47,30 @@ def html_term_converter(value: str) -> str: ... def get_text_content(term: str) -> str: ... def is_text(term: str) -> bool: ... def translate_sql_constraint(cr: Cursor, key: str, lang: str) -> str: ... +def get_translation(module: str, lang: str, source: str, args: tuple | dict) -> str: ... +def get_translated_module(arg) -> str: ... +def get_text_alias(source: str, *args, **kwargs): ... -class GettextAlias: - def __call__(self, source: str, *args, **kwargs) -> str: ... +class LazyGettext: + def __init__( + self, source, *args, _module: str = ..., _default_lang: str = ..., **kwargs + ) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def __eq__(self, other): ... + def __hash__(self): ... + def __lt__(self, other): ... + def __add__(self, other): ... + def __radd__(self, other): ... -class _lt: - def __init__(self, source: str, *args, **kwargs) -> None: ... - def __eq__(self, other) -> NoReturn: ... - def __lt__(self, other) -> NoReturn: ... - def __add__(self, other: str | _lt) -> str: ... - def __radd__(self, other: str) -> str: ... +class LazyTranslate: + module: str + default_lang: str + def __init__(self, module: str, *, default_lang: str = ...) -> None: ... + def __call__(self, source: str, *args, **kwargs) -> LazyGettext: ... -_: GettextAlias +_ = get_text_alias +_lt = LazyGettext def quote(s: str) -> str: ...