Wednesday, September 23, 2026
9 changes · 18.0
Resolved issues and error corrections
This fixes an issue where the email/chat reply suggestion list could reopen by itself after a user pressed Escape, preventing the reply from being discarded as expected. The change makes the interface respect the user's close action even if delayed search results arrive afterward, improving reliability in the mail composer.
Original PR description
Before this commit, the composer suggestion list comes back on its own after Escape closed it, as soon as the server answers the mention search. The re-opened list takes the next Escape, and the reply is never discarded. The test "reply: discard on pressing escape" fails that way on runbot: ``` Failed to find 0 of ".o-mail-Composer" (Timeout of 10 seconds). Found 1 instead. ``` This happens because NavigableList opens on every new set of options: the list first opens on the partners the store already holds, and the answer brings the ones it does not. The fetch is debounced by 250ms, so it lands between the two Escapes only on a loaded machine. This commit fixes the issue by ignoring the fetched suggestions once the user closes the list, until the search changes. Note that the test now flushes the debounced fetch right after Escape, so the race happens on every run. https://runbot.odoo.com/odoo/error/947267
This fixes an error that could stop certain electronic invoices from being imported when a fully discounted line still included an added charge and a fixed tax. The change makes invoice imports more reliable for these edge-case supplier documents and avoids duplicate tax handling during import.
Original PR description
In the special case when there is an invoice line fully discounted but having a charge and if and only if the related fixed tax is retrieved during the import, a ZeroDivisionError occurs. This fix also highlights another weird behavior. In this scenario, the fixed tax was marked twice as to be retrieved: - once in _import_invoice_retrieve_taxes - once in _import_ubl_invoice_line_add_taxes_values --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an unreliable automated test in the Mail app by waiting until the selected contact model is fully loaded before continuing. It helps prevent false test failures in Odoo's validation pipeline, improving release confidence without changing end-user behavior.
Original PR description
Before this commit, mail_template_dynamic_placeholder_tour could fail when the server answers the onchange of "Applies to" slowly: Tour mail_template_dynamic_placeholder_tour failed at step Check if…
Before this commit, mail_template_dynamic_placeholder_tour could fail when the server answers the onchange of "Applies to" slowly:
Tour mail_template_dynamic_placeholder_tour failed at step Check if
the dynamic placeholder popover is opened
(trigger: div.o_model_field_selector_popover)
This happens because the tour waits a fixed 200ms after picking "Contact" before typing "#" in the subject. The popover needs the model, and the record only holds the model once the onchange answers. On runbot the answer came after 230ms, so "#" showed the "select a model" notification instead of the popover.
This commit fixes the issue by waiting for the internal link button of the many2one, which only renders once the record holds the model.
Note that this step relies on "[FIX] web: cancel the pending search on autocomplete select": without it, a search still pending on the picked value marks the input as edited, which hides that button.
https://runbot.odoo.com/odoo/error/947209
Ref commit: https://github.com/odoo/odoo/pull/287888
Forward-Port-Of: odoo/odoo#290185This fixes an internal data model issue where certain calculated many-to-many fields could incorrectly keep a database relation. The change prevents unwanted cross-field side effects, helping keep related data reads accurate and predictable.
Original PR description
When we setup a many2many field which is not stored, it must not have a relation. This is already done for nonrelated fields, but we must do it also for related fields. Otherwise, we may have…
When we setup a many2many field which is not stored, it must not have a relation. This is already done for nonrelated fields, but we must do it also for related fields. Otherwise, we may have side-effects like finding sibling fields in 20.0: in the code below, reading categories would fill roles.
```py
model_id = self.env["ir.model"]._get("test_new_api.foo")
fields = [{
"name": "x_partner_id",
"ttype": "many2one",
"relation": "res.partner",
}, {
"name": "x_role_ids",
"ttype": "many2many",
"relation": "res.partner.category",
}, {
"name": "x_partner_category_ids",
"ttype": "many2many",
"relation": "res.partner.category",
"related": "x_partner_id.category_id",
"store": False,
"readonly": True
}]
for f in fields:
f["model_id"] = model_id.id
self.env["ir.model.fields"].create(fields)
env['test_new_api.foo']._fields['x_partner_category_ids'].relation # should be None
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#290067Turkish Nilvera e-invoices now count only actual product lines in the required line count field, instead of including tax, note, or other accounting lines. This helps generated invoices better match official documentation and reduces the risk of validation or compliance issues.
Original PR description
Currently, the LineCountNumeric node is filled as the length of `line_ids` which includes all the journal items on that move, including product lines, tax lines, note lines etc. The documentation explains that the node's value should be the number of product lines instead. This commit filters the lines to only use the product lines count. task-6584840 Forward-Port-Of: odoo/odoo#289178
This fixes an issue where a selection dropdown could reopen and remain visible after a user picked an item. It improves form reliability and prevents related automated checks from timing out.
Original PR description
Before this commit, the autocomplete dropdown of a many2one could open again right after a suggestion was picked, and stay open. The step of mail_template_dynamic_placeholder_tour waiting for it to…
Before this commit, the autocomplete dropdown of a many2one could open again right after a suggestion was picked, and stay open. The step of mail_template_dynamic_placeholder_tour waiting for it to close then times out:
FAILED: [8/36] Tour mail_template_dynamic_placeholder_tour
Step Wait for the drop down to disappear
(trigger: div[name="model_id"] .o-autocomplete:not(:has(.ui-autocomplete)))
TIMEOUT step failed to complete within 10000 ms.
This happens because the search filling the dropdown runs 250ms after the last keystroke, so a suggestion of the previous search can be picked while the next search is still scheduled. Picking a suggestion only closes the dropdown. The scheduled search then runs, opens the dropdown on the selected value, and nothing closes it after that.
This commit fixes the issue by discarding the scheduled search when the dropdown closes.
https://runbot.odoo.com/odoo/error/233574
https://runbot.odoo.com/odoo/error/237744
https://runbot.odoo.com/odoo/error/944454
https://runbot.odoo.com/odoo/error/945517
https://runbot.odoo.com/odoo/error/947141
Forward-Port-Of: odoo/odoo#287888This fixes an issue in the HTML editor where clicking inside a link that contained formatted text could place the cursor in the wrong position. Users can now edit linked text more reliably, reducing frustration when working with formatted content.
Original PR description
Since #284197 a pointerDown event inside a formated link was not setting the selection in the correct position. We fixed the issue by getting the clicked element closest link to ensure we are effectively outside a link. task-6592373 --- Backport of #289945 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where copied images or attachments could remain connected to the original content instead of the page or record currently being edited. This keeps website and editor content in sync immediately and helps prevent confusing image updates after copying content.
Original PR description
When an attachment tied to one record was copied while editing content linked to a different one, the duplicate could keep referencing the original model instead of the new target, leaving the two out of sync until the next save. opw-6560233 Forward-Port-Of: odoo/odoo#287784
The Luxembourg reporting module now uses a working download link for the FAIA XSD file. This prevents failed or empty downloads and helps businesses access the required reporting schema reliably.
Original PR description
The old link points to a file with zero bytes. opw-6344914