Monday, July 7, 2025
29 changes · saas-18.4
Enhancements to existing features
The website page options walkthrough has been updated to work with the redesigned website builder. This restores automated checks that help ensure page configuration tools keep working reliably for users.
Original PR description
The 'website_page_options' tour was previously broken due to DOM structure changes introduced by the new website builder and was consequently disabled. This commit updates the tour steps to align with the new DOM and re-enables the associated test. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Employee contract version lists now show the yearly cost next to the wage by default. This gives HR teams a clearer view of total compensation costs without opening each individual contract version.
Original PR description
In this PR, we added the yearly cost field to the version list to the right to the wage and will be visible by default. Related task: 4901173.
Resolved issues and error corrections
When users create a link in the website editor and then choose Discard, the link editing popup now closes correctly. This prevents stale link details from remaining on screen after the actual page changes have been undone.
Original PR description
Steps to reproduce: - Open website builder - Select some text and "Add a link" with the toolbar - Fill the URL field - Select "Button Primary" - Click "Discard" - Bugs: The link popover does not closes The dom changes are discarded, but it still shows the same info task-4367641
Features or functions removed from Odoo
This change removes an obsolete duplicate duration calculation function in HR work entries that remained after contract handling was reorganized. It is an internal cleanup with no expected change to employee or payroll workflows.
Original PR description
Description of the issue/feature this PR addresses: Following the merge of contracts into versions, a duplicate function _get_duration_batch was created where the old and new ones existed simultaneously with the same function skeleton, this commit removes the old _get_duration_batch Current behavior before PR: No behavior affected Desired behavior after PR is merged: dead code removed --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Code cleanup and technical improvements
This update simplifies the internal testing setup used across several Odoo Enterprise modules. It reduces maintenance complexity for developers while keeping the changes limited to tests, so there is no expected impact on day-to-day users.
Original PR description
## Pull Request HOOT (PRHOOT) 34 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/216546 Forward-Port-Of: odoo/enterprise#89485 Forward-Port-Of: odoo/enterprise#88949
Miscellaneous changes
*: portal, portal_rating, test_mail_full. Before this commit, the chat bot could stop when redirecting to a page where the portal is enabled. Both the portal and live chat modules rely on the discuss store’s `self` field which identifies the authenticated user. However, the portal also supports authentication via a token in the URL, which temporarily identifies the user on a specific thread. Previously, the portal would overwrite the global `self` value, causing inconsistencies for
Original PR description
*: portal, portal_rating, test_mail_full. Before this commit, the chat bot could stop when redirecting to a page where the portal is enabled. Both the portal and live chat modules rely on the discuss store’s `self` field which identifies the authenticated user. However, the portal also supports authentication via a token in the URL, which temporarily identifies the user on a specific thread. Previously, the portal would overwrite the global `self` value, causing inconsistencies for other users of the store such as messages appearing as if sent by another user. Since token authentication is specific to portal threads, it should only affect actions on the granted thread without altering the global user identity. This fix prevents the portal from overwriting the global `self` value and instead returns the thread-specific `portal_partner` field. opw-4722466 Forward-Port-Of: odoo/odoo#215893 Forward-Port-Of: odoo/odoo#211204
Website users will now see link previews refresh immediately as they type a URL or choose an autocomplete suggestion. This makes creating links clearer and reduces mistakes before publishing or saving content.
Original PR description
### Steps to reproduce: - Install the Website module. - Go to a To-Do and type a slash command, e.g., /link. - Enter a label for the link. - Type in the URL input — observe the preview. - Select a suggestion from autocomplete dropdown — observe the preview. ### Description of the issue/feature this PR addresses: - The link preview did not update while typing in the URL input. - It also did not update after selecting an item from autocomplete dropdown. ### Desired behavior after PR is merged: - The link preview updates live while typing and upon selecting a suggestion. task-4910827 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates older image-related data used in the website editor so it matches the current naming format. It helps avoid inconsistencies when editing existing pages or content with images, with no expected impact outside edit mode.
Original PR description
When `html_builder` was introduced, some data attributes related to images have changed. Unfortunately, the attributes on static data were not adapted accordingly. Because of this, both namings might appear in this version. This commit migrates images and background images attributes so that, upon edition, a single naming scheme remains used. It should be safe enough given that those attributes are only used by edit mode. Dataset changes: - copy `originalId` to `attachmentId` - rename `originalMimetype` to `formatMimetype` task-4367641
The calendar side panel now stays the same width regardless of the content shown in it. This makes the Timesheet calendar filters and controls more stable and easier to use.
Original PR description
Before this commit, the width of the calendar side panel varied depending on the content. Steps to reproduce: - Go to Timesheet - Select the calendar view - Click on the "+" button and click on the filter button. task-4921562 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
This update makes automated checks for the HTML editor more reliable by waiting properly for link preview popovers and splitting an overly long test. It helps reduce random test failures in the release pipeline, supporting smoother validation without changing user-facing behavior.
Original PR description
Forward-Port-Of: odoo/odoo#217434 Forward-Port-Of: odoo/odoo#215168
This fix prevents long website builder dropdown menus from extending beyond the visible screen. Users can now access all available options without parts of the menu being cut off, improving usability when editing website forms or other elements with many choices.
Original PR description
The goal of this commit is to prevent the BuilderSelect from having part of its dropdown outside the screen. This makes some of the elements in the dropdown inaccessible.
This problem is linked to a popover limit that should be set in the future.
Solution:
We will set a limit of 50% of the screen for the height in BuilderSelect
To reproduce:
- Have a BuilderSelect containing many items For example, Type when a Field is selected in a Form.
- Click on the BuilderSelect
Before this commit:
Part of the dropdown is outside the screen and therefore few elements
are impossible to select.
After this commit:
The size of the dropdown is limited to prevent it from being outside the screen.
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-prFont selections such as Open Sans now work reliably in the website theme editor. This ensures the chosen typography is displayed as expected, helping websites maintain their intended branding and appearance.
Original PR description
Since `html_builder` was merged, font family selection is not implicitly quoted anymore. This is a problem for font families having names that contain spaces. This commit puts font family names between quotes before calling `customizeWebsiteVariable`. Steps to reproduce: - Go to the Theme tab - Pick "Open Sans" as font family - Inspect page => The used font was not "Open Sans". task-4367641
A small typo in the Belgian tax configuration was corrected from “.00” to “0.0”. This helps ensure the Belgium localization data is formatted consistently and avoids potential issues when setting up or using Belgian tax records.
Original PR description
Forward-Port-Of: odoo/odoo#216453 Forward-Port-Of: odoo/odoo#216098
This update improves Odoo's internal Hoot testing framework with fixes for search, error handling, event behavior, and debugging usability. It helps developers run and troubleshoot automated tests more reliably while keeping changes limited to the test environment, reducing risk for business users.
Original PR description
## Pull Request HOOT (PRHOOT) 34 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Enterprise: https://github.com/odoo/enterprise/pull/88949 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217463 Forward-Port-Of: odoo/odoo#216546
This fix ensures that changes made to cached web responses do not accidentally alter the saved cache content. It helps keep application data more reliable and prevents hard-to-track display or behavior issues caused by reused cached information.
Original PR description
Before this commit, modifying the response directly (whether from the RAM cache or the IndexedDB cache) would also modify the RAM cache content. Now, rather than storing a reference, the RAM cache stores a copy of the IndexedDB value. Also, when the RAM cache is returned, a copy of the stored value is returned.
This change gives the web desktop test suite more time to complete as the number of automated tests has grown. It reduces the chance of false failures caused by busy machines rather than actual product issues, helping keep development checks stable.
Original PR description
The number of tests in the hoot suite keeps increasing, and we're close to the timeout for the desktop suite. Depending on the CPU load, it happens that the suite timeout. This commit thus shifts it up to 40 minutes. 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
This change makes an automated website popup test more reliable by waiting longer for the popup to appear before checking its close behavior. It helps reduce intermittent test failures in validation systems without changing the customer-facing website experience.
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
This fix prevents key parts of a website table of contents block from being dragged into unrelated page areas. Editors can still reorder those parts using the existing arrow controls, reducing accidental layout issues while building pages.
Original PR description
When the table of content options were converted to `html_builder`, the drag'n'drop of the content part and the navbar part was not restricted to remain within the table of content section. Because of this it was possible to e.g. drop the navbar inside the grid layout of another block. This commit prevents this. task-4367641
This fix restores previously removed user setting methods related to muting in Mail to comply with Odoo's stable version policy. It helps preserve expected behavior and compatibility for existing users and customizations.
Original PR description
This commit reintroduces the methods removed in https://github.com/odoo/odoo/pull/215866 in order to follow stable policy.
This fix makes automated point-of-sale tests for the Brazilian electronic invoicing module more reliable by waiting for product searches to fully finish before continuing. It reduces false test failures in build checks, helping teams validate changes with fewer interruptions.
Original PR description
The tours regularly fail in single app builds because the "No other products found" notification is not found. Waiting on that notification is necessary because the product search happens asynchronously. I was not able to reproduce the test failure locally. But in an attempt to improve the situation this changes the approach to use the little "loading" spinner to wait on the search to finish by using Chrome.isSynced(). This method is used elsewhere in POS tests and should hopefully be less flaky. builx_error-224202 Forward-Port-Of: odoo/enterprise#88300
This fix ensures several Odoo Enterprise apps correctly identify where real-time updates should be sent. It helps prevent missed or misrouted notifications in areas such as approvals, knowledge, VoIP, helpdesk live chat, WhatsApp, and Mexican e-invoicing tests.
Original PR description
\* = approvals, knowledge, l10n_mx_edi, voip, website_helpdesk_livechat, whatsapp Enterprise counter-part. https://github.com/odoo/odoo/pull/215869
Users can now open Studio from the Documents list even when a document shortcut is selected. This prevents an error that interrupted customization work in Documents and keeps the workflow usable.
Original PR description
Steps: - Install `documents` and `studio` - Open documents, go to list view - Select a random file and 'Create a shortcut' via the actions - Try to open studio - traceback opw-4900667 Forward-Port-Of: odoo/enterprise#89508
This fix ensures that when users open a task from the Field Service calendar, the intended form layout is used. It keeps the Field Service calendar aligned with a related platform change, preventing confusing or incorrect task editing screens.
Original PR description
This commit is the counter part of odoo/odoo#216631 which removes a parameter to the editRecord function. Task-4910395
Fixes an issue where processing overdue invoice follow-ups could fail when SMS follow-up settings were enabled. The follow-up process now avoids using outdated customer mobile field data, helping staff complete payment reminders without interruption.
Original PR description
When clicking the `Process Follow-ups` button after creating a due invoice, a traceback could occur due to missing data on the related records. Steps to reproduce: --- - Install `account_followup`…
When clicking the `Process Follow-ups` button after creating a due invoice, a traceback could occur due to missing data on the related records.
Steps to reproduce:
---
- Install `account_followup` module(without demo)
- Go to `Follow-up Levels` and enable SMS in `15 Days`
- Create an invoice with Invoice Date(2 months ago) and Payment terms: `15 Days`
- Now, click on the selected customer and fill in all important details
- In the action button, click `Process Follow-ups`
Traceback:
---
```
KeyError: 'mobile'
ValueError: KeyError('mobile') while evaluating
'if records:\n action = records.action_manually_process_automatic_followups()'
```
The mobile field was removed from `res.partner` (see related commit), but it was not removed from here. This commit cleans it up to avoid referencing a non-existent field.
commit- https://github.com/odoo/odoo/commit/6b820eb6fc6f782ba6a83d605d87b4a1dd2a87be
sentry-6720070075
Forward-Port-Of: odoo/enterprise#89241Odoo Studio now uses the platform’s built-in field capabilities to decide whether fields can be grouped, sorted, or aggregated, instead of relying on less reliable guesses. This helps users see more accurate options when configuring views such as lists, kanban, pivot, graph, gantt, and search.
Original PR description
Before this commit we used some heuristics in studio to determine whther some field had some ability (groupable, sortable, aggregator) After this commit, we use the not so new tools given by https://github.com/odoo/odoo/commit/b177b058be1531c3d2af2b591c22591c19240d33 Note that we still rely on the field type, because even if possible, groupong by some fields doesn't make much sense (eg.: float) task-4879382 Forward-Port-Of: odoo/enterprise#89342 Forward-Port-Of: odoo/enterprise#88522
Scenario: - insert the last blog posts widget in a page - open editor and edit (eg. Filter Intensity) the cover of a post - save Result: the change is lost Cause: the content of the widget is dynamic, and we delete the content in cleanForSave (that call the destroy of the widget) before saving, so the change are not saved. Fix: make the dynamically added cover widget unselectable, the cover of the blog post can still be changed in other locations (blog post list, blog post page).
Original PR description
Scenario: - insert the last blog posts widget in a page - open editor and edit (eg. Filter Intensity) the cover of a post - save Result: the change is lost Cause: the content of the widget is dynamic, and we delete the content in cleanForSave (that call the destroy of the widget) before saving, so the change are not saved. Fix: make the dynamically added cover widget unselectable, the cover of the blog post can still be changed in other locations (blog post list, blog post page). opw-4633287 __PR NOTE:__ in verson before 18.0, the cover was not selectable probably from the .o_not_editable on `.s_dynamic_snippet_content` ancestor element. I've not found what changed (there was some change to dynamic snippet and widget blog post) that make it selectable now. Forward-Port-Of: odoo/odoo#214651 Forward-Port-Of: odoo/odoo#210079
Before this commit: 1. Insert an image and add a link to it. 2. Click on the image and remove it by clicking the remove button in the toolbar. 3. The link popover remains open and only disappears after clicking away. This occurs because the default behavior of a link with text preserves the link element to allow the possibility of completely changing the label of the link directly in the editing area. After this commit: The link popover is properly closed when an image link is remove
Original PR description
Before this commit: 1. Insert an image and add a link to it. 2. Click on the image and remove it by clicking the remove button in the toolbar. 3. The link popover remains open and only disappears after clicking away. This occurs because the default behavior of a link with text preserves the link element to allow the possibility of completely changing the label of the link directly in the editing area. After this commit: The link popover is properly closed when an image link is removed, and the link element is removed when the link element associated with the image is empty. task-4805029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216045 Forward-Port-Of: odoo/odoo#213955
**Steps to reproduce:** 1) Install CRM 2) Create a crm lead and mark it as lost 3) Create a new activity for the lost lead for today 4) Go to the activity button in the top right corner 5) Click on today's activity for crm leads **Issue:** If you click activity for crm, it will only show the active lead's activities, not the lost ones. You need to click on the filter 'lost', to see the lost leads **Cause:** When the lead is marked as lost, we archive the lead record.
Original PR description
**Steps to reproduce:** 1) Install CRM 2) Create a crm lead and mark it as lost 3) Create a new activity for the lost lead for today 4) Go to the activity button in the top right corner 5) Click on today's activity for crm leads **Issue:** If you click activity for crm, it will only show the active lead's activities, not the lost ones. You need to click on the filter 'lost', to see the lost leads **Cause:** When the lead is marked as lost, we archive the lead record. Indeed, we won't see the lost leads by default when opening activities, since they are not active. https://github.com/odoo/odoo/blob/8111009f6a8888db80f9afaa145a4c64272370e7/addons/crm/models/crm_lead.py#L1013-L1016 **Solution:** Add `active_test` to the context to show the archived/lost activities. opw-4866692 Forward-Port-Of: odoo/odoo#214942
During odoo/enterprise#60393 some po files that had been deleted in odoo/odoo#172429 and odoo/odoo#172269 were re-added in. We remove them now as they are out of date + are not reachable to be translated/fixed without a PR. Forward-Port-Of: odoo/enterprise#89301
Original PR description
During odoo/enterprise#60393 some po files that had been deleted in odoo/odoo#172429 and odoo/odoo#172269 were re-added in. We remove them now as they are out of date + are not reachable to be translated/fixed without a PR. Forward-Port-Of: odoo/enterprise#89301