Daily updates from Odoo
Thursday, April 23, 2026
23 changes · master
Security fixes and vulnerability patches
This update removes redundant sudo access within the AI module, addressing a potential security vulnerability. Previously, unnecessary sudo calls were present, which could have opened the system to unauthorized access. This change improves security and aligns with best practices.
Original PR description
In versions prior to saas-19.3, _get_available_models was called without sudo. Also sudo is used when needed inside the method. So calling the method with sudo isn't necessary and may cause security issues.
New functionality added to Odoo
This update adds tracking functionality to key fields within work entry types across multiple Odoo localization modules (l10n_au, l10n_be, etc.). This enhancement provides better visibility and control over work entry types, streamlining reporting and ensuring accurate payroll processing for various international business operations.
Original PR description
task-6123873
Enhancements to existing features
The Ecuador invoice report now places customer information in a separate table to avoid layout issues when there is more data to display. This makes the invoice easier to read and helps prevent overlapping or cramped information on printed reports.
Original PR description
EC invoice custom report had some visual issues due to the limited space where customer information is shown, which was more obvious once the customer information started to grow. To fix this, the customer info is moved to a new table. task-6093976
After databases are synchronized with Odoo.com, the system now tries to create a local API key for each database that does not already have one. This reduces reliance on the global key and can save time during database access, improving overall sync performance.
Original PR description
Before this commit, databases fetched from Odoo's SaaS were contacted using the global API key, which is more costly than using a key local to each database. Avoiding the call from the server to Odoo to check the foreign API key can spare about 500ms on each database where this key is not in the LRU. With this commit, after the synchronization with Odoo.com, we try to generate an API key on each database that doesn't have one yet. To do so, it relies on the API introduced by odoo/odoo#246118. Forward-Port-Of: odoo/enterprise#114406 Forward-Port-Of: odoo/enterprise#106372
Resolved issues and error corrections
This update corrects a typo and adjusts the visual styling in the VOIP dashboard. It improves readability and polish without changing how the dashboard works.
Original PR description
task-6132220 Forward-Port-Of: odoo/enterprise#114324
This update fixes problems that appeared after benefits were moved in the payroll and contract salary areas. It helps ensure employee salary and payroll information displays and behaves correctly after the change.
Original PR description
…fits Task: 6141770
This change fixes an unstable automated test in Belgian payroll by freezing the date used during the test. It prevents the test from randomly passing or failing as the calendar year changes, improving reliability of nightly builds.
Original PR description
The test was failing intermittently in nightly builds that run at a date in the next year (e.g.: 2027-04-20). The issue was that the student's age is calculated at runtime using : - When the student is age 19 (2026): min wage = 2057.87 < 2100 → PASS - When the student is age 20 (2027): min wage = 2136.84 > 2100 → FAIL task-6144986 Forward-Port-Of: odoo/enterprise#114594
This change prevents an error that could appear when creating or editing a salary adjustment if the start date is not yet set. As a result, payroll users can complete the adjustment flow without encountering an unexpected traceback.
Original PR description
This task guard against falsy date_start in _compute_estimated_end to avoid adding a relativedelta to False, fixing a traceback appearing during onchange. task-6139538 Forward-Port-Of: odoo/enterprise#114332
This change fixes an error that could appear when users click certain cells in the Trial Balance report, specifically for Undistributed Profits/Losses. It ensures the report opens correctly instead of failing with a missing data error, improving reliability when reviewing accounting balances.
Original PR description
This error occurs when clicking on any cell for `Undistributed Profits/Losses` in the `Trial Balance` report. Steps to reproduce: - Install `Accounting` module - Create `Journal Entry` with past-year…
This error occurs when clicking on any cell for `Undistributed Profits/Losses` in the `Trial Balance` report. Steps to reproduce: - Install `Accounting` module - Create `Journal Entry` with past-year `Accounting Date` (eg: 31-12-2025) and include one `Journal Items` for `Undistributed Profits/Losses` - Open `Trail Balance` report and click on any cell for `Undistributed Profits/Losses` Traceback: `KeyError: 'report_line_id'` Before this [commit], we were returning fields with `null/None` values. After the commit, fields containing `null/None` [value] are removed, and only fields with valid values are returned. As a result, when the `dispatch_report_action` function is called, the `report_line_id` is missing in `params`. [commit]: https://github.com/odoo/enterprise/pull/102808/changes/b92dc397bef029472a40223f51b611cdf5b631dc [value]: https://github.com/odoo/enterprise/blob/626b8157bcea2e3843cd9d5d0c0036e302b8e5ce/account_reports/utils/report_data_objects.py#L42-L43 sentry-7372351871 opw-6119913 Forward-Port-Of: odoo/enterprise#113421
This change prevents an error that could occur when opening or retrieving account report information. It updates the report code to use the correct method for the new data structure, so reports load normally again.
Original PR description
Currently, an error occurs when retrieving account report information. ``` File "/home/odoo/odoo18/enterprise/account_reports/models/account_report.py", line 1475, in _create_hierarchy…
Currently, an error occurs when retrieving account report information.
```
File "/home/odoo/odoo18/enterprise/account_reports/models/account_report.py", line 1475, in _create_hierarchy
render_lines(root_account_groups, current_level, root_line_id, skip_no_group=False)
File "/home/odoo/odoo18/enterprise/account_reports/models/account_report.py", line 1373, in render_lines
child_line.update
^^^^^^^^^^^^^^^^^
AttributeError: 'AccountReportLineData' object has no attribute 'update'
```
After the [recent commit], all lines, columns, format_params, and annotations are converted into custom objects (AccountReportLineData). However, the code still attempts to use the update() method on these objects, which raises an error [1] since AccountReportLineData does not have an update method.
This commit ensures that the update_value() method is used to update AccountReportLineData objects, as intended, like here [2].
[recent commit]: https://github.com/odoo/enterprise/commit/6608d5c21a7fb9d57786c2a7618b878e244bd420
[1]- https://github.com/odoo/enterprise/blob/cde4e05de82476655764f8c9fe8734416d4a35bf/account_reports/models/account_report.py#L1373-L1377
[2]- https://github.com/odoo/enterprise/blob/cde4e05de82476655764f8c9fe8734416d4a35bf/account_reports/models/account_report.py#L6565
sentry-7403925422
Forward-Port-Of: odoo/enterprise#113668This change ensures that when a salesperson manually closes a subscription, it stays closed even if a payment is later approved or an invoice is paid. This avoids accidentally reopening subscriptions that were intentionally ended, preventing confusion and billing issues.
Original PR description
Before this commit, when a subscription was closed manually by the salesperson, it could be reopened when a transaction was approved or an invoice paid. It could cause issue. In this case, we should not reopen automatically. task-5900481 Forward-Port-Of: odoo/enterprise#113026 Forward-Port-Of: odoo/enterprise#106487
This update ensures that changes to salary information within the salary configurator correctly update related calculations for mobility budgets. Previously, changes outside this specific context could cause inconsistencies. This change improves the accuracy of budget calculations and avoids unexpected behavior.
Original PR description
For consistency purposes, we only trigger the inverse on the mobility budget computation if we are in the context of the salary configurator. Changing the wage in the back end or changing the employer cost should only touch the wage and not other benefits Forward-Port-Of: odoo/enterprise#112510 Forward-Port-Of: odoo/enterprise#111828
This update resolves performance issues and crashes when generating the VAT Books Excel report for large invoices. By optimizing memory usage and query execution, the report now runs efficiently even with extensive data, significantly reducing server load and improving export times.
Original PR description
Related Ticket: https://www.odoo.com/odoo/project/49/tasks/6037414 ### Description of the issue/feature this PR addresses: Generating the "VAT Books" Excel report causes severe performance…
Related Ticket: https://www.odoo.com/odoo/project/49/tasks/6037414 ### Description of the issue/feature this PR addresses: Generating the "VAT Books" Excel report causes severe performance bottlenecks and MemoryError crashes on databases with a massive volume of invoice lines. This PR introduces strict memory management and query optimizations to prevent server crashes and drastically speed up the XLSX export process. ### Current behavior before PR: When exporting the VAT Books report for a large dataset, the system attempts to hold the entire workbook structure in RAM. Additionally, the ORM unnecessarily prefetches fields when iterating over the account.move.line recordset and performs excess sub-queries to look up move_type for journal entries. This combination results in massive memory consumption, slow load times, and eventual server crashes. ### Desired behavior after PR is merged: The VAT Books report generates successfully and efficiently, even on massive databases, with a significantly reduced memory footprint. Specifically: - The ORM bypasses cache bloat by disabling field prefetching (prefetch_fields=False) during the recordset iteration. - The query execution is optimized by changing the search domain from move_type to move_id.move_type, leveraging the existing join table rather than triggering expensive sub-queries. ### Benchmark: The model is iterating through ~1.1M journal items when generating the full report. For Memory: | # Input Data | Before PR | After PR| | -------- | -------- | -------- | | ~7,800 journal items | 1.4GB| 202 MB | | ~32,000 journal items | MemoryError | 278 MB | | ~141,500 journal items | MemoryError | 760 MB | | ~1.1M journal items | MemoryError | 1.4 GB | For Speed: | # Input Data | Before PR | After PR| | -------- | -------- | -------- | | ~7,800 journal items | 2 min | 1.5s | | ~32,000 journal items | MemoryError | 4s | | ~141,500 journal items | MemoryError | 12s | | ~1.1M journal items | MemoryError | 56s | ### Reference opw-6037414 ----------------------------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr) Forward-Port-Of: odoo/enterprise#112230
This update adds a test to ensure the asynchronous export of DAS2 reports functions correctly. This follows up on a previous fix (oondo/enterprise#114449) to improve the reliability of this important reporting feature. Adding this test provides additional assurance of the fix's stability.
Original PR description
Following odoo/enterprise#114449, we're safeguarding this fix by adding a test. No task ID
This update resolves inconsistencies in translations for the account asset and account reports modules, specifically for French (Belgium, Canada, and France) locales. The team removed outdated or incorrect translation overrides, ensuring users see accurate and consistent labels within the Odoo Enterprise application. This improves the overall user experience and data integrity.
Original PR description
There were some translation overrides for `fr_BE` and `fr_CA` that were incorrect or unnecessary. We are deleting these files so they use the correct translations in `fr` instead. In the `nl_BE` translation, we are fixing a menu item so it is shorter, but still correct. task-5921458 Forward-Port-Of: odoo/enterprise#114469 Forward-Port-Of: odoo/enterprise#106998
This update corrects a visual issue on the subscription portal where product lines weren't correctly aligned with tax calculations. The change ensures that only invoiceable product lines are displayed, resulting in accurate tax totals and a consistent view for customers. This improves the clarity and reliability of subscription information presented to users.
Original PR description
Previously, the portal view for subscriptions displayed all un-collapsed products from the sales order, ignoring whether they were actually invoiceable lines. This caused a visual mismatch where the displayed lines did not correspond to the calculated tax totals at the bottom of the view. This commit updates the visibility logic to ensure that product lines are only included if they are invoiceable. task-6128619 Forward-Port-Of: odoo/enterprise#114088
This update resolves an issue where missing tracking data from orders could cause shipping validation failures and incorrect tracking URLs. The fix handles cases where the 'tracker' object is null, preventing errors and ensuring accurate shipping confirmations. Easypost support suggested a delay between order creation and tracking retrieval as a potential workaround.
Original PR description
Problem: 'tracker' object in response from GET /orders/:id request can sometimes be null. This means that when the mail template 'mail_template_data_delivery_confirmation' is sent, a traceback occurs…
Problem: 'tracker' object in response from GET /orders/:id request can sometimes be null. This means that when the mail template 'mail_template_data_delivery_confirmation' is sent, a traceback occurs with error: TypeError: 'NoneType' object is not subscriptable. As a result the picking is not validated in odoo but a shipping has succesfully been created in the easypost backend. Solution: Prevent traceback form happening, picking gets correctly validated and carrier_tracking_url field is empty. Transcript from Easypost support: << I'm also seeing the tracker showing as null when reviewing the response. I'll go ahead and create a ticket for the engineering team to investigate. I can see that the tracking code is being returned in the request, but the full tracking object is not. Since this appears to be happening on a case-by-case basis, you may want to allow more time between the BUY and the GET requests, as I noticed they are being triggered very close together. I'm not certain if that's related, but it may be worth trying as a troubleshooting step while we have this under review. >> opw-5402415 Forward-Port-Of: odoo/enterprise#111833
This update resolves a crash related to AI chat processing and ensures the chat overlay correctly appears over the FileViewer. It also prevents AI actions from being attempted on video files, improving the user experience and stability of the AI features within the Enterprise module.
Original PR description
*={ai_documents}
- Fix crash caused by calling `.values()` on `_ai_read()` result (list),
now using it correctly.
- Correct context passed from FileViewer in ai_documents when
launching AI chat.
- Fix AI chat appearing behind FileViewer by updating outdated
CSS selector.
- Prevent AI actions on video files by showing a warning instead
of attempting unsupported processing.
task-5955968This update streamlines how payslips are generated within the Odoo Enterprise system. Previously, the salary configurator would inadvertently create and modify payslip lines. Now, a more efficient method, `_get_payslip_lines`, is used to retrieve necessary data, preventing unnecessary changes and improving system performance. This change ensures accurate and reliable payslip generation.
This update resolves an issue where opening salary adjustments on mobile devices caused a crash. The fix involved adding a basic kanban view and removing unnecessary overrides to ensure the functionality works correctly across all device types. This improves the user experience for mobile users managing employee salaries.
Original PR description
Steps to reproduce ================== - Install hr_payroll - Use a mobile viewport - Go to Employees - Open a record - Switch to the Salary Adjustments notebook tab => TypeError: undefined is not an…
Steps to reproduce ================== - Install hr_payroll - Use a mobile viewport - Go to Employees - Open a record - Switch to the Salary Adjustments notebook tab => TypeError: undefined is not an object (evaluating 'props.activeActions.onDelete=this.onDelete.bind(this)' Cause of the issue ================== The SalaryAttachment2ManyField widget overrides the rendererProps to handle the delete action, but this isn't defined on mobile (because a kanban view is used) See https://github.com/odoo/odoo/blob/9f93f22ed5f6d5dbbafeb0a8c6fababdc2a65d45/addons/web/static/src/views/fields/x2many/x2many_field.js#L196-L212 Solution ======== Since there is no delete action on the kanban view, there is no need for an override. While we are at it, there was no kanban view defined. Thus a default view was used https://github.com/odoo/odoo/blob/138fad6d54a0b59885b1e5c712beb8f581c9555c/odoo/addons/base/models/ir_ui_view.py#L2835-L2846 It only contained the field description. Since that one is optional, records without a description were almost invisible.. Thus we also add a basic kanban view opw-6047295 Forward-Port-Of: odoo/enterprise#113317
A recent update resolved a bug that caused the annual tax report to crash when comparing it to a previous period. This issue stemmed from the report occasionally containing string values, leading to incorrect conditional checks and a failed calculation. This fix ensures the report functions correctly under all comparison scenarios.
Original PR description
To reproduce: - Create a company in LU - Open the annual tax report for LU - Click on the comparison filter, compare with 1 period in the past ==> Traceback. This happens because that report contains a string value (an editable one, but it's not important here). Since there are only 2 comparison periods, we try creating the "%" column, comparing their amounts. The condition checking whether or not to display "N/A" was wrong, as it considered the values could only be int/float or None. Here, they are strings, so we don't enter that condition and crash when trying to evaluate float_is_zero on a string. Forward-Port-Of: odoo/enterprise#114296 Forward-Port-Of: odoo/enterprise#112619
Features or functions removed from Odoo
This update removes the outdated jQuery library from the HR Contract Salary module, addressing a technical dependency that was being phased out. This change improves the stability and maintainability of the module, ensuring it aligns with modern web development practices.
Original PR description
Community PR (odoo/odoo#257919) removes jQuery from `assets_frontend` as it's deprecated. This commit removes its use. task-5187485
Code cleanup and technical improvements
This change modernizes parts of the web editing experience by removing reliance on an older JavaScript library in most add-ons. It helps keep the codebase easier to maintain and better prepared for future updates, with no expected impact on everyday business use.