Tuesday, September 1, 2026
35 changes · master
Enhancements to existing features
A new automated test verifies that image previews refresh correctly after a user uploads a new image. This helps protect the image upload experience from future regressions in Odoo's web interface.
Original PR description
Purpose ======= Add a test that check that the preview of the `ImageField` is updated after uploading a file when the option `preview_image` is used. Task-6509975
Shift template suggestions now include generic templates even when a shift has a specific project or worksheet. This makes reusable templates easier to find and keeps scheduling behavior consistent with role-based template suggestions.
Original PR description
*_ = planning_field_service_worksheet - When a shift has a project or a worksheet, only templates matching that exact value were suggested. Roles already also include templates with an empty value. - Do the same for project and worksheet so generic templates remain available. task-6364228 Forward-Port-Of: odoo/enterprise#129004
Warehouse operators using the Barcode app can now be prompted to combine a receipt with related receipts when scanned products belong to another incoming order. This helps process mixed vendor deliveries without manually identifying each purchase receipt, while keeping the scanned product selected after the receipts are combined.
Original PR description
Purpose ======= When an operator is doing a vendor purchase receipt, they may receive items from different orders without having a direct clear view on which ones they are. They should be able to do…
Purpose ======= When an operator is doing a vendor purchase receipt, they may receive items from different orders without having a direct clear view on which ones they are. They should be able to do their receipt in the Barcode app without wondering about that and just get a suggested batch if items belong to different orders. Functionnality ============== When an operator scans a product which isn't reserved in the currently opened operation, a prop will be displayed to ask the user if they want to batch the receipt with another receipt which contains the scanned product. The user can either batch with another receipt, either add the product or either discard (do nothing, don't add the scanned product.) If they chose to batch with another receipt, both receipts (the current one and the selected one) will be batched together, either in a new batch (if none were already in a batch), either in one of the pickings' batch. If both receipts are already in a different batch, their both batches should be merged together (whihch can result in more than one added picking.) The same thing happens if the user tries to add a product with the `stock.move.line` form view (with the "Add Product" button), the same confirmation dialog will be displayed, and if the user choses to batch, the created move's `picking_id` will be set on the selected picking, and the batch will be opened instead of going back picking. Once the pickings are batched, one of the batched move lines for the scanned product will be incremented and after that, when the batch is opened in the Barcode app, this move line will be auto-selected. So, for the user, the product they scanned before batching the receipt isn't lost, they don't need to re-scan it. Note that this implementation is very basic, it doesn't handle scan of lot/serial numbers nor packages for now. Also note that this feature doesn't require to enable the batch setting, it should work even if this setting is disabled. How suggest receipts to batch are chosen ======================================== For a receipt to appear in the suggest batch pop-up, it should match following requirement - It must share with the opened receipt the same contact, the same company and the same state (to avoid to batch confirmed pickings with draft pickings); - It can't be done nor cancelled. [task-6154300](https://www.odoo.com/odoo/966/tasks/6154300)
This update refreshes demo data for purchasing, stock-related purchasing, and online store stock scenarios. It helps business users and evaluators see more representative examples when testing or demonstrating these Odoo apps.
Original PR description
Task: 6486305 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 refreshes and expands demo content across purchasing, inventory barcode, manufacturing work orders, and quality control. It helps teams evaluate these workflows with more realistic sample data and clearer barcode examples, making demos and training easier.
Original PR description
Task: 6486305
Users can now delete removable circular nodes, such as Hang Up, directly from the VoIP flow editor with the mouse. The delete option also stays visible when focused, improving keyboard accessibility while keeping protected nodes like Start unchanged.
Original PR description
Circular flow nodes did not display the delete button available on rectangular nodes. As a result, Hang Up nodes could not be removed directly with the mouse. Display the delete button when hovering a removable circular node and keep it visible when focused for keyboard accessibility. Non-removable nodes, such as Start, remain unaffected.
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
The project to-do screens have been tidied up to make searching and list browsing clearer. This should help users find and review their to-do items with less visual clutter and a smoother day-to-day experience.
Original PR description
task-6516822
The Timesheets section on project tasks now places the option to add a new line at the top of the list. This makes entering timesheet records quicker and more visible for users working on task details.
Original PR description
Recently, the framework merged a task allowing to configure the position of the "Add a line" in the list view. We build on this to change the position of the "Add a line" button to the top of the "Timesheets" notebook of Project tasks. task-6499912
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
Helpdesk users can now add a new timesheet line from the top of the Timesheets section on a ticket. This small usability improvement makes time entry easier to find and faster to use when working on support tickets.
Original PR description
Recently, the framework merged a task allowing to configure the position of the "Add a line" in the list view. We build on this to change the position of the "Add a line" button to the top of the "Timesheets" notebook of Helpdesk tickets. task-6499912
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
Date pickers can now show the day of the week alongside dates when enabled. This helps users quickly understand what weekday a selected date falls on, which is especially useful for appointment booking and scheduling flows.
Original PR description
It is sometimes relevant when showing the date to also quickly let the user know what day of the week it corresponds to. task-5072614
Appointment booking pages are easier to create and maintain with tools to copy existing slots or days, edit slots directly from the calendar, and generate fixed-duration time slots while dragging. A new sidebar centralizes booking page management and sharing options, making it simpler for organizers to configure availability and keep long-running appointments tidy.
Original PR description
Sometimes people want to share some specific slots one after the other without having to tediously set them one by one. ## Add a "clone last slot" / "clone last day" action in the list view This…
Sometimes people want to share some specific slots one after the other without having to tediously set them one by one. ## Add a "clone last slot" / "clone last day" action in the list view This eases the set up when most days look the same. The copying is done based on the timezone of the appointment so that the result is always consistent. ## Rework the slot editor ### Custom appointments Previously you could create an appointment via the calendar view, which would allow you to select some slots visually in the calendar before sharing them. We rework this system to be able to edit existing appointments, move and delete slots. This removes the appointment dropdown at the top of the calendar and replaces it with a sidebar where you can create and manage appointments where you are an organizer, which would previously have been listed in the dropdown. From there you can copy the url to share it, enter edition mode to make sure the correct slots are bookable, or edit some basic settings of the appointment type. In this settings form, a new duration field is available that will automatically create slots every X minutes as the user drags. Which is a common thing users want to do for example for house showings. To prevent users from accidentally creating way too many slots at once, this is limited to 24 hours at a time which should be more than sufficient. ### Recurring appointments It is also possible to edit recurring appointments by going to their form using a new stat button. It works very similarly to the custom appointments except slots are only split around midnight. Bookable slots (those shown in the frontend, called "subslots" in this code) are represented inside each slot. Depending on duration and "create slots every X hours" settings of the appointment type. ## Old slots garbage collection To avoid cluttering the slots for long-lived appointments, a new garbage collection mechanism is added to remove slots older ending over 1 week ago, always leaving the last 40 slots so users can have an idea of what the schedule was like on old unused appointment types. task-5072614
The Indian payroll contract template now hides the Tax Deductions section when Professional Tax is not enabled. This keeps payroll settings screens cleaner and prevents users from seeing empty or irrelevant sections.
Original PR description
Prior to this commit, the "Tax Deductions" group caption on the contract template view remained visible even when Professional Tax (PT) was not enabled in the Payroll settings. This commit updates the visibility condition of the "Tax Deductions" group on the contract template view to be hidden when PT is disabled (`not l10n_in_pt`), preventing empty settings sections from displaying to users. Task: 6514274 Forward-Port-Of: odoo/enterprise#129836 Forward-Port-Of: odoo/enterprise#129703
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
Mobile users searching for projects will now consistently see the simpler project card designed for selection dialogs. This avoids occasionally showing the fuller Projects app card in the wrong place, making project selection clearer without changing the main Projects screens.
Original PR description
The many2one "Search More" dialog on mobile requests a kanban view for `project.project` without an explicit `view_id`, falling back to whichever primary kanban view resolves first. This accidentally depended on record id ordering, sometimes serving the rich Projects app card instead of the minimal one meant for this case. This commit sets an explicit lower priority on `project_view_kanban` so it is deterministically chosen for this fallback, leaving the Projects app and Configuration > Projects menus (which pin their own view_id) untouched. task-6131412
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
Mexican eCommerce customers now choose invoicing through clearer buttons, and invoice details are only shown and required when needed. Company name and RFC collection is moved into the dedicated invoicing flows for checkout, address pages, and POS tickets, making invoicing data easier to capture and store correctly.
Original PR description
Improve the dedicated Mexican invoicing checkout step: - replace the "need invoice" Yes/No radios with two buttons, and only require and show the invoicing fields when an invoice is requested - add the Company Name field here and hide the B2B fields (Company Name + RFC) from the address form, both in checkout and in /my/address - read and save the invoicing data on the order's invoice contact (partner_invoice_id) instead of the main partner - POS ticket screen: Collect RFC through the localisation fields required to invoice task-[6234716](https://www.odoo.com/odoo/project/967/tasks/6234716)
Frontdesk automated checks were updated to match the newer visitor creation process, where notifications are sent as soon as a visitor is created. This helps ensure the visitor reception experience and related SMS notification behavior continue to work reliably.
Original PR description
Update frontdesk tests to follow the new visitor creation flow, where notifications are triggered when creating a visitor. Task-6388574
Job listings now only allow working schedules that match the job's company. This helps keep recruitment records consistent and reduces the risk of publishing or managing jobs with invalid schedule settings.
Original PR description
In order to maintain proper job listings and make sure all working schedules are valid, working schedule domain is now depeding on the job listing company. Task: 6408914 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 Forward-Port-Of: odoo/odoo#285407 Forward-Port-Of: odoo/odoo#282993
Job listings now only allow working schedules that are valid for the company linked to the job. This helps keep recruitment postings consistent and reduces the risk of choosing an incompatible schedule.
Original PR description
In order to maintain proper job listings and make sure all working schedules are valid, working schedule domain is now depeding on the job listing company. Task: 6408914 Forward-Port-Of: odoo/enterprise#129748 Forward-Port-Of: odoo/enterprise#128241
Several apps were updated to stay aligned with recent attachment handling changes in Odoo. This keeps opening and deleting attachments working consistently in areas such as Approvals, Documents, Recruitment, Spreadsheets, and Social Marketing.
Original PR description
Community `mail` reshaped AttachmentList's click handlers to the uniform `(ev, { attachment })` object form. These modules patch `AttachmentList.onClickAttachment` / `onConfirmUnlink`, so their overrides adopt the same signature and forward via `super(...arguments)` to keep matching the base.
https://github.com/odoo/odoo/pull/273646This update improves how several mail and calendar interface elements react to changes, especially in chatter, scheduled messages, attachments, polls, previews, and chat bubbles. It should make these areas more efficient and reliable by avoiding unnecessary refreshes and ensuring actions apply to the item the user actually selected.
Original PR description
Continue reading props as signals (`this.x()`) across more mail components via `propComputed`/`propSignal`: the chatter scheduled message and follower list, polls, link previews, the chat bubble and…
Continue reading props as signals (`this.x()`) across more mail components via `propComputed`/`propSignal`: the chatter scheduled message and follower list, polls, link previews, the chat bubble and the small leaf components (country flag, date section, priority, message link preview list).
A callback handed to a slotless list child is made `props.static` and bound once in the caller: a fresh closure every render makes the prop compare unequal and forces every item to re-render, whereas a stable reference lets unchanged items skip it. Done for `AttachmentList.unlinkAttachment` and
`ScheduledMessage.onScheduledMessageChanged`.
`ChatBubblePreview.chatWindow` is chained down as a `propSignal`: the parent already holds the value as a signal and now passes the signal itself, so the preview reacts to it directly.
Click handlers take the record they act on as a parameter, captured at render right before the handler (a scoped `recordAtRender` local) and passed as `(ev, { recordAtRender })`. A signal read inside a handler resolves at call time, so if the value changed since the render the user saw, the handler would act on a record different from the one displayed; the captured record keeps the action tied to what was clicked. A callback that runs later, such as a dialog confirmation, receives the same captured record instead of re-reading the signal.
A callback prop type shared between a child and the parents that pass it is defined once as an exported `(store) => t.function(...)` factory and reused rather than duplicated at each declaration.
https://github.com/odoo/enterprise/pull/122615The Belgian payroll module description now directs users to the official documentation for Dimona. This helps users find the most accurate guidance without changing payroll features or workflows.
Original PR description
Change the module description to refer to the official documentation. Task-6485101
Point of Sale can now use payment methods linked to different currencies, allowing shops to accept payments in more than one currency without blocking POS setup. Cashiers will see the relevant currency per payment method, while order totals remain shown in the POS configuration currency.
Original PR description
In some countries it's common to accept multiple currencies when making sales, but we don't let users open POS configs if they assigned to the POS payment methods for journals which use different currencies. This should let users create payment methods assigned to multiple currencies and then still open the POS. If there are multiple currencies set up on the POS, the payment screen will show the corresponding currency for each payment method. The totals are still shown in the config currency, but when selecting a payment method in a different currency there will be the price in the new currency between brackets on the payment line. Task-[5110998](https://www.odoo.com/odoo/project/1737/tasks/5110998) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr