Wednesday, September 9, 2026
24 changes · saas-18.4
Resolved issues and error corrections
The website editor now skips unnecessary cleanup for images whose source comes from a saved URL field. This prevents the editor from trying to process external image links it does not manage, reducing save-time errors and preserving image behavior.
Original PR description
As of commit 8e397140, the builder walks every `<img>` of the editable area before saving and strips the shape-related dataset entries that no longer apply. Images rendered by an `image` field are excluded from that pass: their `src` is produced from the record's field value, so the builder neither owns it nor has anything to clean on it. `image_url` fields inherit from `image` fields and are in exactly the same situation, except that their `src` is the URL stored in the field rather than a generated `/web/image` link. They were not excluded, so the cleanup ran on them and tried to resolve image info from an arbitrary, possibly external, URL. This commit excludes `[data-oe-type='image_url'] > img` from the pre-save cleanup as well.
Some partner commission screens are now assigned to the correct source module. This helps ensure the feature is installed, updated, and maintained consistently without confusing ownership of related screens.
This update adjusts spreadsheet-related files to support a fix for FRGI testing. It helps keep spreadsheet behavior and presentation reliable for users, reducing the risk of issues during testing or validation.
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 makes point-of-sale test scenarios search customer records directly from the backend when needed. It prevents test results from depending on the order in which customers load, improving reliability without changing normal user workflows.
Original PR description
Added an explicit config on partner search which explicitly triggers a backend search when enabled to ensure the partner load order doesn't affect the result of tours where it's irrelevant. Runbot-[#233397](https://runbot.odoo.com/odoo/error/233397) Task-[6522073](https://www.odoo.com/odoo/project/1737/tasks/6482065/project.task/6522073) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Calendar bookings now use the employee's current working schedule when no contract dates are set, avoiding false unavailable warnings for users with standard employee records. This helps appointment scheduling work correctly in common setups without requiring contract configuration.
Original PR description
- install appointment and hr without demo data - create a booking for any appointment type via gantt - user partner is always unavailable In 18.3 we merged "on_leave_partner_ids" into "unavailable_partner_ids" @[1] However unavailable_partner_ids takes into account contract periods and considers that not being under contract means you are not available. Whereas on_leave_partner_ids did not. This leads to the warning message being displayed in appointment when the employee of the user has no contract, which is the default. Instead now the field will use the current employee regardless of contracts, as we don't strictly care most of the time. unavailable_partner_ids was previously used only for icon display purposes showing the user as unavailable in calendar attendees selection. Hence changing the logic is not very impactful. [1]: https://github.com/odoo/enterprise/commit/a66b824287f9023c93b7f61607dbb8af520e7ee1 task-5083433
This fix prevents occasional crashes when users switch pages while editing reports in Studio. It makes the editor safely stop style checks when the report page is no longer available, improving stability without changing normal editing behavior.
Original PR description
In studio mode, when editing a report and then changing pages, functions that interact with the report editor are occasionally still executed after the page transition. This causes `this.document.defaultView` to become null. Consequently, trying to call `defaultView.getComputedStyle` throws an error, breaking some tests. This commit adds a fallback check for `this.document.defaultView` and early returns false if either the window view or the target element is missing. runbot-233779
The Payroll app no longer shows an error when users open the Payslips menu before any payslips have been created. This makes the first-time or empty-state experience smoother and prevents an unnecessary interruption for payroll users.
Original PR description
This PR fixes a traceback that occurred when opening the Payslips menu in the Payroll app without any existing payslips. Root Cause: The issue was caused by passing a null or undefined payrunId to the PayslipActionHelper component, which was not handled properly. Solution: Since payrunId is optional, we added a conditional check in the parent view (hr_payslip_list_renderer) to only pass the payrunId to PayslipActionHelper if it is defined. Related task: 4919933.
Time off calculations now correctly handle employees with fully flexible working schedules by not forcing a work calendar where none should apply. This helps avoid incorrect leave computations for flexible schedule arrangements.
Original PR description
In case of fully flexible working schedule resource_calendar_id should be false. task-4965122 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an editor issue where keyboard shortcuts could still apply formatting to non-HTML fields even though the toolbar correctly disabled those options. It helps prevent accidental changes to page header or footer text when editing blog content.
Original PR description
Problem: Selecting text in non-html fields disables toolbar formatting, but pressing CTRL+B still formats the text. Cause: `formatSelection` did not check if the selection was inside a non-html field before applying formats. Solution: Return early in `formatSelection` if the selection is inside a non-html model field element. Steps to reproduce: 1. Go to /blog and open an article. 2. Open editor and select header/footer text. 3. Press CTRL+B. => Selected text becomes bold. opw-6537402 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286675
This fix prevents an error when loading HR sample data after the default Administration department has been deleted. The sample employees can now be created with optional department fields left empty, avoiding disruption for users setting up or testing the Employees app.
Original PR description
Currently, an error occurs when loading scenario data after user deleted administration department. Steps to replicate: - Install `hr` and open `Employees > Departments`. - Delete the…
Currently, an error occurs when loading scenario data after user deleted administration department.
Steps to replicate:
- Install `hr` and open `Employees > Departments`.
- Delete the `Administration` department.
- Open Employees, Delete all the employees and Click `load sample data`.
Error:
```
ValueError: External ID not found in the system: hr.dep_administration
ParseError: while parsing /home/odoo/src/odoo/saas-19.3/addons/hr/data/scenarios/hr_scenario.xml:114, somewhere inside
<record id='employee_mw' model='hr.employee' forcecreate='1'>
<field name='active'>True</field...
```
Cause:
- As the user deleted the administration department before the scenario data was loaded the error occurs from [here].
- In the previous version, this error did not occur because, starting from `saas-18.4`, scenario data is loaded through a server action [1]. In earlier versions, the scenario data was loaded along with the demo data through the settings instead. During demo data loading, any errors are converted into warnings, so no error is raised.
Solution:
- Prevented error from occurring when reference is not found. Since these fields are not required, they can safely remain empty.
[1]: https://github.com/odoo/odoo/blob/9400393a13d238404c9797a906ee11b6afcc761e/addons/hr/views/hr_employee_views.xml#L567
[here]: https://github.com/odoo/odoo/blob/b3d0cf09b491f180d6b6d654026497cc7de6731d/addons/hr/data/scenarios/hr_scenario.xml#L124
sentry-7441124574, 7584820916
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe website link editor now displays relative links exactly as users entered them, rather than converting them into full website addresses. This avoids confusion when reviewing or editing internal links, while full external links still appear normally.
Original PR description
Current behavior before PR: - The input shows the absolute URL resolved by the browser (e.g., `https://example.com/contactus`), even if the user originally entered a relative path like `/contactus`. Desired behavior after PR is merged: - The input now displays the original href attribute as entered by the user. Absolute URLs are still shown in full when explicitly entered. task-4890293 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website editor now avoids repeatedly requesting the same loading spinner image when users hover over sidebar options. This reduces unnecessary browser activity and helps keep the editing experience smoother, especially when cache is disabled or connections are slower.
Original PR description
Since commit [1] ([REF] website: rewrite website builder using owl and new html editor), the loading spinner element was created dynamically each time an option was hovered in the website builder sidebar. Steps to reproduce: 1. Open Website in edit mode 2. Add a snippet 3. Open the browser inspector → Network tab and disable cache. 4. Hover over different options in the sidebar 5. Observe multiple requests to `/web/static/img/spin.svg` After this fix, only one request is made if a spinner is wanted. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
This fix keeps the editor toolbar open when users select text and apply formatting such as a background color. It restores the text selection at the right time, preventing the toolbar from disappearing unexpectedly and making editing more reliable.
Original PR description
Steps to Reproduce : - Go to To-do, Create New - Type something - Select all using Ctrl + A - Try to apply background color, the Toolbar closes instantly because of reverted step has not proper selection. Current behavior before PR: - Reverting a preview/commit didn’t restore the correct selection because those steps added via addStep() with collapsed selection (this.currentStep). - During revert, revertStepsUntil revert the this last added step and triggers the step_added_handler. - This handler immediately calls updateToolbar() before the manual selection restoration happens, leading to the toolbar closing due to missing selection. Desired behavior after PR is merged: - The selection is restored before adding the consumed step in revertStepUntil, so reverting restores it correctly and keeps the toolbar open. task-4941601 --- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)
A failing automated test for rental invoicing under Anglo-Saxon accounting was corrected to better reflect the full stock delivery workflow. This helps keep rental accounting checks reliable and reduces false build failures without changing customer-facing behavior.
Original PR description
The test test_no_cogs_for_rental_invoice_anglo_saxon was failing because it did not correctly simulate the full Anglo-Saxon workflow for a stockable product. In Anglo-Saxon accounting, the Cost of Goods Sold (COGS) journal entries are generated upon the validation of the stock move (delivery). This commit fixes the test by: Ensuring the product has stock and is correctly configured as a storable product with real-time valuation. after the creation of the sales order runbot-error-231043
Job offer emails now correctly include the employee's name in the email subject. This makes outgoing offer messages clearer for recipients and helps HR teams identify related employee communications more easily.
Original PR description
**Steps to reproduce:** - Go to Employees app and select any employee - Press "Offers" smart button - Create a new job offer and send it by email **Issue:** The employee name is not populated in the email subject. Task: 5407028
Declined signing requests now show the name and email of the person who actually refused the document. This improves clarity in the document history and helps teams accurately track who declined a signature request.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Do sign now on document with other user than logged in user. - Decline the sign request. Issue: - When the signing request is declined, the chatter message does not display the correct name and email of the user who refused the document. - This happens because if the refusing user is different from the responsible user, the fields refusal_name and refusal_email are not set properly. Solution: - Add a fallback to use the currently logged-in user’s name and email when refusal_name or refusal_email are not available. Impact - Ensures the chatter message correctly shows who declined the document. - Improves clarity and traceability in document signing history.
This fix makes action menus in messaging and related apps look more consistent. It improves the user experience by reducing visual inconsistencies when people use message, chat, WhatsApp, and helpdesk conversation actions.
This update fixes a visual inconsistency in the action dropdowns used in Discuss and related messaging areas. It helps provide a cleaner, more consistent experience when users interact with messages across apps such as Knowledge, Helpdesk live chat, and WhatsApp.
Fixed a misspelling in the Helpdesk "Auto Assignment" group name. This improves clarity for users and administrators who see or manage this setting.
Original PR description
This commit fixes the typo in the "Auto Assignment" group. task-6542450 Forward-Port-Of: odoo/enterprise#130880 Forward-Port-Of: odoo/enterprise#130841
The Belgian payroll employee form now displays holiday attest recovery fields correctly on mobile devices. This prevents text fields from wrapping into the wrong column, making the information easier to read and complete on smaller screens.
Original PR description
Issue: the text fields "Holiday Attest xxxx - Simple Holiday Pay to recover in yyyy" were not displayed correctly on mobile devices being wrapped on different column. Task ID: 5108575
Text highlighting now lines up correctly on websites using right-to-left languages such as Arabic. This improves the editing experience by preventing highlight effects from appearing shifted away from the selected text.
Original PR description
Problem: When an element has `direction: rtl`, the text highlight is incorrectly shifted to the right of the text `span`. Cause: The highlight `svg` uses width `1px` and height `1px` but also sets…
Problem: When an element has `direction: rtl`, the text highlight is incorrectly shifted to the right of the text `span`. Cause: The highlight `svg` uses width `1px` and height `1px` but also sets `right: 0px`. This anchors it to the right instead of the top-left, causing the highlight path to overflow incorrectly on RTL text. Solution: Remove `right: 0px` so that the `svg` always anchors at the top-left. This allows the path to overflow properly on the right side, fixing the highlight alignment. Before: <img width="607" height="357" alt="image" src="https://github.com/user-attachments/assets/0896c29b-ff4a-4a43-9a94-1a00c14d6ea0" /> After: <img width="612" height="366" alt="image" src="https://github.com/user-attachments/assets/93fca551-1aca-4f0a-bba5-34b374106b22" /> Steps to reproduce: 1. Change the website language to an RTL language (e.g. Arabic). 2. Add any text snippet. 3. Select some text and open the highlight options from the toolbar. 4. Observe the highlight options are misaligned. opw-5154303 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects how Belgian payroll contract template fields are handled so tests no longer reference fields from an optional fleet-related module when it is not installed. It helps keep payroll localisation validation reliable without changing day-to-day payroll functionality.
Original PR description
Issue: The test_be_contract_template_loading test fails due to incorrect fields being passed. Cause: The issue occurs because the _get_whitelist_fields_from_template() method includes the some fields, introduced in this https://github.com/odoo/enterprise/pull/92093. This field comes from the l10n_be_hr_payroll_fleet module, which is not listed as a dependency in all payroll localisations. As a result, the field cannot be found during test execution. Solution: Remove the all that fields from all _get_whitelist_fields_from_template overrides in the localisation modules, and instead include this fields by overriding the function in the l10n_be_hr_payroll_fleet module. build_error-231684
The website information page now uses the updated “Edit” terminology instead of the old “Customize” wording. This keeps the guidance aligned with the current interface and helps users follow instructions more easily.
Original PR description
Since we've changed the Customize tab to Edit in `18.4`, this commit adapts the text on /website/info accordingly. task: [6005106](https://www.odoo.com/odoo/project/974/tasks/6005106) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The time off test now uses fixed dates instead of dates based on when the test runs. This prevents false failures on weekends or non-working days, improving confidence in the system's automated checks without changing user-facing behavior.
Original PR description
## Before: The test relied on relative dates (today + 2 days) when creating a leave request. The behavior depended on the day it was executed. For example, if the test ran on a Friday, the leave request would be created for Sunday, causing the validation to fail because the employee was not supposed to work on that day. ## After: This uses a static date for both the accrual allocation and creating the leave to avoid unnecessary errors. runbot-945745 Forward-Port-Of: odoo/odoo#282190