Daily updates from Odoo
Friday, October 17, 2025
17 changes · 17.0
Security fixes and vulnerability patches
IoT Boxes now check that a database has a valid token before connecting. This helps prevent unauthorized or misconfigured connections, improving protection for connected devices and business data.
Original PR description
We added a check to prevent IoT Boxes from connecting to a database if the database doesn't have a valid token. Task: 5177501
New functionality added to Odoo
Odoo can now retrieve vendor electronic invoices from Uruguay's billing service and create draft vendor bills for review, including related XML and PDF attachments. This reduces manual entry while keeping users in control, with clearer handling of discounts, down payments, document numbering, and synchronization errors.
Enhancements to existing features
Estonia VAT XML exports now process report data in batches instead of recalculating each line separately. This prevents timeouts on large reporting periods and helps businesses submit VAT reports reliably even with high transaction volumes.
Original PR description
Behavior before: When exporting the VAT report to XML, each newly added line triggered a fresh _compute_expression_totals_for_each_column_group call. With large volumes of journal items, this…
Behavior before: When exporting the VAT report to XML, each newly added line triggered a fresh _compute_expression_totals_for_each_column_group call. With large volumes of journal items, this resulted in excessive repeated queries and, for big datasets, timeout errors. Behavior after: Introduced _custom_unfold_all_batch_data_generator, which batches the computation of expression totals for all lines. Now, journal items are resolved in bulk and mapped back to their respective moves, significantly reducing redundant queries. The VAT XML export completes successfully, even on months with very large datasets. Root cause: The Estonia VAT report was missing a batch unfold method (_custom_unfold_all_batch_data_generator). Without it, the system executed totals computation for each line individually instead of in batch, causing major performance degradation. Benchmark: | Period size (journal items) | Before patch | After patch | |----------------------------------------|----------------------|--------------------| | ~15k | 7s | 5s | | ~200k+ | Timeout error| 21s | opw-5046077
This update makes automated test browser shutdown more resilient when Chrome reports rare shutdown errors. It helps prevent stalled build environments and leftover browser processes, improving reliability for the development and testing pipeline.
Original PR description
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if…
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if this is in response to `stop`-ing the page, or a pre-existing navigation directive interfereing with the stop-ing of the browser. I tried reproducing locally under the assumption that the `Page.stopLoading` might be the cause but got nowhere[^1]. This issue seems extremely infrequent, and in most cases is but a minor annoyance, an error appears on the corresponding build, and that's it. However if the error occurs during `ChromeBrowser.stop` then the browser is not terminated, which on runbot prevents the docker image from shutting down properly, and leaves zombie builds. Therefore make `ChromeBrowser.stop` more resilient to errors in the initial section so that we do terminate the browser even if the "graceful CDTP shutdown" fails. While at it, add a fallback to kill the browser if it does not terminate gracefully. https://runbot.odoo.com/odoo/error/233442 [^1]: and the error only happening in 18.0 and later when `Page.stopLoading` was present long before that makes it likely the proximal cause is in the code being run, especially as all the errors sampled from the builds list are related to pos and the failure are immediately preceded by ongoing HTTP requests
Resolved issues and error corrections
PayPal payments can now proceed for invoices in Chinese yuan where PayPal supports this currency. This prevents blocked invoice payments and better aligns Odoo's PayPal currency handling with PayPal's current rules.
Original PR description
## Versions 17.0+ ## Issue No payment is possible with PayPal for invoices expressed in Chinese currency. ## Steps to reproduce **`account` app required** - Enable "CNY" currency via `Invoicing /…
## Versions
17.0+
## Issue
No payment is possible with PayPal for invoices expressed in Chinese currency.
## Steps to reproduce
**`account` app required**
- Enable "CNY" currency via `Invoicing / Configuration / Accounting / Currencies`;
- Install, setup and publish PayPal payment provider;
- Move to the Invoice app:
- Create a new invoice in "CNY" currency for any customer with at least 1 product;
- Confirm and click on the preview button:
- Click on the "Pay now" button then "Pay" button of the wizard.
## Cause
"CNY" currency is only supported for Chinese accounts and for transactions occurring in China. PayPal says:
> Please note that Chinese Renminbi (CNY) is supported as a payment currency (buyer currency) or settlement currency (holding currency) only for in-country PayPal accounts. If the settlement account is based outside of China, PayPal will convert the funds into the account’s primary currency using the applicable currency conversion rate, which includes a spread or fee.
opw-5071893This fix ensures Swiss payroll ELM transmission employee views behave correctly when payroll is used across multiple companies or countries. It helps prevent confusion or incorrect field visibility for businesses managing Swiss payroll in broader company setups.
Original PR description
task-5159023
This fixes a browser compatibility issue that could prevent Odoo from communicating with local IoT and point-of-sale devices in some Chrome versions. The change keeps support for upcoming Chrome network access requirements while avoiding failures in older browsers.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/231713 In odoo/odoo#231014 we added the `targetAddressSpace` argument to `fetch` requests to prepare for the Local Network Access feature that will be enabled by default from Chrome 142. Unfortunately, it seems that adding this option breaks the `fetch` request in older versions of Chrome that are implementing the Private Network Access spec. To fix this we detect if the permission is available in the browser, and only set the option if this is the case.
This update prevents Point of Sale hardware communication from failing in older Chrome versions. It checks browser support before using a newer network option, helping keep receipt printers and other local devices working reliably across more customer environments.
Original PR description
Enterprise PR: https://github.com/odoo/enterprise/pull/97266 In odoo/odoo#231014 we added the `targetAddressSpace` argument to `fetch` requests to prepare for the Local Network Access feature that will be enabled by default from Chrome 142. Unfortunately, it seems that adding this option breaks the `fetch` request in older versions of Chrome that are implementing the Private Network Access spec. To fix this we detect if the permission is available in the browser, and only set the option if this is the case. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue in the Accounting app. It helps ensure accounting records behave correctly, reducing the risk of disruption for users handling financial operations.
Original PR description
Steps to reproduce: Issue: Solution: opw-4915551 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invoice emails now keep a consistent language for all recipients, including contacts copied on the message. This prevents mixed-language wording in invoice email headers, improving clarity and professionalism for multilingual customer communications.
Original PR description
**Steps to reproduce:** - Install Accounting and Contacts - Go to "Settings / Translations / Languages" - Activate another language (e.g. French) - Create a contact with an email and French as…
**Steps to reproduce:** - Install Accounting and Contacts - Go to "Settings / Translations / Languages" - Activate another language (e.g. French) - Create a contact with an email and French as language - Create another contact with an email and English as language - Go to "Settings / Technical / Email / Email Templates" - Edit "Invoice: Sending" email template - In "Email Configuration" tab, add the email of the English contact in "Cc" field - Create an invoice for the French contact - Confirm the invoice - Send the invoice **Issue:** The invoice is sent by email to the customer and to the email configured as CC in the template. Both emails are in French, but some terms in the email header for the CC contact are in his configured language. For example, instead of "Voir Facture", it's written "View Facture". And instead of "$10 dû le 01/01/2025", it's written "$10 due 01/01/2025". **Cause:** The content of the email and the model description is translated in the language of the customer of the invoice. However, when grouping the recipients of the email, they are grouped by their language, leading to a mix of languages for some recipients. **Solution:** In the method grouping the recipients by lang, there is a parameter named "force_email_lang" that is the lang used for the content of the email, but it is only used as a fallback when a recipient doesn't have a lang configured. From the name of the parameter (i.e. force_email_lang), it should be use in priority if set. opw-4904029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where pressing Enter inside text with existing line breaks could create additional unwanted blank lines. It helps keep edited website or content text formatted as intended, reducing cleanup for users.
Original PR description
Problem: When pressing Enter between two line breaks, extra breaklines are inserted unexpectedly. Cause: This issue was introduced by commit 59a130457cb2d3b88bcf240f835e405535068eb2. However, the original problem that commit attempted to fix was already properly handled by commit d5590bf8c2d539cbed9a57bcb77b441c71f5ad1c in 18.0. Solution: Backport commit d5590bf8c2d539cbed9a57bcb77b441c71f5ad1c to 17.0. Steps to reproduce: 1. Add several line breaks in a paragraph. 2. Press Enter in the middle to split the paragraph. 3. Observe that extra line breaks appear. opw-5158234 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Delivery validation now reliably includes all required shipping labels and shipping documents in the automatic print flow. This prevents missed print jobs after validation, especially when only one printer client is connected, reducing manual follow-up for warehouse teams.
Original PR description
The `button_validate` method called clicking "Validate" returns a list of client actions to call. After these clients actions are executed, the page reloads. This reload makes our broadcasted action not to be caught by the client if there is only one connected. Anyway, this flow was overcomplicated and has been simplified overriding the method returning the client actions, adding the "shipping labels" and "shipping documents" to it.
Fixed an issue where saved payment methods were not offered when registering payments for invoices tied to an individual user within a company. The payment flow now looks at the customer linked to the invoice, helping businesses reuse saved payment methods correctly and avoid manual payment entry.
Original PR description
Currently, when user A from company AA records a payment method, a payment token is stored for that user. However, when an invoice is issued for that user, the payment token cannot be used because the payment registration form uses the partner AA instead of the user linked to the move, partner A. Step to reproduce: 1. Create a user A in company AA 2. Create an invoice for user A 3. Register a payment on the invoice and save the payment method (token) 4. Create another invoice for user A 5. Try to register a payment on the invoice: the payment token is not proposed This fix updates the logic to use the user linked to the move instead of the partner on the line, allowing proper selection of a payment token. opw-5036106
This fixes a browser error that could appear after saving a pop-up detail form from a repair order parts list. The change helps keep the interface stable when users open and close related record dialogs, reducing confusing console errors and potential interruptions.
Original PR description
Steps to Reproduce: - Open a Repair Order form view in Odoo 17 or 18. - Navigate to the Parts tab. - In the list view of parts, click the Smart Button on any part line. - A pop-up form view opens…
Steps to Reproduce:
- Open a Repair Order form view in Odoo 17 or 18.
- Navigate to the Parts tab.
- In the list view of parts, click the Smart Button on any part line.
- A pop-up form view opens showing detailed operations.
- Click the “Pick From” field value, but don't change its value.
- Click the Save button in the pop-up.
- Observe the browser console for the error: TypeError: Cannot read properties of null (reading 'querySelector') at ListRenderer.focusCell
Traceback:
```py
TypeError: Cannot read properties of null (reading 'querySelector')
at ListRenderer.focusCell (https://91307582-17-0-all.runbot219.odoo.com/web/assets/15b4f47/web.assets_web.min.js:9519:80)
at ListRenderer.<anonymous> (https://91307582-17-0-all.runbot219.odoo.com/web/assets/15b4f47/web.assets_web.min.js:9477:272)
```
Root Cause:
- Asynchronous patching in OWL (onPatched with await Promise.resolve()) continues execution after the next tick, even if the component is destroyed.
- When the component is destroyed, OWL sets status(this) = 3 (DESTROYED).
- focusCell() accesses DOM using querySelector, which fails if the component is destroyed.
- The code did not check the component status before calling focusCell().
Fix:
- Added `if (status(this) === destroyed) return;` to stop focusCell() execution on destroyed components.
- Ensured async patching is handled safely with await Promise.resolve().
- Added `onWillDestroy` to clean up dialog callbacks, preventing memory leaks.
OPW - [5154694](https://www.odoo.com/odoo/project/70/tasks/5154694)
[PAD](https://pad.odoo.com/p/issue_5154694_shku)
Localhost issue reproduction [steps](https://drive.google.com/file/d/1wkglUosOveUseU0mBePZcQAFB_ZWr3uM/view)
17:https://github.com/odoo/odoo/blob/f9726cfe93e8850a38d9de06acfa5d78473b50b0/addons/web/static/src/views/list/list_renderer.js#L223
18:https://github.com/odoo/odoo/blob/1cac54db8634267a780b4011291f1e8a80ac5f5b/addons/web/static/src/views/list/list_renderer.js#L213
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prRefreshing appointments filtered by staff member no longer causes an error when the system checks available capacity. This helps staff and customers continue booking or managing appointments without interruption.
Original PR description
This commit fixes an issue where the refresh with appointment based on staff user was raising a traceback as it also tried to compute the max capacity possible. Related commit 3cca7e47ab58f8a7d4e9196dbf60f7068348216b task-5118860
This change removes an unnecessary browser setting from Point of Sale IoT device requests. It helps avoid errors for users on older Chrome versions while keeping local device communication working as expected.
Original PR description
This reverts commit 1a934ae which added the `"targetAddressSpace": local` option to IoT fetch requests. This is because of two reasons: 1. It caused errors on older versions of Chrome that implemented the obsoleted 'Private Network Access' standard. 2. It was not actually required in the first place, it is only needed in situations where a HTTP resource is accessed from HTTPS using a domain that resolves to a local IP. In Odoo we only ever do this for HTTPS -> HTTPS requests, where it works automatically. task-5157145 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change removes an unnecessary browser request option from IoT-related communication. It prevents errors in older Chrome versions and keeps IoT and point-of-sale hardware connections working as expected.
Original PR description
This reverts commit 6d09dc6 which added the `"targetAddressSpace": local` option to IoT fetch requests. This is because of two reasons: 1. It caused errors on older versions of Chrome that implemented the obsoleted 'Private Network Access' standard. 2. It was not actually required in the first place, it is only needed in situations where a HTTP resource is accessed from HTTPS using a domain that resolves to a local IP. In Odoo we only ever do this for HTTPS -> HTTPS requests, where it works automatically. task-5157145