Wednesday, September 3, 2025
24 changes · saas-18.2
Enhancements to existing features
SMS message composition can now receive extra information when generating message text. This makes it easier for installed add-ons to customize SMS content without using fragile workarounds, improving maintainability for future customizations.
Original PR description
In add-ons may need to pass additional context to body render function, both `_render_field`, and `_render_template` support this but the `sms.composer` didn't implement a proper way to pass additional context to them. overwrite `_prepare_body_values` for just passing `add_context` to render functions is not a good practice. In this PR I add a `_get_body_additional_context` to it, so any module can overwrite that function to pass additional context to render functions. Forward-Port-Of: odoo/odoo#208355
The Peppol demo bill shown when fetching incoming bills in demo mode has been replaced with a clearer, better example. This helps users and evaluators better understand the incoming bill workflow without affecting live business documents.
Original PR description
Replace Peppol demo bill that you get when fetching incoming bills in demo peppol mode. Forward-Port-Of: odoo/odoo#225086
Resolved issues and error corrections
Saving the document layout wizard no longer tries to rewrite an unchanged company bank account number. This prevents unnecessary errors for trusted bank accounts while keeping the displayed bank information unchanged.
Original PR description
Description of the issue/feature this PR addresses: The document layout wizard (base.document.layout) attempts to write the partner’s bank account number even if it has not been changed. If the first…
Description of the issue/feature this PR addresses: The document layout wizard (base.document.layout) attempts to write the partner’s bank account number even if it has not been changed. If the first bank account is marked as trusted, Odoo blocks the write and raises an error. This PR prevents that error by only writing the account number when it has actually changed. Current behavior before PR: - The wizard shows the account_number field. - On saving, _inverse_account_number always writes to the first partner bank account. - Trusted bank accounts trigger an error: “You cannot change the account number or partner of a trusted bank account.” Desired behavior after PR is merged: - The wizard still shows the account_number field. - On saving, _inverse_account_number only writes if the value changed. - Trusted bank accounts that are not modified do not cause an error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224905
Miscellaneous changes
After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Meanwhile added a new entry that was still added to the `.tx/config`. Forward-Port-Of: odoo/odoo#225225 Forward-Port-Of: odoo/odoo#225179
Original PR description
After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Meanwhile added a new entry that was still added to the `.tx/config`. Forward-Port-Of: odoo/odoo#225225 Forward-Port-Of: odoo/odoo#225179
This fix adjusts an automated Point of Sale test so it checks product pricing details at the right moment in the mobile flow. It helps keep quality checks reliable and prevents false test failures without changing how users operate the system.
Original PR description
In this commit, we just change the place of step that ensure the content of the product 1 is correct because inleftside function in common.js add a rollback step in mobile view and then the tour failed. If the check step is before the rollback ... then it works. 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
Refreshing a completed live survey session after a question was deleted no longer triggers an error. This keeps the participant-facing thank-you page stable even when survey content is edited in another tab.
Original PR description
Currently, an error occurs when refreshing a live session's `Thank You` page after deleting a survey question. **Steps to reproduce:** - Install the `survey` module. - Create a `new survey`, `add a…
Currently, an error occurs when refreshing a live session's `Thank You` page after deleting a survey question. **Steps to reproduce:** - Install the `survey` module. - Create a `new survey`, `add a question` and click on `Create Live Session`. - Complete the survey and leave it on the `Thank You` page. - Switch back to the `first tab`, delete the question and `save` the survey. - Return to the `Thank You` tab and `refresh` the page. **Error:** `IndexError: list index out of range` **Root Cause:** At [1], the controller assumes the question exists and tries to access `index [0]`, but when the question has been deleted, the recordset is empty, causing an `error`. [1] https://github.com/odoo/odoo/blob/ffd9c0f96bda1bad1ad2059d9be2fae54b60eace/addons/survey/controllers/survey_session_manage.py#L236 This commit prevents a crash when refreshing a live session if the question was deleted. sentry-6736648824 Forward-Port-Of: odoo/odoo#225020 Forward-Port-Of: odoo/odoo#218312
This fix prevents an error when a settings page header is created without a label. It makes the label optional as intended, improving reliability for configuration screens without changing normal user workflows.
Original PR description
Before this commit, an error would occur if a header setting did not contain an attribute string or field. This was because the code tried to infer the label. However, the label should be optional. 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#225119 Forward-Port-Of: odoo/odoo#225080
Opening a Discuss channel now clears its unread indicator even if another browser session already marked it as read. This prevents confusing stale unread badges when users work across multiple browser windows or devices.
Original PR description
Before this commit, if you opened an unread channel that the server already considered “read,” the channel would remain marked as unread in your browser. This typically happens when one browser instance misses the bus notification that cleared the unread status. Steps to reproduce: 1. Open Discuss as the same user on two browsers (A and B) 2. Send a message to said user 3. Stop bus notifications on browser A 4. Read the message on browser B 5. Re-enable bus notification on browser A 6. Open the channel on browser A -> not being marked as read This happens because the method `_set_last_seen_message` skips sending the notification when the message seen is older than the current `seen_message_id` (previously set by the other browser). This commit fixes the issue by setting the `allow_order` parameter in the rpc call. task-4863058 Forward-Port-Of: odoo/odoo#223956 Forward-Port-Of: odoo/odoo#218623
Users can now retry deleting a row in related list fields after cancelling a confirmation dialog. The delete button is only briefly disabled to prevent accidental double-clicks, avoiding a workflow blockage in customized screens such as subtasks or product attributes.
Original PR description
PR [1] aimed at fixing a double-click issue with the delete button in x2many lists. In standard views, it works fine. However, there are customizations (e.g. project sub tasks, product attributes...) that add a confirmation step before actually removing the row. If the user cancelled the deletion, clicking on the delete icon of that row afterwards had no effect at all. This commit fixes the issue by re-enabling the button after 500ms, thus only preventing double clicks. [1] https://github.com/odoo/odoo/pull/173481 opw~5019621 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#225072
Fixed an issue where opening an employee record on a mobile device and tapping the gear menu could cause the screen to crash. This improves reliability for HR users accessing employee information from phones or tablets.
Original PR description
Opening the Employee form on mobile and tapping the gear icon could crash because `PresenceActionItems` was undefined. Initialize it and guard the template. task-5055564 Forward-Port-Of: odoo/odoo#224942
The organization chart now shows the correct employee and manager information when viewed from user, employee, or public employee records. This prevents mismatched reporting details and improves reliability for HR users viewing employee structures.
Original PR description
This update ensures that the correct employee and parent IDs are fetched depending on whether the widget is displayed in a `res.users`, `hr.employee` or `hr.employee.public` form. The `onWillStart` was removed since `useRecordObserver` is triggered in `onWillStart`, and both used to have the same logic. task-5039701 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225193 Forward-Port-Of: odoo/odoo#224456
The e-waybill screen now shows errors and warnings with the correct colors, making issues easier to recognize at a glance. It also handles access-related errors more reliably, reducing confusion for users working with e-waybill records.
Original PR description
Before: --- Error and warning colors were mismatched in the e-waybill view. In this commit: --- Fixed the e-waybill view to correctly display error messages - Errors now display in red (alert-danger) :red_square: - Warnings now display in yellow (alert-warning) :yellow_square: AccessError now handled correctly. --- task-5050937 Forward-Port-Of: odoo/odoo#225196 Forward-Port-Of: odoo/odoo#225078
This fix prevents an unexpected system error when saving a view with an unsupported XML tag. Users now receive a clearer validation message, helping administrators identify and correct invalid view definitions more easily.
Original PR description
When a user tries to save a view with an invalid tag, an error occurs. **Steps to produce:-** 1. Go to Settings > Technical > User Interface > Views. 2. Click on New. 3. Add the view name. In architecture -> add `<template></template>`. 4. Try to save the changes. **Error:-** `ValueError:Wrong value for ir.ui.view.type: 'template'`. **Root cause:-** - The view type in `ir.ui.view` is automatically inferred from the `root tag` of the XML defined in the `arch` field. - In this case, `<template>` becomes the inferred view type, which is not part of the valid selections for the type field in the model `ir.ui.view`. **Solution:-** - Before calling `super().create(vals_list)`, add a validation check to ensure `values['type']` is in the allowed types. If not, raise a ValidationError. sentry-6561028171 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207219
This update corrects an internal test check so standalone tests properly verify their simulated time mode. It helps keep automated testing reliable and reduces the risk of unnoticed timing-related issues reaching later development stages.
Original PR description
Standalone tests don't enter faketime mode. Forward-Port-Of: odoo/odoo#224077
Linking an employee who has a bank account to an internal user no longer incorrectly requires bank account trust permissions. This prevents an unnecessary error and lets authorized employee/user updates proceed smoothly.
Original PR description
Steps to reproduce: - Let's consider an employee E with a bank account BA - Let's consider that BA has the option "Send Money" enabled - Let's log to an internal user U without any access right in Bank - Try to link E to any internal user Bug: A user error was raised: You do not have the rights to trust or untrust accounts. opw:4553238 Forward-Port-Of: odoo/odoo#211081 Forward-Port-Of: odoo/odoo#198974
When a user is archived, their assigned activities are now correctly removed even if they belong to a company that is not currently selected. This prevents old activities from remaining visible or actionable due to company filtering.
Original PR description
**Steps to reproduce:**
- Set up one user with a new company
- With this user :
- Create sale order
- Create activity on the new sale order
- Go back to the admin user
- Disable the new company in the top right menu
- Archive the user
- Activities of the user are still present
**Issue:**
In `activities_to_delete = self.env['mail.activity'].search([('user_id', 'in', self.ids)])`, the access rights of the records used in the activities are checked, which means that the sale order domains are applied. If the given domain doesn't match (for example `('company_id', 'in', company_ids)` when the company_id is manually disabled), the search can miss the activity to unlink.
**Fix:**
Added `.sudo()` to ensure all of the user's activities of any company
are considered, overwriting the current company context.
opw-4716031
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#206813This fixes website tracking so custom goal details are sent in the expected format to Plausible analytics. Businesses using these goals can again rely on accurate conversion reporting and segmentation for website actions.
Original PR description
Since commit b9b3a60, conversion to owl, the props are sent as string instead of object.
This commit restores old behaviour of using a JSON object for props.
Before commit b9b3a60:
> $($0).data('event-params')
{Type1: 'cart'}
After commit b9b3a60:
> $0.dataset.eventParams
'{"Type1": "cart"}'
After this commit:
> JSON.parse($0.dataset.eventParams)
{Type1: 'cart'}
opw-oxpslide-stbuThis update makes Odoo's internal test process faster by skipping an unnecessary check unless it is explicitly needed. It also avoids failures in environments where source files are not available, improving reliability for development and release validation.
Original PR description
`get_method_additional_tags` can be slow when there are a lot of test to load while the feature is only needed in rare cases. This commit removes the check if the corresponding tag is not in the config test-tags. This should also solve an issue when the sources are not available. Forward-Port-Of: odoo/odoo#225109 Forward-Port-Of: odoo/odoo#225061
This fixes an issue where empty chatbot messages appeared as unwanted blank lines in live chat channel history. Chat histories will now look cleaner and more accurate, reducing confusion for users reviewing conversations.
Original PR description
When a chatbot conversation contains messages with empty body, this empty body would be converted into a newline which is not desired. This commit ensures that empty messages are not converted into newlines in the channel history. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Portal users can no longer become owners of Documents spreadsheets, aligning ownership rules with the existing restriction that spreadsheets cannot be shared with them in edit mode. This avoids permission issues and keeps spreadsheet control limited to internal users.
Original PR description
Following the discussion I had with @flch-odoo regarding https://github.com/odoo/enterprise/pull/92134 , Since Spreadsheets can not be shared in edit mode to non-internal users, we prevent them from becoming owners. opw-4753670 Forward-Port-Of: odoo/enterprise#92409
A quality control test now sets up the needed serial number permission explicitly, so it works even when the module is installed on its own without demo data. This improves reliability of internal testing and reduces false failures during updates or deployments.
Original PR description
## Issue:
The test `test_receipt_validation_triggers_serial_number_label_print` fails when running `quality_control` alone without demo data
## Cause:
The user is missing the group `stock.group_production_lot`, that enable serial number printing
As a result, the condition `self.env.user.has_group('stock.group_production_lot')` in `stock.picking` `_get_autoprint_report_actions()` is not satisfied
The `button_validate()` in `stock.picking` will have an empty report_actions and will not print anything
The Demo data that allow the test to work is in `stock`
https://github.com/odoo/odoo/blob/9b08449f25cd16dc15117d305726380298c313d8/addons/stock/data/stock_demo.xml#L176-L182
## Steps to reproduce:
- Install only `quality_control` (no demo data)
- Run the test `test_receipt_validation_triggers_serial_number_label_print`
related-to: https://github.com/odoo/enterprise/pull/90134
opw-4790427
Forward-Port-Of: odoo/enterprise#93296The signature dialog now avoids showing an automatically generated signature on top of a drawn signature. This prevents visual confusion and gives users a clearer signing experience.
Original PR description
Fixed an issue where both the auto-generated and drawn signatures overlapped in the signature dialog. This was caused by the system automatically setting the user's default signature to the drawn one when opening the dialog. Now, the dialog no longer defaults to the drawn signature, preventing visual overlap and ensuring a cleaner user experience. Forward-Port-Of: odoo/enterprise#93750
The website generator now reliably stops its background checks when users leave or the screen is closed early. This prevents repeated server calls from a closed component, reducing avoidable crashes and improving stability.
Original PR description
In a component lifecycle, it may happen that onWillStart is called but not onWillUnmount. Indeed, if the component is destroyed before being mounted (because the current rendering has been cancelled), onWillUnmount isn't called. As a consequence, in the WebsiteGenerator component, the setInverval might never been called, thus producing an orm call every 10 seconds, when the component is destroyed. These calls lead to crashes ("Component is destroyed").
The solution is to use the onWillDestroy hook instead, which is always called.
Forward-Port-Of: odoo/enterprise#93679After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Forward-Port-Of: odoo/enterprise#93751 Forward-Port-Of: odoo/enterprise#93730
Original PR description
After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Forward-Port-Of: odoo/enterprise#93751 Forward-Port-Of: odoo/enterprise#93730