Wednesday, September 16, 2026
74 changes · master
Enhancements to existing features
Odoo now removes reliance on an outdated spreadsheet-writing library and uses the maintained reader for older Excel imports. This reduces maintenance risk while preserving the ability to import existing .xls files and newer .xlsx files through the appropriate tools.
Original PR description
(see commit message) task-2480034 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A small internal flag was added to the base module setup to prepare for possible future support for loading test data. This does not change day-to-day user workflows now, but it makes a later backport or rollout easier and safer.
Original PR description
Part of https://github.com/odoo/odoo/pull/284989 for 20.0 Introduce the new test data flag on ir.module.module in case we want to backport the feature in 20.0 later.
Settings pages now include clearer spacing between the top control area and the settings form. This small visual adjustment improves readability and keeps the layout consistent across Odoo editions.
Original PR description
ENT: https://github.com/odoo/enterprise/pull/131451 task-6570898 | Before | After | |--------|--------| | <img width="1704" height="567" alt="Screenshot 2026-09-14 at 17 06 55" src="https://github.com/user-attachments/assets/8adfb0f8-97e3-4405-975f-2b3a198e35e5" /> | <img width="1706" height="547" alt="Screenshot 2026-09-15 at 15 51 45" src="https://github.com/user-attachments/assets/311569f0-d0f7-4e7b-ac21-754f4e3e9fff" /> |
Spreadsheet imports now rely on the maintained Excel handling already required by the system, instead of an older library that is no longer used for XLSX files. This keeps accounting import tests aligned with the current dependency setup and reduces outdated technical baggage without changing day-to-day user workflows.
Original PR description
xlrd is not used anymore for xlsx files. https://github.com/odoo/odoo/pull/286896
The contact smart button for Signature Requests now opens a complete list of all related requests, including those still awaiting signature. This removes confusion where the displayed count did not match the documents shown and makes requests easier to review.
Original PR description
The Signature Requests smart button on a contact opened a kanban view filtered to signed documents, while the number displayed on the button also included requests awaiting a signature. Users could therefore see fewer documents than the number displayed on the button, with no indication that a filter was applied. Open the requests in a list view without any filter, so that all requests counted by the smart button are displayed and easier to scan. task-6575586
The activity view now has softer cell gradients and slightly more padding after the web client redesign. This makes activity information easier to scan and gives the interface a cleaner, more polished appearance.
Original PR description
| Header | Header | |--------|--------| | <img width="264" height="77" alt="image" src="https://github.com/user-attachments/assets/95dd9535-c66a-420e-8e34-cd2a3a44c195" /> | <img width="262" height="80" alt="image" src="https://github.com/user-attachments/assets/2e62ad1a-afc1-4999-b4b1-f2b534597504" /> | This PR finetunes the cells of the activity view after the webclient redesign. It slightly reduces the strength of the gradient applied on the cells and adds a bit of padding. task-6577089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update removes an obsolete internal option from expense receipt extraction and Stripe expense processing. It helps keep the expense workflow code simpler and easier to maintain without changing how users handle expenses.
Original PR description
Remove the check parameter as it is not used anywwhere anymore Related: https://github.com/odoo/odoo/pull/288256
The website shop carousel filter has been renamed from “Newest Products” to “Newest Arrivals” and now uses the same sorting logic as the shop page. This makes product presentation more consistent for website editors and shoppers, reducing confusion around which items are shown as new.
Original PR description
Currently, the `Newest Products` dynamic filter shows products that were recently created and published. This is inconsistent with the `Newest Arrivals` filter already used on the /shop page, which…
Currently, the `Newest Products` dynamic filter shows products that were recently created and published. This is inconsistent with the `Newest Arrivals` filter already used on the /shop page, which sorts products according to publish date. Steps to produce: --- - Install the website_sale module with demo data. - Navigate to Website and open the homepage in edit mode. - Add a Dynamic Snippet Carousel to the homepage. - Click on the newly added carousel. - In the right-side Edit panel, select the Dynamic Carousel settings. - Observe that the Current Filter is set to Newest Products by default. This PR aligns the dynamic filter with the /shop page behavior by: - Renaming the filter from `Newest Products` to `Newest Arrivals` (including its XML ID) for consistency. - Updating the underlying sort logic to match the /shop page's `Newest Arrivals` filter. - Updating the related tests accordingly. upgrade PR: https://github.com/odoo/upgrade/pull/10668 opw-6331212 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now routes Gevent worker web requests through the same internal HTTP server used elsewhere, while still relying on Gevent for connection handling. This reduces duplicate server logic and should make future maintenance more consistent without changing business workflows.
Original PR description
The Gevent worker (started in a subprocess by the PreforkServer) was still using the WSGI server of gevent, although we have our own server since [h11]. We think it is a good idea to consolidate the codebase around a single server, then to use multiple different ones. The Threaded and Prefork servers are calling `socket.accept()` themselves, doing the same for geven is proving more difficult, so we decided to still rely on Gevent and its StreamServer class for the socket management, but leave the HTTP part to our h11-based WSGI server. Co-authored-by: Chong Wang <cwg@odoo.com>
Several localization modules were updated so their company settings continue to align with a recent change to the VAT field in the base system. This helps keep country-specific reporting, payroll, payments, and e-invoicing settings working consistently after the underlying template change.
Original PR description
*au_hr_payroll_api,be_reports,bg_reports,ca_payment_cpa005,cl_edi, de_intrastat,eu_oss_reports,ke_edi_oscu,lu_reports,nl_reports, ph_reports,uy_edi In the associated community PR, the vat field has changed a bit for a new feature, this updates the view that were xpathing to it. task-6285604
The purchase dashboard KPI cards have been visually updated so the Days to Order card matches the other dashboard cards. This improves readability and consistency by using clearer backgrounds and rounded styling.
Original PR description
Before this PR, the not all the KPI's backgrounds were updated to be visible with the new background. Now they are raised to bg-200 and border-radius was added. | Before | After | |--------|--------| | <img width="1681" height="193" alt="Screenshot 2026-09-14 at 15 16 27" src="https://github.com/user-attachments/assets/7cb39825-cf19-4872-97a1-5203fe79b8ff" /> | <img width="1681" height="193" alt="Screenshot 2026-09-14 at 15 16 05" src="https://github.com/user-attachments/assets/19f5f8cc-6eab-47b3-9604-ea1500d3d653" /> | task-6570029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The invite people experience in Discuss has been visually refined to match the rest of the interface. Search fields, selected person chips, invitation links, result rows, and dialog spacing now feel more consistent and easier to scan.
Original PR description
The invite people panel did not match the rest of Discuss. Its search field was square, while every other search input in Discuss is pill-shaped, and its result rows were stacked flush against each other without any padding. Give the search field the same pill shape and height as the one of `mail.SearchInput`, used by the member list and the sidebar. Add padding and a gap between result rows, and let the selected person chips and the invitation link field follow the same pill language. The dialog wrapping these panels, opened by "+ Chat" and by the "Invite people" entries, had almost no padding of its own, letting its content touch the modal border. Use the standard modal body padding instead. <img width="1716" height="686" alt="invite-popover-comparison-zoom" src="https://github.com/user-attachments/assets/d6338e61-3c72-49cc-a0b6-f5bfb73eaed0" />
The ellipsis menu buttons in Odoo Discuss now use a consistent size and hover style across related screens. This creates a more polished and predictable experience for users interacting with chat, channels, and messaging menus.
Original PR description
Before this commit, ellipsis buttons in Discuss had an inconsistent style (different size, different hover effect). This commit harmonizes the style with a shared classname `.o-discuss-ellipsisButton`. <img width="1188" height="1130" alt="ellipsis-button-before-after" src="https://github.com/user-attachments/assets/54e7f6f8-1308-4075-adaf-7b95230e2a70" />
Completed activity meeting links now keep users connected to the record they came from, making it easier to return after viewing a meeting. The change also improves these links in email notifications so navigation remains reliable outside the app.
Original PR description
If you clicked on the activity meeting link of a done activity, you'd have no robust way of going back to the record you were on. Using this instead of _get_html_link and adding base_url in order to work on email notifications too. Task-6577150
The AI assistant connection setup now includes clearer hints about the information users need to provide. This makes it easier for users to configure the connection correctly and reduces confusion during setup.
Original PR description
This commit adds hint to the MCP configuration dialog describing the parameters required to connect an AI assistant, making the setup process clearer for users. task-6375961
Helpdesk users will no longer receive an empty PDF when trying to print timesheets for a ticket with no logged time. Instead, the system shows a notification, keeping the action available while avoiding confusing blank reports.
Original PR description
Before this PR --- - The "Timesheets" print action was available from helpdesk tickets even when no timesheet entries were logged on the ticket - Clicking the action generated an empty timesheet PDF After this PR --- - The "Timesheets" print action remains available on helpdesk tickets - When no timesheet entries are available to print, a toast notification is displayed instead of generating an empty PDF task-5361456
Dropdown menus have been visually adjusted to better match Odoo's new Frost design direction. This improves interface consistency and polish for users across enterprise web screens without changing business workflows.
Original PR description
This commit adapts the dropdown layout to better align with the new Frost design. task-6542810 Requires: - https://github.com/odoo/odoo/pull/287459
The spreadsheet dashboard grid now better matches the surrounding action interface color. This creates a more consistent visual experience for users working with spreadsheet dashboards.
Original PR description
Task-6542221
Payroll run lists now show the most recent entries first. This makes it easier for payroll teams to find and review current pay runs without scrolling through older records.
Original PR description
-Order of payruns has been adjusted to show the newest firstly.
Odoo settings can now store text-based options directly through configuration parameters. This makes it easier for businesses and implementers to manage longer or multi-line setting values consistently without extra custom work.
Spreadsheet dashboards now use a grid color that matches the surrounding action interface. This creates a more consistent visual experience for users working with dashboards and spreadsheets.
Original PR description
Task-6542221
The Guatemala and Peru localization settings have been moved higher in the Accounting settings page. This makes electronic invoicing configuration immediately visible when users arrive from dashboard links or warnings, reducing scrolling and setup friction.
Original PR description
Purpose: Moving the Guatemalan/Peruvian Localization section higher in the settings ensures that when a user is redirected from the Accounting Dashboard or from warnings, the relevant EDI configuration is immediately visible without scrolling. task-6572740
Sales service products can now have a task template selected even when no project is assigned. This reduces setup friction while keeping choices relevant by limiting templates based on whether a project is selected.
Original PR description
The task template field on the product form was hidden if there were no project set on the service, forcing users to set a project before being able to pick a task template. With this commit, the task template can be selected even without project. Further, if no project is set, only task templates without project can be chosen. Finally, if a project is set then task templates either matching the project or without project can be selected. task-6514809
Project administrators can now open a project's settings directly from the task kanban or list view using a new cog menu action. This saves time by reducing navigation steps while keeping the option limited to users with project administration rights.
Original PR description
In this commit, we add a "Configure Project" action to the cog menu of the kanban and list views of tasks. This action redirects to the form view of the current project and is only visible for users with 'project > admin' access rights. task-6533807
The VoIP project app now includes required access group information when the user session starts. This avoids an extra background request during startup, helping the web client load more efficiently.
Original PR description
The voip app needs this group at startup: https://github.com/odoo/enterprise/blob/c50de485ab5c0fa7927652d4129629b5b674ca37/voip_project/static/src/softphone/softphone_model_patch.js#L14 This commit adds the group inside the session info to avoid extra RPCs at webclient startup. The exact same thing is done for `voip_crm` task-6565730 Forward-Port-Of: odoo/enterprise#131207
The VoIP recruitment integration now includes a needed permission check during the initial session load. This reduces extra background requests when the web client starts, helping the app open more efficiently without changing user workflows.
Original PR description
The voip app needs this group at startup: https://github.com/odoo/enterprise/blob/203c85cade63a6564f5051d318916aaf0ea87df5/voip_hr_recruitment/static/src/softphone/softphone_model_patch.js#L14 This commit adds the group inside the session info to avoid extra RPCs at webclient startup. The exact same thing is done for other voip_* bridge modules task-6565730 Forward-Port-Of: odoo/enterprise#131210
Resolved issues and error corrections
Updated website builder test checks so they continue to pass with newer Chrome behavior. This helps keep quality checks stable without changing the website features users see.
Original PR description
In Chrome 152, single-value `background-size` properties may be serialized or expanded to include implicit dimensions (e.g., appending `auto` like `100px auto`), causing strict exact-string test assertions to fail. This commit updates `website` builder test expectations to use regex prefix matching or substring inclusion so tests remain reliable across different Chrome versions. Note: this is a followup of https://github.com/odoo/odoo/pull/285591 where I missed one occurence during forward-port. My bad. runbot-946570 Forward-Port-Of: odoo/odoo#288519
Features or functions removed from Odoo
An obsolete Belgian point-of-sale module was removed because it only contained empty placeholder files. This cleanup reduces maintenance overhead without changing business functionality for users.
Original PR description
This module only contained static empty files
Code cleanup and technical improvements
This fix restores the correct spacing around status bars when they appear inside dialog windows. It improves visual consistency and prevents cramped layouts in affected Odoo forms.
Original PR description
| Master | This PR | |--------|--------| | <img width="1016" height="393" alt="image" src="https://github.com/user-attachments/assets/5c60052d-c95b-4351-8ed5-ae122d4db5d6" /> | <img width="1006" height="312" alt="image" src="https://github.com/user-attachments/assets/6b88796f-5eb9-4fb8-b685-b59feed796e9" /> | This PR fixes an oversight from Commit[^1] which omitted the scenario of a statusbar rendered within a dialog. As we relied on the padding utility class for this scenario, we need to set the CSS variable in the dialog context as well. [^1]: https://github.com/odoo/odoo/commit/95e354c75386dc514e8fd0905ab8d348c7fb6ecd task-6578339 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Message previews in Odoo Mail now prevent links and mentions from triggering their own actions when clicked. This helps users reliably open the intended conversation or related record from previews without accidental navigation or unwanted interactions.
Original PR description
Prior to this commit, clicking links or mentions in the message preview could trigger their actions instead of opening the related record. This could happen when clicking the preview from the messaging menu, while links and mentions in the chat bubble preview could also be clicked directly. This commit prevents clicking links and mentions from triggering their actions in message previews in both the messaging menu and chat bubbles. The links and mentions keep their visual appearance, but clicking the preview now only opens the related record in messaging menu and does nothing in bubble preview. Task-6569382 https://github.com/user-attachments/assets/8565bfa2-848f-424e-8378-bcacc43dfba8 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The change prevents installation failures when using Dutch VAT reporting by making shared VAT payment warning settings available outside the Belgian localization. This helps affected companies install and use the reporting module without duplicate setup logic or broken views.
Original PR description
*: account_reports, l10n_be_reports --- Description of the issue this commit addresses: Since commit 8a2d22f9fdac, the Dutch VAT payment wizard view references a warning field and configuration action defined only by the Belgian localization. Installing l10n_nl_reports therefore fails during view validation. --- Desired behavior after this commit is merged: This commit moves the shared field and action to the generic QR payment wizard, making them available to both localizations without duplication --- task-6578161
This fixes an unwanted gap between the control panel and the settings form in Odoo Enterprise. The change makes the settings page layout appear more consistent and polished for users.
Original PR description
In Enterprise, the spacing between the control panel and the settings form view is not wanted. COM: https://github.com/odoo/odoo/pull/288107 task-6570898
This update cleans up several manufacturing and inventory screens so key status information is clearer and visual icons are more consistent. It also fixes a display issue where draft manufacturing orders were missing their status indicator, helping users scan work orders and stock operations more reliably.
Original PR description
1) the state of an MO now stays on one line in the work order kanban view 2) the icon of package is changed to package_2 in the smart button and kanban view 3) remaining time and date is hidden on a work order card in the kanban view 4) fixed a bug where draft manufacturing orders didn't have a state bubble in the MO kanban view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Manufacturing and work order cards now display key status information more consistently and with cleaner visuals. This makes it easier for users to scan production status, identify draft orders, and recognize package-related actions without visual clutter.
Original PR description
1) the state of an MO now stays on one line in the work order kanban view 2) the icon of package is changed to package_2 in the smart button and kanban view 3) remaining time and date is hidden on a work order card in the kanban view 4) fixed a bug where draft manufacturing orders didn't have a state bubble in the MO kanban view
This fixes an issue where translated labels for partner additional identifiers were not displayed correctly in views. The change ensures labels are translated before rendering, reducing test failures and preventing confusing untranslated text for users.
Original PR description
Problem: Failing tests revealed that the lazy translated labels of the additional identifiers from the multi id latam refactor were not finding translations in the t-out of the views. Markupsafe is resolving the lazy translation first without an env which resulted in the error of not finding a translation. Solution: Resolve the lazy translation of the labels with an established helper method in Python before it hits Markupsafe. Related PR: https://github.com/odoo/enterprise/pull/117163 runbot-build-error-947021 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Planning and Sales Planning apps now correctly create a new planning entry from the Plan dialog when users click an empty schedule cell. This prevents an error message and lets teams continue scheduling work without interruption.
Original PR description
Before this commit, when clicking on an empty cell and when the "Plan" dialog was opened, the "Create New" button produced a traceback. This was because the "assign_slot" rpc was called in "props.onSelected" instead of "props.onCreateEdit". Because "onCreateEdit" not overriden in the planning module, it was defaulting to "onSelected". We fix this by overriding "onCreateEdit" in the planning module and calling the "create" method of the model. task-6574764 version: 20.0
Company-paid expenses now open the related accounting move correctly even when no supplier bill exists or is expected. The update also removes an obsolete internal option in expense handling, reducing maintenance overhead without changing day-to-day workflows.
Original PR description
## [FIX] hr_expense: Fix existing bill view
Fix an issue where company paid expenses
would refuse to display the move if there was no linked bill, even for cases where there would be no existing bill ever
## [IMP] {hr,sale}_expense: Remove deprecated parameter
Remove the check parameter as it is not used anywwhere anymore
Related: https://github.com/odoo/enterprise/pull/131561The website cookie policy now lists the timezone cookie alongside the existing language preference cookie. This helps ensure visitors receive a more complete explanation of essential cookies used before consent is requested.
Original PR description
The cookie policy page must disclose every cookie stored on a visitor's device, including the essential ones set before any consent is given. Add tz to the existing "Preferences (essential)" row next to frontend_lang, and extend that row's purpose to mention the timezone. task-6470891
The chat input request button now uses the standard filled secondary button style instead of a custom border. This keeps the Discuss interface visually consistent with the product theme and improves polish for users.
Original PR description
Drops the inline `border-black` override in favour of proper theme btn styling. task-6528352 | Before | After | |--------|--------| | <img width="392" height="639" alt="image" src="https://github.com/user-attachments/assets/99990e51-b9d9-4b1d-b76a-6ad89422cc18" /> | <img width="390" height="648" alt="image" src="https://github.com/user-attachments/assets/06b64fed-82ca-44cf-b3d8-af7a5a0d6556" /> |
This fixes an internal accounting test so it only checks identifiers that belong to the accounting area. It helps keep automated validation accurate and reduces false failures in development, with no expected change for end users.
Original PR description
The xmlids are defined in `account_reports` runbot-946593
Expense policy limits for job positions are now displayed in the company currency, matching how those limits are configured. This helps avoid confusion when reviewing or applying employee expense rules, especially in multi-currency contexts.
Original PR description
Display job position expense limits using the company currency to match how the limit amount is configure. Also clean up the limit model by moving it to its own file. task-[6445873](https://www.odoo.com/odoo/project/967/tasks/6445873) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The meeting-ready banner is no longer shown in one-to-one direct messages, where inviting others is not applicable. This prevents users from seeing an empty invitation link and keeps the chat experience clearer.
Original PR description
The "Your Meeting is Ready" banner offers to add more people to the call and shows a permanent invitation link to share with them. It is meant for conversations that can grow. In a DM there is nobody else to add, and DMs have no invitation link, so the link input rendered empty. Hide the banner for chat conversations. <img width="2742" height="689" alt="meeting-banner-dm-before-after" src="https://github.com/user-attachments/assets/7eaa527d-8260-4c8c-9425-343cca974d9b" />
The quotation document kanban card layout now has better spacing, making it easier to scan and read. This small visual fix improves the sales quotation builder experience without changing any business workflow.
Original PR description
The kanban card lacks spacing. task-6566640 | Before | After | |--------|--------| | <img width="1307" height="254" alt="image" src="https://github.com/user-attachments/assets/aff159f8-cddc-4b44-b98a-5609c0bf5748" /> | <img width="1363" height="274" alt="image" src="https://github.com/user-attachments/assets/23d135ae-79b0-4287-9d5c-81e44716324c" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an unwanted extra line that could appear in list views when no footer totals were shown, especially with sample data or empty results. The change makes the interface look cleaner and avoids visual confusion for users reviewing lists such as Contacts.
Original PR description
Since 50b1ceabf1b2, the list view redesign gives the footer cells a top border, and at the same time drops their padding when they are empty, so that a footer without any aggregate takes no space. Both rules contradict each other: the row is squashed to a zero height, but its border keeps being painted. And since the table borders are collapsed, that border is painted by the table itself, so it also ignores the opacity the sample mode applies to the footer. Hence the line, especially visible with sample data where everything else is faded out. Only draw the separator when the footer actually holds something, the way the x2many list footers already do in form views. Steps to reproduce: - go to Contacts - add a favorite filter matching no record - go back to the list view: the sample data is displayed, and a stray line is drawn right under the last row
This fix ensures Odoo resets an internal performance counter for the registry itself, not just individual models. It matters for large combined test runs because it prevents Python from disabling a cache that can slow or destabilize extended testing.
Original PR description
reset_classes_tp_versions_used() was only ever fed model classes (registry.values() / self.values()), never the Registry class itself. Since Registry._lock (among others) gets patched on every HttpCase setUpClass/tearDownClass, the shared Registry class silently exhausts CPython 3.13's per-type version-tag budget (1000) over a long test run, permanently disabling its attribute cache, while the periodic reset kept "succeeding" on every other class. This causes issues particularly when testing all the modules in Odoo Community + Enterprise in a single go (not like in runbot)
This update reduces excess spacing around the form view control area and status bar for a cleaner, more balanced layout. It also adjusts the chatter area spacing so the page background and content alignment look more consistent across Odoo editions.
Original PR description
There is too much spacing under the control panel when we are in a form view and the community spacing doesn't work with the background. This commit reviews the spacing of the o_form_statusbar and control_panel, adapted in community and enterprise to a better visual balance. This change requires us to adapt the chatter spacing, removing the margins on the inner element to rely on a padding on the .o-mail-Chatter-topbar instead. task-6531145 Enterprise PR: https://github.com/odoo/enterprise/pull/130825 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The spreadsheet command palette now hides actions that users cannot access from the regular spreadsheet menu. This prevents users from seeing unavailable options and keeps the experience consistent across the interface.
Original PR description
Some items are displayed in the command palette while being hidden in the spreadsheet interface. With this revision, we synchronize the availability of a menu item between the topbar menu and the command palette. Task-6352180 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#273294
The help text for leave type pay rates now explicitly explains that unpaid leave should be configured at 0%. This reduces confusion for HR users when setting up leave policies and helps avoid incorrect payroll-related configuration.
Original PR description
- Update the help tooltip of the pay_rate field on leave types to explicitly mention the 0% configuration for unpaid leaves, preventing user confusion. task-6574198
This update fixes the setup for Latin American check tests so they no longer depend on unnecessary country-specific data. It makes the test suite simpler and more reliable, reducing the risk of false failures during development and quality checks.
Original PR description
Some tests were relying on latam documents or AR master data for no good reason. It only make sense to tests the third party checks with an Argentinean company. Most of the tests should run on a company of any localization. We create two separate setup to reflect that fact, and remove some useless complexity where we can. runbot-947000
This fix ensures Odoo correctly recognizes when a field has no real unsaved change after a user retypes the same value in a different format. It prevents the Save and Discard buttons from remaining stuck on screen when there is nothing left to save, reducing user confusion in forms.
Original PR description
**Description of the issue/feature this PR addresses:** Fixes #287978 In `useInputField` (`input_field_hook.js`), `onChange` and `commitChanges` only trigger the `FIELD_IS_DIRTY` bus event with…
**Description of the issue/feature this PR addresses:** Fixes #287978 In `useInputField` (`input_field_hook.js`), `onChange` and `commitChanges` only trigger the `FIELD_IS_DIRTY` bus event with `false` when the newly typed value actually differs from the value already stored on the record. When the typed text parses to the *same* value as what is already on the record (e.g. retyping `6,250` after the field already holds `6,25`), the code takes the `else` branch, which only resets the displayed text and never notifies the bus that the field is no longer dirty. `form_status_indicator.js` keeps whatever `fieldIsDirty` state it last received from that bus event, and shows the Save/Discard buttons whenever `root.dirty || fieldIsDirty`. Since nothing ever fires `FIELD_IS_DIRTY(false)` in that `else` branch, `fieldIsDirty` stays stuck at `true`. `Discard` correctly resets `root.dirty`, but has no way to reset `fieldIsDirty`, so the Save/Discard buttons keep showing even though the record is clean. **Current behavior before PR:** 1. Edit a field to a new value, click away (value committed, indicator shows Save/Discard as expected). 2. Edit the same field again, this time typing different text that parses to the *same* value (e.g. `1.20` when the field already holds `1.2`), click away. 3. Click **Discard**. The record is reverted, but the Save/Discard buttons remain visible. They stay stuck until the page is reloaded. **Desired behavior after PR is merged:** Retyping different text that parses to the same value clears the field's dirty state like any other case where the field ends up unchanged, so Discard (or any other action) correctly hides the Save/Discard buttons once there is nothing left to save. Forward-Port-Of: odoo/odoo#288030
Adjusted spacing around the form view control panel and chatter area to create a cleaner, more balanced layout. This fixes excessive empty space and keeps the interface visually consistent across Enterprise messaging and WhatsApp-related views.
Original PR description
*: mail_enterprise, whatsapp There is too much spacing under the control panel when we are in a form view and the community spacing doesn't work with the background. This commit reviews the spacing of the o_form_statusbar and control_panel, adapted in community and enterprise to a better visual balance. This change requires us to adapt the chatter spacing, removing the margins on the inner element to rely on a padding on the .o-mail-Chatter-topbar instead. task-6531145 Community PR: https://github.com/odoo/odoo/pull/287003
The spreadsheet command palette is now consistently available from the top bar across all spreadsheet-related actions, not just document views. This fixes an access gap and makes spreadsheet tools easier to reach in different workflows.
Original PR description
The command palette was made available as a topbar menu item but it was only exposed in the document action. Task-6352180 Forward-Port-Of: odoo/enterprise#122423
The Peruvian POS electronic invoicing tests now use the correct sales journal when checking receipts. This keeps automated validation aligned with recent accounting changes and helps prevent false test failures.
Original PR description
Since the POS accounting refactor in odoo/odoo#256889 pos.config.journal_id is the journal used to create invoices, so it has to be a sale journal. Before that it was the journal for session entries and invoice payments, which allowed general journals, and invoices went to invoice_journal_id. runbot-error-947223
This fix prevents an error when a check template filters accounts and the filter returns no results. Businesses can now use such templates without unexpected interruptions or tracebacks during accounting report processing.
Original PR description
When a check template has a domain on account.account that would give no result, it would throw a traceback because min cannot operate on an empty result. Forward-Port-Of: odoo/enterprise#131540
The appraisal process no longer requires a final assessment to be completed. This reduces unnecessary blockers for HR teams and managers when an appraisal can be closed or managed without that final text.
Original PR description
Forward-Port-Of: odoo/enterprise#131393
When the website generator cannot find an attachment, the error log now includes the missing file name. This makes troubleshooting faster because support teams no longer have to rely on an attachment ID that may be empty or unhelpful.
Original PR description
When an attachment is not found, we should log the filename as well as often the attachment id is None and tells us nothing. Forward-Port-Of: odoo/enterprise#131370
The spreadsheet insertion dialog no longer shows an unwanted horizontal scrollbar or duplicate scrolling on small screens. This makes the insert flow cleaner and easier to use, while keeping spreadsheet template styling separate from selector dialogs.
Original PR description
Opening "Insert in Spreadsheet" displayed an unwanted horizontal scrollbar in the spreadsheet selector. On small viewports, it could also produce a second scrollbar alongside the scrollable modal. The selector reused the `o-spreadsheet-templates-dialog` class, whose styles belong to `documents_spreadsheet`. This applied template-only max-height and overflow rules to the selector and made `spreadsheet_edition` rely on styles from a dependent module. Give selector dialogs their own class and keep the template-specific styles on the template dialog. Move the shared pager layout to `spreadsheet_edition` under a dedicated class, and update both pager consumers and the dashboard document selector. Task: 6526781 Forward-Port-Of: odoo/enterprise#131450 Forward-Port-Of: odoo/enterprise#130114
Direct debit mandates now receive a sensible default type when the system cannot find an exact match. This prevents missing selections in cases where only one mandate option exists and the field may be hidden from users.
Original PR description
When no good match is found for the mandate_type, we still want to default on something. In particular when only one concrete implementation of the mandate exists, the field will be hidden since there is only one possible value. task-none
A website test was adjusted so it consistently uses a mock service instead of accidentally calling the real external image API. This reduces false test failures and helps keep the release process stable without changing customer-facing functionality.
Original PR description
The `test_media_dialog_undraw` test monkeypatches `HTML_Editor.media_library_search` to avoid calling the real undraw API during the tour. However, the "routing" ormcache may already hold the controller endpoint built with the original (unpatched) method, if it was resolved by an earlier request served by the same worker. Invalidate the "routing" ormcache after patching so the requests are routed to the patched methods. Same change as done in #271536. https://runbot.odoo.com/odoo/error/939933 Forward-Port-Of: odoo/odoo#288246
This change removes an obsolete calendar connection setup screen and related assets that are no longer used. Calendar syncing is now handled directly by the Google and Microsoft calendar integrations when credentials are configured, reducing maintenance overhead without changing the current user workflow.
Original PR description
Purpose ======= Removing the 'calendar.provider.config' wizard, its associated widget and images as they're not used anywhere. Specification ============= Following…
Purpose ======= Removing the 'calendar.provider.config' wizard, its associated widget and images as they're not used anywhere. Specification ============= Following odoo/odoo@eccb937393ff3fb22e3d341137325782d1faf9cd , the calendar onboarding has been removed which consequently removed the onboarding banner with the "Connect your calendar" button opening the provider wizard. Following odoo/odoo@f78a82df0e712caa82608f35a393e6d522179483 , the "Connect your calendar" xml action opening the wizard has been removed as part of a sync flow reorganization. Following odoo/odoo@d87d5fe51fa945cac014033032f33333168ed579 , the "configureCalendarProviderSync" js method opening the wizard has also been removed. Now, each provider (google_calendar, microsoft_calendar) adds their own sync button in the attendee controller depending on their credentials and sync status. No "Sync" or "Connect" button will be suggested if no google or microsoft credentials are set. Credential settings are only accessible via the Settings. The 'calendar.provider.config' wizard is thus unused, as well as its related widget and the google / microsoft images which was used in its form view. => Removing the dead code Task-6297321 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update modernizes how Odoo handles internal business actions across Studio and many enterprise apps. It should not change day-to-day workflows, but helps keep the platform easier to maintain and aligned with the latest web architecture.
Original PR description
web_studio: replace makeActionManager with StudioActionManagerPlugin (subclass of ActionManagerPlugin), and move its doAction override onto the plugin class instead of monkey-patching it in the service, matching how the dialog service was already handled. Second commit updates every import for odoo/odoo's action_service.js → action_plugin.js rename.
This update restructures how Odoo's web client manages navigation actions and internal messaging, without changing expected user workflows. It helps make the platform easier to maintain and prepares the interface architecture for future improvements while keeping compatibility for existing features.
Original PR description
Extracts env.bus into its own GlobalBusPlugin (temporary EnvBusBridgePlugin keeps env.bus working for legacy callers), then converts the action service into ActionManagerPlugin, keeping a backward-compatible action service shim for existing useService() callers. File renamed to action_plugin.js to match every other migrated service.
Several country-specific payroll, reporting, and localization screens were updated to use the current component validation approach. This is an internal modernization that helps keep these features maintainable and aligned with the platform, with no expected change to day-to-day user workflows.
Original PR description
Replaced deprecated uses of `static props` with calls to `useProps()`, providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.The AI app module and its related Documents and Knowledge connectors have been renamed to better reflect the agent-based AI direction. References, assets, and translations were updated so the renamed modules continue to work consistently, with a dependency simplified behind the scenes.
Original PR description
- Rename `ai_app` to `ai_agentic`. Rename the Documents and Knowledge bridge modules accordingly. - Update all references and asset paths to use the new module names. - Replace the `web_studio` dependency with `base_automation`. task-id-6497307
The AI question tool can now display markdown-style formatting when asking users questions. This makes prompts clearer and easier to read, improving the user experience with AI-assisted workflows.
Original PR description
This commit introduce markdown formatting for the `_ai_tool_ask_user_question` tool.
The barcode scanning system was reorganized to support Odoo's upcoming interface technology migration. This is mainly an internal change that helps keep barcode-related features reliable across areas like events, attendance, point of sale, and self-ordering, without introducing major visible changes for users.
Original PR description
Services need to be converted to Plugin as part of the Owl3 migration. This commit converts the barcodeService into a new BarcodePlugin.
This update modernizes how several Odoo Enterprise apps validate information passed between interface components. It reduces reliance on deprecated code patterns, helping keep manufacturing, planning, projects, rooms, sales, and related tools easier to maintain without changing day-to-day user workflows.
Original PR description
* mrp_mps,mrp_workorder,project_enterprise,obox*,planning*,room,sale_*
Replaced deprecated uses of `static props` with calls to `useProps()`,
providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.The point-of-sale enterprise barcode handling has been reorganized to support Odoo's upcoming platform technology migration. This is an internal change that should help keep barcode features compatible and maintainable without changing day-to-day business workflows.
Original PR description
Services need to be converted to Plugin as part of the Owl3 migration. This commit converts the barcodeService into a new BarcodePlugin.
This update modernizes internal component setup in the Sign and Social apps by replacing an older validation pattern with the current one. It helps keep these apps maintainable and aligned with the platform’s latest standards, with no expected change to day-to-day user workflows.
Original PR description
Replaced deprecated uses of `static props` with calls to `useProps()`,
providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.This pull request appears to be a test related to the Singapore localization area rather than a functional business change. It should have little to no direct impact on users or day-to-day operations.
Original PR description
Ignore. Testing with VIN if the codeowner is properly set. task-because-why-not
This update modernizes internal component definitions across time tracking, timesheet grid, and barcode workflows. It helps keep these areas maintainable and aligned with the current framework, with no expected change to day-to-day user behavior.
Original PR description
Replaced deprecated uses of `static props` with calls to `useProps()`,
providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.This change reorganizes how Odoo handles internal page actions and shared event messaging across many apps. It should preserve existing user workflows while making the platform easier to maintain and extend in future releases.
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 update modernizes the way Odoo opens and manages actions across several business apps, without changing the intended user workflows. It helps keep the platform easier to maintain and prepares these areas for more consistent behavior in future updates.
This update simplifies how inter-company sales, purchases, and stock transfers match related stock movements. It is an internal cleanup that should make the process easier to maintain without changing day-to-day user behavior.
Original PR description
Clean up context key in _find_corresponding_move. The 2 context keys assigned_move_ids and skip_price_check are only used in this specific method. This commit updates to use method parameters instead.