Tuesday, April 14, 2026
17 changes · master
Enhancements to existing features
This update optimizes Odoo's startup speed by delaying the loading of a specific library (openpyxl). This change reduces startup time by approximately 100ms and allows Odoo to function without this library, improving overall system responsiveness. It's a small but important performance enhancement.
Original PR description
This is the only module loading it eagerly at startup. We can save at least 100ms by moving it to the function that uses it. Moreover, this way we can start odoo without openpyxl being available.
This update clarifies how recurring products are handled in Odoo Enterprise. The name of a key field has been changed from `has_subscription_products` to `has_recurring_products` to better reflect its purpose: controlling which fields are displayed on order templates. This ensures accurate product visibility for subscription-based sales.
Original PR description
Rename `has_subscription_products` to `has_recurring_products` to avoid confusion. Recurring products are only treated as subscriptions when a plan is set; here we only check if products can be sold recurringly to control some fields' visibility on `sale.order.template`
Resolved issues and error corrections
The 'Validate' button for GSTR1 and GSTR2B returns was temporarily hidden. This fix corrects a technical issue caused by a recent code change, ensuring the button is now correctly displayed for these return types. This ensures users can properly process and submit their GSTR filings.
Original PR description
The Validate button was not visible for GSTR1 and GSTR2B return types. This issue was introduced after the removal of the 'new' state from l10n_in_gstr1_status and l10n_in_gstr2b_status in commit: https://github.com/odoo/enterprise/commit/8058bf55918bd0c1ac0de52d696de67ce0b3b45b As a result, the button visibility condition relying on state = 'new' was no longer valid, since the initial state is now represented by False (i.e., no value set) instead of an explicit 'new' selection. This fix updates the visibility condition to correctly handle the new default state and restores the expected behavior. task-6105435
Code cleanup and technical improvements
This update refines the Odoo Studio interface to better support mobile devices. Specifically, a change was made to the template naming convention to align with recent improvements that allow colorpickers to appear inline with labels, enhancing the user experience on smaller screens.
Original PR description
This commit renames the o_wrap_field_boolean to o_wrap_field_inline in studio templates, following the community changes made to support colorpicker field inline next to its label on mobile.
This update fixes an issue where dropdown menus within the softphone wouldn't close when clicking outside the softphone. This improvement ensures consistent navigation and usability when using the softphone, aligning with recent changes to modal behavior. The fix was implemented to restore expected dropdown functionality.
Original PR description
Since [1] (and its follow-up commits), the softphone became the "UI active element" once it opens. This was required to solve multiple keyboard navigation issues that occurred while being on the app…
Since [1] (and its follow-up commits), the softphone became the "UI active element" once it opens. This was required to solve multiple keyboard navigation issues that occurred while being on the app switcher with the softphone opened. It also simply improved navigation any time the softphone is used, allowing it to close on ESC, etc. This is also consistent with what is being done at [2] where the softphone will get closer to modal behavior. However, it came with a bug: dropdown inside and outside the softphone were not closed anymore if clicking outside the softphone. E.g.: - Open the user dropdown menu - Click outside => it closes - Open the softphone - Open the user dropdown menu - Click outside => It does not close anymore This commit adds a test about it. The fix lies in the dropdown closing logic in the community counter-part of this PR. [1]: https://github.com/odoo/enterprise/commit/df1772e877a508150fd3f549526dec9d867354be [2]: https://github.com/odoo/enterprise/pull/111337 task-6055692 Forward-Port-Of: odoo/enterprise#111516
A recent issue prevented users from accessing server action views correctly within the Document module. This was caused by a priority setting problem in the view configuration. This update resolves the issue by explicitly setting a priority, ensuring the correct server action view is displayed, and improving usability.
Original PR description
When the document module is installed, sometimes the server action view that is shown when accessing the server actions from the normal menu can be broken: the model field for instance is no longer visible, which makes the user interface unusable. <img width="723" height="412" alt="image" src="https://github.com/user-attachments/assets/73f6d516-77be-4f66-80dc-033fd8c0cb7c" /> This is because the document module defines a new primary form view for server actions, but does not set a priority for that view. As a result we have 2 primary views, with the same default priority of 16 in the database, and in that case the sorting of view can lead to the document specific view to be selected, when the other one is expected. We fix this by explicitly setting a priority of 32 on the form view in the document module. Forward-Port-Of: odoo/enterprise#112847
This update fixes an issue where the employee health warning incorrectly flagged employees with long sick leaves prior to 31 days. The change adjusts the logic to include employees who have been on sick leave for at least the past 31 days, ensuring more accurate health assessments. This improves the reliability of the warning reports.
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#113443 Forward-Port-Of: odoo/enterprise#112985
This update resolves a crash that occurred when users double-clicked 'Add Custom Field' within a list view's optional fields dropdown in Odoo Studio. The fix prevents Studio from opening multiple times simultaneously, ensuring a stable user experience. This improves reliability and prevents data loss.
Original PR description
On a list view, open the optional fields dropdown. Click twice on "Add Custom Field" Before this commit there was a crash, because opening studio while it is already opening was not protected. After this commit, there is no crash. Forward-Port-Of: odoo/enterprise#113299
This update ensures CSV files are now correctly recognized as viewable within Odoo's list views, mirroring the behavior in the Kanban view. Previously, CSV files were ignored in list views, creating a discrepancy in functionality. This change enhances usability and consistency across Odoo.
Original PR description
Current behavior before PR: - CSV files were viewable from the Kanban view, and opened the spreadsheet conversion dialog - In list view, CSV files were not considered viewable - Same issue for trashed CSV files in list view Desired behavior after PR is merged: - Consider CSV files as viewable in list view - Align behavior with the Kanban view Task: 6052134 Forward-Port-Of: odoo/enterprise#113586 Forward-Port-Of: odoo/enterprise#112869
This update fixes a problem where the payroll dashboard displayed warnings for all companies, even when a user was only working with one. Now, the dashboard only shows warnings related to the company the user is currently managing, ensuring more relevant and accurate alerts. This improves the user experience and data clarity.
Original PR description
This commit will restrict the payroll dashboard alerts to only display warnings relevant to the user's currently selected company.
**Why:**
Previously, the payroll dashboard search method fetched and displayed warning of `Employees Without Running Contract` from all companies in the database, regardless of the user's active company context.
**What:**
- Added a domain filter ('company_id', '=', self.env.company.id) to the search query.
task-6095361This update fixes an issue where search filters in the MRP Planning section (MPS) were lost when users navigated away and returned. The fix ensures that search filters are correctly retained, providing a more consistent and efficient user experience. This improves usability and data accuracy.
Original PR description
Issue: In the MPS view, when the user sets a search filter, navigates away and then returns via the breadcrumb, the search filters that were applied are gone. This happened because the MPS client action was not passing `globalState` to the `WithSearch` component. Fix by passing `globalState` in `withSearchProps`. task-5368078 Forward-Port-Of: odoo/enterprise#113183 Forward-Port-Of: odoo/enterprise#113125
This update corrects payroll tax rates in the Belgian HR payroll module (l10n_be_hr_payroll) to reflect the latest regulations for the year 2026. This ensures accurate tax calculations and compliance for employees and the company. The change is a technical fix to maintain correct financial reporting.
Original PR description
Forward-Port-Of: odoo/enterprise#113426
This update resolves an issue where prompts within email templates weren't being evaluated correctly. The fix ensures that all prompt containers are wrapped in a `<div>` to prevent errors during evaluation, guaranteeing prompts now function as intended. This improves the reliability of AI-powered email content.
Original PR description
Note: In 18.4, the editor inserts a space before and after the prompt container, in which case the following steps won't cause an error because the container won't be the only html element. Steps to…
Note: In 18.4, the editor inserts a space before and after the prompt container, in which case the following steps won't cause an error because the container won't be the only html element. Steps to reproduce: - Create a new email template. - Insert a prompt by using the '/prompt' command. - Type any prompt like 'Say Hello'. - Save the email template. - Click on preview. - The prompt isn't evaluated. The '_eval_ai_prompts' method creates a root element from the passed html content. When the passed content represents a single prompt container html element, the root will become that prompt container. The method will try to evaluate the prompt and replace the prompt container and then return the root. The returned root won't contain the evaluation of the prompt in this case because the whole root should be replaced by the evaluation given that there is no other elements. To fix this, the html content will always be wrapped in a `<div>` to avoid the need for replacing the whole root element. Forward-Port-Of: odoo/enterprise#111645 Forward-Port-Of: odoo/enterprise#110247
This update fixes an issue where appointment booking descriptions were displayed in the user's language instead of the website's language. Previously, the system used the user's language setting, regardless of the website's language. Now, booking descriptions will correctly display in the website's language (e.g., French) for users with different language preferences.
Original PR description
When booking an appointment, the cart shows the date/time in the partner's language instead of the website's language. `_prepare_order_line_values` uses `self.partner_id.lang`, ignoring the website language and using the user's language instead. Steps to reproduce: 1. Have a website language different than the user's language 2. Go to the website appointment page 3. Book an appointment 4. Check the booking For this case: - Website language: French - User language: English => You will find, "xxx at xx:xx to yyy at yy:yy" instead of "xxx à xx:xx au yyy à yy:yy" Ticket [link](https://www.odoo.com/odoo/action-4043/5931610) opw-5931610 Forward-Port-Of: odoo/enterprise#113208 Forward-Port-Of: odoo/enterprise#107698
This update resolves an issue where 'Hide Composition' sections weren't consistently hidden in the portal preview. The fix ensures that sections with hidden products are correctly masked, matching the behavior in PDF reports. This improves the accuracy of sales order previews for customers.
Original PR description
**Problem:** Currently, when 'Hide Composition' is enabled on a section containing at least one product, while the order have subscription product, the recurring lines within that section are still…
**Problem:** Currently, when 'Hide Composition' is enabled on a section containing at least one product, while the order have subscription product, the recurring lines within that section are still visible in the portal's 'preview' view, whereas they are correctly hidden in the PDF report. **Expected behavior:** As observed in pdf format, in preview, the hidden section should hide the components and only view the name of the section. **Steps to reproduce:** - Create quotation with One Goods type product - Add section with Hide composition - Add service type product in the section - Preview it and section products will be hidden - Confirm the quotation and now preview the sales order - Now the hidden section products will be visible **Solution:** - We need to separate the logic of displaying lines and invoiceable lines (since _get_invoiceable_lines doesn't necessarily return the sections/subsections) - The filtering in sale subscription module wasn't considering the `collapse_composition` boolean field, which why hidden sections content were displayed. - We need to hide any product with a parent (section or subsection) collapsed, hide any subsection with a parent section collapsed. opw-5868148 Forward-Port-Of: odoo/enterprise#106287
This update prevents regular employees from modifying the target job within an appraisal. The original system caused access errors because employees lacked the necessary permissions to view company job postings. This change ensures that target job assignments are managed solely by managers, improving data integrity and security.
Original PR description
Steps to reproduce: 1- Create an appraisal for a regular employee 2- Confirm it so its state changes to 'ongoing' 3- Try to change the target job as an employee 4- Click on see more Cause: The main cause is that regular employees lack the privilage to view job postings by a company. therefore an access rights errors is resulted when the flow is executed. Solution: Made the field readonly for normal employees (as it should be, target jobs are the managers' responsibility to change). Forward-Port-Of: odoo/enterprise#112663
This update resolves an issue where users couldn't exclude leaves that were also considered working time. Now, administrators can correctly designate leaves as non-working time, ensuring accurate tracking of employee availability and preventing scheduling conflicts. This improves the accuracy of holiday planning and reporting.
Original PR description
…orking time We can't take leaves considered as working time. We should be able to task-6089849 Forward-Port-Of: odoo/enterprise#112820