Wednesday, September 23, 2026
10 changes · saas-19.2
Resolved issues and error corrections
The HR responsible person field now correctly limits selectable users to authorized Time Off Officers. This prevents incorrect staff assignments and helps keep time-off responsibilities aligned with the right HR permissions.
Original PR description
Issue: ---------------------------------------- The domain of the field `hr_responsible_id` isn't computed. Also it should contain `hr_holidays.group_hr_holidays_user`. Cause:…
Issue: ---------------------------------------- The domain of the field `hr_responsible_id` isn't computed. Also it should contain `hr_holidays.group_hr_holidays_user`. Cause: ---------------------------------------- The domain of the field is returned by `_get_hr_responsible_domain()` as a string which is not supported. https://github.com/odoo/odoo/blob/2ea452d03aa0cbfe360c539fb3b29a7b89aa7297/odoo/orm/fields_relational.py#L112-L123 `validated()` returns `None` so the domain is left empty. Solution: ---------------------------------------- Return a list instead of a string. Also, override the field in `hr_holidays` and and the condition on `hr_holidays.group_hr_holidays_user`. Note: ---------------------------------------- This [commit](https://github.com/odoo/odoo/commit/ff50687bad2939db882e75ae20f28e6155fa2191) did the same thing in saas-19.4 but added a useless field in `hr.employee` because it did not catch the error of the string being wrong. opw-6545508
Message previews in Mail now display the proper text for app-handled links instead of showing placeholder hash symbols. This makes notifications such as pinned messages and join notices clearer and less confusing for users.
Original PR description
Before this commit, JS-handled links (e.g. pinned messages notification, joined notification) would be formatted as "#" in `htmlToHtmlInline()` (introduced in [1]). This causes message preview for pinned message notification to show as "# #". This commit fixes the issue by specifically handling JS-handled links (recognized by odoo-specific data attributes) and rendering their tet content. [1]: https://github.com/odoo/odoo/pull/238080 task-6571060
The project website form processing has been cleaned up and reorganized to make it more reliable and easier to update. This supports future improvements while reducing the risk of issues when users submit project-related forms online.
Original PR description
Clean up and move some of the form processing logic for future updates opw-6560036 Forward-Port-Of: odoo/odoo#287697
The HTML editor now ignores link preview metadata that contains only spaces. This ensures users see the link URL or appropriate fallback text instead of an empty clickable preview area.
Original PR description
Problem: When a link's metadata contains whitespace-only strings for `og_title`, `og_description`, or `og_image` (e.g. `og_title: " "`), the link popover displays an empty clickable preview area.…
Problem: When a link's metadata contains whitespace-only strings for `og_title`, `og_description`, or `og_image` (e.g. `og_title: " "`), the link popover displays an empty clickable preview area. Cause: `LinkPopover` assigned raw metadata values directly. Non-empty whitespace strings evaluate to truthy values in JavaScript (`" "` is truthy), preventing fallback to the default URL or empty string. Solution: Trim the metadata values (`og_title`, `og_description`, `og_image`) when populating state so that whitespace-only values evaluate to empty strings and trigger appropriate fallbacks. Steps to reproduce: - Open HTML editor. - Add a link with URL `https://netorg4182089.sharepoint.com/:v:/s/projects/IQD72ajP3WOBT4jcAu_1qLfIAamL9lvrq4ls1Bs9XCyXJvw?e=vQ9wH3`. - Open the link popover. => Observe that the popover title falls back to the URL instead of showing an empty clickable space. opw-6564118 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288188
This fixes an issue where list bullets could appear too far to the left when users turned large header text into a list. The editor now adjusts spacing automatically, keeping formatted content visually consistent and easier to read.
Original PR description
Problem: Creating a list on a header block with large font size content causes the list marker/bullet to overflow to the left. Cause: `ListPlugin.blockToList()` wrapped block elements into a list without invoking `this.adjustListPadding(list)`, leaving the list padding unadjusted for larger font sizes. Solution: Call `this.adjustListPadding(list)` in `blockToList` so that proper inline padding is set based on the list item content font size. Steps to reproduce: - Create a header block (e.g. Header 4). - Change the font size of the header content to be bigger. - Apply a list on the content. => Observe that the list marker overflows to the left. opw-6542903 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286975
This fixes an issue where employees could receive repeated chatter messages when they were automatically enrolled in an eLearning course more than once. The change keeps course enrollment notifications clean and avoids cluttering employee records with duplicate updates.
Original PR description
Steps to reproduce: - connect with a user with an employee record - recreate a new eLearning course - enable debug mode - add "Role / User" to "Auto Enroll Groups" fields => message is duplicated in the employee's chatter `_action_add_members` in `website_slides` is designed to be idempotent (calling it twice is a no-op if the partner has already joined) but the override in `hr_skills_slides` is not. We have many many duplicated messages on odoo.com (see task) task-6508615 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289644 Forward-Port-Of: odoo/odoo#284483
The Luxembourg reporting module now uses a working download link for the FAIA XSD file. This prevents failed or empty downloads, helping users access the required reporting schema reliably.
Original PR description
The old link points to a file with zero bytes. opw-6344914 Forward-Port-Of: odoo/enterprise#132582
This fixes an unstable automated salary configuration test in Belgian payroll by making the click target more precise. It reduces false test failures caused by accidentally selecting the wrong transportation option, helping keep payroll validation more dependable without changing user-facing behavior.
Original PR description
Tour `hr_contract_salary_tour` fails non-deterministically on step `trigger: 'span[name="Gross"][value="2886.87"]',` There are multiple steps in the tour where a value is input and then a click is…
Tour `hr_contract_salary_tour` fails non-deterministically on step `trigger: 'span[name="Gross"][value="2886.87"]',` There are multiple steps in the tour where a value is input and then a click is made targetting `label:contains(Transportation)`[^1]. The click is made to force the update of the salary configurator's values. However, the selector is not precise enough, multiple elements match, some of which clickable and with an influence on the configurator. By looking at the screenshots from faulty runbot builds, we can see a value specified for the "Train Transportation" option, although it is not supposed to be selected at this point of the tour, which causes the value of the gross to be wrong. Runbot screenshot: <img width="1366" height="768" alt="image" src="https://github.com/user-attachments/assets/a520cacf-f900-4aad-ae6b-d9b7b68da716" /> Selector results (random runbot): <img width="1918" height="613" alt="image" src="https://github.com/user-attachments/assets/caae96d4-5026-48cc-aad7-d1283ab5549a" /> ----- runbot-242057 [^1]: eg. https://github.com/odoo/enterprise/blob/7ff50cf2abc02cb71f3b50d85a92f4ee52e1a66c/test_l10n_be_hr_payroll_account/static/tests/tours/hr_contract_salary_tour.js#L429 Forward-Port-Of: odoo/enterprise#132384
This fixes Colombian electronic invoice XML so the note field only shows the invoice’s Terms and Conditions. It prevents an internal technical control key from appearing in documents sent to DIAN, reducing confusion and keeping the exported invoice content aligned with business expectations.
Original PR description
**Steps to reproduce:** - Install the `l10n_co_dian` module and switch to the CO Company. - Disable `Test environment` and enable `DIAN Demo Mode` in the invoicing settings. - Set a `Technical…
**Steps to reproduce:** - Install the `l10n_co_dian` module and switch to the CO Company. - Disable `Test environment` and enable `DIAN Demo Mode` in the invoicing settings. - Set a `Technical control key` on the `Customer Invoices` journal. - Create and confirm an invoice with Terms and Conditions. - Send the invoice to `DIAN`. - Open the generated XML file and observe the `cbc:Note` tag. **Observation:** The `Note` tag contains the `technical control key`. **Expected behavior:** The `Note` tag should only contain the Terms and Conditions value from the invoice. (Confirm with PO [1]) **Root Cause:** At [2] and [3], the code includes the `technical key` in the `Note` tag. [1]: https://www.odoo.com/mail/message/1164671931 [2]: https://github.com/odoo/enterprise/blob/a5f4bde1aa33ea7b796d7ee3f9d713a6c8ab8348/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L664 [3]: https://github.com/odoo/enterprise/blob/a5f4bde1aa33ea7b796d7ee3f9d713a6c8ab8348/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1600-L1603 opw-6513843 Forward-Port-Of: odoo/enterprise#132606 Forward-Port-Of: odoo/enterprise#131495
Corrects a rental planning test so it handles time zones consistently when checking pickup and planning slot times. This prevents false test failures during early-morning hours and helps keep rental ordering quality checks reliable.
Original PR description
**Issue:** `test_payment_renting_product_available` test is failing when executed between 0:00 AM and 2:00 AM in Brussels timezone (UTC+2): ``` AssertionError: datetime.datetime(2026, 6, 22, 16, 0) != FakeDatetime(2026, 6, 21, 16, 0) : The planning slot should begin at the same time as the picking time. ``` In the database the datetime is stored in UTC, which is the previous day for the example above. In `test_payment_renting_product_available` test, the datetime is passed to `datetime.combine()` function that naively uses the date part, which leads to a one-day delta. The datetime should be converted to the working timezone before being passed to `datetime.combine()`. runbot-940435 Forward-Port-Of: odoo/enterprise#131944