Friday, July 18, 2025
31 changes · saas-18.3
Enhancements to existing features
The mail chatter now receives recipient field information as part of its existing data load instead of making separate background requests. This reduces unnecessary server calls and can make chatter screens load or refresh more quickly for users.
Original PR description
This PR removes `/mail/thread/recipients/fields` by embedding the value inside `/mail/data`. This removes up to 2 RPCs done inside chatter `onWillStart` and `updateRecipients`. PR enterprise: https://github.com/odoo/enterprise/pull/84661 Task-4685400 Forward-Port-Of: odoo/odoo#208393
The Demo payment provider now receives the same default outstanding account setup as online payment providers. This keeps test payment flows aligned with real provider behavior and reduces manual accounting setup during demonstrations or testing.
Original PR description
Purpose: Set default outstanding account for `Demo` payment provider as well,
as it is a test version of an Online Payment Provider.
Followup on commit: https://github.com/odoo/odoo/pull/213554/commits/24f06192f4c6f747d2096603b6895481483138ab
task-4907646
Forward-Port-Of: odoo/odoo#216806The Chart of Accounts views now make the Active column easier to show or hide, helping users review account status more conveniently. The Allow Reconciliation column is moved into optional hidden columns by default, reducing clutter while keeping it available when needed.
Original PR description
In this commit: - Moved the 'Allow Reconciliation' column to the optional 'Hide' section. - Added the 'Active' column to the optional 'Show' section. - Added the 'Active' column to the optional 'Hide' section in 'Chart Of Accounts' menu. task-4907725
Nilvera API request logs are now shorter and easier to analyze in monitoring tools. Sensitive request details such as parameters and payloads are no longer included, helping protect user privacy while keeping key performance and status information visible.
Original PR description
This change streamlines the Nilvera API request logs to a single-line format, making them easier to parse and visualize in tools like Grafana. The new format includes only the HTTP method, URL, response status, and request duration, removing parameters and payloads to avoid leaking sensitive information and to ensure user privacy. No task Forward-Port-Of: odoo/odoo#218045
This update adjusts Odoo Studio so its form editor tests stay compatible with recent messaging changes. It helps ensure Studio continues to work reliably after the related mail recipient field endpoint was removed.
Original PR description
PR community: https://github.com/odoo/odoo/pull/208393 Task-4685400 Forward-Port-Of: odoo/enterprise#84661
Resolved issues and error corrections
This fix adds a missing database index used by the Indian withholding feature when reading related invoice records. It helps avoid slow full-table scans on large accounting datasets, improving performance without changing user-facing workflows.
Original PR description
FK columns in large tables like `account.move` need to be indexed if an opposite one-to-many relationship is defined, otherwise reading that o2m requires a full Seq Scan of the table. Introduced via #183335 Forward-Port-Of: odoo/odoo#218517 Forward-Port-Of: odoo/odoo#218497
Code cleanup and technical improvements
This update makes internal Web Studio test checks wait for the exact page elements they need before continuing. It reduces random test failures, helping the team validate changes more reliably without affecting end users.
Original PR description
In this commit, we simplify the assertions made in run functions with more explicit triggers that use Hoot's pseudo-selectors. This is almost the same thing, except that the macro system waits to…
In this commit, we simplify the assertions made in run functions with more explicit triggers that use Hoot's pseudo-selectors. This is almost the same thing, except that the macro system waits to find the trigger (animationFrame by animationFrame). If, for some reason, the parent element already exists but not the child element sought in the run function, then the tour spits out... indeterministically.
So this commit can also fix tours.
For example:
{
trigger: ".o-web-studio-report-container :iframe body",
run() {
assertEqual(
this.anchor.querySelector(".test-added-0").textContent,
"in document view"
);
assertEqual(this.anchor.querySelector(".test-added-1").textContent, "in main view");
},
},
:iframe body is present but not ".test-added-0" yet ... then the assertion failed when it is enough just to wait for the element to be in the dom.
Is fixed with :
{
trigger: ".o-web-studio-report-container :iframe body .test-added-0:contains(in document view)",
},
{
trigger: ".o-web-studio-report-container :iframe body .test-added-1:contains(in main view)",
}The Project app now shows task priority correctly in the dependencies list on a task's “Blocked by” tab. The priority column is hidden by default to keep the list focused on the most important details, such as status, task name, and assignees.
Original PR description
Before this commit, the priority field of project.task was not correctly rendered inside the sub-list view of task dependencies (in "Blocked by" tab in task form view). This commit makes sure the priority field of project.task is correctly in that sub-list view. Also, it also hides by default the column to let more spaces for the most relevant fields (state, name and assignees).
The CRM Lost filter now shows opportunities that were marked as lost, even though those records are normally archived. This helps teams review lost business accurately without missing records in activity reports.
Original PR description
#### Issue: The `Lost` filter does not reveal any records, as any records moved to the lost status are archived. #### Solution: Override default context that hides archived records when using the filter. opw-4937003 Forward-Port-Of: odoo/odoo#219524
This fix prevents Italian electronic invoice imports from failing when an invoice line has a zero price and no discount or surcharge value. Businesses can now import these valid supplier invoices without interruption or manual correction.
Original PR description
Error "division by zero" raised when importing a XML invoice with `price_unit == 0` and `ScontoMaggiorazione == 0` introduced by #206238 Forward-Port-Of: odoo/odoo#217670
This fix prevents the Argentina localization from crashing when a user enters a non-numeric identification number for a partner. Instead of failing unexpectedly, the system now handles invalid VAT or ID input safely, improving reliability during partner setup and data entry.
Original PR description
The system crashes when trying to `sanitize invalid VAT` inputs for `Argentina partners` due to the assumption that the identification number can always be safely cast to int(). **Steps to…
The system crashes when trying to `sanitize invalid VAT` inputs for `Argentina
partners` due to the assumption that the identification number can always be
safely cast to int().
**Steps to reproduce:-**
- Initialize a database with `demo data`.
- Install the `l10n_ar` module and switch to the `AR Company`.
- Create a partner with:
- Country: `Argentina`
- Identification Method: `DNI`
- Number: `test`
- Observe the error.
**Error:-**
`ValueError: invalid literal for int() with base 10: ''`
**Root cause:-**
- The method `_run_check_identification` is introduced after this [commit](https://github.com/odoo/odoo/pull/179078)
- in this method, when [1] is executed, then `get_id_number_sanitize` method
is called.
- At [2], the error occurs because `_get_id_number_sanitize()` assumes the VAT
is numeric after removing `non-digit characters`. If the VAT input is non-
numeric (e.g., 'test'), it becomes an `empty string ''`, and converting that to
int('') raises an error.
**Solution:-**
- Added a VAT validity check using `_check_vat_number()` at the start of
`_get_id_number_sanitize()`. If the VAT is invalid, we return 0
early to prevent `int()` conversion errors.
[1]: https://github.com/odoo/odoo/blob/2c019833bbc771866fb9a1c0021d87b8b07ed411/addons/l10n_ar/models/res_partner.py#L63
[2]: https://github.com/odoo/odoo/blob/2c019833bbc771866fb9a1c0021d87b8b07ed411/addons/l10n_ar/models/res_partner.py#L134-L135
**sentry-6743438515**This change gives a long-running website test more time to complete when checking page properties. It helps prevent false test failures caused by slower iframe loading in some Odoo editions, improving release validation reliability without changing user-facing behavior.
Original PR description
## Version 18.0+ ## Issue Task 4141409 introduced long tests to simulate complete flow. As this test relies on many iframe checks and these iframes being slow to load, the test time limit is reached. The test fails on Single App and Community but not with Enterprise might be related to performances linked to modules interactions. runbot-223225 Forward-Port-Of: odoo/odoo#214870
The mail discussion “Seen by” popup no longer displays a date that could be mistaken for when someone viewed a specific message. This avoids confusion caused by showing a general channel activity date that may be outdated or unrelated to the message.
Original PR description
Before this commit, the “Seen by” tooltip displayed each member’s channel-level `last_seen_dt`, which for older messages could misleadingly be interpreted as “seen today” even if the user hadn’t actually viewed it recently. Furthermore `last_seen_dt` isn’t kept up to date client-side (and only gets fetched on reload), thus causing more confusion. This commit removes the date from the “Seen by” popup. Tracking a true per-message “seen at” timestamp for every user would require significantly more complex modeling and will be revisited later if necessary. task-4630168 Forward-Port-Of: odoo/odoo#219441 Forward-Port-Of: odoo/odoo#211490
This change fixes an internal automated test for website live chat that was failing when demo data was loaded. The test now uses a dedicated user so its expected email value stays consistent, helping keep nightly build checks reliable without affecting customer-facing behavior.
Original PR description
This commit fixes a failing test in the nightly "With Demo" build. The test fails because it checks the email of the demo user, which is overridden by the demo data from another module. This commit fixes the issue by making the test run with a different user than the demo user, so that the email remains predictable. fixes runbot-229925
Expense users can now return to the filtered list after opening an expense from dashboard shortcuts such as "To Submit". This restores expected navigation and avoids users getting stuck on an individual expense record.
Original PR description
**Steps to reproduce:**
- Install the `hr_expense` module.
- Go to the Expense menu and click on "To Submit" in the My Expense dashboard.
- Open any record from the list view.
**Observation:**
- You can't go back to the list view after opening a record.
**Cause:**
- A tag `menu` was added to the action to hide breadcrumbs, but it removed all breadcrumb navigation, unable to go back.
https://github.com/odoo/odoo/blob/92993d7790bb641e5822a5358db35c7fcc7bd091/addons/hr_expense/static/src/components/expense_dashboard.js#L44
**Solution:**
- Used a better way by passing `{ clearBreadcrumbs: true }` to stop the breadcrumb from changing when a filter is applied.
opw-4790643
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#218397
Forward-Port-Of: odoo/odoo#217492This update makes an internal mail component available for custom extensions. It helps teams and partners apply tailored mail-related changes more reliably without altering core behavior.
Original PR description
Useful for custom patches. Forward-Port-Of: odoo/odoo#219470
This fix updates several country accounting templates so default suspense accounts are treated as current assets instead of current liabilities. This keeps balance sheet reporting aligned with Odoo's accounting rules and prevents issues when users reselect suspense accounts on bank journals.
Original PR description
Since V14, suspense accounts are classified as current assets. They were previously classified as current liabilities while the liquidity accounts were current assets. It would artificially inflates the current assets and current liabilities as long as the bank statements lines weren't reconciled. We noticed that the belgian default suspense account is still classified as current liability. On the bank Journal, there is a domain so only current assets type can be set as default suspense account. There is no issue at the package installation but if the suspense account is removed from the journal, it can't be added back afterwards. task-4829826 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212935
This change stabilizes an internal mail test that could fail unpredictably when automated test systems were under heavy load. It helps keep release validation reliable without changing any user-facing mail behavior.
Original PR description
Since [1], https://github.com/odoo/odoo/pull/207974 websocket timeout has been increased during test. Fetching notification only returns the notifications of the last 50 seconds initially. When runbot is under high load, this can lead to non deterministic failures. This commit patches the cursor date to bypass this issue. [1]: https://github.com/odoo/odoo/pull/207974 fixes rubot-223126,223758 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#217953
Automation rules that update records now safely do nothing when required update details are left blank. This prevents scheduled automation from failing and avoids interruptions for users creating CRM leads or using similar automated workflows.
Original PR description
When executing an automation rule with an "Update Record" action, if no update path is configured, an error occurs. **Steps to reproduce:** 1. Install the **CRM** and **Automation Rules** modules. 2.…
When executing an automation rule with an "Update Record" action, if no update path is configured, an error occurs.
**Steps to reproduce:**
1. Install the **CRM** and **Automation Rules** modules.
2. Create a new **automation rule**:
- Model = Lead, Trigger = After Creation
3. Add an **action**. Type = Update Record (do not configure the update path)
(Tip: select another action type and switch back to reset the path.)
5. Create a new lead.
6. Run the scheduled action: Automation Rules: check and execute.
**Error:**
```
AttributeError: 'bool' object has no attribute 'split'
....
ValueError: AttributeError("'bool' object has no attribute 'split'") while
evaluating 'model._cron_process_time_based_actions()'
```
**Cause:**
In `_traverse_path`, the `update_path` is expected to be a string for `.split()`, but if not configured, it is `False`, leading to the traceback. - [1]
[1] - https://github.com/odoo/odoo/blob/5842c9f4821772fe44cfe7244162edec1ffff88e/odoo/addons/base/models/ir_actions.py#L701
**Fix:**
This commit ensures that no action is performed if the update path is not defined, avoiding the traceback.
sentry-6722927119
Forward-Port-Of: odoo/odoo#217723Fixes an issue where product tags could appear with duplicated page structure when shoppers changed product variants. This keeps product pages cleaner and helps avoid display or layout problems in the online shop.
Original PR description
Steps: - Open Odoo 18. - Go to Website > Shop. - Open any product with tags. - Inspect the DOM. Issue: - The `.o_product_tags` div was duplicated. - This resulted in a nested `.o_product_tags` block in the DOM. Reason: - The system was inserting the full HTML tags, including its wrapper, causing the nesting. Solution: - Now only the inside content of the tags is updated, not the whole wrapper. - This keeps the structure clean and avoids duplication. Result: Now, there will be no duplication in the `.o_product_tags` block div section. OPW:4863967 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219001 Forward-Port-Of: odoo/odoo#218320
This fix makes message and accounting notifications use the correct fallback information when notification data is missing or empty. It helps prevent inaccurate details, such as wrong record names or scheduling information, from appearing in user notifications.
Original PR description
Beware values may be Falsy, in that case we have to fallback on message itself. account: correctly check values or messages values in notification discuss: fix values usage in discuss methods mail: fix values / msg non coherency for scheduledDatetime, should always be Falsy if not given in values or message Task-4845982 Forward-Port-Of: odoo/odoo#219153 Forward-Port-Of: odoo/odoo#219055
The accounting app now shows clearer error messages when migrated custom reports use unsupported cross-report formulas. The message identifies the affected report, line, and label, and includes an example so users and support teams can resolve the issue faster.
Original PR description
When customer migrate to 18.3, they might reach the cross-report error if they had customizations in a report using a subformula. The error message was very technical and is now improved by at specifying the report name (useful when using sections), line name and the label as well as providing an exemple on what a cross_report expression is. task-4938291 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates the Mexican DIOT report so it uses the current column references introduced by a related accounting change. It helps ensure DIOT values are calculated and reported under the correct categories, reducing confusion and reporting errors.
Original PR description
Description of the issue/feature this PR addresses: The language used in the DIOT documentation was confusing and even though we had the exact same description for two columns it turns out they were…
Description of the issue/feature this PR addresses: The language used in the DIOT documentation was confusing and even though we had the exact same description for two columns it turns out they were different, so we need to change the logic of a few columns to make it work as needed. This issue was addressed in PR: https://github.com/odoo/odoo/pull/217441, but a small adjustment still needs to be made in the l10n_mx_reports module. Current behavior before PR: The l10n_mx_diot_get_values function uses references to the old account.report.expression that were removed in the pr mentioned above. Desired behavior after PR is merged: The l10n_mx_diot_get_values function uses the new references to account.report.expression that were introduced in the pr of the community repo. opw-[4920577](https://www.odoo.com/odoo/my-tasks/4920577) "I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr" Forward-Port-Of: odoo/enterprise#89984 Forward-Port-Of: odoo/enterprise#89481
This fixes an issue in the Gantt schedule view where using Today after selecting a one-day custom range could create an invalid date range. Users can now continue navigating the schedule normally with the next arrow, avoiding confusion during appointment resource planning.
Original PR description
Steps to reproduce ================== - Go to Appointments > Schedule > Resources Bookings - Select a custom range with the same start date and stop date - Click apply - Click on Today - Use the next arrow => Nothing changes Cause of the issue ================== If there is 0 day between the start and stop dates, clicking on today will have the stop date before the start date. opw-4754203 Forward-Port-Of: odoo/enterprise#88919
This fixes a configuration issue in the Swiss payroll ELM transmission module by removing an incorrect preset value from a linked setting. It helps ensure payroll transmission settings reflect the actual company configuration and avoids misleading defaults.
Original PR description
…lated field Forward-Port-Of: odoo/enterprise#90425
Spreadsheet users can now autofill pivot columns, including columns that were themselves created through autofill, without triggering a crash. This improves reliability when extending reports with date-based measures and reduces interruptions during spreadsheet analysis.
Original PR description
Fix crash when autofilling columns which where created by autofill. Task: 4719884 Forward-Port-Of: odoo/enterprise#86846 Forward-Port-Of: odoo/enterprise#83314
The AI Composer no longer shows user mention or channel suggestions that could not be used successfully. This prevents confusing options and avoids errors when slash commands are entered in AI Composer channel conversations.
Original PR description
* = test_discuss_full_enterprise Disabled all @ (mentions) and # (channel) suggestions in ai_composer to prevent non-functional options. also prevents error when using / commands in ai_composer type of the channels. task-4918914
This fix restores the Mexican electronic invoicing payment method field on bank statement lines. Users can again edit this information during bank reconciliation, helping keep payment reporting accurate for Mexican localization requirements.
Original PR description
Since https://github.com/odoo/enterprise/commit/2335c953723dce66af8811fdfbfd5b811d42b109 The field l10n_mx_edi_payment_method_id is no longer available on statement lines to be edited by the end user.
A website rental checkout test was adjusted so it waits correctly without interacting with the date picker. This helps keep automated checks stable and reduces false build failures, with no expected change for customers using the rental flow.
Original PR description
remove click on datepicker in the wait step build-error-213702 Forward-Port-Of: odoo/enterprise#89873
This change fixes an automated test for the Knowledge app by making it find the clipboard copy button more reliably. It helps keep release validation stable and avoids false test failures that could delay deployments.
Original PR description
This commit fixes an issue with the embedded clipboard steps in the commands tour. The selector for the problematic steps was too specific as the copy button isn't always the 1st button. runbot-114522 task-4748626 Forward-Port-Of: odoo/enterprise#80845
This fix prevents the Knowledge app from failing when optional information is missing. It improves stability by handling empty values safely instead of treating them as structured data.
Original PR description
Just be sure when using an argument that can be False instead of a dict. Task-4845982 Forward-Port-Of: odoo/enterprise#90285 Forward-Port-Of: odoo/enterprise#90254