Thursday, September 24, 2026
8 changes · saas-19.2
Enhancements to existing features
The Argentine localization tests now create sample invoices more directly, avoiding unnecessary repeated processing during test setup. This reduces test execution time and database activity while keeping the report results unchanged.
Original PR description
The use_current_date=False branch of _create_test_invoices_like_demo built 18 invoices through Form, which reruns the whole move onchange for every field of every line. It was two thirds of the l10n_ar_reports class setup. Create them with _create_invoice from the fields the Form set, like the other branch does. The accounting date is now the invoice date on every invoice, the report output is unchanged. With the l10n_ar_reports counterpart: | l10n_ar_reports, runbot 18.0 L10n | before (3 builds) | after | |------------------------------------|-------------------|-------| | TestArReports setUpClass | 78-103s | 31s | | module test time | 80-106s | 33s | | queries | 45.4k | 28.4k | Forward-Port-Of: odoo/odoo#290123 Forward-Port-Of: odoo/odoo#290111
The Argentina accounting reports tests now create sample vendor bills more efficiently, reducing automated test time while keeping report results unchanged. This helps developers validate changes faster with no expected impact on customers or day-to-day accounting workflows.
Original PR description
Same as the l10n_ar fixture: the 10 demo vendor bills were built through Form, rerunning the whole move onchange for every field of every line. Create them with _create_invoice from the fields the Form set. TestSicoreReport subclassed TestArReports only for the report helpers, so it rebuilt that whole VAT book fixture without reading it: inherit the withholding and account report bases directly instead. The accounting date is now the invoice date on every bill, the report output is unchanged. With the l10n_ar counterpart: | l10n_ar_reports | before | after | |---|---|---| | TestArReports setUpClass, runbot | 78-103s | 31s | | module test time, runbot | 80-106s | 33s | | TestSicoreReport setUpClass, local | 10.7s | 6.1s | Runbot: 18.0 L10n, 3 base builds. Local: saas-19.2, Form fix applied. Forward-Port-Of: odoo/enterprise#132713 Forward-Port-Of: odoo/enterprise#132697
Resolved issues and error corrections
This update fixes several issues in Odoo's internal web testing tools and related test data. It helps teams catch problems more accurately before release, reducing the risk of regressions in areas like messaging, live chat, calendar, accounting, and point of sale.
Original PR description
- https://github.com/odoo/enterprise/pull/131914 Various Hoot/web tests fixes. See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289788 Forward-Port-Of: odoo/odoo#256814
This fixes an issue where autocomplete suggestions could reopen after a user selected an item, causing the dropdown to stay visible. The change makes forms and related workflows more reliable by preventing delays and failed automated checks tied to stuck dropdowns.
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#290317
Forward-Port-Of: odoo/odoo#287888This update prevents temporary related many-to-many fields from keeping an unnecessary database relationship. It avoids cases where reading one field could accidentally affect another similar field, improving data consistency behind the scenes.
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#290286
Forward-Port-Of: odoo/odoo#290067This update corrects internal test data definitions so automated checks better match real Odoo behavior. It helps teams catch configuration and data issues earlier, reducing the risk of hidden problems in features such as appointments, documents, knowledge, barcode, VoIP, WhatsApp, and point of sale integrations.
Original PR description
- https://github.com/odoo/odoo/pull/256814 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#132502 Forward-Port-Of: odoo/enterprise#131914
Users can now reopen a sent Sign template even when it was created without signature fields. The system no longer tries to add a placeholder signer when the template is already tied to a sent request, preventing an access error and keeping template review workflows smooth.
Original PR description
Version: 19.0 Steps to reproduce: - Create a sign template with no sign fields - Send a sign request using that template - Open that template from Templates Issue: After a sign request is sent, record rules make the template read only for sign items (create/write only when there are no sign requests). On open, if the template has no signers, the UI auto creates a dummy signer. For an empty sent template, that create is denied by those rules and raises an Access Error. Fix: Guard the auto create signer flow with a sign requests check so that a sent template does not try to create a new signer on open. Task: 6591146 Forward-Port-Of: odoo/enterprise#132516
When Colombian contact data is refreshed in a multi-company database, any newly created child contact now automatically stays linked to the same company as the original contact. This avoids missing company assignments and helps keep customer records consistent across companies.
Original PR description
Problem: In l10n_co, when updating a contact's data using the "Update data" feature in a multi-company setup, the company of the newly created child contact isn't set. Solution: Set the child contact's company to match the parent contact's company when creating the record, ensuring both contacts belong to the same company. Steps to reproduce (runbot v18): 1. Install l10n_co 2. Set up two companies (Company A and Company B). 3. Create a contact with an email and NIT, and set its company to Company B. 4. Click the "Update data" button. 5. Open the newly created child contact and check its company. The company of the newly created child contact is not set. opw-6528295 Forward-Port-Of: odoo/enterprise#131049