Tuesday, April 21, 2026
17 changes · saas-19.1
Resolved issues and error corrections
When customers receive invoices by email, any extra report attachments now keep the filename set in the report configuration. This avoids confusing default names and makes the emailed documents easier to identify.
Original PR description
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice…
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice number). This is due to a difference in flow: sales use the standard mail.compose.message wizard, which correctly applies each report’s print_report_name, while invoices use the dedicated account.move.send flow. In this flow, dynamic report filenames are not computed from the report itself. To fix this, the send flow is updated so _get_placeholder_mail_template_dynamic_attachments_data computes the filename from each dynamic report. When a print_report_name is defined, it is used. Otherwise, the previous fallback behavior is preserved. The fix will ensure extra dynamic reports follow their configured printed name. Steps to reproduce: 1. Go to Settings > Technical > Reporting > Reports and duplicate the standard Invoice report. 2. In the duplicated report, set a custom value in Printed Report Name (e.g. 'CUSTOM_NAME_TEST'). 3. Go to Settings > Technical > Email > Templates and open “Invoice: Sending”. 4. Add the duplicated report under Dynamic Reports. 5. Create a customer invoice and confirm it. 3. Click Send (or Send & Print) to open the email preview. Related Ticket: opw-6058716 Forward-Port-Of: odoo/odoo#259975 Forward-Port-Of: odoo/odoo#259267
The barcode app no longer shows a stock-location confirmation warning when adding products that are not meant to be stored in inventory. This prevents confusing prompts for users and makes delivery operations smoother.
Original PR description
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P…
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P as product > Confirm #### > A confirmation dialog appears: Oops! It seems that this product is not located in WH/Stock. Do you confirm you picked from there? ### Expected behavior: Since the product is not storable it should not trigger the dialog ### Cause of the issue: The `is_storable` value of the `product.product` is not part of the data that can be used to check if we should check the quantity available in location since only the product id and name are directly available: https://github.com/odoo/enterprise/blob/77d3cc81be8aeb9f2e8bf57fb561fcae80f23b04/stock_barcode/static/src/js/stock_barcode_sml_form.js#L40-L70 However, since an rpc is already performed in order to determine the `qty_available` of the product, we might as well use that same rpc to recover the information and also avoid the dialog in case it is irrelevant. opw-6110655 Forward-Port-Of: odoo/enterprise#114173
This change fixes an issue where retry messages were being logged too prominently during builds. As a result, build logs are cleaner and easier to review without the unnecessary noise.
Original PR description
While moving the logic from common to suite, the logger was changed from common._logger to suite._logger, but the monkeypatching was not updated, resulting in the "Retrying" logs not being downgraded to info and spamming the logs of the builds. Forward-Port-Of: odoo/odoo#260041
This change updates an internal performance test to match a recent menu visibility update in a related feature. It does not change how users work, but it keeps automated checks accurate so future build and test runs remain reliable.
Original PR description
Due to changes in the related enterprise PR fixing timesheet Configuration menu visibility in sale_timesheet_enterprise, the number of queries has increased. This commit increases the expected query count in test_load_menus_perf and test_load_web_menus_perf from 62 to 63. task-5428010
This fix corrects how the upgrade script recognizes when a value is already being used inside a template expression, especially when it is followed by a comma. As a result, the script avoids moving variables into the wrong place, reducing unnecessary changes during upgrades.
Original PR description
When a variable is used as method parameter and followed by a comma it failed to be identified as being used, so the script then incorrectly moved it as a t-call parameter while it's not necessary.
In the example below, the variable `geoip_country` was not correctly identified as being used in the `t-out` statement:
```
<t t-name="website.test">
<t t-call="website.layout">
<t t-set="geoip_country" t-value="request.geoip.country_code"/>
<t t-set="all_countries" t-value="{cc.code: cc.name for cc in request.env['res.country'].search_fetch([], ['code', 'name'])}"/>
<div>Country: <t t-out="all_countries.get(geoip_country, 'BE')"/></div>
</t>
</t>
```
This commit fix used variable detection when the variable is immediately followed by a comma.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis change fixes an issue where custom fields could be counted more than once when Odoo reloads its model structure. As a result, the system avoids carrying over duplicate field data, helping keep model setup stable and reliable.
Original PR description
When a custom (manual) field is related to a base field, it is added to `registry.field_setup_dependents`. However, these custom fields were not being cleaned up correctly, causing them to duplicate and leak during each model setup. This fix explicitly cleans these manual fields from `field_setup_dependents` inside `_add_manual_models()` when manual models are removed from the registry and the registry is being reloaded. Similar to https://github.com/odoo/odoo/pull/253377. Forward-Port-Of: odoo/odoo#259819
This update fixes an unreliable automated test in the HTML editor, making test results more consistent. It helps prevent random failures in the development and release process without changing the user-facing editor behavior.
Original PR description
My last desperate fix attempt did not fix the issue so here is yet another desperate fix attempt. I have seen issues related to the use of `setContent` just to set the selection in the past so I hope it might be that. It's the only noticeable change between this test and the others, be it icon tests or color selector ones. runbot-242333 Forward-Port-Of: odoo/odoo#259731 Forward-Port-Of: odoo/odoo#259544
This change updates Peru e-invoicing test files so they match the corrected unit price rounding used in PEPPOL. It does not change business behavior for customers, but it keeps automated tests accurate and prevents false test failures during development and delivery.
Original PR description
https://github.com/odoo/odoo/commit/e79136d04c844f9a0a8c6d0532c65e0cc3a68b8f fixes unit price rounding in peppol. This PR fixes a broken test in l10n_pe_edi opw-6009771 Forward-Port-Of: odoo/enterprise#114159
This change removes an unhelpful tooltip that appeared when users hovered over boolean fields in calendar popups. It improves the user experience by preventing confusing HTML content from showing up where no extra information is needed.
Original PR description
Before this commit, the tooltip of a boolean field in calendar popover shows html content when the user hovers the boolean field. This commit removes the tooltip of boolean field in calendar popover since the information inside that tooltip is not really useful for the user. Issue found during the development of task-5994205 Forward-Port-Of: odoo/odoo#259529 Forward-Port-Of: odoo/odoo#259011
This fix ensures that existing checks can still recognize when a data query has restrictions, even when results are returned in a sorted order. It prevents unexpected behavior in parts of the system that rely on that check and helps maintain consistent results.
Original PR description
Some code uses `if query.where_clause` to detect if there are any restrictions on the table. When setting ordered result ids, we simply used a JOIN, so there is no detected where clause. To keep existing code working, we add a dummy 1=1 to the where clause. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update refreshes the automated performance test expectations for website modules when demo data is present. It helps keep test results accurate and prevents false failures during validation, without changing end-user functionality.
Original PR description
Query counts were updated for demo data. runbot-242325 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures the Update Payment button disappears when it should after payments are reconciled on Mexican invoices. It corrects a case where batch payments could make the system think an update was still needed, even though the payment information was already complete.
Original PR description
- Create one invoice with the PUE payment policy. - Create another invoice with the PDD payment policy. - Send both invoices to the CFDI. - Create a batch payment for both and reconcile. - Click on Update Payment on one of the invoices. The Update Payment button does not disappear. In the method _l10n_mx_edi_cfdi_invoice_get_payments_diff, we compare the current UUIDs and the previous UUIDs to determine if the button should be shown. However, when there is a batch payment, the current UUID list includes the UUIDs of all invoices in the batch, including the PUE payment (which should normally be filtered out by the continue). The previous UUID list includes only the UUID of the PDD payment. opw-6055781 Forward-Port-Of: odoo/enterprise#112520
This update removes unnecessary fields from the data sent to the self-order front end. It helps keep the information payload lighter and reduces wasted processing without changing the user experience.
Original PR description
Fix _generate_return_values to remove some fields that are not needed on the frontend Forward-Port-Of: odoo/odoo#260016 Forward-Port-Of: odoo/odoo#259915
The website editor now correctly shows the translation status on file names added through the file tool, even when other background colors would previously hide it. This makes it easier for users to see which content still needs translation while editing a site.
Original PR description
Commit cbb2eb2edfeecbc21a70c1a3cba81ad0a7ac9c75 added a resource to repeat the background color of the translation state inside elements, for the cases where an element has a background color that hides the translation state. This commit uses the resource for file's names (added by typing `/file`) Steps to reproduce: - Open website builder - Type `/file` and add a file - Add a language - Open in translate mode - Bug: the translation state is not show on the file name task-6038029 Forward-Port-Of: odoo/odoo#259955 Forward-Port-Of: odoo/odoo#259902
This update adjusts an internal check used to decide when a browser compatibility patch should be considered outdated. It helps keep accessibility-related behavior aligned with the newer lxml 6.1 release, reducing the risk of unnecessary or stale patching.
Original PR description
Whitelisting of ARIA attributes is now part of the milestone for LXML 6.1. This commit updates monkey patch's obsolescence detection accordingly.
The call menu in Discuss now includes the Picture-in-Picture option, making it faster to keep a call visible while moving to another conversation or chatter. This also corrects the menu styling so the Fullscreen and Picture-in-Picture actions display with normal visibility.
Original PR description
Before this commit, Call Menu did not have the "Picture-in-Picture" action. This is unfortunate because this is one of the most valuable action to have it available there, as a frequent usage of…
Before this commit, Call Menu did not have the "Picture-in-Picture" action. This is unfortunate because this is one of the most valuable action to have it available there, as a frequent usage of Discuss is to join a call, switch to another conversation or chatter, and then wanting to keep an overlay of the call. Without the "Picture-in-Picture" in Call Menu, this forces user to access the Discuss conversation again and then click on "Picture-in-Picture" there, when clicking on the call menu would be faster. This commit adds the "Picture-in-Picture" action in the call menu to ease using this feature. Also fixes an issue where "Fullscreen" and "Picture-in-Picture" actions have reduced opacity in the Call Menu. This comes from opacity hover effect that should be limited to their inline visual in the Call view but was mistakenly also present in the dropdown. Before / After <img width="440" height="369" alt="Screenshot 2026-04-17 at 14 15 58" src="https://github.com/user-attachments/assets/2accb779-28f5-4930-a101-db5e52b029b7" /> Forward-Port-Of: odoo/odoo#259866
This change fixes a test that could fail during setup because it checked access groups before confirming the related module was installed. It helps keep automated tests stable and prevents unnecessary errors in the electronic invoicing area.
Original PR description
The `get_default_groups` call happens during super.setUpClass(), therefore we have not checked (yet) if the module in which the security group is in is installed, and we end up with an Exception. task-none Forward-Port-Of: odoo/odoo#260230