Thursday, August 28, 2025
21 changes · saas-18.3
Enhancements to existing features
A test that can sometimes freeze during nightly builds when a time-simulation tool is active has been disabled temporarily. This helps keep automated build checks moving while the underlying issue is investigated, with no expected impact on end users.
Original PR description
For a strange reason, this test can get stuck while compiling the sources with libsass when faketime is active. Some more investigation is needed but disabling it for now to avoid having builds stuck during the nightly Forward-Port-Of: odoo/odoo#224422
Resolved issues and error corrections
Fixed a Point of Sale issue where decreasing an unsaved order line could accidentally remove two items from the current order instead of one. This helps cashiers keep orders accurate and avoids unintended changes during checkout.
Original PR description
- Fix issue in `handleDecreaseUnsavedLine` which was leading to removing two orderlines instead of one in the current order. This issue appeared since this commit (8e964000474125ca2db4ee4e5883be8424d9fca1). Since we already set the line qty to 0 (or remove it) inside `updateSelectedOrderline` after calling `_showDecreaseQuantityPopup`, we don't need to call `removeOrderLine` inside `handleDecreaseUnsavedLine`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224230
Miscellaneous changes
Description of the issue/feature this PR addresses: The method action_add_from_catalog in purchase_stock replaces the product's kanban view with a purchase-specific one. This method directly replaces the first view in the list, which could be wrong if another module changes the default view of the catalog. This commit updates the method to replace only the kanban view, ensuring that other view types are preserved correctly. --- I confirm I have signed the CLA and read the PR guidelines
Original PR description
Description of the issue/feature this PR addresses: The method action_add_from_catalog in purchase_stock replaces the product's kanban view with a purchase-specific one. This method directly replaces the first view in the list, which could be wrong if another module changes the default view of the catalog. This commit updates the method to replace only the kanban view, ensuring that other view types are preserved correctly. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#194745 Forward-Port-Of: odoo/odoo#175438
Changing a customer or vendor VAT number in the Indian localization no longer causes the invoice fiscal position to be recalculated. This keeps tax-related settings stable and consistent with standard Odoo behavior, reducing unexpected changes during partner detail updates.
Original PR description
The field fiscal_position_id in l10n_in was dependent on l10n_in_gst_treatment, which itself depended on partner.vat, partner.country_id, and partner.l10n_in_gst_treatment. As a result, any change to the partner’s VAT triggered a recomputation of fiscal_position_id. This contradicts the generic behavior, since VAT changes should not affect fiscal position. This fix removes the unnecessary dependency chain. reference - https://github.com/odoo/odoo/pull/224511
Creating a discussion channel with guest members no longer triggers an error. This helps users save channels reliably when adding guests as members.
Original PR description
Currently, an error occurs when creating a channel that includes guest members. Steps to Reproduce: - Install the `mail` module. - Go to `Channels > New`. - Fill in the `channel name` and `Under…
Currently, an error occurs when creating a channel that includes guest members. Steps to Reproduce: - Install the `mail` module. - Go to `Channels > New`. - Fill in the `channel name` and `Under Members`, add a member with a `guest`, and `save`. `KeyError: 'partner_id'` This error occurs when a user creates a channel and adds a guest in the Members section. This error occurs after [this commit]( https://github.com/odoo/odoo/commit/ad612321bcafe6dfdaabf3aa37f26af364185a69), where the partner_id and guest_id fields dynamically become readonly [1], so that if only the guest is entered, the partner becomes readonly, and when the record is created, the partner_id key does not exist, and raises the error [2]. This commit ensures that the partner_id is accessed only if it is present in the record. [1]- https://github.com/odoo/odoo/blob/5bddf9bfb634d09d3264e4fe4734d75f1083775a/addons/mail/views/discuss_channel_views.xml#L87-L88 [2]- https://github.com/odoo/odoo/blob/5bddf9bfb634d09d3264e4fe4734d75f1083775a/addons/mail/models/discuss/discuss_channel.py#L235 sentry-6791956423 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222211
The two-factor authentication test flow now waits for page elements to be ready before continuing. This reduces intermittent test failures and helps keep release validation stable, without changing the user-facing login experience.
Original PR description
Added wait steps in the TOTP flow tests to ensure that UI elements are fully loaded and ready this should help to avoid race conditions in the tests. build_error-107908 Forward-Port-Of: odoo/odoo#219260
This fixes an unreliable automated test in the Sales Timesheet area by making sure a required kanban column is created before the test continues. It helps reduce false test failures and improves confidence in future updates without changing user-facing behavior.
Original PR description
In this commit, we fix the undeterministic behavior by adding a step to ensure kanban column is created before continue scenario. runbot-error-id~181916 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
This fix prevents an error when editing a sales order that has multiple linked invoices visible on the form. Users can now trigger updates, such as changing a product line, without the screen failing due to duplicate-reference checks on several invoices at once.
Original PR description
**Step to reproduce** - create a SO - link 2+ invoices to it - using studio, add invoice_ids to the SO Form - trigger a onchange (ex. change the product from SOL) - we receive a traceback…
**Step to reproduce** - create a SO - link 2+ invoices to it - using studio, add invoice_ids to the SO Form - trigger a onchange (ex. change the product from SOL) - we receive a traceback **Traceback:** ```ValueError: Expected singleton: account.move(<NewId origin=35>, <NewId origin=31>, <NewId origin=32>, <NewId origin=33>, <NewId origin=34>)``` **Issue:** - from `onchange` triggers chain,`_compute_duplicated_ref_ids` is invoked calling `_fetch_duplicate_reference` for the related moves (invoice_ids) such that as they are in create/edit mode - at this time `convert_to_write(moves[field_name], moves)` fails as moves has more than 1 record and `recordset[field]` is not valid syntax in such case https://github.com/odoo/odoo/blob/3966753eb5a8534c8b5b8a16e626f5250c9013cf/addons/account/models/account_move.py#L1868-L1884 - hence, we receive valueError, expecting a singleton **Fix;** - we adapt the method to accept multiple moves which may be in create/edit mode opw-4959528 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223513
This fixes an issue where inherited property values could be wrong or unavailable after the system cache was cleared or missed. It helps keep records consistent and prevents unexpected missing data in workflows that rely on inherited properties.
Original PR description
inherited properties should be computed from its related field after cache miss 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#224550 Forward-Port-Of: odoo/odoo#224359
Fixed an issue where printed reception reports could cut a table row between two PDF pages when the report contained many product lines. This makes inventory reception documents easier to read and helps avoid confusion during warehouse review or record keeping.
Original PR description
### Issue: - In the settings enable reception report. - Create a storable product with a product name of length 60. - Create and confirm a delivery with 20+ lines of 1 x that product. - Create and…
### Issue: - In the settings enable reception report. - Create a storable product with a product name of length 60. - Create and confirm a delivery with 20+ lines of 1 x that product. - Create and confirm a PO with 20+ lines referring to 1 x that product. - Validate the receipt > Allocation smart button > Assign all. - Click on print and open the PDF. #### > The last row of the first page is cut in half at the end of the page and the beginning of the next one. ### Cause of the issue: The class `o_report_reception` is used both in the view of the reception report `ReceptionReportMain`: https://github.com/odoo/odoo/blob/25b8e651c439d688bd05dd0d9619d74fa749597d/addons/stock/static/src/components/reception_report_main/stock_reception_report_main.xml#L16 and its printed version: https://github.com/odoo/odoo/blob/25b8e651c439d688bd05dd0d9619d74fa749597d/addons/stock/report/report_stock_reception.xml#L43-L44 However, when the report becomes too big (many lines), the class did not allow the user to scroll down the view and a fix has been implemented adding the overflow-y style to the class see https://github.com/odoo/odoo/commit/d8a19285939fb31f6d34290cb8138d402e93024b https://github.com/odoo/odoo/blob/25b8e651c439d688bd05dd0d9619d74fa749597d/addons/stock/static/src/scss/report_stock_reception.scss#L3 The issue being that wkhtmltopdf relies on the size of the table to determine if a row should be displayed on a page or an other one and if you can scroll down he will apparently not do his job correctly. opw-4824221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224434
This fix prevents an error when users add a new Cards block on a website page and resize its card grid vertically. It makes the website editor more reliable for creating and adjusting card layouts.
Original PR description
Scenario: - add a "Cards" snippet (s_floating_blocks) - click on "Add New" cards - resize vertically the grid containing "Card Title" Result: traceback error is shown TypeError: Cannot read properties of undefined (reading 'substring') at iframeWindowMouseUp (snippets.options.js:4799:1) Cause: the code assume that there is always a g-col-* class and it is there on demo cards, as well as if the grid is resized horizontally, but it's not there when adding a new card. Fix: adding the class the the new card template. opw-5027818
This fix prevents errors in Discuss calls when someone leaves or crashes just as another participant joins. It makes call handling more reliable by safely ignoring late connection updates after a call has already ended.
Original PR description
Before this commit, since https://github.com/odoo/odoo/pull/202167, a race condition could occur where the call is over when the the rtc session matching a track event is obtained. This could occur if you crash or leave at the moment another user arrives. You could get a track event from the SFU, wait for the rtc session record from Odoo, leave te call, finally get the rtc session from odoo. This would lead to a traceback as this handler expected that the call was still ongoing.
Manufacturing orders created from make-to-order sales now remain in draft when the product recipe has no components or operations. This prevents empty production orders from being confirmed automatically, giving users a chance to add the needed details first.
Original PR description
Issue Before This Commit: ============================ Currently, if a BOM has `no components or operations` and is triggered via `MTSO`, the generated Manufacturing Order (MO) is automatically set to a `confirmed` state. This behaviour is inconsistent and not meaningful, as there's nothing to produce or track. Steps to Reproduce: ============================ - Install the `mrp and sale` module. - Enable MTSO route. - Create a product with a BOM that has `no components or operations`. - Create a sale order for that product. MO is created in a `confirmed` state. With This Commit: ============================ This commit ensures that MOs triggered via `MTO(Already worked) or MTSO` are created in draft state if their BOM has no components and no operations. This allows the user to manually add required details before confirming the MO. supporting custom use cases. TaskID:- 4920195 Forward-Port-Of: odoo/odoo#221844
Users composing messages in Discuss with an input method editor can now press Enter to choose suggested text without accidentally sending the message. This prevents incomplete or unintended messages from being posted, improving reliability for users typing in languages that rely on composition input.
Original PR description
Before this commit, pressing ENTER to pick a composition suggestion from IME in a discuss channel composer would send a message with the current content of composer. This is definitely not the intended behavior: it should change the composing text by the IME software but the send on ENTER press should not happen while the text is in composing. This commit fixes the issue by adding condition for composing text. Task-5043396 Forward-Port-Of: odoo/odoo#224390 Forward-Port-Of: odoo/odoo#224265
The Timesheet Leaderboard now opens correctly even when the current employee is excluded from the billing rate ranking due to a very low billing rate. This prevents an error screen and keeps managers and employees able to view leaderboard information reliably.
Original PR description
**Issue:** A traceback occurs when clicking the Timesheet Leaderboard widget. **Cause:** The template `timesheet_leaderboard_dialog.xml` assumes that `state.current_employee` is always defined. However, when the current user's employee has a billing rate ≤ 0.5%, they are filtered out from the leaderboard. As a result, `setCurrentEmployeeIndexFromLeaderboard` returns `undefined`, causing the widget to crash. https://github.com/odoo/enterprise/blob/70ed91ba1ebb94cb1919df49a4d95fad26935d03/sale_timesheet_enterprise/static/src/services/timesheet_leaderboard_service.js#L18-L31 **Steps to reproduce:** 1. Set up a company with 4+ employees having billing targets. 2. Ensure the current user's employee has a billing rate ≤ 0.5% (e.g., 0.3 hours logged / 100 hours target). 3. Switch the leaderboard to "Billing Rate" mode. 4. Click the Timesheet Leaderboard widget. opw-4875410
The Return for Exchange button now keeps the correct visibility rules in rental stock return flows. This prevents the button from appearing or disappearing incorrectly, reducing confusion for users handling exchanges.
Original PR description
Adapt the xpath to make sure the invisible condition on the 'Return for Exchange' button is not overriden. tasks 4748294 & 4778066 Forward-Port-Of: odoo/enterprise#89090
This fix prevents an error when a subscription sales order has no previous invoice date. The system now uses today's date as a fallback, helping stock movements linked to subscriptions continue without interruption.
Original PR description
The Issue: Prior to this commit, When the sale order last_invoice_date is False, a traceback is thrown The Fix: To resolve this, We get the last_invoice_date or todays date opw-4403557 Forward-Port-Of: odoo/enterprise#75717
Commission reports now use the right database access mode when preparing report data. This prevents warnings or errors when opening reports that rely on temporary data for faster calculations.
Original PR description
Since https://github.com/odoo/enterprise/pull/88646 a temporary table is created to speed up computation of commission report. As dislayng the report is creating and dropping the temporary table, it is not compatible anymore with a read only cursor. This commit ensure that a read write cursor is used to prevent warning and errors. task-4982555
Restoring an XLSX file with no folder now saves a clear default folder value instead of an undefined setting. This prevents the Documents search panel from ending up in an invalid state after files are restored from the trash.
Original PR description
Steps to reproduce: - Go to documents and upload an XLSX file - Move the XLSX file to the trash - Restore the XLSX file Current behavior before PR: - The key 'searchpanel_documents_document' was set to undefined, When the file had no folder Desired behavior after PR is merged: - Files without a folder now store 'false' as the default search panel folder_id Task: [5005319](https://www.odoo.com/odoo/2328/tasks/5005319) Forward-Port-Of: odoo/enterprise#92799
Duplicating a move related to a tax return no longer keeps the duplicate incorrectly attached to the original return. This prevents accidental links that could confuse return records and reporting.
Original PR description
Duplicating some return's move also kept the duplicate linked to the return. This is wrong. task-5046319
Fixed an issue in the OCR manual correction screen where deselecting highlighted boxes appeared to work but was not saved. Users will no longer see previously deselected boxes return as selected after refreshing the page.
Original PR description
During refactoring of the boxes interface of the OCR (see commit acfbaf3), this occurrence of `dataMoveId` wasn't replaced with `recordId`. It causes a small bug where the box unselection wouldn't work properly. Visually, it looked like it was working as the JS code handling the unselection of boxes worked fine, but the unselection wasn't saved to the database. Upon refresh, all the boxes that were selected at some point will still be displayed as "user selected" in the UI. task-none Forward-Port-Of: odoo/enterprise#92980