Thursday, April 3, 2025
23 changes · master
Enhancements to existing features
Spreadsheet dashboard files across several business apps were updated to the latest internal data format. This prepares the dashboards for upcoming visual improvements such as cleaner table styling and row hover effects, with no immediate functional change expected for users.
Additional tests improve confidence that planning resources, reporting figures, and export behavior work as expected. This reduces the risk of regressions in planning, timesheet forecasting, and sales-related planning workflows without changing day-to-day user features.
Original PR description
_*= project_timesheet_forecast, project_timesheet_forecast_sale
This commit introduces multiple test cases to ensure robust functionality across various aspects of the planning modules.
- Test the creation of material resources and assigning roles to them.
- Validate the accurate calculation of the following measures in `Planning Analysis` report.
- Billable Allocated Hours
- Non-Billable Allocated Hours
- Remaining Hours
- Effective hours
- Verify that the default exported field is correctly included in the export fields
when the "I want to update data" option is selected.
task-3231758Field service, subscription, and stock-related workflows now assign the right manager permissions when demo defaults are unavailable. This helps keep core business scenarios working reliably across companies and sales subscriptions.
Original PR description
_*= project_sale_subscription, sale_subscription, industry_fsm_stock The default demo is not loading, and the default groups have been moved to the demo. Therefore, I had to apply the project manager group to the current user. task-4677936
The rental eCommerce module was updated to stay compatible with recent changes in the main Odoo website sales platform. This helps ensure rental product pages and shopping flows continue to work consistently after the broader platform update.
Original PR description
Adapt according to changes in community. [task-4447730](https://www.odoo.com/web#id=4447730&cids=1&menu_id=4720&action=333&active_id=1695&model=project.task&view_type=form) Requires: - https://github.com/odoo/odoo/pull/197320 - https://github.com/odoo/upgrade/pull/7469
Resolved issues and error corrections
Code cleanup and technical improvements
Customer-facing subscription actions in the portal, such as changing plans and closing subscriptions, have been rebuilt using Odoo’s newer interaction framework. This keeps the same business capabilities while making the subscription portal code easier to maintain and align with ongoing platform modernization.
Original PR description
**PR Description:** - Replace public widgets for portal subscriptions with new Interaction alternatives. This continues the refactoring work for public widgets. **Steps to Reproduce the Features:** -…
**PR Description:**
- Replace public widgets for portal subscriptions with new Interaction alternatives.
This continues the refactoring work for public widgets.
**Steps to Reproduce the Features:**
- **SubscriptionChangePlan:**
- Log in as an **Admin**.
- Navigate to the **Subscriptions app** and open a subscription with a recurring payment.
- Modify the **Self-Service** section of the subscription plan to include an optional plan
(e.g., update "Monthly" to include "Yearly" as an option).
- If the modified plan isn’t available on an existing subscription, create a new subscription for a **portal user**.
- Log in as the **portal user** and open the subscription with the modified plan.
(Alternatively, you can preview it as an **Admin**.)
- The **Change Plan** button should appear.
To test the feature, append `&change_plan=true` to the URL.
- **SubscriptionCloseFinish & SubscriptionCloseSelect:**
- Navigate to **Subscriptions app** → **Configuration** → **Recurring Plans**.
- Create a new plan or modify an existing one.
- In the **Recurring Plans** form, enable the **Closable** option under the **Self-Service** section.
This allows customers to close their own subscriptions via the portal.
- Open any subscription and click **Preview**.
- The **Close Subscription** button should now be visible on the left.
Clicking it will trigger the two widgets.Miscellaneous changes
Following a change of behaviour of the library, hidden headers are not considered in a chart data, and the pie chart of Cost Repartition was stripped of its data. Task-4687551 Forward-Port-Of: odoo/enterprise#82673
Original PR description
Following a change of behaviour of the library, hidden headers are not considered in a chart data, and the pie chart of Cost Repartition was stripped of its data. Task-4687551 Forward-Port-Of: odoo/enterprise#82673
This update adjusts internal app customizations so they stay aligned with the latest core Odoo method definitions. It helps prevent technical linting issues and reduces the risk of errors when these modules interact with the main platform.
Original PR description
See community branch for lint test. odoo/odoo#203296
This fixes unstable automated tests for VOIP and room features so they run faster and more consistently. It reduces the risk of false failures during development and helps teams validate changes with less delay.
Original PR description
Issue: non-deterministic JS unit tests in VOIP. See commits for details. Community: https://github.com/odoo/odoo/pull/204471
This fix makes document-based accounting actions more reliable by allowing a journal to be identified either by its internal ID or by its code. It reduces the chance of errors when creating accounting entries from documents, especially in configurations that reference journals differently.
Original PR description
refactor account_create_account_move() to accept an ID of a journal or code of journal
This fixes a visual issue in Documents where the shortcut indicator could disappear when users dragged files over the search panel while holding Ctrl. Users now keep the expected visual guidance during drag-and-drop actions, reducing confusion.
Original PR description
Before this commit, when dragging documents over the search panel while holding the ctrl key the icon disappear preventing the user from the visual help. This commit fix the issue. Task-4689834
The Documents app now opens the server actions list with a default filter showing only top-level actions. This makes the list easier to navigate and helps users focus on the actions most relevant for configuration or review.
Original PR description
Add Top-level actions filter to the documents server actions list by default
This change updates internal mobile app tests to use a shared helper for preparing web request data. It keeps test behavior consistent with the main Odoo codebase and reduces maintenance effort, with no expected impact on day-to-day users.
Original PR description
- use `build_rpc_payload` helper function in `HttpCase`. Related PR: [#196819][1] [1]: https://github.com/odoo/odoo/pull/196819
Description ----------- The non-stored field `user_has_access` is the primary `ir.rule` used for a `knowledge.article` and is included in every query. As a result, the method `_search_user_has_access` is frequently called and quickly becomes a performance bottleneck. This is particularly noticeable when opening the Knowledge app, as it involves reading the displayed article along with loading the sidebar. This update optimizes the method as follows: - For generic article access, the opti
Original PR description
Description ----------- The non-stored field `user_has_access` is the primary `ir.rule` used for a `knowledge.article` and is included in every query. As a result, the method…
Description
-----------
The non-stored field `user_has_access` is the primary `ir.rule` used for a `knowledge.article` and is included in every query. As a result, the method `_search_user_has_access` is frequently called and quickly becomes a performance bottleneck. This is particularly noticeable when opening the Knowledge app, as it involves reading the displayed article along with loading the sidebar.
This update optimizes the method as follows:
- For generic article access, the optimization leverages the field `inherited_permission`, which already contains the propagated `internal_permission` of the article along the hierarchy. This removes the need to recompute these permissions dynamically with a complex query since the data has already been precomputed.
- For member access, the query logic has been revised while maintaining the same outcome: Previously, the process involved: `for all articles, append the member and their permission, recurse into child articles for all in-sync and permissionless articles, and propagate the member's permission. Finally, discard all articles without any set permission.`, The new approach reverses the logic to avoid the need for discarding at the end and iterating through all articles: `for the articles the member belongs to, propagate the member's permission to its child articles, provided the child is in-sync, has no explicit permission, and the partner is not already a member of that article.` Although the last condition may seem counterintuitive, the initial set of articles considered encompasses those the member is linked to already. This also avoids cases where a parent article's member permission would overwrite differing permissions on its child articles.
- Additionally, `set` manipulations are used to handle IDs, thereby preventing the injection of large ID lists into multiple domain leaves. This improves query parsing and avoids poor query execution plans that could be caused by excessively large ID lists.
Benchmark
---------
On odoo.com, opening the Knowledge app from the Apps dashboard:
| Request | Before | After | Speed-up |
|----------------------|--------|-------|----------|
| web_read | 1.69s | 160ms | **10x** |
| get_sidebar_articles | 1.64s | 160ms | **10x** |
In a shell, searching articles with `[('user_has_access', '=', True)]`:
| User Type | Before | After | Speed-up |
|-----------------------|--------|-------|----------|
| `sudo` | 251ms | 35ms | **7x** |
| regular internal user | 577ms | 58ms | **10x** |
Reference
---------
task-4633813
Notice
------
⚠️ Note to clients/partners that might read this: For the full benefits of the patch, deploy the indexes that were added in this PR. This can be done by Upgrading the module `knowledge`, or creating the indexes manually in database. The patch should still be a net-benefit even for database without the indexes deployed.
Forward-Port-Of: odoo/enterprise#82773
Forward-Port-Of: odoo/enterprise#80971When you uncheck the 'Other dependent' box, it keeps the value in the dependent fields. This leads to have values set on the employees that are not visible. To avoid this issue, we empty the 'dependent' fields when we uncheck the 'Other Dependent' checkbox. This is the same behaviour of what is done in the onchange on backend view. Forward-Port-Of: odoo/enterprise#82794
Original PR description
When you uncheck the 'Other dependent' box, it keeps the value in the dependent fields. This leads to have values set on the employees that are not visible. To avoid this issue, we empty the 'dependent' fields when we uncheck the 'Other Dependent' checkbox. This is the same behaviour of what is done in the onchange on backend view. Forward-Port-Of: odoo/enterprise#82794
We need to use the payment method linked to the biggest paid amount, not the payment method linked to the biggest order. Forward-Port-Of: odoo/enterprise#82693
Original PR description
We need to use the payment method linked to the biggest paid amount, not the payment method linked to the biggest order. Forward-Port-Of: odoo/enterprise#82693
`prevent_zero_price_sale` was not set according to the right prices for `website_sale_renting` and `website_sale_subscription` opw-4650460 See also: https://github.com/odoo/odoo/pull/202867 Forward-Port-Of: odoo/enterprise#82685 Forward-Port-Of: odoo/enterprise#82082
Original PR description
`prevent_zero_price_sale` was not set according to the right prices for `website_sale_renting` and `website_sale_subscription` opw-4650460 See also: https://github.com/odoo/odoo/pull/202867 Forward-Port-Of: odoo/enterprise#82685 Forward-Port-Of: odoo/enterprise#82082
Bug: When creating a new payslip for a salesperson with work entries of code LEAVE1731, we would get a traceback. Reason: Since we were creating the record and did not yet save, the code was calling a method that did an SQL query on ids of self which is empty. Fix: We created a new method that uses the orm instead to handle this specific case. Forward-Port-Of: odoo/enterprise#78269
Original PR description
Bug: When creating a new payslip for a salesperson with work entries of code LEAVE1731, we would get a traceback. Reason: Since we were creating the record and did not yet save, the code was calling a method that did an SQL query on ids of self which is empty. Fix: We created a new method that uses the orm instead to handle this specific case. Forward-Port-Of: odoo/enterprise#78269
This commit addresses post merge fixes in the UI after the big rework of the sidebar and UI improvements: - Fix alignment of the sign items when being dropped, as from now on sign items follow the pre-defined alignment and are not forced to be rendered in the center anymore. task-4555838 Forward-Port-Of: odoo/enterprise#79448
Original PR description
This commit addresses post merge fixes in the UI after the big rework of the sidebar and UI improvements: - Fix alignment of the sign items when being dropped, as from now on sign items follow the pre-defined alignment and are not forced to be rendered in the center anymore. task-4555838 Forward-Port-Of: odoo/enterprise#79448
Steps to reproduce ================== - Install knowledge,contacts,web_studio - Open a contact record - Open studio - Add a many2many pointing to a knowledge article - Save and exit studio - Link an article and open it => this.env.ensureArticleName is not a function Cause of the issue ================== The knowledge article view uses a js_class and contains widgets that except the custom subenv from the controller. As the js_class isn't used in x2many views, the view crashe
Original PR description
Steps to reproduce ================== - Install knowledge,contacts,web_studio - Open a contact record - Open studio - Add a many2many pointing to a knowledge article - Save and exit studio - Link an article and open it => this.env.ensureArticleName is not a function Cause of the issue ================== The knowledge article view uses a js_class and contains widgets that except the custom subenv from the controller. As the js_class isn't used in x2many views, the view crashes. Solution ======== We can simply blacklist that model when searching for relations to add opw-4513295 Forward-Port-Of: odoo/enterprise#81068
In the Knowledge editor, the "New Article" button uses a "pen" icon, while most buttons for creating a new record in Odoo use a "plus" icon. To ensure consistency across views, we are replacing the "pen" icon with a "plus" icon. task-4690444 Forward-Port-Of: odoo/enterprise#82741
Original PR description
In the Knowledge editor, the "New Article" button uses a "pen" icon, while most buttons for creating a new record in Odoo use a "plus" icon. To ensure consistency across views, we are replacing the "pen" icon with a "plus" icon. task-4690444 Forward-Port-Of: odoo/enterprise#82741
When the fulfilment channel changes from Amazon, the user currently must delete the offer to create a new one, as they can't change the amazon_feed_ref. (Please note that due to an API change, this field does in fact include a JSON containing the product type, fulfilment channel, and the feed reference.) Indeed, when the listing is changed, Amazon doesn't get the information. This means we will continue to update the inventory if that offer was in FBM. Or not updating the inventory of a no
Original PR description
When the fulfilment channel changes from Amazon, the user currently must delete the offer to create a new one, as they can't change the amazon_feed_ref. (Please note that due to an API change, this…
When the fulfilment channel changes from Amazon, the user currently must delete the offer to create a new one, as they can't change the amazon_feed_ref. (Please note that due to an API change, this field does in fact include a JSON containing the product type, fulfilment channel, and the feed reference.) Indeed, when the listing is changed, Amazon doesn't get the information. This means we will continue to update the inventory if that offer was in FBM. Or not updating the inventory of a now FBM offer. While that second case would only require the user to delete and recreate a new offer (which would be a bother but not that problematic), sending a quantity to a FBA offer would trigger a well known problem of ghost listing on Amazon, where Amazon will consider having both channels, and randomly set an order as either FBA or FBM, until that ghost listing quantity drop down to 0. When catching a discrepancy, we'll thus reset the value of the amazon_feed_ref, so that it'd be pulled again later if needed by the sync inventory with, this time, the correct value. This would also stop the inventory synchronization of a potentially FBA offer. As for any stock synchronization that might happen between the listing changes from Amazon side and the first order received in FBA, we decided against forcing the FBM quantity to 0 on all FBA offer every time, to avoid sending too many useless calls for a corner case. As the product was until now sold in FBM, in most cases, it can still be until the end of the ghost listing. If not, our support is aware of it and can force the quantity to 0 again. opw-4681035 Forward-Port-Of: odoo/enterprise#82754
Isuue: - When on a relatively slower network, if we double click the comments icon present on the social media post, the comments dialog box opens up twice. - Can be spotted easily on the runbot as well. Video of the issue https://drive.google.com/file/d/1abe7Cq3otsVNH4hGRHFV34jC3uIGHY6m/view?usp=drive_link Reason: - There is no existing mechanism present to prevent this kind of scenario. Fix: - We simply use a flag to prevent this. We set/reset the value as we desire. Task-418
Original PR description
Isuue: - When on a relatively slower network, if we double click the comments icon present on the social media post, the comments dialog box opens up twice. - Can be spotted easily on the runbot as well. Video of the issue https://drive.google.com/file/d/1abe7Cq3otsVNH4hGRHFV34jC3uIGHY6m/view?usp=drive_link Reason: - There is no existing mechanism present to prevent this kind of scenario. Fix: - We simply use a flag to prevent this. We set/reset the value as we desire. Task-4184968 Forward-Port-Of: odoo/enterprise#82717 Forward-Port-Of: odoo/enterprise#82411
After the refactor by https://github.com/odoo/enterprise/commit/84cc09959d82dbceb4fe673b85464ef3d8630606 the noCertificado field in the COA (Chart of Accounts) report became invalid. - On a Mexican company, generate the COA report from the Trial Balance. - In the generated XML, the noCertificado tag exceeds 20 characters. This tag should contain exactly 20 characters and match the noCertificado from the CFDI report. This commit applies the same string manipulation for the COA repoart a
Original PR description
After the refactor by https://github.com/odoo/enterprise/commit/84cc09959d82dbceb4fe673b85464ef3d8630606 the noCertificado field in the COA (Chart of Accounts) report became invalid. - On a Mexican company, generate the COA report from the Trial Balance. - In the generated XML, the noCertificado tag exceeds 20 characters. This tag should contain exactly 20 characters and match the noCertificado from the CFDI report. This commit applies the same string manipulation for the COA repoart as the cfdi report (in the _add_certificate_cfdi_values method in the l10n_mx_edi module) source: http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd opw-4644489 Forward-Port-Of: odoo/enterprise#82430