Friday, September 18, 2026
40 changes · master
Enhancements to existing features
Blog authors now get a more familiar editing experience, with starter content presented as an editable text block and more control over blog post width. The main blog listing also regains a page title, improving search visibility while still allowing it to be hidden when desired.
Original PR description
- [IMP] website_blog: wrap initial content in a "Text" snippet - [IMP] website, website_blog: allow full container control on blog posts - [IMP] website_blog: add a title on the "All blogs" page Forward-Port-Of: odoo/odoo#289201
Projects created outside the main Project app flow now automatically receive four basic task stages. This helps users and AI-assisted project creation start with a ready-to-use task workflow, reducing setup omissions after imports or automated project generation.
Original PR description
Before this commit, when the user imports a project he creates he sometimes forgot to import his basic stages to be able to quickly add his task. An AI could also forget to create stages when the user asks the AI to generate a business project. This commit adds a default method to generate 4 basic stages when the project is not created manually by the user in the main action of Project app. task-6233294 Forward-Port-Of: odoo/odoo#287735
PayPal payments now show key account details more consistently and support clearer card brand handling. Businesses also get more control over 3D Secure configuration, helping align checkout behavior with their payment requirements.
Original PR description
1. Add Brands for Card Payment 2. Add possibility to configure 3DS 3. Show account id and email always 4. Remove (copy) from payment methods when duplicated task-6537307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288935
Odoo now prevents other workers from loading system registry data while it is being modified. This reduces the risk of inconsistent behavior during internal updates and helps keep multi-worker environments more reliable.
Original PR description
Before modifying a registry, `will_change_registry` is called. During the first call, lock registry loading so that no other worker can load the registry while it's being modified. This is similar to locking during updating of modules. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo search filters can now handle records that span a start and end date, not just records that begin in a selected period. This makes it easier for users to find ongoing items such as events, bookings, or assignments that overlap a chosen timeframe.
Original PR description
A date filter (`<filter date="date_start"/>`) filters on a single field: the periods it offers, as well as the relative ones introduced in [1], match the records that *start* in the searched period.…
A date filter (`<filter date="date_start"/>`) filters on a single field: the periods it offers, as well as the relative ones introduced in [1], match the records that *start* in the searched period.
For models describing a range rather than a single date, it is useful to be able to search for records that are ongoing during a given period.
A date filter can now name the field ending that span:
<filter string="Period" name="period" date="date_start" end_date="date_stop"/>
Its periods and its relative options then match the records overlapping the searched period:
['&', ('date_start', '<=', period_end),
'|', ('date_stop', '>=', period_start),
'&', ('date_stop', '=', False), ('date_start', '>=', period_start)]
A record with no end date ends when it starts. Each bound is serialized with the type of the field it is compared to, so that a date field and a datetime field can be paired.
Task-6546268
[1] https://github.com/odoo/odoo/pull/267980
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-prAccounting users can now use a keyboard shortcut to validate and post an opening entry from the setup wizard. This reduces clicks during initial accounting setup and helps users complete the process more efficiently.
Original PR description
No task ID
This update makes record value changes more efficient by applying field updates in batches instead of one at a time. It also preserves the bank name when setting a bank account on an accounting journal, helping keep financial records accurate.
Original PR description
Set field values in batch instead of doing it field by field. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The spreadsheet component has been updated to the latest available version, bringing ongoing improvements from the shared spreadsheet engine into Odoo. This helps keep spreadsheet behavior current and improves how collaboration/session changes are tracked behind the scenes.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4020a44abd [REL] Package: Bump master to 20.1.0-alpha.0 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/88a8b225da [IMP] session: Forward root command in the revision payload [Task: 6574631](https://www.odoo.com/odoo/2328/tasks/6574631) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
The website builder now includes a searchable selector for long option lists, starting with form field types. This makes it faster and easier for users to find the right form field when editing website forms.
Original PR description
*: html_builder This PR introduces a `BuilderSearchSelect` component that has a search functionality, making it easier to find and choose items from large lists of options. It will be initially enabled for the "form field types" selector to simplify picking a field type option. task-5398633 Forward-Port-Of: odoo/odoo#271821
The mail chat composer now has a fully rounded, pill-shaped input when shown on one line. The chat window corners were adjusted to match, giving conversations a more consistent and polished appearance.
Original PR description
Round the composer input to a full pill on a single line. The chat window radius follows so both look consistent. <img width="820" height="718" alt="composer-rounded-comparison" src="https://github.com/user-attachments/assets/23132111-3976-4064-abdb-c7cddae06876" /> Forward-Port-Of: odoo/odoo#287094
Users can now embed whiteboards from Miro, Google Docs, Figma, and Canva directly in supported Odoo content. This makes project tasks and to-do items better suited for collaborative planning and design work without leaving Odoo.
Original PR description
Supported providers: - miro.com - docs.google.com - figma.com - canva.com task-6102610 Forward-Port-Of: odoo/odoo#262181
The working schedules list now displays calendar names vertically aligned with the rest of each row. This small visual improvement makes the list easier to scan and gives the scheduling screen a cleaner, more consistent appearance.
Original PR description
Add a class `o_resource_calendar_list` for the working schedules list view to align the list rows in the middle. Before the PR: <img width="1908" height="597" alt="image" src="https://github.com/user-attachments/assets/19445c28-3e28-4d5b-a12f-f6c1701c01a7" /> After the PR: <img width="1390" height="262" alt="image" src="https://github.com/user-attachments/assets/fb50f6ca-6193-4c5e-9a30-8cd47873f01f" /> task-6562529
Event badges now make key instructions and QR codes easier to use, including when printed and folded. The event session planning experience is also cleaner, with simpler reminder and favorites messaging and fewer confusing badge labels from single-choice questions.
Original PR description
Backport of https://github.com/odoo/odoo/pull/287446 which one is a Forward-Port-Of: https://github.com/odoo/odoo/pull/285915 because freeze v20 meanwhile Several diff for OXP [IMP] event: improve A4…
Backport of https://github.com/odoo/odoo/pull/287446 which one is a Forward-Port-Of: https://github.com/odoo/odoo/pull/285915 because freeze v20 meanwhile Several diff for OXP [IMP] event: improve A4 foldable badge -> required for oxp kenya - if you have ticket instruction, use it on badge + add qr code always visible [IMP] event: don't show tag (question reply) if only one choice -> fix case of "yes, agree" show on badge as tag "yes" [IMP] website_event_track: typo and make it less verbose -> FP quick pass usability [IMP] website_event_track: replace fa-bell by fa-star -> why ? not sure better after... but FP request -> + add menu whishlist directly in event sub menu ## deploy ``` views = [ 'website_event_track.agenda_main_track', 'website_event_track.track_card', 'website_event_track.tracks_search', 'website_event_track.event_track_aside_other_track', 'website_event_track.track_widget_reminder', ] from odoo.upgrade import util for xmlid in views: util.update_record_from_xml(env.cr, xmlid) ``` Forward-Port-Of: odoo/odoo#285915 Forward-Port-Of: odoo/odoo#288790
The PDF quote builder layout is now more consistent and easier to scan. Buttons align with their section titles, multiple buttons fit neatly side by side, and redundant product label text has been removed.
Original PR description
Before this commit, an unnecessary margin on the quote builder buttons left them out of line with their section titles, and those titles didn't match the sections used everywhere else in other tab views. The `Product >` prefix was also redundant, as the product name alone already says what the section is. This commit removes the margin, spaces the buttons so several can sit side by side, aligns the titles with the usual form section style, and drops the `Product >` prefix. task-6528393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288523
Product availability searches based on free stock are now much faster, especially in databases with many inventory records. This reduces waiting time and database load when users filter or search products by available quantity.
Original PR description
**Problem:** Searching on free_qty can be slow when there are many stock.move and stock.quant. The search method uses _compute_quantities_dict() to compute the free_qty based on stock.move and…
**Problem:** Searching on free_qty can be slow when there are many stock.move and stock.quant. The search method uses _compute_quantities_dict() to compute the free_qty based on stock.move and stock.quant, which is expensive. **Solution:** A similar field, qty_available, has a faster search method based on stock.quant only. This method can be adapted to support fast searching on free_qty by also aggregating the reserved_qty and subtracting it from the qty_available. **Perf Table:** Record: product.template, with ~20k stock.picking and most products w/o moves. |Record count|Time before|Queries before|Time after|Queries after| |------------|-----------|--------------|----------|-------------| |10k |2.14s |214 |370ms |45 | |50k |6.06s |644 |829ms |50 | |100k |11.42s |1196 |1.05s |46 | opw-6266096 Forward-Port-Of: odoo/odoo#287363 Forward-Port-Of: odoo/odoo#270434
Odoo now installs related country-specific apps when another app for the same single country has already been installed, even if no company is set up in that country. This reduces unexpected missing add-ons, avoids recurring cleanup work, and preserves country metadata used in the Apps screen.
Original PR description
Currently a module with `countries` in the manifest is only installed in case a company with a matching country exists. This commit relaxes the constraint: In case we have already installed a module…
Currently a module with `countries` in the manifest is only installed in case a company with a matching country exists. This commit relaxes the constraint: In case we have already installed a module "from that country" we still install the module. For this we only consider modules that have a single country set in the manifest. (To avoid installing "generic" modules with multiple countries that we do not want.) The current behavior may cause unexpected behavior in case a module is manually installed in case such a company does not exist. (This i.e. causes issues with the runbot tests from time to time) Consider the following case: `l10n_XX`: `countries: ['XX']` `l10n_XX_reports`: `countries: ['XX']` In case we manually install `l10n_XX` but no company has country `XX`. Then we would not install `l10n_XX_reports`. The current workaround is to just not set the `countries` in dependecies but only in the "root" modules. But this requires knowledge of this problem. So it is sometimes not done. So currently we have to do "cleanup" PRs from time to time. Another issue with the workaround is that the `countries` also gives additional metainformation about the module that is lost. E.g. the `countries` info is used to display flag icons for the module in the `Apps` application. task-None
The Open Kiosk button in the self-ordering point of sale dashboard has been separated into its own reusable component. This makes it easier for other modules to customize or extend the button without changing the core dashboard behavior.
Original PR description
To allow overrides in other modules, the “Open Kiosk” button has been extracted into its own widget. 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 improves how Odoo handles updates to core field properties in the Base module. It supports customization workflows more reliably, including scenarios driven by AI-assisted configuration.
Original PR description
For Customizing AI prompt 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 clarifies how hierarchy-related search options in Odoo's core data engine are described. It helps developers and implementers better understand these options, reducing confusion when configuring or extending business logic.
Original PR description
task-4280696 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
India company settings now show “Unregistered” as a placeholder when no GST registration type is selected. This helps users understand that an empty value means the company is unregistered, reducing confusion during setup.
Original PR description
As `l10n_in_gst_registration_type` is left empty for unregistered companies, add an `Unregistered` placeholder so users can understand that an empty value means the company is unregistered. This improves the user experience when configuring the GST registration type. Forward-Port-Of: odoo/odoo#288837
The calendar side panel has been reorganized so the activity filter appears as the last item among calendar filters. This makes it easier for users to find after the addition of multiple calendar filters.
Original PR description
Following the introduction of multicalendars (odoo/odoo#261571), the "My Calendars" filters have been added to the calendar sidepanel. The activity filter is now a bit lost in the panel. Moving it as last item of the calendar filters. Task-6573460 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288527
Spanish electronic invoicing screens are being streamlined so cancellation requests use a single action menu entry instead of separate buttons. The change also makes key JSON files easier to find by keeping SII data with its related document and showing Veri*Factu JSON attachments in document lists.
Original PR description
During the l10n_es [EDI rework](https://www.odoo.com/odoo/project/967/tasks/6175455), the PO introduced some tweaks that would be nice to have. As those tweaks have nothing to do with the rework, we have decided to add them in a different PR: - Replace the direct SII/TicketBAI cancel buttons with a server action bound to the form's action menu, so cancellation goes through a single "Request Cancellation" entry instead of a dedicated button. - Expose the raw JSON attachment on Veri*Factu documents in the list view. - Attach the SII JSON payload to the SII document record itself instead of the invoice, so it travels with the document it belongs to. Here is the edi-rework [PR](https://github.com/odoo/odoo/pull/267440) task-6523345 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Calendar app now includes a reusable default reminder that can support appointment scheduling. It also replaces a confusing empty attendee label with the clearer wording "Unassigned," making calendar records easier to understand.
Original PR description
This PR adds a calendar.alarm. This one is required as default alarm for the appointment types. To avoid creating a new data file and updating the manifest, this change is not done appointment but in calendar as it can already be useful in that app. To avoid a technical label, this PR replaces the default falsy label of CalendarEvent.partner_ids, which is "Undefined Attendee", by "Unassigned". Enterprise PR: https://github.com/odoo/enterprise/pull/131840 Task-6576867 Forward-Port-Of: odoo/odoo#288801
The calendar event 'Linked to' field now suggests only relevant business records, making it easier for users to choose the right related item. The reference selector also supports searching and filtering, reducing long lists and speeding up selection.
Original PR description
Improve the models suggested in the "Linked to" field on the "calendar.event" model. We should only have business models. Also improving the reference field to use a select menu instead of the regular select element. This allows to search for a model and reduce the selection depending on the search term. Task-6563387 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287832
The Sales dashboard no longer adds an extra Sales Orders filter when users click the To Deliver or To Invoice cards. This makes the displayed filters match the selected dashboard card more clearly, without changing the orders included in the results.
Original PR description
Steps to produce: --- - Install sales module with demo data. - Go to quotations > Click on `To deliver` or `To invoice` filter. For the `To deliver` and `To invoice` button, the `Sales Orders` filter is redundant. There is no need to have it. Remove the Sales Orders filter when clicking the To Deliver and To Invoice dashboard cards. Both filters already only return confirmed sales orders, making the additional Sales Orders filter redundant. This creates a 1:1 mapping between each dashboard card and its displayed search filter. opw-6574937 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288744
Users can now open the same quick action menu from the members panel and messaging menu items, not just individual messages. This makes common mail and Discuss actions easier to access and reduces accidental text selection when using long-press on iOS Safari.
Original PR description
Before this PR, we could right-click on messages to show the message actions. This feature was only limited to messages. This PR adds the same feature in member panel and messaging menu item. Also drastically reduces chances for long-press on iOS Safari to trigger accidental text selection. Task-6463002 Forward-Port-Of: odoo/odoo#273806
The AI Agent interface now makes it easier to choose which subagents are allowed to help with a task. This improves clarity for users configuring AI agents and should reduce selection mistakes.
Original PR description
task-[6578342](https://www.odoo.com/odoo/2366/tasks/6578342) Forward-Port-Of: odoo/enterprise#131951
Secondary buttons now keep a consistent border appearance on hover, while disabled buttons use the same style with reduced opacity. Stat buttons also follow the regular secondary hover behavior, giving users a more consistent interface across forms.
Original PR description
The secondary buttons border no longer darkens on hover, and their disabled design now repeats the regular style with an opacity, like the other variants. The stat buttons were forced to the view background color on hover, they now get the regular btn-outline-secondary hover. task-6562366 Forward-Port-Of: odoo/enterprise#131275
Studio users can now choose an end date field when configuring date filters in search views. This helps businesses create more accurate date-range filters, especially for records that span a start and end date.
Original PR description
This commit is the counter part of odoo/odoo#288280 and allows to select an end_date field on date filters in studio. Task-6546268
This update ensures the Wise profile identifier is saved after related Wise connection settings are updated. This helps keep direct deposit configuration consistent and reduces setup issues for U.S. payroll payments.
Original PR description
The wise_profile_identifier is reset after writing on wise_api_key or wise_environment, so assign it after the first 2 values.
Belgian payroll now supports transport reimbursement for each separate home-work trip when JC302 employees or workers have interrupted shifts on the same day. This helps ensure private car and bicycle reimbursements match the actual number of qualifying commutes, while public transport season-ticket handling stays unchanged.
Original PR description
1. Employees and workers under JC302 with interrupted shifts can receive transport reimbursement for each home-work trip, based on separate work entries on the same day. 2. Public-transport season-ticket handling remains unchanged. Task-6532008
Knowledge article editors can now opt in to a whiteboard embedding command from the editor menu. This makes it easier for teams to add visual collaboration content directly into Knowledge articles when needed.
Original PR description
See https://github.com/odoo/odoo/pull/262181 This commit make the knowledge article editor opt-in to the whiteboard embedding powerbox command. task-6102610 Forward-Port-Of: odoo/enterprise#116588
Payroll dashboard warnings now load more efficiently by reducing expensive background processing and making warning actions more flexible. This should improve dashboard responsiveness for payroll teams, especially where many warning checks are displayed.
Original PR description
Prior to this commit, the payroll dashboard could experience high latency during load times. This was primarily caused by the heavy use of `safe_eval` to compute Python-based warning actions…
Prior to this commit, the payroll dashboard could experience high latency during load times. This was primarily caused by the heavy use of `safe_eval` to compute Python-based warning actions (`evaluation_code`), as well as the rigidity of the `button_action` (Many2one) field which limited dynamic UI routing. This commit refactors the warning action system to fix these performance issues and clear technical debt: - Replaced the relational `button_action` field with a generic JSON-driven `action_config` text field on `hr.payroll.warning`. - Migrated all existing data records in `hr_payroll`, `l10n_be_hr_payroll`, and `l10n_be_hr_payroll_account` to use `action_config`. - Converted several Python-evaluated warnings into pure `domain` warnings by moving static dictionary generation and `group_by` clauses into the JSON configuration, allowing the backend to skip `safe_eval` entirely. - Improved the separation of concerns: the backend strictly handles ORM detection (`warning_domain`), while `action_config` handles UI routing. - Set up the infrastructure to support volatile frontend context keys (e.g., for autofocusing fields) without polluting the ORM context.
Odoo now supports Obox features in the Android app, including kiosk mode. This enables businesses using Point of Sale and POS Self Order to run supported Obox workflows on Android devices more smoothly.
The appointment calendar side panel now behaves consistently when editing an appointment type. This removes a visual flicker and prevents activity items from appearing when their filter is not shown, making the experience clearer for users.
Original PR description
Previously the activity filter was removed from the sidepanel when an appointment type was in edition. This introduced a side panel flicker when toggling the edition mode. Also, the activity events were still being displayed in the calendar which doesn't make any sense. Make the activity display consistent with its filter state by removing the "showActivityFilter" override. Task-6573460 Forward-Port-Of: odoo/enterprise#131720
Studio now handles AI options directly on regular fields, so users no longer need a separate AI-field drop action. The update also improves wording and the Studio promotion dialog, making the AI field experience clearer and more consistent.
Original PR description
Forward-Port-Of: odoo/enterprise#131981
Appointment booking screens and emails are clearer and more consistent. Users get better default reminders, more readable appointment cards, improved popover layout, and confirmation emails that greet the right attendee when bookings are made internally.
Original PR description
This commit improves the UI of appointment: * To improve the readability of the "total_capacity_reserved" field in the records of the kanban view, its background color is lightened. * The default…
This commit improves the UI of appointment: * To improve the readability of the "total_capacity_reserved" field in the records of the kanban view, its background color is lightened. * The default alarm of the appointment type is set to 1 day. * The name of the appointment booker is no longer used for the greeting in the confirmation email since it is not set if the appointment is done from the backend. Instead of it, the first of the attendees is used and if they do not exist, the organizer is used. * The popover is improved. Margins are placed between the buttons in the footer, to avoid having them stuck to each other. A maximal width is set for the videocall_location field, this way it does not impact the size of the popover. * To avoid a technical label, the default falsy label of CalendarEvent.resource_ids, which is "Undefined Attendee", is replaced by "Unassigned". Community PR: https://github.com/odoo/odoo/pull/288801 Task-6566639 Forward-Port-Of: odoo/enterprise#131840
Belgian payroll now automatically sets a disabled spouse's fiscal status to "without income" so the correct withholding tax scale is applied. This helps ensure employees with a disabled spouse receive the appropriate tax treatment and reduces manual payroll errors.
Original PR description
When an employee has a disabled spouse, the employee automatically qualifies for withholding tax scale 2 (Bareme II), so the spouse fiscal status must be "without income". If Disabled Spouse is set to True, the spouse fiscal status is now automatically set to "without_income". In Disabled Spouse is not selected, the fiscal status can be manually changed to any other option. task-6542651
The Belgian payroll module now uses the latest officially indexed economic unemployment bonus rates. This helps ensure payslip calculations reflect current legal compensation amounts for affected employees.
Original PR description
Update the economic_unemployment_bonus parameter values to reflect the official rate indexation. task-6541797
Belgian payroll users now get clearer warnings when employees are missing time off allocations, helping HR teams spot and resolve issues before payroll or leave planning is affected. The employee and time off dashboards also make it easier for managers to grant the needed allocations directly from the relevant screens.
Original PR description
mock- https://link.excalidraw.com/l/65VNwvy7c4X/1BoTHSkGUpa - Added new warning on payroll dashboard for employees not having allocation. Doesn't apply to employees without contract and salary…
mock- https://link.excalidraw.com/l/65VNwvy7c4X/1BoTHSkGUpa
- Added new warning on payroll dashboard for employees not having allocation.
Doesn't apply to employees without contract and salary structure dirigeant.
- Added "Not defined" on employee form o-stat-value when there is no allocation.
- Added new button "Grant Time off" on employee Time Off dashboard only visible
to time off managers and when no allocation. On click-> new allocation request
form opens.
- Updated fields for New Allocation request form from Time Off Dasboard:-
- Removed name field.
- Rename "Ask for" to "Duration" for `number_of_day_display` field.
- Change time type field to widget time type tags
- New button "Grant" in place of "Submit Request" directly approves requests.
- Updated the popover form for Time off gantt:
- Warning message on no allocation shows is in alert-danger class.
- If there is no enough allocation then "Allocate & Add" appears which
creates required allocations with leaves.
task-6476239