Saturday, April 25, 2026
14 changes · saas-19.2
Resolved issues and error corrections
This update fixes a missing field in the contact form for Czech companies (l10n_cz). The 'City' field was absent, which is a required data point for Czech tax reporting. This change ensures accurate data collection and compliance with local regulations.
Original PR description
Steps to reproduce: 1- Install Contacts and l10n_cz 2- Switch to CZ company 3- Open any contact Issue: `City` field is missing in address section Expected behavior: Should have the `City` field opw-6123084
This update ensures service order line display names accurately show the price unit when requested, regardless of context. Previously, the display name was incorrectly formatted, leading to inconsistent information. This fix corrects a bug related to how the price unit is displayed for service products.
Original PR description
Before this commit, when `formatted_display_name` is true in the context, the display name of `sale.order.line` records will always show the partner and the price unit if it contains a service product. The problem is `with_price_unit` is no longer checked in the context to really know if we want to display or not the price unit in the formatted display name. This commit checks `with_price_unit` in the context to display the price unit in the formatted display name if it is truly in the context. Forward-Port-Of: odoo/odoo#259080
This update fixes a test failure caused by a delay in processing the final click on a discard button during an Odoo tour. The fix ensures all tour popups are fully closed before the tour concludes, preventing data inconsistencies and improving test reliability. This resolves a potential issue that could impact the stability of the MRP Workorder module.
Original PR description
**Issue** Currently, there is an async issue with the test `test_shop_floor_disable_serial_create`that may fail with the following error: "Tour finished with a dirty form view being open. Dirty form views are automatically saved when the page is closed, which leads to stray network requests and inconsistencies." **Cause** Although the tour explicitly closes all popups, the last click on the discard button may not be processed before the tour ends: https://github.com/odoo/enterprise/blob/859e65e8c267701bb19dbff9d24a8c80774dbaa6/mrp_workorder/static/tests/tours/tour_shopfloor.js#L332-L333 runbot-242504 Forward-Port-Of: odoo/enterprise#114367
This update corrects a misleading issue in the Z report generated from date ranges. Previously, the report header incorrectly displayed information from a single session even when multiple sessions with completed orders were included. This change ensures the report header accurately reflects the sessions contributing to the report data, providing a more reliable view of sales performance.
Original PR description
Before this commit: - When generating a Z report via date range (config_ids, no session_ids), the header's session name was derived from the closed-session if there was exactly one, which excludes open sessions (stop_at IS NULL). - If an open session had completed orders (state='done') within the date range, those orders were included in the report body while the session itself was absent from the sessions list. - This caused the header to display the closed session's name and title the report as a single-session Z report, even though it contained data from multiple sessions. opw-6123054 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259900
This update fixes an issue where combo product pricing was incorrectly calculated when customers purchased more than one unit. The previous system misapplied discounts and prices, leading to inaccurate totals. This change ensures accurate pricing and calculations for combo products, regardless of quantity purchased.
Original PR description
When buying more than one unit of a combo product, the free-item quota (qty_free) was not scaled by the parent quantity, causing child lines with qty > 1 to be partially mis-classified as extra. This meant the same line was processed by both the free and extra loops, with the extra loop overwriting the correct price. Additionally, the proportional price_unit for free child lines used the unscaled original_total (which already includes the parent qty factor) against a per-unit parent_lst_price, resulting in a price that was too low by exactly the parent qty factor. opw-6045562 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261222 Forward-Port-Of: odoo/odoo#258753
This update fixes an issue where employees weren't automatically added to channels when their department was set to 'Administration'. Now, the system correctly subscribes users to the channel once the department update is saved, ensuring consistent channel membership based on employee roles.
Original PR description
**Steps to reproduce:** navigate to 'Discuss' > 'Channels' create a new channel and set 'Auto Subscribe Departments' to 'Administration' create a new user and a corresponding employee record go to 'Employees' > locate the employee set the employee's department to 'Administration' **Current behavior before PR:** The user is not automatically added to the channel. This occurs because the auto-subscription logic is triggered before the department change is committed to the database. **Desired behavior after PR is merged:** The user is correctly auto-subscribed to the channel once the department update is saved. task-5448649 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261268 Forward-Port-Of: odoo/odoo#241617
This update resolves an issue where product category images weren't showing on website B when configured with a different domain. The fix ensures category images use absolute URLs, bypassing domain-based access restrictions and ensuring consistent display across all websites.
Original PR description
Scenario: - set two website A and B with different domain - create an eCommerce category Y - create and publish a product with category Y, website B - drop category list widget in a page in website B - set in /odoo/system-parameters web.base.url to domain of website A - open the page in website B while being logged out of website A Result: the category Y image is dead. Cause: category images are using domain of "web.base.url", so if that corresponds to a website where the category is not shown (because of the access rule "Hide empty eCommerce categories to public/portal users") then the image will not be shown (unless we are a logged in internal user on the domain of "web.base.url"). Fix: use absolute URL without domain for category image, the same way it is done for other dynamic snippets (eg. Products). opw-6118004 Forward-Port-Of: odoo/odoo#260124
This update resolves a crash that occurred when assigning recruiters in the Odoo recruitment Kanban view. The issue stemmed from an unnecessary cache parameter in avatar image URLs, which caused errors due to missing data. Removing this parameter ensures the Kanban view functions correctly without crashes.
Original PR description
**Steps to Reproduce:** 1. Open Recruitments 2. Find a job position without a recruiter in the kanban view. 3. Clicking on the assign recruiter widget produces a traceback. **Bug Cause:** The…
**Steps to Reproduce:** 1. Open Recruitments 2. Find a job position without a recruiter in the kanban view. 3. Clicking on the assign recruiter widget produces a traceback. **Bug Cause:** The ?unique= cache related parameter was added to the avatar image URL in the autoCompleteItem slot of KanbanMany2OneAvatarEmployeeField. This parameter relies on write_date being available on the autocomplete suggestion record. However, web_name_search only returns id and display_name, so write_date is undefined on autocomplete suggestion records, causing a crash when accessing autoCompleteItemScope.record.data.write_date.ts. **Bug Solution:** Remove the ?unique= parameter from the avatar image URL in the autoCompleteItem slot, reverting it to its original form. Cache is unnecessary for autocomplete suggestion avatars as they are only visible for the duration of the dropdown interaction. **Task:** 6092768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261040
This update resolves an issue where creating a filter with invalid data in the system would cause a crash. Now, the system gracefully handles these errors, preventing the application from stopping. While the filter isn't active, the system no longer crashes, improving stability.
Original PR description
On some view, create and edit a filter, but put something unparseable by JS in the `context` field eg: `{123}`.
Go back to the view.
Before this commit there was a crash, because the python parser in JS crashed.
After this commit, there is no crash, the filter is visible but not activable.
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#260999
Forward-Port-Of: odoo/odoo#260612This update resolves an issue where the website's video placeholder would crash when a video URL wasn't provided. The code has been updated to gracefully handle missing URLs, preventing errors and ensuring video placeholders function correctly across all saved website pages. This improves the user experience and prevents website disruptions.
Original PR description
Commit[^1] reworked the `s_video` snippet placeholder into a plain SVG, dropping the inner `<iframe>` and the `data-oe-expression` attribute that carried the video URL. The `.media_iframe_video` class was kept, so the `MediaVideo` interaction still binds to the placeholder and calls `generateVideoIframe`, which then reads `dataset.oeExpression || dataset.src` (undefined) and crashes on `.match()`. The same crash hits the `DOMContentLoaded` fallback on the frontend for any saved page that ends up with a `src-less` placeholder. To prevent the issue, we exit the interaction early if no `src` is saved and leave the existing children in place. Nothing changes if the video has a valid URL already. [^1]: https://github.com/odoo/odoo/commit/db91ddd861b13694fe0e0b8d9cce23e02f487a6a task-6158263 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261184
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity calculations during internal transfer processes, preventing discrepancies in inventory reporting. This improves the reliability of stock management operations.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#114998
Forward-Port-Of: odoo/enterprise#110241This update resolves an issue where a duplicate close button was appearing in the Odoo Discussions interface. The fix restricts the button's visibility to the meeting view, ensuring a cleaner and more consistent user experience. This improves usability and prevents confusion for users.
Original PR description
ActionPanel components (e.g. invitation panel, delete thread dialog) displayed an extra close (X) button in Discuss. The close button was shown when not in a chat window, causing duplication with the existing close button. This commit restricts the button visibility to the meeting view only, preventing the extra close button. Task-[6054963](https://www.odoo.com/odoo/project/1519/tasks/6054963) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update streamlines the data sent to the self-order POS frontend by removing unnecessary fields. This optimization reduces data transfer, potentially improving performance and responsiveness for users. The change was a small fix to enhance the user experience.
Original PR description
Fix _generate_return_values to remove some fields that are not needed on the frontend Forward-Port-Of: odoo/odoo#260016 Forward-Port-Of: odoo/odoo#259915
This update fixes an issue where upgrade scripts within Odoo modules weren't properly organized, leading to potential logging and warning problems. Now, these scripts are correctly associated with the core upgrade package, ensuring better stability and error handling during updates. This improves the reliability of Odoo updates.
Original PR description
The resulting modules should be bound to the `odoo.upgrade` package. Side effects: - the loggers created inside the upgrade scripts are now in the `odoo.upgrade` namespace. - warnings raised by bad usages in upgrade scripts are now correctly filtered. Forward-Port-Of: odoo/odoo#261050 Forward-Port-Of: odoo/odoo#258025