Tuesday, April 14, 2026
4 changes · master
Enhancements to existing features
This update makes Odoo's internal code evaluation behave more like standard Python when applying function decorators. It prevents code from briefly accessing an undecorated version of a function, improving consistency and reducing unexpected behavior in internal tooling.
Original PR description
Before this commit, decorators were converted into function calls after the decorated function was defined. As a result, it was possible to assign the original function before it was wrapped. It is necessary to preserve the decorator lookups before the function definition, which results in a `NameError` if the original function is used. Task-6115826
State and governorate data for Oman, Bahrain, and Kuwait is now available in the core system rather than tied to accounting localization modules. This makes address data more consistently available and improves address display by showing state names instead of state codes.
Original PR description
This commit moves states from l10n_om, l10n_bh, and l10n_kw modules to base module, as countries states should never be present in accounting localization modules. Moerver, this commit fixes address format for these countries by showing state name instead of state code. task-6107515
This update optimizes Odoo's startup speed by delaying the loading of a specific library (openpyxl). This change reduces startup time by approximately 100ms and allows Odoo to function without this library, improving overall system responsiveness. It's a small but important performance enhancement.
Original PR description
This is the only module loading it eagerly at startup. We can save at least 100ms by moving it to the function that uses it. Moreover, this way we can start odoo without openpyxl being available.
This update clarifies how recurring products are handled in Odoo Enterprise. The name of a key field has been changed from `has_subscription_products` to `has_recurring_products` to better reflect its purpose: controlling which fields are displayed on order templates. This ensures accurate product visibility for subscription-based sales.
Original PR description
Rename `has_subscription_products` to `has_recurring_products` to avoid confusion. Recurring products are only treated as subscriptions when a plan is set; here we only check if products can be sold recurringly to control some fields' visibility on `sale.order.template`