Monday, January 12, 2026
23 changes · 19.0
Resolved issues and error corrections
The Manufacturing Orders list filter for delayed productions has been corrected so users can search delayed work orders without warnings or crashes. This keeps production planning views reliable after recent platform changes.
Original PR description
Issue before this commit: ========================= Searching for Delayed Productions in the MRP list view triggered: - A deprecation warning in saas-18.4 → 19.0: `warnings.warn("Since 19.0, use…
Issue before this commit:
=========================
Searching for Delayed Productions in the MRP list view triggered:
- A deprecation warning in saas-18.4 → 19.0:
`warnings.warn("Since 19.0, use Domain.custom(to_sql=lambda model, alias, query: SQL(...))", DeprecationWarning)`
- A traceback in master:
`Failed to cast TableSQL('mrp_production', -, None).date_finished into a datetime`
Steps to Reproduce:
=========================
- Install mrp module.
- Open the Manufacturing Orders list view.
- Filter by Delayed Productions.
- Observe the warning (saas-18.4 → 19.0) or traceback (master).
Cause of the issue:
=========================
Recent ORM changes in [PR](https://github.com/odoo/odoo/commit/f811af2c52df798b6ba0fc18e3f45944abdb7a12) disallow using raw SQL expressions as values inside normal domains.
Only Domain.custom() is permitted for injecting custom SQL.
The previous _search_is_delayed implementation used a deprecated pattern,
which caused the warning in current versions and a crash in the master version.
With This Commit:
=========================
- Rewrite the delayed production filter using Domain.custom() to safely generate the SQL.
- Preserve functional behaviour: the filter still returns delayed productions correctly.
- Avoid deprecation warnings and prevent traceback.
TaskID:- 5404547
Forward-Port-Of: odoo/odoo#239574The attendance app now reuses an existing location helper that can rely on GeoIP data when available. This reduces unnecessary map service requests, improving efficiency and helping avoid avoidable external calls.
Original PR description
Backport of #243117 Forward-Port-Of: odoo/odoo#243129
Calendar filters that include archived linked records now load correctly instead of causing an error. This improves reliability for users working with historical or inactive records in calendar views.
Original PR description
Description of the issue/feature this PR addresses: In fa56409da23727c62c3de128a180d25e72b481d2 support was added for many2many filters in the calendar arch. Since X2many fields use the many2one…
Description of the issue/feature this PR addresses: In fa56409da23727c62c3de128a180d25e72b481d2 support was added for many2many filters in the calendar arch. Since X2many fields use the many2one formatter (see makeFilterDynamic) filters need to be passed in the following format [id, display_name]. Since x2many records are not automatically fetched in this format fa56409da23727c62c3de128a180d25e72b481d2 added an additional step wherein colors and display names are fetched (by calling searchRead) and filters are properly formatted. An issue arises though if a record is archived and therefore not found by searchRead. In this case the filter will not be properly formatted and formatMany2one will raise an exception. Current behavior before PR: Using a x2many filter with an archived record raises an exception. Desired behavior after PR is merged: Using a x2many filter with an archived record will not raise an exception. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents the HTML editor from showing error popups in rare paste and selection cases. Users should experience more reliable editing when pasted content is cleaned up or when the editor encounters invalid selection data.
Original PR description
During an `DomPlugin.insert`, the inserted content is added. Then some transformations are applied to clean up, including the removal of some nodes which are inventoried into `candidatesForRemoval`,…
During an `DomPlugin.insert`, the inserted content is added. Then some transformations are applied to clean up, including the removal of some nodes which are inventoried into `candidatesForRemoval`, and some specific `<br>` nodes. Ultimately, the selection is set after the last inserted node. In some cases, none of the inserted content remains after the clean up. When this happens, the selection is being set after the last inserted node, which is not part of the DOM anymore, and therefore leads to an error. This commit prevents this from happening by detecting when all inserted content was actually already removed. Steps to reproduce: - In a plain web page, copy a <br> into the clipboard - In an editor, put a character on a line - Paste => An error popup was displayed task-5429909 [FIX] html_editor: avoid failing when selection nodes are disconnected This commit addresses a traceback that was spotted but for which the actual scenario remains undetermined. The only possible way this traceback may occur is if nodes inside a selection are disconnected. The test added by this commit produces the same traceback as the observed one. task-5429909 Forward-Port-Of: odoo/odoo#242941 Forward-Port-Of: odoo/odoo#242488
This fixes an automated website editor test that could fail unpredictably when popup snippets were involved. The change makes the test remove popup snippets after use, reducing false failures and improving confidence in release validation.
Original PR description
**Problem** Before this commit, the tour `test_03_snippets_all_drag_and_drop` could fail with the error `Element (:iframe .o_snippet_preview_wrap[data-snippet-id="s_popup"]) has not been found`. The failure was reproducible locally and appeared non-deterministically on runbot. **Cause** The tour steps could occasionally execute too quickly, leading to non-determinist behavior where snippets were dropped inside a popup that had been inserted but not yet closed. When the dropzone is inside an open popup, some snippets (e.g. `s_popup`) are excluded from the Snippet Viewer, resulting in the error reported above. **Solution** The tour flow is modified such that popup snippets are removed after being dropped, as already happens for every other snippet category. This completely removes the risk that new snippets are dropped into a popup. runbot-233328
When users replace a styled image with another media type, image-specific formatting such as size or rotation is now cleared. This prevents icons, documents, or other inserted media from appearing incorrectly because of leftover image settings.
Original PR description
**Current behavior before PR:** - When an image had styles applied to it (such as transform or width) and was replaced with another media type like an icon or document, those styles were incorrectly carried over to the replaced media. **Desired behavior after PR is merged:** - Since transform and width styles are meant to apply only to images, they are now removed when an image is replaced with other media types. task-5373362 Forward-Port-Of: odoo/odoo#240284 Forward-Port-Of: odoo/odoo#238319
This fix prevents calendar views from crashing when a filter includes an archived related record. Users can continue using many-to-many calendar filters reliably, even when some linked records are inactive.
Original PR description
Description of the issue/feature this PR addresses: In fa56409 support was added for many2many filters in the calendar arch. Since X2many fields use the many2one formatter (see makeFilterDynamic) filters need to be passed in the following format [id, display_name]. Since x2many records are not automatically fetched in this format fa56409 added an additional step wherein colors and display names are fetched (by calling searchRead) and filters are properly formatted. An issue arises though if a record is archived and therefore not found by searchRead. In this case the filter will not be properly formatted and formatMany2one will raise an exception. Current behavior before PR: Using a x2many filter with an archived record raises an exception. Desired behavior after PR is merged: Using a x2many filter with an archived record will not raise an exception. (ref: #241522)
Product cards in the Point of Sale combo configurator now stay evenly aligned even when product names are long. This makes the popup look more consistent and easier for cashiers to scan during order entry.
Original PR description
Before this commit: ================= Product cards with long names caused a slight vertical misalignment in the combo configurator popup, resulting in inconsistent card sizes within the grid. After this commit: ================== Ensure all product cards remain uniformly aligned and maintain consistent dimensions in the combo configurator popup, even when product names are long. Task:5447320 Forward-Port-Of: odoo/odoo#243089 Forward-Port-Of: odoo/odoo#241720
This fix makes automated tests for the website and HTML editor behave more consistently when simulating keyboard navigation. It reduces false failures caused by test helpers moving the cursor twice, helping teams validate editor changes with greater confidence.
Original PR description
The `simulateArrowKeyPress` method used in hoot tests performs both an actual `press` and modifies the selection. However, in some cases, the `press` already updates the selection because of our own listeners, which leads to a selection similar to performing the action twice. This commit avoids this by making sure the default `press` did not get prevented by our own custom listeners before modifying the selection. task-5438683 Forward-Port-Of: odoo/odoo#241604
The HR demo job used by sample payroll data is no longer tied to only the main company. This prevents access errors when users in multi-company demo setups load a default contract template, making demo payroll flows work more reliably.
Original PR description
## Steps to reproduce: - install l10n_in_hr_payroll with demo data - go to employee - open payroll tab - select default contract template from Load a Template - click on load button ## Issue: - General demo job position used in many places in demo data has company_id set to main company by default. It creates access error of multi company issue. ## Fix: - The standard job in demos should not be linked to the main company by default. It should be visible and accessible for all companies. backport of https://github.com/odoo/odoo/pull/234477 Task-5440650
The self-ordering eating location page now centers the available option when only one choice can be shown. This makes the screen look cleaner and avoids leaving the lone option awkwardly aligned to the left.
Original PR description
On the eating location page, when there is only one preset, we would like to center it. Before, when there is only one preset available, it was aligned on the left. This occurs when there is two presets for a pos config and the default one is not available in self o task:5478651 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes cases where users could not easily remove inline code formatting, especially in list items. Empty inline code markers are now cleaned up and adjacent code sections merge correctly, making text editing behave more predictably.
Original PR description
Text formatted as inline `<code>` (between backticks) is very difficult to remove in some situations, typically at the beginning of a list entry. This commit solves this by removing the code style when its last character is removed. Steps to reproduce: - Create a list - Type some inline code - Put the cursor in the middle - Press Enter - Type some text after the inline code on the second line - Try to remove the inline code from the second line using backspace => The line is removed before the code style disappears task-5375140 Forward-Port-Of: odoo/odoo#238552
This update makes automated tests for website image editing wait until the editing sidebar is ready before checking it. This reduces intermittent test failures and helps keep website builder changes moving through validation more reliably.
Original PR description
Image edit tests using the builder sidebar were failing intermittently because image elements rely on async actions with non-deterministic timing, causing the sidebar options to be unavailable sometimes. Use `waitSidebarUpdated` to ensure the sidebar is fully updated before asserting on its content. Here is an example of an error: error-234951 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#243008
This fixes a crash that could happen when users edited a logged note and selected the option to open the full composer. The unavailable action is now hidden while editing, so users can save message edits without interruption.
Original PR description
Steps to reproduce: =================== 1- Go to a project task & log any note. 2- Edit & Click the additional "+" and click "Open Full Composer" 3- Click on Save. -> traceback. Cause: ====== When entering edit mode, the composer was created without a thread reference, causing "Cannot read properties of undefined (`this.props.composer.thread is undefined`)" errors in `onClickFullComposer`. Solution: ========= We shouldn't have "open-full-composer" action in editing messages opw-5443985
This fixes an incorrect calculation in a French tax report box. It helps ensure reported tax totals are aggregated accurately for French accounting compliance.
Original PR description
During this commit: https://github.com/odoo/odoo/commit/869f80b466ec2246f27e11fa823eb32ac664fb01 we made a mistake in the box 15_1. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243099 Forward-Port-Of: odoo/odoo#243013
This update fixes an issue where the timesheet timer wasn't correctly associated with the task being worked on. The fix ensures the timer uses the correct task or project from the list view, providing a more accurate and user-friendly timesheet experience. This improves the reliability of time tracking.
Original PR description
### Issue: When looking at the list of timesheet for a task, we can start the time but the timer have default values that don't correspond to the task. ### Cause: `startTimer` in the `timesheetTimerService` is called from the timesheet timer hook without vals. It then makes an orm call to `action_start_new_timesheet_timer` to retrieve the fields (project or task) but as nothing is given in the vals, the selected project is the one returned by `_get_favorite_project_id()`. ### Solution: Get the context of the list view to retrieve the task or the project and input it in `vals`. opw-5342525
This update resolves a minor typo within the Odoo Enterprise system. The change ensures the naming of attachment files accurately reflects their associated external IDs and intended functionality. This improves data consistency and reduces potential confusion.
Original PR description
Fix typo – Correct the ir_attachment file name to match the external ID and its functionality. OPW-5428700
This update corrects a technical issue where the test button on the IoT device interface incorrectly reported successful status even when errors were occurring. The fix standardizes the data format used for IoT device communication, ensuring accurate status reporting and improved reliability of the device testing process. This prevents misleading feedback for users.
Original PR description
This commit fixes several situations where a positive status would be given by the test button despite the presence of an error: - If the websocket connection was used but there was a timeout - If the websocket connection was used but there was any other error - If any 6-digit error code was returned when using the stable IoT box To fix these issues, we stop using the `data['message']` field, since it gets ignored by the websocket confirmation controller. We now use the same result format as the other requests (and the stable IoT box). We also add a check for the `"timeout"` that we receive when a websocket request times out. Forward-Port-Of: odoo/enterprise#103817
This update ensures the employment bonus calculations in the l10n_be_hr_payroll module accurately reflect bonus amounts up to March 2026. This fix addresses a recent adjustment to Belgian tax regulations regarding employment bonuses, maintaining compliance and accurate payroll reporting.
Original PR description
Forward-Port-Of: odoo/enterprise#103820
This update fixes a minor issue in the SendCloud integration where the product ID was incorrectly accessed. The change ensures the system reliably retrieves product information using the correct 'id' key, preventing potential data retrieval errors. This improves the accuracy of SendCloud order processing.
Original PR description
Same fix as d4fae97, the id was retrieved by doing `[0]` but the proxy object has changed so we need to use the `id` key to get the value instead. ----- Ticket: opw-5433254
This update corrects a calculation error in the Belgian payroll module (l10n_be_hr_payroll) related to the 3000 deduction. The change ensures the deduction accurately reflects tax regulations up to the year 2026, improving payroll accuracy for Belgian businesses. This fix addresses a previously identified discrepancy.
Original PR description
Forward-Port-Of: odoo/enterprise#103824
This update clarifies the terminology used in the Odoo Enterprise payroll module. The 'Other Input Types' and 'Payslip Other Input Types' menu items have been renamed to 'Salary Input Types' to improve user understanding and ease of navigation. This change enhances the overall user experience within the payroll system.
Original PR description
Updated the Input type for better clarity and easier understanding for users: - '**Other Input Types**' : 'Salary Input Types' - '**Payslip Other Input Types**' : 'Salary Input Types' **task-5474028**
This update resolves a bug where the 'copy link' button in the salary calculator generated a 404 error. The fix ensures the offer is saved before generating the link, preventing errors related to missing offer IDs. This improves the usability of the salary calculator for generating offer links.
Original PR description
Steps to reproduce: 1- Open salary calculator 2- Do not edit any fields 3- Click on copy link button 4- Open the link Issue: When you open the link you'll see a 404 page. Cause: The salary calculator essentially creates an offer. When no fields are modified in the form, the offer isn't created yet. When a link is created for that offer, the offer id part of the link is NewId_xxx. Fix: Modify the widget that copies the link to clipboard to first save the offer before generating the link. Task-5441297