Thursday, February 19, 2026
46 changes · saas-19.1
Resolved issues and error corrections
This update optimizes the MPS report to handle large production schedules more efficiently. By reducing the amount of data fetched and minimizing unnecessary queries, the report now runs significantly faster and consumes less memory, preventing potential errors. This improves the overall responsiveness of the system for users generating these reports.
Original PR description
Problem: When running the MPS report on a large number of production schedules, if the associated number of stock moves is high, the _get_moves_and_date method can cause a memory error. Solution: We…
Problem:
When running the MPS report on a large number of production schedules, if the associated number of stock moves is high, the _get_moves_and_date method can cause a memory error.
Solution:
We will fetch only the necessary fields to reduce queries and memory usage and set prefetch_fields=False to further reduce memory usage.
Benchmarks:
Run locally on a dupe of customer's db.
Time/queries measured by requests to /get_mps_view_state Memory measured using memray on method get_production_schedule_view_state()
<table>
<tr>
<th rowspan="2"># of Production Schedules</th>
<th colspan="3">Before</th>
<th colspan="3">After</th>
</tr>
<tr>
<th>Time</th>
<th># of Queries</th>
<th>Memory usage</th>
<th>Time</th>
<th># of Queries</th>
<th>Memory usage</th>
</tr>
<tr>
<td>20</td>
<td>22.846s</td>
<td>1,379</td>
<td>882.0MB</td>
<td>8.046s</td>
<td>1,180</td>
<td>103.4MB</td>
</tr>
<tr>
<td>300</td>
<td>41.098s</td>
<td>6,297</td>
<td>1.0GB</td>
<td>43.694s</td>
<td>5,732</td>
<td>363.5MB</td>
</tr>
<tr>
<td>1000</td>
<td>N/A (MemoryError)</td>
<td>N/A (MemoryError)</td>
<td>>2GB</td>
<td>88.416s</td>
<td>22,629</td>
<td>1.1GB</td>
</tr>
</table>
Average memory usage reduction: 75%
opw-5225472
Forward-Port-Of: odoo/enterprise#106392This update resolves an issue where the version history comparison displayed incorrectly when using toggle blocks within Knowledge articles. The fix corrects a flaw in the HTML generation process, ensuring accurate comparisons are shown. This prevents potential confusion and ensures data integrity within the system.
Original PR description
There is an issue with the history dialog in very specific scenarios where a toggle (or any similar block) is involved, resulting in an incorrect "comparison" being displayed. How to reproduce: -…
There is an issue with the history dialog in very specific scenarios where a
toggle (or any similar block) is involved, resulting in an incorrect
"comparison" being displayed.
How to reproduce:
- create a new Knowledge article, and replace the title with a toggle block
- in the "content" section of the toggle, write a word, e.g. "word" in the
paragraph.
- exactly below the toggle block, write the exact same word ("word") in a
paragraph.
- save the article
- open the version history
- click on the oldest entry (there should be 2 of them), and click "view
comparison"
Issue:
- the paragraph below the toggle is not shown.
Technical explanation:
- There is an incomplete constraint in `generate_comparison`, which is related
to a trade-off (see `test_replace_nested_divs`), which was supposed to ignore
identical successive `opening` tags. However, it also ignores `closing` tags,
which it shouldn't do (it causes this issue).
- This issue produces invalid html which could also cause owl crashes (in
addition to the incorrect comparison), if embedded components were present in
the invalid html part.
task-5933410
Forward-Port-Of: odoo/odoo#249184This update resolves a minor issue where the website tour wasn't functioning correctly after the initial loading screen refreshed. By waiting for the loading screen to disappear before checking for the 'editor_enable' class, the tour now flows seamlessly for users. This ensures a smoother and more reliable experience.
Original PR description
When the iframe reloading starts, the builder can still have the class `editor_enable`, which breaks the flow of the tour, as the next step is waiting for that class, so we should wait for the loading screen to disappear first, and only then check for the `editor_enable` class. runbot-234504 Forward-Port-Of: odoo/odoo#245688
This update resolves an issue preventing some iPhone users (particularly the iPhone 13 Pro) from correctly focusing on barcodes when scanning. A temporary workaround – a zoom slider – has been implemented to address this limitation, ensuring consistent barcode scanning functionality across all mobile devices. This improves the mobile sales process by allowing users to reliably scan barcodes.
Original PR description
This commit resolves an issue where certain mobile devices with multiple lenses (notably iPhone 13 Pro) failed to focus on barcodes at close range. Since the Web API does not allow direct manual focus control in Safari iOS, a zoom slider has been added as a workaround to help the camera sharpen the image. Note: While Chrome on Android supports direct focus adjustment, this zoom-based solution provides a consistent fix for all mobile users. Steps to reproduce: * Open Odoo on Mobile * Go to Sale app * Create a new SO * Add a product * Select the barcode icon to open the modal * Try to scan a barcode (Object is near the phone) => Bug opw-5870885 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249292
This update resolves an issue preventing standard payroll users from accessing the 'One-time payments' feature within Swiss company contracts. The fix allows payroll officers and managers to open this functionality, ensuring they can correctly manage elm transmissions. This improves usability for payroll operations.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll…
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll Officer/Manager access. 4. Log in as that user, create a contract, and click on "One-time payments". Issue: --------- A Traceback with AccessError: ```You are not allowed to access 'Action Window' (ir.actions.act_window) records.``` Cause: ---------- https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/l10n_ch_hr_payroll_elm_transmission/models/hr_contract.py#L195 The code attempts to call `.read()` on an `ir.actions.act_window` record. Standard users typically do not have read access to window action records, resulting in an **AccessError** even if they have rights to the payroll data. Solution: ------------- Use [_for_xml_id](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L187) to return action content for the provided xml id in a safe way by doing [sudo](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L205) internally to bypass the access restriction. opw-5491467 Forward-Port-Of: odoo/enterprise#107628 Forward-Port-Of: odoo/enterprise#106598
This update resolves an issue where cron jobs would repeatedly fail after exceeding a timeout threshold. The fix ensures that the cron job counter is correctly reset after a timeout, preventing the job from getting stuck and failing indefinitely. This improves the stability and reliability of automated tasks within Odoo.
Original PR description
CronJobs timed_out_counter is not getting reset when reaching the CONSECUTIVE_TIMEOUT_FOR_FAILURE due to a transaction rollback. This commit introduces a fix to ensure only records with an actual…
CronJobs timed_out_counter is not getting reset when reaching the CONSECUTIVE_TIMEOUT_FOR_FAILURE due to a transaction rollback. This commit introduces a fix to ensure only records with an actual exception tuple pass through in method: 'method_direct_trigger'. Description of the issue/feature this PR addresses: When a cron job reaches the timeout threshold (timed_out_counter >= 3), method_direct_trigger crashes because the ListLogHandler filter matches log records that have exc_info = None. But the original filter only checked hasattr(lr, 'exc_info') which is true for all LogRecord objects. This caused a TypeError when attempting to unpack exc_info (None) on the next line, which rolled back the transaction and prevented timed_out_counter from being reset. Current behavior before PR: Clicking "Run Manually" on a timed-out cron (timed_out_counter >= 3) raises TypeError: cannot unpack non-iterable NoneType object, rolling back the transaction. The timed_out_counter is never reset, leaving the cron permanently stuck. Desired behavior after PR is merged: The filter correctly skips log records where exc_info is None (i.e., non-exception errors like timeouts). method_direct_trigger returns True, the transaction commits, and timed_out_counter is properly reset to 0. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248978
This update adjusts the size of the 'RedirectWarningDialog' in the Odoo web interface. Previously, the dialog was too large, consuming unnecessary screen space. This change ensures a cleaner and more user-friendly experience by aligning the dialog's size with established styling guidelines.
Original PR description
Currently `RedirectWarningDialog` are using `xl` size which is way too big for the content it displays. Dialog sizes were reviewed in commit[1], the RedirectWarning should follow the same styling. task-5477287 [1]: odoo/odoo@01741aa2619998078bd19aca848146ac75c027fc --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where clicking links to specific messages in chatter wouldn't highlight the message correctly. The fix removes a redundant check that was preventing the auto-highlight feature from working when the targeted message wasn't among the initial 30 loaded. This ensures message links function as expected.
Original PR description
PR #223362 removes the early return for checking the origin thread in `highlightMessage()` while PR #234659 adds it again through the FW ports of a fix intended for mailbox (which has not been needed from 19.0 onwards). Since the auto-highlight of message is triggered when the thread is 1st loaded, i.e. has loaded 30 most recent messages, if the targeted message to highlight is not in the loaded messages, then the `highlightMessage()` call would be mistakenly and silently ignored by this early return. This trigger of `highlightMessage()` is done only once, hence the failed attempt to highlight the message. This PR removes reliance on the origin thread. Steps to reproduce the bug: - Send more than 30 messages in a chatter. - Copy the first message link and paste it into the browser to go to the message as a highlighted one. - Thread doesn't jump to the targeted message. task-5929780 Forward-Port-Of: odoo/odoo#249062
This update adjusts the Swiss tax reports to accurately include account 2970, which represents the 'Annual profit or annual loss' account. The change ensures correct reporting for Swiss tax compliance. This fix resolves a discrepancy in the account selection process.
Original PR description
This recent commit: odoo/enterprise@d223f826eaafa3189846b555af16b240f91936ba changed the formula for `account_financial_report_line_ch_290_a_balance` from: ```py [('account_id.code', '>=', '290'),…
This recent commit:
odoo/enterprise@d223f826eaafa3189846b555af16b240f91936ba
changed the formula for `account_financial_report_line_ch_290_a_balance` from:
```py
[('account_id.code', '>=', '290'), ('account_id.code', '<', '2991'), ('account_id.account_type', '!=', 'equity_unaffected')]
```
to:
```py
[('account_id.code', '>=', '290'), ('account_id.code', '<', '2970')]
```
The main goal of the commit was to remove the unaffected earnings account from the CH reports. While doing so, the formula was also modified by replacing `account_id.code = 2991` with `account_id.code = 2970`.
However, since the condition uses the `<` operator, the account with `code = 2970` is not taken into account. Account `2970` is the last account that should be considered before `Annual profit or annual loss`. see:
https://github.com/odoo/odoo/blob/19.0/addons/l10n_ch/data/template/account.account-ch.csv#L106
Ticket [link](https://www.odoo.com/odoo/project.task/5387092)
opw-5387092
Forward-Port-Of: odoo/enterprise#102247This update fixes an issue where tables copied from the Knowledge editor were only partially copied, resulting in incomplete table structures when pasted elsewhere. The change ensures that tables are fully copied, regardless of whether the content is editable or locked, providing a consistent user experience. This improves the usability of the Knowledge feature for creating and sharing tables.
Original PR description
Problem: In Knowledge, when adding a clipboard block and inserting a table inside it, clicking on the copy button only copies the text inside the table instead of the full table structure. Cause: In `html_viewer`, the copy logic clones only the deepest selected node. In contrast, `html_editor` (via `clipboard_plugin`) copies the entire selection range. This difference causes inconsistent behavior between editable and locked content. Solution: Align the behavior by copying the full selection in `html_viewer`, ensuring tables and other complex structures are copied entirely and consistently. Steps to reproduce: - Open Knowledge. - Add a clipboard block. - Insert a table inside the block. - Lock the content. - Click the copy button. - Paste into any editable field. - Observe that only the text (not the table) is pasted. opw-5476320 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247930
This update resolves an issue where grouped tax reports were generating incorrect results when invoices included both positive and negative tax amounts. The fix ensures that all tax line amounts, including negative ones, are correctly considered during report generation, preventing errors and ensuring accurate tax reporting.
Original PR description
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous…
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous commit](https://github.com/odoo/odoo/commit/48d60151254045768d5aac1b29c5acf84b70cef2) modified the query responsible for the construction of the grouped reports. It only keeps the base lines of type entry which have a balance of the same sign as the tax line. Yet in our case, the CABA move is of type 'entry'. It has only one tax line with a positive amount because the taxes amounts on each line are added. But the balance of the negative line is negative. So the query will only consider the positive line hence the error. So now, the logic is only considering lines with the same sign to avoid entries where the invoice lines and the refund lines are both there. This is why it only checks for moves of type 'entry'. We also ignore the check for CABA moves, i.e. moves where `tax_cash_basis_origin_move_id` is defined. Steps to reproduce: - Activate Cash Basis in the Settings - Create a tax based on payment - Create an invoice with two lines: - One with a negative amount, an income account and the created tax - One with a positive amount big enough to compensate the previous line, a different income account and the same tax - Confirm - Click "Pay", validate the payment - In the Dashboard > Bank journal > Create a reconciliation of the amount of the invoice - Reconcile it with the invoice - Accounting > Reporting > Tax Return - Select "Group By: Account tax" Ticket [link](https://www.odoo.com/odoo/project.task/5089790) opw-5089790 Forward-Port-Of: odoo/odoo#249099 Forward-Port-Of: odoo/odoo#239081
This update resolves an issue where grouped tax reports were generating incorrect results when invoices included both positive and negative tax amounts. The fix ensures that all tax lines, including those with negative balances (CABA moves), are properly considered during report generation. This improves the accuracy of tax reporting.
Original PR description
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous…
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous commit](https://github.com/odoo/odoo/commit/48d60151254045768d5aac1b29c5acf84b70cef2) modified the query responsible for the construction of the grouped reports. It only keeps the baselines of type 'entry' which have a balance of the same sign as the tax line. But in our case, the CABA move is of type 'entry'. It has only one tax line with a positive amount because the taxes amounts on each line are added. But the balance of the negative line is negative. So the query will only consider the positive line hence the error. So now, the logic of the only considering lines with the same sign is to avoid entries where the invoice lines and the refund lines are both there. This is why it only checks for moves of type 'entry'. We also ignore the check for CABA moves, i.e. moves where `tax_cash_basis_origin_move_id` is defined. Steps to reproduce: - Activate Cash Basis in the Settings - Create a tax based on payment - Create an invoice with two lines: - One with a negative amount, an income account and the created tax - One with a positive amount big enough to compensate the previous line, a different income account and the same tax - Confirm - Click "Pay", validate the payment - In the Dashboard > Bank journal > Create a reconciliation of the amount of the invoice - Reconcile it with the invoice - Accounting > Reporting > Tax Return - Select "Group By: Account tax" Community PR: odoo/odoo#239081 Ticket [link](https://www.odoo.com/odoo/project.task/5089790) opw-5089790 Forward-Port-Of: odoo/enterprise#107707 Forward-Port-Of: odoo/enterprise#101601
This update corrects a visual inconsistency in Odoo's note-taking feature. Previously, checklists and bullet lists had different indentation levels, leading to a misaligned appearance. This change ensures all list types are consistently formatted for improved readability and a more polished user experience.
Original PR description
The checklist has different indents than bullet list and numbered list. It should not be the case. This commit removes the extra indent from checklist entries. Steps to reproduce: - Go to a "To do" note - Create a checklist with indented items - Create a bullet list with indented items => Both list were not aligned task-5916723 Forward-Port-Of: odoo/odoo#249149 Forward-Port-Of: odoo/odoo#247568
This update resolves an issue where tooltips would unexpectedly disappear when a user moved between a parent and child element within the Odoo interface. Previously, the tooltip would be terminated, now it persists as long as the user remains within the parent element's area. This ensures a smoother and more intuitive user experience.
Original PR description
Have a tooltip on a parent. Hover on a child of that parent. Now, leave the child but stay in parent. Before this commit, the tooltip would be killed and never respawn. After this commit, the tooltip is not even killed if we stayed within the parent's physical space. task-5346498 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#248857
A recent update to the appointment module caused installation issues due to a problem with how the system checks template data. This fix prevents errors during reinstallations by temporarily skipping the generation of invitation URLs, ensuring the module installs correctly. This resolves a previous installation failure.
Original PR description
Reinstalling the appointment module fails during mail template validation. ### Reproduction Steps 1. Install the `appointment_hr_recruitment` module. 2. Uninstall `appointment`. 3. Reinstall…
Reinstalling the appointment module fails during mail template validation. ### Reproduction Steps 1. Install the `appointment_hr_recruitment` module. 2. Uninstall `appointment`. 3. Reinstall `appointment`. → A template parsing error appears. ### Cause The global `request.env` is bound to the registry active at the start of the request. When reinstalling a module, this registry becomes stale and does not include the models being re-added. During installation, the `mail.template` model performs a test render to validate its XML data. One of the templates calls `_get_interview_invite_url`, which invokes a controller that looks up the `appointment.type` model using `request.env`. Because the registry is stale and does not contain this model, the lookup raises a KeyError and the installation fails. ### Fix Rationale Skip invite URL generation when `install_mode` is set to avoid using the stale `request.env`. opw-5898780 Forward-Port-Of: odoo/enterprise#107650
This update resolves an issue where DHL shipping rate calculations failed when requested for dates outside of DHL's business hours. Adding a 'next business day' flag ensures rates are accurately calculated, preventing errors and ensuring reliable shipping options for our customers. This addresses a previous error causing 'Product not found' issues.
Original PR description
Before this commit, there was an issue when trying to get the rates for DHL shipping late in the day. The issue happened because `plannedShippingDate` fell outside of the working hours. This commit adds the nextBusinessDay flag for the rating request to avoid the error. Error: ``` Product not found 996: The requested product(s) not available for the requested pickup date. Process ID associated for this transaction') ``` opw-5393684 Forward-Port-Of: odoo/enterprise#107153
This update clarifies the visibility of specific fields within the Belgian payroll and fleet modules. Previously, generic fields were consolidated across all countries, but this change restores the original design, keeping BE-specific fiscal logic contained within the Belgian module. This ensures accurate reporting and compliance for Belgian businesses.
Original PR description
This branch only hides BE-specific fields in l10n_be_hr_payroll_fleet (they remain defined/used there and are invisible for non‑BE companies). On master (19.3) those generic fields (can_be_requested, default_car_value) were refactored into hr_payroll_fleet so payroll+fleet consumers across all countries can use them; BE fiscal logic stays in l10n_be_hr_payroll_fleet task-5906656 Forward-Port-Of: odoo/enterprise#106456
This update resolves an issue where the onboarding tour incorrectly targeted disabled calendar slots in the yearly holiday calendar. The fix excludes 'disabled' calendar cells, ensuring the tour reliably selects the first available Thursday, regardless of the server date (specifically impacting years 2027/2028).
Original PR description
Before, the tour attempted to click the “first Thursday” by selecting the first .fc-day-thu element in the DOM. The yearly calendar sometimes renders an initial “empty”/disabled weekday cell (when Jan 1 is Fri/Sat/Sun), so the first .fc-day-thu can be a disabled slot with no actionable element. That makes firstChild de-facto empty and the tour fails (seen reproducibly when the server date is set to years like 2027/2028, for example). Excluding .fc-day-disabled makes the selector target the first real Thursday cell task-5930501 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248275
This pull request reverts a previous change related to how contract templates were being generated. The issue stemmed from a problem with triggering compute fields, which wasn't a critical bug. This change ensures the contract template functionality is working correctly and will be addressed fully in the main version.
Original PR description
This reverts commit 1d5e75900c0326f7b5293ad4cdafcc32d0f662fc. The problem was due to compute fields not triggered. It'll be fixed in master as this is not really a bug. task-5948571 Forward-Port-Of: odoo/enterprise#107791
This update resolves an issue where payroll warnings weren't being properly reflected or updated within the Odoo system. The fix ensures that warning messages are now reliably displayed and can be updated, leading to more accurate and timely payroll reporting. This improves the reliability of financial data.
Original PR description
Forward-Port-Of: odoo/enterprise#107792
This update resolves a technical issue preventing notifications from the signature field. The notification service was missing a necessary declaration, causing an error. This fix ensures that signature field notifications are now correctly processed, improving the user experience.
Original PR description
The notification service is later used in this [method](https://github.com/odoo/odoo/blob/04f3473da52ec74f3955cadd58eb016537497d44/addons/web/static/src/views/fields/signature/signature_field.js#L120), but it was never declared so it was causing 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#248602
This update fixes a potential issue where global invoices sent from the POS in Mexico could fail due to timeouts when interacting with the SAT portal. Increasing the read timeout for these requests helps prevent duplicate invoice submissions and ensures accurate data transmission, improving the reliability of tax filing.
Original PR description
**Fix:** Increase the read timeout for POST requests to SW sapien PAC. It may prevent timeout issue when sending a global invoice from the POS with a lot of POS orders that could lead to duplicated documents on the SAT portal when retrying to send the global invoice again. opw-5347962 Forward-Port-Of: odoo/enterprise#107735
This update simplifies the accounting setup for Spanish businesses within Odoo. Previously, there were separate account configurations for sales within Spain, intra-community transactions, and exports. This change removes this unnecessary complexity, aligning with Spanish tax regulations and streamlining the accounting process. It ensures a more straightforward and accurate representation of financial data.
Original PR description
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#247543
This update resolves an issue where test runs were repeatedly generating unnecessary assets, slowing down the testing process. By adding a specific asset bundle to the pregeneration list, we've streamlined test execution and improved overall efficiency. This change ensures tests run faster and more reliably.
Original PR description
During tests runs, lazy loaded assets are generated on the fly, and eventually multiple hundred of times (i.e. +/- 150 times on runbot). This commit adds the `web_studio.studio_assets` bundle to the pregeneration list to avoid regenerating during tests runs. Forward-Port-Of: odoo/enterprise#107147
This update optimizes how Odoo retrieves related data, preventing performance slowdowns that can occur when fetching large amounts of information. By deduplicating data during the fetching process, the system now responds more quickly, especially when accessing multiple related records. This results in a smoother and faster user experience.
Original PR description
Various improvements to avoid non-linear growth of returned values when iterating over prefetches. Traversing a relational field introduces a duplication factor in the returned values. `records |=…
Various improvements to avoid non-linear growth of returned values when iterating over prefetches. Traversing a relational field introduces a duplication factor in the returned values. `records |= more` is syntactic sugar for `records = records | more`, which does not modify the recordset in place but makes one from scratch. Therefore the time complexity is not `O(len(more))` but `O(len(records) + len(more))`, which is what makes it quadratic when used in a loop. Since refactor in https://github.com/odoo/odoo/pull/229057, this quadratic complexity is introduced in the prefetching, too. Changes: - Keep same prefetch when accessing a single key as when iterating over a recordset. Small gain and more consistent results. - When iterating over prefetches, deduplicate at source. Without this, the overhead of the generator can be huge for each returned value, since the same value might be returned many times. In less trivial cases (like traversing two relational fields and making unions with it), the time speedup is several orders of magnitude.