diff --git a/odoo-stubs/fields.pyi b/odoo-stubs/fields.pyi index 7d35d17..15362a5 100644 --- a/odoo-stubs/fields.pyi +++ b/odoo-stubs/fields.pyi @@ -1,6 +1,11 @@ import datetime +from typing import Any, Generic, Optional, TypeVar, overload -from typing import Any, Optional +from .models import BaseModel +from .tools import date_utils + +_FieldT = TypeVar('_FieldT', bound=Field) +_FieldValueT = TypeVar('_FieldValueT') DATE_LENGTH: Any DATETIME_LENGTH: Any @@ -21,7 +26,7 @@ class MetaField(type): _global_seq: Any -class Field(MetaField('DummyField', (object,), {})): +class Field(Generic[_FieldValueT], metaclass=MetaField): type: Any = ... relational: bool = ... translate: bool = ... @@ -112,7 +117,10 @@ class Field(MetaField('DummyField', (object,), {})): def update_db_index(self, model: Any, column: Any) -> None: ... def read(self, records: Any): ... def write(self, records: Any, value: Any, create: bool = ...): ... - # def __get__(self, record: Any, owner: Any): ... + @overload + def __get__(self, record: BaseModel, owner: Any) -> _FieldValueT: ... + @overload + def __get__(self: _FieldT, record: None, owner: Any) -> _FieldT: ... def __set__(self, record: Any, value: Any) -> None: ... def _compute_value(self, records: Any) -> None: ... def compute_value(self, records: Any) -> None: ... @@ -122,14 +130,14 @@ class Field(MetaField('DummyField', (object,), {})): def determine_domain(self, records: Any, operator: Any, value: Any): ... def modified_draft(self, records: Any): ... -class Boolean(Field): +class Boolean(Field[bool]): type: str = ... column_type: Any = ... def convert_to_column(self, value: Any, record: Any, values: Optional[Any] = ...): ... def convert_to_cache(self, value: Any, record: Any, validate: bool = ...): ... def convert_to_export(self, value: Any, record: Any): ... -class Integer(Field): +class Integer(Field[int]): type: str = ... column_type: Any = ... _slots: Any = ... @@ -140,7 +148,7 @@ class Integer(Field): def _update(self, records: Any, value: Any) -> None: ... def convert_to_export(self, value: Any, record: Any): ... -class Float(Field): +class Float(Field[float]): type: str = ... column_cast_from: Any = ... _slots: Any = ... @@ -156,7 +164,7 @@ class Float(Field): def convert_to_cache(self, value: Any, record: Any, validate: bool = ...): ... def convert_to_export(self, value: Any, record: Any): ... -class Monetary(Field): +class Monetary(Field[float]): type: str = ... column_type: Any = ... column_cast_from: Any = ... @@ -172,7 +180,7 @@ class Monetary(Field): def convert_to_read(self, value: Any, record: Any, use_name_get: bool = ...): ... def convert_to_write(self, value: Any, record: Any): ... -class _String(Field): +class _String(Field[str]): _slots: Any = ... def __init__(self, string: Any = ..., **kwargs: Any) -> None: ... prefetch: Any = ... @@ -222,7 +230,7 @@ class Html(_String): def convert_to_column(self, value: Any, record: Any, values: Optional[Any] = ...): ... def convert_to_cache(self, value: Any, record: Any, validate: bool = ...): ... -class Date(Field): +class Date(Field[datetime.date]): type: str = ... column_type: Any = ... column_cast_from: Any = ... @@ -238,7 +246,7 @@ class Date(Field): def convert_to_cache(self, value: Any, record: Any, validate: bool = ...): ... def convert_to_export(self, value: Any, record: Any): ... -class Datetime(Field): +class Datetime(Field[datetime.datetime]): type: str = ... column_type: Any = ... column_cast_from: Any = ... @@ -256,7 +264,7 @@ class Datetime(Field): def convert_to_display_name(self, value: Any, record: Any): ... _BINARY = memoryview -class Binary(Field): +class Binary(Field[bytes]): type: str = ... _slots: Any = ... @property @@ -268,7 +276,7 @@ class Binary(Field): def read(self, records: Any) -> None: ... def write(self, records: Any, value: Any, create: bool = ...) -> None: ... -class Selection(Field): +class Selection(Field[str]): type: str = ... _slots: Any = ... def __init__(self, selection: Any = ..., string: Any = ..., **kwargs: Any) -> None: ... @@ -293,7 +301,7 @@ class Reference(Selection): def convert_to_export(self, value: Any, record: Any): ... def convert_to_display_name(self, value: Any, record: Any): ... -class _Relational(Field): +class _Relational(Field[BaseModel]): relational: bool = ... _slots: Any = ... comodel_name: str = ... @@ -373,10 +381,9 @@ class Many2many(_RelationalMulti): def read(self, records: Any) -> None: ... def write(self, records: Any, value: Any, create: bool = ...) -> None: ... -class Id(Field): +class Id(Field[int]): type: str = ... column_type: Any = ... _slots: Any = ... def update_db(self, model: Any, columns: Any) -> None: ... - def __get__(self, record: Any, owner: Any): ... def __set__(self, record: Any, value: Any) -> None: ...