Wednesday, April 22, 2026
15 changes · saas-18.2
Enhancements to existing features
This improves how Odoo's test infrastructure reports failures when a websocket connection closes unexpectedly. Instead of showing a generic cancellation error, it now surfaces the real underlying cause, helping teams diagnose failed automated runs faster.
Original PR description
This case induces confusion in the ranks: when the WS connection fails, the result of the run is set to failure then every outstanding response is cancelled. For `_wait_ready` specifically, because…
This case induces confusion in the ranks: when the WS connection fails, the result of the run is set to failure then every outstanding response is cancelled. For `_wait_ready` specifically, because it's a blocking wait on a request it yield a confusing result as the run fails with `CancelledError` and the actual cause (the WS was closed) is lost. One option would be to `set_exception` on the waiting responses, but I feel like this could create other confusing knock-on effects e.g. more evented waits which currently get ignored might start raising exceptions (although that seems unlikely as callbacks apparently do get called on cancel), and since issues with cancelling only seem to appear in `_wait_ready` that seems like overkill. Instead have `_wait_ready` handle cancellation by first checking if the result is in error, and using that to raise the underlying error, otherwise retry (and ultimately timeout, probably). And while at it, before signaling a timeout check if the run is in failure and raise that immediately, just in case. https://runbot.odoo.com/odoo/error/233738 Forward-Port-Of: odoo/odoo#260324
Resolved issues and error corrections
Attachments uploaded to cloud storage now keep the file type that was provided instead of having it re-detected incorrectly. This helps ensure files are handled and displayed consistently after upload.
Original PR description
When uploading an attachment to cloud storage via `_post_add_create(cloud_storage=True)`, the attachment's original `mimetype` is guessed even if we specify it. With this commit we explicitly preserve given mimetype Discovered during task-5153790 Forward-Port-Of: odoo/odoo#257979
Miscellaneous changes
Forward-Port-Of: odoo/odoo#260319
Original PR description
Forward-Port-Of: odoo/odoo#260319
Forward-Port-Of: odoo/enterprise#114395 Forward-Port-Of: odoo/enterprise#114366
This change restores the previous behavior for how child contact display names appear, preventing incorrect or confusing names in customer and company records. It matters for users who rely on accurate contact names on invoices and partner records, especially in German localization workflows.
Original PR description
This reverts commit 0ef4c1d06fdf999ad5cdad696069aec8f2f943c5. opw-5900567 Forward-Port-Of: odoo/odoo#260097 Forward-Port-Of: odoo/odoo#260065
This update fixes a small issue in the Project app where a task view call was missing required information. It helps keep task kanban interactions working reliably for users.
Original PR description
This commit adds a missing parameters to the parent call. task-5498274 Forward-Port-Of: odoo/odoo#260143
Odoo no longer blocks startup when an add-ons path points to an empty folder. This helps teams and AI-assisted coding tools start new module projects in a clean repository before any modules exist.
Original PR description
Initialize a new empty git repository where you are going to vide-code some new Odoo modules. Because the repository is empty (no addon yet) the CLI fails with an "option --addons-path: the path <path> is not a valid addons directory". This makes vide-coder sad, and bigrams want vide-coders to be happy, so drop the sanity-check and also accept empty addons. Forward-Port-Of: odoo/odoo#256913
This fixes a timing issue in an automated restaurant point-of-sale test where a customer change could be overwritten by a delayed server response. The change helps prevent false test failures and improves confidence in the POS restaurant workflow validation.
Original PR description
In the tour test_customer_alone_saved, the test was creating an order, then go on the ticket screen and then come back on the product screen to change the customer to go again on the ticket screen and come back on product screen to check that the customer did not changed. The problem was that when going to the ticket screen the first time, the order was synced with the server but the answer might come after the test changed the customer. When going the second time on the ticket screen, the order was changed with the information of the backend and the user was lost. This is all due to the test that are too fast. runbot-error: 238467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change prevents a test from failing when a related access group belongs to a module that has not been confirmed as installed yet. It helps keep invoice export validation reliable without changing customer-facing behavior.
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
Vendor bill imports from UBL XML now show the correct chatter message when no import logs are generated. This avoids displaying an unhelpful 'None' message and confirms the invoice format used for the import.
Original PR description
[FIX] account_edi_ubl_cii: Print right message in chatter at import When a UBL XML invoice is imported in vendor bills and no logs are collected, a message 'None' is printed in the chatter and the message 'Format used to import the invoice: ...' is not printed This commit fixes both issues no-task 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 Forward-Port-Of: odoo/odoo#260374
E-waybill documents now store only the required date instead of including an unnecessary time. This keeps Indian e-waybill data aligned with official requirements and avoids confusion from time zone conversions in accounting and inventory flows.
Original PR description
The e-waybill specification requires `document_date` to contain only the date component, but the field was previously defined as a datetime. Since the value is computed from the `account.move` date field, it defaulted to `00:00 UTC` (05:30 IST), introducing unnecessary time information. This commit fixes the issue by: * Changing the field type from datetime to date. * Ensuring proper conversion when values originate from datetime fields (e.g., inventory flows), by converting to IST. This prevents the inclusion of incorrect times and aligns the field with e-waybill requirements. task-6128526
This update corrects an automated test for Mexican electronic invoicing after a related rounding change was reverted to its expected behavior. It helps ensure the invoice rounding logic stays reliable and prevents false test failures during development and delivery.
Original PR description
https://github.com/odoo/odoo/pull/255574 change the rounding mode back to mixed. This break the test modified in this PR. opw-5963855 Forward-Port-Of: odoo/enterprise#114081
The Sendcloud delivery tests were reclassified so they now run in regular automated checks instead of only nightly testing. This helps catch issues earlier and makes the delivery integration more reliable. A related test was also adjusted to match the current package-weight behavior.
Original PR description
Test class was tagged as external although calls are mocked. This means errors were only caught in nightly and not by CI. Removing the tag requires fixing some of the tests. For `test_multicollo`, we send the average weight of packages instead of the total since 97f82442c9fee7dcb3e8c5e9bacddcd6bb864e11. Forward-Port-Of: odoo/enterprise#111660
This update removes the transaction ID shown next to payment amounts in Point of Sale for Worldline transactions. It helps avoid confusion for cashiers, since the ID could look like a negative amount, while removing information they do not need.
Original PR description
This PR removes the transaction id shown next to the amount in point of sale for transactions used with Worldline. The transaction id preceded by a "-" was confusing for some cashiers and interpreted as a negative amount. Since the transaction id isn't useful for cashiers it's removed from the xml. Before: <img width="705" height="422" alt="image" src="https://github.com/user-attachments/assets/19ebfe49-e16d-45ea-b770-e445fe8b473d" /> After this PR: <img width="1182" height="353" alt="image" src="https://github.com/user-attachments/assets/f7cd1b7c-75fa-4fe9-ae20-7c5e6d834488" /> opw-6085975 Forward-Port-Of: odoo/enterprise#113782
This update fixes a display issue in Documents where certain XML email attachments that can be previewed as PDF were opening in two preview panes at once. Users now see a single correct preview, improving readability and avoiding confusion when reviewing incoming documents.
Original PR description
**Steps to reproduce:** - Install documents_account - Set up alias to catch incoming mails - Receive a mail with xml attachement which can be previewed as pdf - Go to Documents app - Click on the…
**Steps to reproduce:** - Install documents_account - Set up alias to catch incoming mails - Receive a mail with xml attachement which can be previewed as pdf - Go to Documents app - Click on the document preview - Preview is split in two iframes, both with the same content (pdf) **Issue:** Due to the `isPdf` patch the attachment can match multiple types for the preview (pdf and text) as both getter return `true`. ``` <iframe t-if="state.file.isPdf" ... <iframe t-if="state.file.isText" ... ``` It also seems that xml received by mail are imported as text, which is why the issue doesn't happen when manually uploading the same xml file. **Fix:** Ensure that if the document is matching `isPdf`, it doesn't trigger the second iframe with `isText`. Also it seems fixed in 19.0 as the text iframe is replaced by this xpath: `<xpath expr="//iframe[@t-if='state.file.isText']" position="replace">` which was added for https://github.com/odoo/enterprise/commit/de614ee5e9a087d49939c65c0118ae6164c7b31b related patch: https://github.com/odoo/enterprise/commit/ffcdd2275c8bf564e15151ccbcaf3965ed968450 opw-6018536 Forward-Port-Of: odoo/enterprise#112041
Original PR description
Forward-Port-Of: odoo/enterprise#114395 Forward-Port-Of: odoo/enterprise#114366