Friday, April 10, 2026
24 changes · saas-19.1
Enhancements to existing features
This update optimizes how Odoo searches for calendar resources, specifically when filtering by user. By adding an index, the system now responds more quickly to these searches, leading to a smoother user experience. This change focuses on internal performance improvements.
Original PR description
This commit adds an index on `planning.calendar.resource.user_id`, as it's the only criteria used in `get_calendar_filters` for the `search_count` and the `search_read` done after. Forward-Port-Of: odoo/enterprise#113304
Resolved issues and error corrections
This update resolves a test failure within the Odoo Enterprise accounting module. The issue stemmed from incorrect data values during testing, specifically related to payment processing and multi-bill statements. This ensures the accounting tests run reliably and accurately.
Original PR description
Fixup for test test_early_payment_discount_multi_bill_statement that will fail when accountant is not installed due to mismatched amls values opw-5881976 Forward-Port-Of: odoo/enterprise#113425
Code cleanup and technical improvements
This update allows us to accurately track an employee's hourly cost over time by moving this data from the main employee record to a versioned record. Previously, changes to hourly cost would overwrite historical data, making it impossible to see how costs evolved. This change provides a more complete and reliable record of employee expenses.
Original PR description
This commit will migrate the hourly_cost field from the base employee model to the versioned record model. **Why:** Previously, the hourly_cost field was defined directly on the hr.employee model. Because this model represents the "main" record, any changes to the hourly cost would overwrite the value across all historical versions of that employee. This made it impossible to track how an employee's cost to the company evolved over time. By moving this field to the versioning model each historical snapshot of the employee can now maintain its own specific hourly cost. **What:** - Added the `hourly_cost` field to the employee versioning model. - Updated `hourly_cost` of an employee to use the version related field task-6098429
This update fixes a reporting issue where the employee sick leave warning incorrectly flagged employees with long absences before 31 days. The change now accurately identifies employees who have been on sick leave for at least the past 31 days, ensuring more accurate reporting for payroll and HR compliance.
Original PR description
-**Issue**: The warning shows employees who had a long sick leaves before 31 days, which is incorrect. -**Fix**: Adjust the logic to include employees who have been on a sick leave for the past 31 days (at least). Forward-Port-Of: odoo/enterprise#113249 Forward-Port-Of: odoo/enterprise#112985
This update resolves a technical glitch that was occasionally preventing the automated 'random tour' feature within the industry_fsm reports from running correctly. The fix, identified by a runbot issue, ensures that users can consistently access and utilize this helpful guide for navigating the FSM reports. This improves the user experience and efficiency.
Original PR description
runbot issue-242264 Forward-Port-Of: odoo/enterprise#113272
This update resolves an issue where material resources with assigned roles were incorrectly displayed when filtering by employees in the Planning app. The fix improves the filter domain to accurately exclude these resources, ensuring that only employee-type resources are shown when using the employee filter.
Original PR description
Steps to Reproduce: 1. Open the Planning app. 2. Go to Configuration -> Materials. 3. Set a role on either the demo material resource laptop or toolkit. 4. Go back to the Planning view. 5. Apply the view filter employee (filter by Employees). Issue: The material resource with a role should not be visible, but it is still present. Current behaviour: When filtering the Planning view by Employees, material resources with an assigned role remain visible. Expected behaviour: Material resources with an assigned role should be excluded from the Planning view when filtered by Employees — only employee-type resources and resources on which role is not set should appear. Fix: Improved the filter domain so unnecessary data are excluded. Task-4526989 Forward-Port-Of: odoo/enterprise#92816
This update resolves a problem where EPD bill payments weren't correctly updating their status in the system. The fix ensures payments are accurately marked as 'paid' after reconciliation, improving the reliability of financial reporting. This was triggered by a specific test scenario involving early payment terms and EPD bills.
Original PR description
Steps to reproduce: - Create an early payment term. - Create a Vendor Bill with EPD and post it. - Register a payment for this bill (no outstanding account set on journal => no move created). - Create a bank transaction fully paying the bill. - Reconcile the transaction with the bill. Issue: Access the payment of the bill. The payment state remains 'in_process' instead of 'paid'. Fix in community: https://github.com/odoo/odoo/pull/256486 opw-5881976 Forward-Port-Of: odoo/enterprise#112398
This update corrects a technical issue where payroll data was being incorrectly transmitted in non-production (test) environments. This change ensures that test data remains isolated and prevents potential disruptions or inaccuracies during development and quality assurance. The fix improves the stability and reliability of our test environments.
Original PR description
Forward-Port-Of: odoo/enterprise#113504
This update resolves an issue where FSM users couldn't access the Bill of Materials (BOM) when working with sales orders containing both service and goods products. The fix grants FSM users the necessary BOM access, allowing them to correctly view and manage stock moves within their tasks.
Original PR description
**Steps to reproduce:**
- Install mrp, industry_fsm_repair, and industry_fsm_sale
- Create a user with only fsm access rights
- Create a sale order with both service and goods products using the above user
- Confirm the sale
- Log in as the fsm user
- Go to fsm app > open task > open pickup > open stock move
**Issue:**
fsm users with no BOM access encounter errors when opening stock moves from fsm tasks.
**Cause:**
lack of bom access for fsm-only user.
**Fix:**
This commit grants bom and bom line access to the project user.
task-5077522
Forward-Port-Of: odoo/odoo#229522This update fixes an issue where the payment term list would sometimes shrink or flicker after a language change. The fix adds extra space to the list using a wider column format, ensuring consistent and clear display of payment terms for users. This improves the overall user experience.
Original PR description
Previously, after a language switch, text gets longer inside cell. On clicking/focusing `o_cell_custom` the widths were recomputed and the list shrinks/flickers. In this commit `colspan='2'` is set on `line_ids` to give the x2many list more horizontal space. This avoids column shrinking/flickering. Task-5189713 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257570
This update resolves a technical issue where a malformed XML tag was causing problems with the marketing card functionality. Previously, the system automatically corrected these errors, but with the latest software version, this fix is necessary to ensure proper operation of the marketing card feature.
Original PR description
This commit fixes a malformed HTML/XML tag in CardCampaign. Note: before libxml2 v2.14.0, this issue was automagically cleaned up, but not anymore. Forward-Port-Of: odoo/odoo#258388
This update resolves a bug that prevented users from replacing images with illustrations in the mass mailing editor. The fix ensures compatibility by correctly handling image attachments with optional parameters like 'charset=utf-8' and converting illustrations to PNG for better email client support.
Original PR description
Currently, in the mass mailing editor, an error occurs when a user replaces an image with an illustration. Steps to reproduce: 1. Open the mass mailing editor 3. Drag and drop a snippet containing an…
Currently, in the mass mailing editor, an error occurs when a user replaces an image with an illustration. Steps to reproduce: 1. Open the mass mailing editor 3. Drag and drop a snippet containing an image 4. Double-click on the image 5. In the image search bar, type "test" and press `Enter` 6. Select an illustration => A traceback is raised. When an illustration is selected, it is automatically stored as an attachment with the mimetype `image/svg+xml; charset=utf-8`. The editor then loads the image using the attachment URL (e.g. `/html_editor/shape/illustration/usability-testingsvg-258?...`). When the media dialog is closed (via `on_media_dialog_saved_handlers`), the editor attempts to process the image and calls the `/html_editor/get_image_info` route to retrieve the image info. This route retrieves the corresponding attachment from the database using the attachment url, but filters results based on a predefined set of allowed mimetypes. The issue arises because this set does not account for valid mimetypes that include optional parameters such as `charset=utf-8`. As a result, the attachment is not found, preventing the image from being processed and ultimately causing the crash. To fix the issue, we will update the domain used to retrieve image attachments so that it accepts valid mimetypes with optional parameters (e.g. `image/svg+xml; charset=utf-8`). During image processing, the transformed image is temporarily encoded in base64 and stored in the src attribute. When the record is saved, this base64 image is converted into a new attachment via the `/html_editor/modify_image/<id>` route. **This conversion step is necessary because many email clients have limited support for SVG images. Converting the illustration to PNG ensures better compatibility and visibility across mail clients.** After conversion, the image url is then set to `/html_editor/shape/illustration/335/usability-testingsvg-258?...` This URL is handled by the `html_editor/shape/<module>/<path:filename>` route. Its purpose is to process SVG files and dynamically adjust their colors based on query parameters (e.g. the `c1` parameter). However, once the image has been converted to PNG, this logic no longer applies. To address this, an additional conditional check will be introduced: if the file is not an SVG, the route will bypass the SVG-specific transformation logic and instead serve the image directly. Task-5977962 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255134
This update prevents the chatbot from restarting when a chat session is closed prematurely. Previously, an incomplete chatbot shutdown could cause errors. Now, the restart button is disabled when the chat hasn't finished, ensuring a smoother user experience and preventing potential issues.
Original PR description
Before this commit, it was possible to restart the chatbot on the feedback panel when closing the chat window. This was actually failing when the chatbot was stopped before the last step was completed and left the livechat state in error. Now, the button is simply disabled on feedback when we did not reach the end of the chatbot to avoid any issue. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257891
This update reduces the frequency with which Odoo checks for VIES (VAT) updates, improving system performance and reducing the load on external services. This change ensures smoother and more reliable operation of our VAT calculations, particularly for businesses relying on up-to-date VAT rates.
Original PR description
task-none Forward-Port-Of: odoo/odoo#258302
This update resolves an issue where to-do tasks without a project would unexpectedly become required, preventing users from saving them after a page refresh. The fix corrects a technical merging of required field attributes within the Odoo system, ensuring to-do tasks remain editable regardless of refresh.
Original PR description
Steps to reproduce 1. Create a to-do from the To-do app (no project set, appears as "Private") 2. Open the Project app, go to My Tasks, open the to-do 3. The "Private" label shows correctly 4.…
Steps to reproduce 1. Create a to-do from the To-do app (no project set, appears as "Private") 2. Open the Project app, go to My Tasks, open the to-do 3. The "Private" label shows correctly 4. Refresh the page Issue After refresh, the "Private" label vanishes and the project field becomes required (red), making the record unsavable. The web client merges (ORs) the `required` attribute of fields sharing the same name across view nesting levels. Commit 46adf760a3a33 introduced `required="1"` on the sub-task `project_id` inside the `child_ids` One2many list: https://github.com/odoo/odoo/blob/46adf760a3a33e48d34fe99c565a8c6c1194fb65/addons/project/views/project_task_views.xml#L479 This causes the main form's `project_id` required expression (`parent_id or child_ids or is_template`) to be ORed with `1`, always evaluating to true. On initial navigation the sub-task list is not yet loaded so it works, but on a full page refresh all field attributes are merged at once, making the main task's project field unconditionally required. Solution Change the sub-task's `project_id` required expression to `parent_id or child_ids or is_template`, matching the main form's field. This still evaluates to true for sub-tasks (they always have a `parent_id`) while no longer forcing true on standalone to-dos that have no project. opw-6008266
This update fixes a visual issue where the 'seen' indicator wasn't displayed correctly when the last message in a channel was a notification. Now, the indicator accurately reflects when a user has read the last message, regardless of whether it was a regular message or a notification, improving channel organization.
Original PR description
Before this PR: In channels with seen indicators, the indicator is hidden if the user's last message is a notification. Since indicators are not displayed on notifications and the logic does not fall back to the previous message, the user is left with no visible 'seen' status. After this PR: The seen indicator now skips notification-type messages and is correctly displayed on the last message sent by the user. task-5921911 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248390
This update resolves a bug preventing admin users from accessing the project form view (Studio) when the ‘Project Stage’ option is disabled. The change ensures admin users retain access, allowing them to utilize Studio functionality without permission errors. This improves overall system usability for administrators.
Original PR description
## Steps to Reproduce: 1. Ensure the “Project Stage” option is disabled. 2. Open the form view of any project. 3. Click the Studio button. 4. An access error appears, indicating that the current user does not have permission to access stage_id, preventing the project form view from being edited. ## Expected Behavior After the PR: The admin user should have access to stage_id even when the “Project Stage” option is disabled. This ensures that Studio can be opened without triggering an access rights error. ## Task : task-[5892227](https://www.odoo.com/odoo/project/4105/tasks/5892227) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a subtle issue where the system was incorrectly associating customer data. The fix ensures that customer records (res.partner) are properly linked, improving data accuracy for sales transactions. This change was made to align with customer expectations and improve the reliability of sales information.
Original PR description
Introduced by 64d9ded9637286ef0cfd9e65ba7c60d4f48d6c16, customer was supposed to hold res.partner record and not res.users one. Logic worked nevertheless because `child_ids` is inherited through the `partner_id` inherits on the `res.users` model.
This update resolves an issue where scrolling or swiping in the mobile inbox triggered unwanted message actions. The fix prevents the system from misinterpreting scrolling as a long press, ensuring the correct message actions appear when intended. This improves the user experience for mobile users.
Original PR description
Before this commit, when in inbox mobile and scrolling & swiping on inbox notifications, the message actions was displayed at the same time. Steps to reproduce: - have Admin with "Handle in Odoo"…
Before this commit, when in inbox mobile and scrolling & swiping on inbox notifications, the message actions was displayed at the same time. Steps to reproduce: - have Admin with "Handle in Odoo" Notification preferences - have some messages in Inbox (e.g. receive @ mentions from chatter) - open Inbox in Discuss app in mobile, and scroll up / swipe horizontally on each message => this opens message actions in bottom sheet This happens because when scrolling up/down or swiping left/right on a message, this is triggering a longpress. The longpress has some dedicated code to detect that there's no scrolling or swipe at the same time, however since 1 the action swiper was changed and made this regression. This happens because 1 introduced some `ev.stopPropagation()` on touch event, which are crucial for the hook useLongPress() to determine whether a scroll or swipe is occuring. Because the events have been stopped, the useLongPress() wrongly assumes the user triggers a long press. One could think we could use capture in useLongPress(), which is generally the way to prevent this issue. However, ActionSwiper is stopping propagation at the capture mode, therefore giving no chance for useLongPress() to detect the touch events. Thankfully the capture event listener target is the `ActionSwiper` itself, so one solution is to register in capture mode in a broader scope like `window`. This commit fixes the issue by registering on `capture` of the touch event on `window` for `useLongPress()`. Task-6008171 Scroll up in inbox, Before / After:  
This update fixes a visual issue where translation status highlights were hidden behind button backgrounds in the website builder. By adding a small span element, the translation state is now consistently displayed, ensuring accurate and clear translation status indicators for users. This enhances the user experience when using the website builder with translated content.
Original PR description
When buttons (`a.btn` elements) are translated inline, or badges (`span.s_badge`), the background color that shows the status of the translation appears under the background of the button/badge. The…
When buttons (`a.btn` elements) are translated inline, or badges (`span.s_badge`), the background color that shows the status of the translation appears under the background of the button/badge. The status is thus only visible on the surrounding text, and completely invisible when the button is alone (unless it has a transparent background). This commit adds a plugin in translate mode which adds a span with the color of the translation status in the problematic elements if they are inside a translation span and have a background color. Steps to reproduce: - Open website builder - Drop the `s_banner` snippet (or add a button by typing `/button`) - Add a second language - Open in translate mode - Bug: the text of the button does not have the green/yellow highlight that shows the translation state (technically, it is hidden under the background of the button, which you can see if you set a transparent background on the button) `o_translate_inline` on links: - 8fe88de0d5cc61395721cd8bda7b7ef2ea961760 - f65ac79631180e77aca5a53fc557b3e1acfcbd65 - 6aef5ee411656ec400e92fcc2bbd62e420645e0e task-6038029 Forward-Port-Of: odoo/odoo#258203 Forward-Port-Of: odoo/odoo#254000
This update resolves a bug that prevented demo users from receiving inbox messages when linked to HR employee records. The previous code caused access errors when retrieving message counts, leading to a blank inbox. This change ensures all inbox messages are correctly fetched for users, improving notification functionality.
Original PR description
Since PR #252611, the value of the `message_needaction_counter` field has been added to the store data when fetching inbox messages. The `hr` module adds a specific group to this field, that could cause fetching inbox messages to crash if the needaction message is related to an `hr.employee` record and the user is not involved in that group. This change adds sudo when accessing to this field to get the store data for inbox messages. Steps to reproduce: - Set the notification preference to `inbox` for the demo user. - Log in as admin and mention the demo user in an employee record. - Go to inbox as demo. The messages will not be fetched, with an access error to `message_needaction_counter` field.
This update resolves an issue where right-clicking on links within email messages sometimes displayed unwanted actions. The fix expands the scope to cover all links, including those with nested HTML elements, ensuring a cleaner and more reliable email experience. This improves usability for all users.
Original PR description
Before this commit, when right-click on a link in a message, this sometimes show the message actions. A commit was dedicated on fixing this issue [1], however this was limited to exact click on `<a>`. Many links shared by email are `<a>` with some nested nodes, for example `<a><font>LINK</font></a>`. Such links were not covered by [1] and thus made the message actions show on right-click. This commit fixes the issue by not showing the message actions on right-click on links, including nested children. [1]: https://github.com/odoo/odoo/pull/244252 opw-6110949
This pull request updates the core o_spreadsheet library used in Odoo. It includes several bug fixes and improvements related to spreadsheet rendering, formula handling, and testing. These changes ensure the spreadsheet functionality remains stable and reliable.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4561a9a809 [REL] 19.0.29 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4561a9a809 [REL] 19.0.29 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/cd7707f944 [FIX] format: keep negative accounting suffix in large number [Task: 6068834](https://www.odoo.com/odoo/2328/tasks/6068834) https://github.com/odoo/o-spreadsheet/commit/f7b1c449c8 [IMP] tests: add image snapshots for renderer store tests [Task: 5933130](https://www.odoo.com/odoo/2328/tasks/5933130) https://github.com/odoo/o-spreadsheet/commit/46c70d8670 [FIX] renderer: rendering tests are wrong [Task: 5933130](https://www.odoo.com/odoo/2328/tasks/5933130) https://github.com/odoo/o-spreadsheet/commit/bd47b32e9e [IMP] tests: update jest to v30 [Task: 5933130](https://www.odoo.com/odoo/2328/tasks/5933130) https://github.com/odoo/o-spreadsheet/commit/bfb8e0595f [FIX] cf: add sanity checks on conditional format type/operator [Task: 6106092](https://www.odoo.com/odoo/2328/tasks/6106092) https://github.com/odoo/o-spreadsheet/commit/aee92bcbdd [FIX] live-server: specify host to avoid issues with some browsers [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/f5e1d32287 [FIX] spreadsheet: chart side panel content should use full height [Task: 6080680](https://www.odoo.com/odoo/2328/tasks/6080680) https://github.com/odoo/o-spreadsheet/commit/89c8b30ee2 [FIX] xlsx: export formula that returns an error [Task: 6008904](https://www.odoo.com/odoo/2328/tasks/6008904) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com> Forward-Port-Of: odoo/odoo#258579
This update resolves a technical problem with incorrectly formatted XML within the test reports module. Previously, the system automatically corrected these errors, but this fix ensures consistent test results moving forward. This change improves the reliability of our testing process.
Original PR description
This commit fixes a malformed HTML/XML tag in TestReports. Note: before libxml2 v2.14.0, this issue was automagically cleaned up, but not anymore. Forward-Port-Of: odoo/odoo#258569