Wednesday, June 28, 2023
1 change · master
Features or functions removed from Odoo
Odoo now uses one standard way to generate and retrieve record display names, replacing the older duplicate naming method. This reduces inconsistencies for users and developers, while improving performance in searches and record lookups across many apps.
Original PR description
## [REM] core: remove `name_get` API ### Rationale Since v8, the `display_name` field is present on all models. By default, `display_name` uses `name_get` which has pretty much the same purpose…
## [REM] core: remove `name_get` API ### Rationale Since v8, the `display_name` field is present on all models. By default, `display_name` uses `name_get` which has pretty much the same purpose (return record name used by the web client). Gradually, many (backend) developers (and the ORM: https://github.com/odoo/odoo/commit/6da1c3ac4c036eac289597602976538e243cb939) started using `display_name` (more convenient than `record.name_get()[0][1]`) but it still had the `name_get` override. It becomes more complex than necessary and poeple start to misunderstand the two (and sometimes override both, leading to inconstiencies between `display_name`/`name_get`). To simplify the ORM and the API, we decided to keep only one of them, the `display_name` field: - It is much more convenient from a backend point of view (`record.name_get()[0][1]` vs `record.display_name`) - It is cached during the same transaction (and invalidated if its dependencies change) - It can be overridden like any other compute field (override `_compute_display_name` with any extra dependencies) - `name_get` is replaced by `read(['display_name'])` (API perceptive), which can actually be more efficient (if `display_name`'s depends are correct, the ORM will only fetch the fields it needs instead of every prefetchable field) ### Changes - Deprecated `name_get` for the v17 and based the method on `display_name` (the opposite of before) - Removed all usage of `name_get` - Overrides of `name_get` are now overrides of `_compute_display_name` - For `res.partner`, rename the field store `display_name` into `complete_name` because `display_name` context-dependent and it makes no sense to have a compute store that is context-dependent. - Previously, it was possible to return multiple names for the same record with `name_get`, but it was tricky and most of the usage of this `name_get` didn't take this into account. The only example of this is the `name_get` of `product.product` (now use `", ".join(<names>)`). ## [IMP] core: fetch `display_name` during `name_search` The `name_search` makes at least 2 SQL requests, one to find the records and one to read fields needed to compute the `display_name`. With the default `_compute_display_name`, it only needs to fetch the `_rec_name` field (if there is one), but the ORM perfetch field mechanism will also fetch every prefetchable field (see `_fetch_field`). Then, to avoid running two queries and fetching too many fields, we add the dependency fields (with `_determine_fields_to_fetch`) to the select clause of the `Query` returned by `_name_search`. ## [IMP] *: add dependencies to `display_name` field The previous commit introduced an optimization to reduce the number of queries and fields fetched when we call `name_search`. But it works much better when the dependencies of `display_name` contain field names used in the calculation (on the same record/model). Then, to improve the performance and the cache coherency, add `depends` and `depends_context` depending on the custom `_compute_display_name`. Add only the first level of dependencies (never traverse relational field) because only these have a positive impact on the previous optimization and the cost is very low (see `modified`). https://github.com/odoo/enterprise/pull/42599 https://github.com/odoo/upgrade/pull/4780 https://github.com/odoo/documentation/pull/4639