Tuesday, September 1, 2026
14 changes · master
Enhancements to existing features
Checkboxes with hidden labels can now use their description as the clickable text, making forms easier to use. This improves accessibility and reduces mistakes when users need to tick options with a very small clickable area.
Original PR description
It's possible to hide the label of a checkbox. The surface to tick it is then very small. Solution: Use the description as a substitute for the label when the latter is hidden. Task-6009931
The website setup wizard now downloads industry images in parallel instead of one by one. This shortens waiting time during website configuration, especially for customers hosted far from Odoo image servers or experiencing higher network latency.
Original PR description
The website configurator downloads 80+ industry images sequentially, making the image processing block highly sensitive to network latency to IAP. Download the images in parallel before creating…
The website configurator downloads 80+ industry images sequentially, making the image processing block highly sensitive to network latency to IAP. Download the images in parallel before creating their attachments, significantly reducing the time spent in this block. On Runbot, this brings the image processing time down from ~4.5s to ~0.8s, saving more than 3 seconds in the Website Configurator wizard. The improvement might seem small on Runbot due to its very low latency to the IAP servers, but it can be significantly higher for Odoo instances hosted farther away from the IAP servers. For example, on my local instance in Gujarat, India, the same block went from ~75s to ~10s. The exact improvement is still subject to the load on the IAP server and the network conditions between the IAP and Odoo servers. However, the parallel downloads significantly reduce the impact of network latency on this process. task-[6514167](https://www.odoo.com/odoo/project/974/tasks/6514167) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Custom fields can now choose more precise database index types, helping improve search performance for different data needs. The update also ensures index changes are properly detected and rebuilt when needed, reducing the risk of stale database structures.
Original PR description
Allows custom fields to have a more specific index instead of just "True" which is a just btree. Check commits for more details task-6507120 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Rental product pages can now support showing a crossed-out reference price when a discount applies. This helps shoppers better understand rental discounts and keeps pricing presentation consistent with regular products.
Original PR description
`_get_additional_combination_info` inlines the logic that decides whether a "before discount" reference price should be shown and how to compute it, directly against the pricelist rule that matched the current price. Rental products need to use a different method to compute the price before discount as multiple rules can be applied at the same time. This commit extracts that logic into its own `_get_price_before_discount` method so it can be overridden independently of the rest of `_get_additional_combination_info`. task-6279525 See also: - https://github.com/odoo/enterprise/pull/124483 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Online shoppers can now narrow product lists using a range slider for selected product attributes, such as ordered sizes or levels. This makes browsing large catalogs faster and more intuitive while keeping the displayed range labels updated as customers adjust the filter.
Original PR description
- Add support for range display type for product attributes - Render range slider using attribute sequence ordering - Add dynamic label update on frontend task-6059293
Course managers can now send an email only to the attendees they select, instead of messaging every attendee through mass mailing. The attendees list also has clearer progress filters, and related mail handling was made more reliable for records that do not use discussion threads.
Original PR description
**Purpose:** Allow sending an email to selected course attendees instead of contacting all attendees through the mass mailing action. **Specifications:** - Add a "Send Email" action in the Attendees list view for the selected attendees, with the same behavior as the Contacts app. - Add default "Not Started" and "Almost Done" filters. Task-6267552
Customers can now enter a recipient email and send a purchased gift card directly from the order confirmation page or their portal order. The update also improves the gift card experience by adding copy functionality and better styling outside of the eCommerce-only flow.
Original PR description
The gift card section is displayed in two contexts: the order confirmation after checkout and the customer's portal order. The customer can now enter a recipient email and send the gift card directly from either one. The copy interaction is moved from website_sale_loyalty into sale_loyalty, as it would not work when eCommerce is not installed. task-6255032 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users now see a helpful dialog when they try to delete a record that is still used elsewhere, instead of a technical server error. The dialog explains what is blocking the deletion and, when available, offers archiving as an alternative so users know how to proceed.
Original PR description
Deleting a record that is still referenced elsewhere failed on a raw PostgreSQL RESTRICT violation, surfaced as a technical server error: nothing told the user which record was in the way, nor what…
Deleting a record that is still referenced elsewhere failed on a raw PostgreSQL RESTRICT violation, surfaced as a technical server error: nothing told the user which record was in the way, nor what to do about it. The web client's delete flows now go through `web_unlink()` (via the new `orm.webUnlink()`), so none of this affects `unlink()` calls made by other server-side code. On a blocked delete, it rolls back and retries the deletion record by record inside a savepoint that is always rolled back, to pinpoint which records are the actual problem, then raises `UnlinkBlockedError` with the blocking model's display name, whether the records can be archived, the selection and the blocked subset of it. Client-side, registering `UnlinkBlockedErrorDialog` under that exception's name is all it takes for the dialog to show up wherever the delete came from; no view has to catch anything. It proposes archiving instead when the records support it - on the whole selection, reloading the view afterwards - and is a plain "Close" otherwise. When only part of a bulk delete is blocked, it also links to the non-deletable records. task-4610830
This update improves the guided onboarding tours for Accounting, CRM, and Point of Sale so they work better in both automated checks and manual walkthroughs. It helps ensure new-user guidance remains consistent and easier to validate before release.
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
Deleting records from the Gantt view now uses the same deletion flow as other views. When a record cannot be deleted because it is still linked elsewhere, users see a helpful dialog instead of a raw server error.
Original PR description
Gantt deletes its records itself, through `unlink()`, so a delete blocked by a RESTRICT violation still failed there on a raw server error. Going through `orm.webUnlink()` gets the pill dialog and the multi-selection delete the same actionable dialog as the other views. task-4610830
Odoo now supports additional payroll work entry types for temporary unemployment, including cases involving public holidays and refused unemployment claims. This helps employers apply the correct pay and social contribution treatment in Belgian HR and payroll processes.
Original PR description
[IMP] {hr_holidays,hr_work_entry}: new work type entries for temporary unemployment
When a company put workers on temporary unemployment and a public holiday occurs during that period:
- By default it has to be paid
- if the temporary unemployment is long enough, the employer can pay only the taxable part (no onss)
Also it may happens that a technical unemployment is made by a company but then refused by the administration,
in that case the employer has to pay it but this day is still considered as a technical unemployment
in the computation of the ONSS contribution reduction.
Some hr_work_entry_types were created or updated:
LEAVE6665 is now selectable in timeoff.
LEAVE086 is created and acts as counterpart for LEAVE207 when the temporary unemployment is long enough.
Both LEAVE086 and LEAVE207 are acceptable on public holiday days.
LEAVE2049 is created (for refused temporary unemployment by administration)
enterprise-122476
task-6199998This update polishes the email marketing building blocks and templates used to create mass mailing campaigns. Users get more visually refined snippets, better template variety, and improved default images and branding, making it easier to produce attractive emails with less manual adjustment.
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
Website forms now better communicate invalid fields and their related error messages to screen readers. This improves accessibility for users relying on assistive technologies and helps them complete forms more confidently.
Original PR description
Screen readers could not link invalid inputs to error messages. Solution: Use aria-invalid and aria-errormessage to improve the screen reader experience. Task-6009931
Belgian payroll now handles public holidays that fall during a worker's temporary unemployment period more accurately. The system splits the absence and applies the correct paid holiday code, including whether social security contributions apply, helping employers follow payroll rules.
Original PR description
When a company put workers on temporary unemployment and a public holiday occurs during that period: - By default it has to be paid - if the temporary unemployment is long enough, the employer can pay only the taxable part (no onss) Upon validating a temporary unemployment leave that overlaps a public holidays, we split the leave into subsegments and we apply a specific code that takes precedence over the public holiday leave. It becomes either a LEAVE207 (with onss) or LEAVE086 (without onss). community-275356 task-6199998