Wednesday, August 26, 2026
41 changes · master
Enhancements to existing features
Purchase reporting now includes the related project, so teams can break down purchase orders by project. This makes it easier to build project-based purchase insights in spreadsheets and dashboards.
Original PR description
Before this commit, it was not possible for the user to analyze his purchase orders based on the project related inside purchase report. This commit adds the project_id field inside that report to be able to use in spreadsheet or dashboard app.
Room bookings and point-of-sale order tracking now start listening for updates from the correct point in time. This reduces the chance of users missing important live notifications during the brief moment between loading information and subscribing to updates.
Original PR description
…point Add the `bus_info` to the room booking view. Required not to miss any notifications between fetch and first subscription. community: https://github.com/odoo/odoo/pull/283436
Payroll users can now access closure days directly from the Payroll app menu. This makes it easier for payroll teams to manage company closure days in the same place as related payroll work.
The data cleaning merge preview dialog has been simplified by removing unnecessary titles and repeated descriptions. This makes the information easier to scan and helps users understand merge decisions with less distraction.
Original PR description
Simplify the merge preview dialog by removing noisy titles and redundant descriptions, making its sections more consistent and easier to understand. task-6236930
The older Belgian POS blackbox module is no longer available for new installations because it is planned to be replaced by a newer module. This helps new users avoid starting with a module that will soon be deprecated, while existing setups are not described as being changed.
Original PR description
The module `pos_blackbox_be` will soon be deprecated and replaced by `l10n_be_pos_blackbox`. To avoid new users installing the old module, we make it not installable anymore.
The general ledger report can now include invoice dates when that column is configured. This gives finance teams clearer context for ledger entries without needing to cross-check invoices separately.
Original PR description
If a column is added with `expression_label` equal to `invoice_date`, include that in results of `_report_custom_engine_general_ledger`. task-5917897 Forward-Port-Of: odoo/enterprise#128938 Forward-Port-Of: odoo/enterprise#113774
Event registration forms now show general, once-per-order questions before attendee-specific questions. This makes the checkout flow easier to follow and better matches what users expect during registration.
Original PR description
**Purpose:** We keep general questions after individual questions, usually users expect it other way around **Specifications:** Move the once per order block on top of the modal Task-6314437
A warning now appears when a Brazilian NFS-e invoice is still pending, explaining that each manual status check consumes one IAP credit. This helps users make informed decisions and avoid unexpected credit usage.
Original PR description
Add a yellow warning message after issuing an NFS-e and the l10n_br_edi_last_edi_status = pending so the user will know that every time they click on "Check NFS-e Status" it will consume 1 IAP credit. Task-id: [6385938](https://www.odoo.com/odoo/project/967/tasks/6385938)
The Planning settings now describe the geolocation option more clearly, helping users understand what the feature does. The Billing setting text was also standardized by removing extra punctuation for a more consistent settings experience.
Original PR description
## [IMP] planning: update geolocation feature description This commit updates the description of the geolocation feature in the Planning settings. ## [IMP] project_timesheet_forecast_field_service_sale: update setting description In this commit, we remove the dot at the end of the "Billing" setting to match standard setting descriptions. task-6450511
Resolved issues and error corrections
This fixes a display issue where the employee presence badge could appear in the corner of employee cards instead of on the avatar. The change keeps the badge styling limited to avatar layouts, improving visual consistency in HR screens.
Original PR description
Commit[^1] moved the badge's overlap styling out of a SCSS rule scoped to `.o_hr_employee_form_view … .o_employee_avatar` and into `additionalClasses` on the field registry entry. Those classes are…
Commit[^1] moved the badge's overlap styling out of a SCSS rule scoped to `.o_hr_employee_form_view … .o_employee_avatar` and into `additionalClasses` on the field registry entry. Those classes are applied unconditionally, so `position-absolute top-0 end-0 bg-light rounded-circle` leaked into every usage of the widget. On the kanban card the field sits in a non-positioned `float-end` div, so the badge resolved against `.o_kanban_record` and pinned itself to the card corner as a grey disc. A later commit papered over the symptom with `mt-1` (Commit[^2]), removed here. The overlap styling goes back to SCSS, scoped to `.o_employee_avatar` — the container marking the three "badge over picture" layouts, including the enterprise wizard the original rule missed. Also drops a `margin: unset !important` kanban rule left inert since the same refactor. task-6487546 [^1]: https://github.com/odoo/odoo/commit/dc8f38b1054664a0e382530bb4fc73983e2085cb [^2]: https://github.com/odoo/odoo/commit/fbae74ab0c6fa1d8fc0789b27bd60062a5bd29bf --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Features or functions removed from Odoo
Helpdesk and Frontdesk no longer show duplicate “Today” date filters now that the system provides this option automatically. This keeps search menus cleaner and prevents saved defaults from pointing to removed filter options.
Original PR description
Remove the Today filters on Closed On / Creation Date / Rated On (helpdesk) and next to Date (frontdesk), that are redundant with the relative filters we introduced in the previous [PR](https://github.com/odoo/odoo/pull/267980) Community: https://github.com/odoo/odoo/pull/284154
Code cleanup and technical improvements
This update renames an internal loyalty coupon reference to a card reference in German POS certification and Mexican POS invoicing areas. It keeps these country-specific POS features aligned with the broader loyalty system refactor, reducing the risk of inconsistencies during future upgrades.
Original PR description
As part of the pos_loyalty refactor, the pos_orderline.coupon_id field was renamed to pos_orderline.card_id. This PR renames wherever the field is used to keep everything consistent Community PR-[#274951](https://github.com/odoo/odoo/pull/274951) Upgrade PR-[#10948](https://github.com/odoo/upgrade/pull/10948)
Rating snippets now keep their accessibility label in sync when the number of stars changes. This helps screen reader users understand ratings correctly across website pages and mass mailing content.
Original PR description
aria-label was not used correctly on s_rating snippet. Moreover, it was not updated when the number of stars is updated. Now, aria-label is updated correctly. Task-6009931
Businesses using only Point of Sale can now access the product variants setting from their POS configuration. This fixes a missing option that prevented OAF plan users from enabling product variants when no other related apps were installed.
Original PR description
If only PoS is installed (if you are on the OAF plan). The variants settings is unavailable and cannot be activated. Steps to reproduce: ------------------- * Install only PoS * Look for variant in settings > Observation: The option is not showing up Why the fix: ------------ The setting is just a copy of the other places where the settings is available. opw-6378568 Forward-Port-Of: odoo/odoo#276179
This update fixes an issue that could cause certain employee searches to fail or return incorrect results for users without access to private employee data. It helps ensure HR search behavior remains reliable while preserving existing access restrictions.
Original PR description
The hack to search fields as a user that has no access to private employee data and searching on the `current_version_id` instead of the provided field since we force to wrap searchable fields domains in a Query in odoo/odoo#280373. The hack did not support usage of the 'any!' operator on `current_version_id` leading to a query like: "hr_employee.id in (select id from hr_version ...)". task-6468820 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284271 Forward-Port-Of: odoo/odoo#283811
A test that simulates buying a rental product on the website has been temporarily disabled because the related rental planning flow is still changing. This avoids repeated false failures while the final process is being settled, with no direct change to customer-facing features.
Original PR description
Given the rapid changes in spec for `{website_}sale_renting_planning` it doesn't make sense to fix the tour only for the flow to break right away after. Therefore, the tour is temporarily disabled until the flow of the module(s) is finalized.
task-6389324
Forward-Port-Of: odoo/enterprise#128170This fixes a display problem that could stop contact or user avatars from loading when their last update date was missing. Users should see a more reliable interface in forms and kanban views instead of encountering an error.
Original PR description
Issue: The `Many2OneAvatarField` and `KanbanMany2OneAvatarField` templates were directly calling `value.write_date?.toMillis()`. Optional chaining does not handle the case where `write_date` is `false`, resulting in a `TypeError` because `toMillis()` is not available on a boolean value. Solution: Added a `uniqueId` getter in both `Many2OneAvatarField` and `KanbanMany2OneAvatarField` to safely handle a missing or false `write_date`. The getter calls `toMillis()` only when `write_date` is available and returns `undefined` otherwise. Both templates now use `uniqueId` for the avatar URL. opw-6464172 Forward-Port-Of: odoo/odoo#284015 Forward-Port-Of: odoo/odoo#282659
The Sign app no longer replaces existing rules that control when the Mark Done button is shown in the activity scheduling wizard. This prevents the button from appearing in inappropriate cases and avoids conflicts with other apps that also manage its visibility.
Original PR description
Previously, the sign module was completely overwriting the `invisible` attribute on the "Mark Done" (`action_schedule_activities_done`) button in the activity schedule wizard. This inadvertently discarded base conditions (such as hiding the button when `has_error` is true) and caused conflicts with other modules (like `calendar`) that also need to modify this button's visibility. This commit updates the view inheritance to safely append the sign condition using `add` and `separator="or"`, preserving all existing visibility rules. Task-6499751 Forward-Port-Of: odoo/enterprise#129005
This fix keeps accountant knowledge PDF navigation working across newer and older PyPDF versions. It reduces the risk of errors when generating or processing PDF documents after library updates.
Original PR description
On latest versions of PyPDF, the `outlines` attribute was renamed to `outline`, we now handle both attributes to provide compatibility with both versions. A similar issue arises with the `addLink` method, which was renamed to `add_link`, and later replaced by `add_annotation`. Another similar issue arises with the `add_bookmark` method, which was replaced by `add_outline_item`. task-6474715 version-19.4 Forward-Port-Of: odoo/enterprise#127074
The image editor toolbar now shows the Wrap text icon correctly when users adjust image alignment. This removes a small visual glitch that could make the option look missing or unavailable.
Original PR description
### Steps to reproduce: - Insert an image in the HTML Editor (e.g. via /media). - Select the image and click on the alignment dropdown option in the toolbar. - Observe that the `Wrap text` icon is invisible. ### Purpose of this PR: - The `Wrap text` icon was set to `text_wrap`, which is an invalid Material Symbols icon name and was missing from the font subset. This PR fixes the issue by updating the icon to `format_image_left` in `image_plugin.js` and `oi_to_ms.scss`, adding `format_image_left` to `icons_wishlist.txt`, and regenerating the icon font subset. task-6448292 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a website builder issue where connection shapes could switch to black or white when adjacent sections used the same background color plus an image or video. Shapes now keep the intended matching color, making page designs more consistent for editors and visitors.
Original PR description
When the user has not set a specific color to a connection shape, and changes the background color of the connected block, the builder automatically updates the color of the shape to match. There is an exception if the color of the shape is the same as the one of its block (in that case it uses a contrasting color). This commit removes the exception if the block also has a image background or a video background (because those will cover the color background once loaded, so that background does not really count) Steps to reproduce: - Open website builder - Drop a block - Set a color as "Background" - Set an image as "Background" (or a video) - Click on the "Shape" option and select a one in "Connections" - Drop a second block - Set the same color as "Background" - Bug: the shape get a contrasting color (black or white) instead of the background color of the neighbor task-6483027
This fixes a small styling issue in the HTML editor’s link popup by removing an invalid layout setting. The popup should continue to behave as before, with cleaner underlying code and reduced risk of browser styling quirks.
Original PR description
This PR aims to remove the unnecessary max-width property having invalid unit value from `link_popover.xml`, as the existing behavior is correct without it. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website link tracking page no longer shows SEO optimization, page properties, or link tracker menu actions that are not useful for visitor-facing content. This reduces confusion for website editors and keeps management options focused on pages where they add value.
Original PR description
Since [this commit][1] you're able to optimize the link tracker page using "optimize seo." This makes no sense as it contains no useful content for visitors to the website. Access to the action is now disabled when the current page is the link tracking page. The page properties and link tracker menu items have also been removed for similar reasons. [1]: https://github.com/odoo/odoo/commit/ac55f2bb113ecf7c774fe6e96d28e716184a97d1 Task-6288891 Forward-Port-Of: odoo/odoo#283954 Forward-Port-Of: odoo/odoo#278132
When users insert dynamic fields in the HTML editor, related fields now default to a readable display name instead of a technical ID. This makes generated content clearer while still allowing users to choose the ID field when needed.
Original PR description
*: project Before this commit: when clicking a field having sub fields (canFollowRelationFor is true), we just return this field's id, which is not very useful in most cases. After this commit: We created subclass of DynamicPlaceholderPopover, EditorDynamicPlaceholderPopover, which uses EditorModelFieldSelectorPopover. We use the display name of the followable field by default and if the user really want the id, they may choose the id subfield. We also show the followable field's name as the default placeholder instead of "Display name". task-6265223 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283748 Forward-Port-Of: odoo/odoo#272129
When the cookie banner remains enabled, clearing the cookie policy page now restores the default policy page instead of leaving the website without one. This prevents administrators from losing access to the setting and helps keep cookie-related website configuration consistent.
Original PR description
Steps to reproduce: - enable the cookies bar in the website settings and save - clear the "Cookie Policy Page" field and save The website was left without a cookie policy page while the cookies bar was still enabled. Since the settings view only displays the field when it has a value, it disappeared with no way to set it back, other than toggling the cookies bar off and on again. The default policy page was only restored when the `cookies_bar` flag itself changed, so a write clearing only `cookie_policy_id` slipped through. Restore the default page whenever the policy is emptied while the cookies bar remains enabled, so the field reappears with the default page after saving. task-6356766 Forward-Port-Of: odoo/odoo#273901
This fix prevents Accounting payment terms from crashing when a user enters zero or negative day values for end-of-month due dates. Instead of showing a technical error, the system can now handle the calculation safely and show the appropriate validation message when the record is saved.
Original PR description
Steps to reproduce: - Install `Accounting` module - Payment Terms > Create NEW - Add a new Due Term line with "Days end of month on the" and a negative amount of days(eg: -1) Traceback: `ValueError: day is out of range for month` When `days_next_month` is set to a negative value, it is passed directly to `relativedelta` as the 'day' value. Since a negative value is not a valid day of the month, the due-date computation raises a `ValueError`. Use the end of the month for the calculation when `days_next_month` is non-positive. This prevents the traceback while computing the payment term and allows the proper validation error to be raised when the record is saved. opw-6453640 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283865 Forward-Port-Of: odoo/odoo#281904
This fix prevents Belgian Intrastat reporting from crashing in rare cases where company data is accessed without the expected permissions. It mainly protects future customizations or edge-case setups, with no expected change for normal day-to-day use.
Original PR description
Due to some trouble with tests, we found that in some cases, this function is called on the root company, and if the user does not have the access rights to read data from the company (users with system rights have them by default), it will cause a crash. This situation is not possible with the standard UI, but we fix it in case it becomes possible in a future version or customization. Forward-Port-Of: odoo/enterprise#128212
The AI livechat snippet now has a preview image again, so it displays correctly before the feature is installed. This helps website editors recognize and choose the livechat block more easily in the website builder.
Original PR description
Problem: 1) The preview image of the livechat snippet was removed in this [commit][1] and wasn't replaced with another image. As a result, the uninstalled livechat snippet doesn't display properly in the website builder. Solutions: 1) An image has been added `ai_livechat.png` which is shown on preview Note: This fix will change in master to be up to date with current website snippet previews. The location will be moved to `snippet_previews` and the file type will be changed to `.webp` [1]: https://github.com/odoo/enterprise/commit/df05441e469157890253b5550b5f8735723b28fb Task-5248712 Forward-Port-Of: odoo/enterprise#126361
This fix updates a payroll test so it checks only rows containing payroll data, instead of counting automatically added blank rows. This prevents false test failures and helps keep payroll release validation stable.
Original PR description
Issue: The original trigger was searching for 2 table rows, when it enforces 4 with added empty rows. The [getEmptyRowIds](https://github.com/odoo/odoo/blob/33dc65bbac165f33030ad3da59ea785b69482b3f/addons/web/static/src/views/list/list_renderer.js#L1104-L1110) enforces max of 4 rows. The condtional (one up the stack) !ctx["this"].props.list.isGrouped&&!ctx["this"].props.noContentHelp returns true, and it adds empty rows. Fix: Since this enforces 4 rows with empty rows we check the rows that have data instead of how many rows are added. Because anything less than or equal to 4 but greater than 0 records it will always be 4 table rows while the conditional above returns true . opw-6349513 <img width="1337" height="674" alt="Screenshot 2026-07-15 at 4 53 51 PM" src="https://github.com/user-attachments/assets/76f53521-ec9f-4807-9083-95533904b5de" /> Forward-Port-Of: odoo/enterprise#127531 Forward-Port-Of: odoo/enterprise#125091
The mass mailing feature now correctly excludes temporary wizard screens from the list of models that can be used for mailings. This prevents inappropriate or unusable system objects from appearing as mailing targets, improving reliability and reducing confusion.
Original PR description
The search function ` _search_is_mailing_enabled` mistakenly used `model.is_transient()` (where the model is the `ir.model` record itself) to filter the transient models, which always returns `False` since `ir.model` is a regular persistent model. As a result, transient models (wizards) were never filtered out. This commit fixes it by using`self.env[model.model].is_transient()` to call `is_transient` on the actual model. Task-6458883 Forward-Port-Of: odoo/odoo#283781 Forward-Port-Of: odoo/odoo#282783
The HTML editor now places the drag-and-drop move handle on the correct side when users work in right-to-left languages. This improves editing usability and visual consistency for languages such as Arabic or Hebrew.
Original PR description
Problem: In MoveNodePlugin, `setMovableElement` sets the position of the drag-and-drop handler without considering `this.config.direction === "rtl"`. The handler is placed on the left side regardless of text direction. Solution: - In RTL mode, calculate the handle position from the right edge of the element so it is placed on the right side with the same distance as in LTR. - Update hover hooks, editable bounds, and dropzone rectangles for RTL mode. Steps to reproduce: 1. Open the editor in RTL mode. 2. Hover over a movable block element (e.g. `<p>`). => The move handle appears on the left side of the element instead of the right. task-6442717 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284190 Forward-Port-Of: odoo/odoo#281249
The HTML editor now keeps background colors when users turn colored text into lists or turn list items back into regular paragraphs. This prevents formatting from unexpectedly disappearing and makes document editing more consistent.
Original PR description
Problem: Background color was lost both when converting text with a background color into a list item and when converting a list item with a background color back into a paragraph. Cause: - `insertListAfter` only copied `color` from the font wrapper to `li.style.color`, ignoring `background-color`. - Unwrapping a list item (`ListPlugin`) extracted `color`, `font-size`, and `text-align`, but ignored `backgroundColor`. Solution: - Preserve `background-color` from font wrapper onto `li.style.backgroundColor` when creating a list. - Restore `li.style.backgroundColor` onto a `<font>` wrapper when unwrapping a list item. Steps to reproduce: - Apply background color to a paragraph and toggle list -> background color is lost. - Apply background color to a list item and toggle list off -> background color is lost. opw-6481665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283158
The ecommerce product comparison page now shows the product tags table only when at least one tag is visible to shoppers. This prevents customers from seeing an empty specifications section when products only have hidden tags.
Original PR description
The product specifications table is displayed whenever the product has tags, even if none of them are visible on the ecommerce website. The product tags template filters out non-visible tags, but the…
The product specifications table is displayed whenever the product has tags, even if none of them are visible on the ecommerce website. The product tags template filters out non-visible tags, but the surrounding table remains rendered and appears empty. Only display the tags table when at least one tag is visible on ecommerce. @Tecnativa TT63855 **Description of the issue/feature this PR addresses:** The condition used to display the product tags table considers all tags associated with the product, including those that are not visible on ecommerce. **Current behavior before PR:** When a product only has non-visible tags, the tags table is displayed without any content. <img width="669" height="350" alt="image" src="https://github.com/user-attachments/assets/4758ea76-5186-4035-a065-aa4c71ce7053" /> **Desired behavior after PR is merged:** The tags table is only displayed when the product has at least one tag visible on ecommerce. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282348 Forward-Port-Of: odoo/odoo#278604
This fixes an issue where Australian tax reporting data could fail if the optional Australian reports module was not installed. The change keeps report calculation logic aligned with the module that provides it, improving reliability for Australian localization setups.
Original PR description
We had a case where l10n_au and account_reports were installed together, but not l10n_au_reports (manually uninstalled ?). Since the custom engine was used on expressions in l10n_au, this failed. Custom engines should always be used and declared within the same module (or a submodule of the one defining the handler) to avoid such issues. opw-6451274 Forward-Port-Of: odoo/odoo#282790
This fix keeps Australian report-specific calculation logic within the same reporting module that provides it. This prevents errors when Australian localization is installed without the optional Australian reports module, improving reliability for affected configurations.
Original PR description
We had a case where l10n_au and account_reports were installed together, but not l10n_au_reports (manually uninstalled ?). Since the custom engine was used on expressions in l10n_au, this failed. Custom engines should always be used and declared within the same module (or a submodule of the one defining the handler) to avoid such issues. opw-6451274 Forward-Port-Of: odoo/enterprise#128132
This update prevents a rare crash in Hungarian Intrastat reporting when company data is accessed in unusual permission scenarios. It helps keep reporting stable for future customizations or edge cases, even though the issue is not expected through the standard user interface.
Original PR description
Due to some trouble with tests, we found that in some cases, this function is called on the root company, and if the user does not have the access rights to read data from the company (users with system rights have them by default), it will cause a crash. This situation is not possible with the standard UI, but we fix it in case it becomes possible in a future version or customization. Forward-Port-Of: odoo/enterprise#128218
Tax return submission now checks account settings only for tax groups that are actually used. This prevents businesses from being blocked by incomplete setup on unused tax groups, making tax closing smoother without changing reporting results.
Original PR description
…ax closing Steps to reproduce: - Remove the tax payable and receivable accounts of a tax group for which no move exists. - Open the tax returns view, set the opening date and submit the tax return -> Odoo prevents going further because the tax group configuration isn't fully done, but it's useless to ensure that for tax groups that aren't used. Forward-Port-Of: odoo/enterprise#128197
The expense dashboard was updated as part of Odoo’s Owl 3 migration, replacing an older internal component update mechanism with its newer equivalent. This keeps the HR Expense interface aligned with the platform’s latest technology and helps reduce future maintenance risk without changing user-facing functionality.
Original PR description
As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update replaces an older internal screen-update mechanism across several Odoo apps so they remain compatible with the next version of Odoo's web interface framework. It is a behind-the-scenes cleanup with no intended change to everyday workflows.
Original PR description
One last batch of grouped mechanical `useLayoutEffect` migration before having to do the rest one by one. WHY: useLayoutEffect is removed in OWL3 Enterprise PR: https://github.com/odoo/enterprise/pull/128927 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change updates several Odoo Enterprise apps to use newer internal screen update mechanisms. It helps keep Documents, Social, Marketing Automation, Spreadsheet, and Timesheets compatible with upcoming platform changes without changing day-to-day functionality.
Original PR description
One last batch of grouped mechanical `useLayoutEffect` migration before having to do the rest one by one. Community PR: https://github.com/odoo/odoo/pull/284142
This change updates internal web interface code as part of Odoo's move to the newer Owl 3 framework. It helps keep the web client maintainable and compatible with future platform improvements, with no expected direct change for day-to-day users.
Original PR description
As part of the Owl 3 migration, this pr aims to replace **onWillUpdateProps** hook with the appropriate Owl 3 alternatives. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr