Tuesday, September 22, 2026
22 changes · saas-19.4
Resolved issues and error corrections
Fixes issues in the Documents app spreadsheet template picker where the search bar could disappear when no templates matched and the custom filter option could crash. Users can now search and refine spreadsheet templates without losing the search controls or encountering an error.
Original PR description
- templates searchbar disappear when the search has no match - Clicking "Add a custom filter' in the searchbar crashes Task-6526322 Forward-Port-Of: odoo/enterprise#130376 Forward-Port-Of: odoo/enterprise#130096
This fixes how dates and date-times are shown and saved when using debug mode to set default values. Business users and administrators will see the correct date format, reducing confusion and preventing incorrect default date values from being stored.
Original PR description
Problem: When setting default values in debug mode, the date and datetime values are not formatted correctly. This leads to confusion and incorrect values being set for date fields. Steps to reproduce: 1. Enable debug mode 2. Create a journal entry, set the date to some date (August 31st, for example), and save. 3. Click the bug icon, click Set default values. 4. Click on the dropdown, notice how the date is displayed as datetime instead of date. Cause: The displayed values were not being formatted for date and datetime fields when setting default values. They were just output as strings. Also, dates were not serialized correctly before being sent to the server, they were serialized as datetime instead of date, because the code was checking the constructor name of the value instead of the field type. opw-6533491 Forward-Port-Of: odoo/odoo#287813
The Maintenance app now shows request status with the intended circular indicator in the card-style request view. This fixes a visual inconsistency so users can recognize request states more clearly and consistently.
Original PR description
Issue Before this Commit: ======================== The maintenance request state is displayed as a rounded pill in the kanban view instead of a circular indicator. <img width="500" height="150"…
Issue Before this Commit: ======================== The maintenance request state is displayed as a rounded pill in the kanban view instead of a circular indicator. <img width="500" height="150" alt="image" src="https://github.com/user-attachments/assets/84fe84ef-ff58-4873-bb73-1f375774f149" /> Steps to reproduce ======================== 1. Open the Maintenance app. 2. Open Maintenance Requests. 3. Observe the maintenance request state. The state is displayed as a rounded pill instead of a circular indicator. Cause of the issue: ======================== In the [PR](https://github.com/odoo/odoo/pull/260098), the view type of maintenance requests was changed from `kanban` to `cards`, but the `MaintenanceRequestStateSelection` component still checks for `kanban` in its `isKanbanOrMobileView` method. As a result, it uses the `rounded-pill` styling instead of the circular styling. After this Commit: ======================== Update the condition to correctly check `card` as the view type, so the maintenance request state is displayed as a circular indicator. <img width="500" height="150" alt="image" src="https://github.com/user-attachments/assets/e01b5898-2ec3-45b3-aa79-f7ed7c8e9e9f" />
This fixes an issue where some grid-based views could appear empty after part of the page was rebuilt, until the user scrolled or resized the window. The grid now recalculates immediately when its container changes, keeping content visible and reducing user confusion.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289085 Forward-Port-Of: odoo/odoo#281721
This fixes an issue in the website editor where drop zones around the Animated Cover block could overlap, making it harder to add new content in the right place. Editors should now have a clearer and more reliable drag-and-drop experience when building pages.
Original PR description
Steps to reproduce: - Go to a website page in edit mode. - Drag and drop an "Animated Cover" snippet onto the page. - Try to drag and drop another snippet below it. => The two dropzones overlap. Before this commit, the last dropzone inside the `Animated Cover` snippet overlapped the dropzone used to add a new section below it. After this commit, the first and last dropzones inside the `Animated Cover` snippet are shifted away from adjacent dropzones. task-6588702
This fixes a website display issue where social media icons using the circle style could become hard to see on dark page sections. The icons now keep the appropriate contrasting color, improving readability and visual consistency for website visitors.
Original PR description
Steps to reproduce: - Select a dark website color palette. - Drag and drop a snippet with a dark background onto the page. - Drag and drop a "Social Media" snippet inside it. - Disable the "Color" option. - Select the "Circle" layout. => The icons are not visible against the dark background. Before this commit, the shaped icon fallback introduced by [1] had higher specificity than the `rounded-empty-circle` color reset. It forced a dark color onto icons placed on a dark background. After this commit, `:where()` keeps the fallback selector specificity low, so empty circle icons inherit a contrasting color. [1]: https://github.com/odoo/odoo/commit/cc02feec060a9469f3e4af6b40fb291266beca99
Employees in Belgium can now select a company bike even when using the mobility budget. This aligns the salary package options with legally allowed benefits and avoids blocking a valid employee choice.
Original PR description
When you take the mobility budget, it doesn't allow you to take a company bike. This should be possible as it is legally possible Forward-Port-Of: odoo/enterprise#132405
Email template editors now correctly prevent users from adding embedded videos. This avoids broken or empty email content caused when unsupported video elements are removed during saving.
Original PR description
Steps to reproduce: 1. Go to Settings > Technical > Email Templates. 2. Open any email template. 3. In the Body editor, either paste a YouTube URL and select Embed YouTube Video from the popup, or…
Steps to reproduce: 1. Go to Settings > Technical > Email Templates. 2. Open any email template. 3. In the Body editor, either paste a YouTube URL and select Embed YouTube Video from the popup, or type `/media` and open the 'Videos' tab in the Media dialog. 4. Select a video or embed a YouTube video. 5. Save the email template. Issue: - The YT URL is converted into an `<iframe>` video element in the email template. However, the `<iframe>` element is removed when the template is saved because it is not supported by the email HTML sanitization. - This leaves the surrounding content empty and can result in broken HTML in the email template. The `body_html` field was configured with `allowCommandVideo: false` to prevent video embedding, but this option is not recognized by the HTML field and is therefore ignored. Solution - Use the supported `allowVideo: false` option on the `body_html` field of email templates to disable video embedding in the editor as [this PR](https://github.com/odoo/odoo/pull/219288) has changed the html_field components's attribute. Expected behavior - Video embedding should be disabled in email templates, preventing users from inserting YouTube videos and avoiding `<iframe>` elements that are later removed by HTML sanitization. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286133
This fixes an error that could occur when a user customized the Inventory Overview and removed a card containing a dashboard graph. The page now continues to load normally, making Studio customizations safer for inventory teams.
Original PR description
Steps to reproduce:
- Go to Inventory > Overview
- Enable Studio, delete a kanban card that contains the "picking_type_dashboard_graph" widget (field kanban_dashboard_graph)
> UncaughtPromiseError > OwlError
> TypeError: Cannot read properties of undefined (reading 'includes')
at StockKanbanRenderer.getGroupsOrRecords
Cause of the issue:
`StockKanbanRenderer.getGroupsOrRecords` assumes the field `kanban_dashboard_graph` is always present on every record to detect if all Inventory Overview graphs are sample data and, if so, replace them with randomized values.
By removing the card with studio, we remove the field from the fields fetched for the record, and so `r.data.kanban_dashboard_graph` is `undefined`.
Fix by ignoring records for which the field isn't fetched instead of assuming it's always there.
opw-6512743
Forward-Port-Of: odoo/odoo#285593Custom recorded tours can now be tested directly from the tours list as expected. This prevents a silent failure where pressing “Testing” appeared to do nothing, improving reliability for teams validating guided workflows.
Original PR description
Clicking "Testing" on a custom/recorded tour called startTour with mode "auto" and fromDB true, but getTour() only loaded from the database when mode was "manual". For a tour that only exists in the web_tour.tour record (not in the client-side registry), this left `tour` undefined and startTour() silently did nothing. Load from the database whenever fromDB is set, regardless of mode. Task-id: 6575435 Forward-Port-Of: odoo/odoo#288618 Forward-Port-Of: odoo/odoo#288474
This fix ensures Factur-X invoice files include the required customer name even when an invoicing address has no name of its own. It falls back to the parent commercial partner name, reducing failed e-invoice compliance checks.
Original PR description
Description of the issue/feature this PR addresses: The Factur-X Refactoring (https://github.com/odoo/odoo/pull/284123) introduced an error that can result in the generated XMLs not being compliant…
Description of the issue/feature this PR addresses: The Factur-X Refactoring (https://github.com/odoo/odoo/pull/284123) introduced an error that can result in the generated XMLs not being compliant due to the partner name being missing (BT-44) Current behavior before PR: When a contact has an invoicing address without a name set, then the new Factur-X generation does not fall back to the parent name, leaving the corresponding XML entry empty, which is therefore pruned, leaving the Factur-X without a BT-44 and thus failing BR-07 Desired behavior after PR is merged: The new generation method uses the same data source and fallback method as the old Factur-X generator, pulling the `display_name` of the `commercial_partner_id` if the address doesn't have a `name`. This greatly reduces the chance of a generated Factur-X failing BR-07. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289661 Forward-Port-Of: odoo/odoo#289498
Employees without HR access can now see one-off work locations for colleagues in the calendar, matching the behavior for recurring locations. This helps teams rely on the calendar for accurate daily workplace information without needing elevated HR permissions.
Original PR description
**Steps to reproduce** - With a user having HR rights, create an exceptional work location for a user (click on the top bar of one of the days in the calendar, where work locations are displayed, and do not check "repeat every". - Open the calendar app with a user having no HR rights, in the sidebar, add the user with a non-recurrent work location. Notice that the work location is not visible, unlike recurring ones. **Cause** Recurring work locations are defined on the public employee (`*_location_id` type fields) and are readable by all users. Non-recurring work locations are `hr.employee.location` records and the `homeworking_own_rule` rule restricts read operations for non-HR users. opw-6190464 Forward-Port-Of: odoo/odoo#288438 Forward-Port-Of: odoo/odoo#266380
This fix updates an accounting test to use a proper PDF file instead of invalid sample content. It helps keep automated checks reliable, reducing false failures during development and quality assurance.
Original PR description
Use PDF_RAW from base.tests.files instead of fake (and invalid) PDF content, like the other tests needing a PDF attachment. runbot-946577 Forward-Port-Of: odoo/enterprise#131746
This update corrects how employee work contact information is calculated so access rights are handled consistently. It helps prevent unexpected behavior when viewing or managing HR employee records.
Original PR description
Ensure correct access to avoid unexpected behavior opw-6560194 Forward-Port-Of: odoo/odoo#288661 Forward-Port-Of: odoo/odoo#288063
Generic demo leave types no longer carry a specific country, so they will not interfere when setting a company's country in demo or development environments. Real country-specific leave data remains protected by the existing checks.
Original PR description
_check_country_change_holidays constraint blocks writes to res.company.country_id whenever hr.leave/hr.leave.allocation records exist whose leave type country differs from the new company country. Unset country_id on the generic holiday_status_* demo leave types they are not meant to represent a specific country's holiday policy, so they should not carry a country at all. With country_id set to False, they no longer participate in the country-change constraint. The constraint keeps protecting real country changes on business data, while no longer blocking legitimate demo installs where we configure the main company with our country but rely on demo data for dev instances. Related to https://github.com/odoo/odoo/pull/277346 Forward-Port-Of: odoo/odoo#288983 Forward-Port-Of: odoo/odoo#278749
Odoo now applies a stable ordering when multiple fiscal positions have the same priority. This prevents unpredictable tax or accounting rule selection after data imports, improving consistency for businesses using fiscal positions.
Original PR description
The algorithm to find the right fiscal position works on top of deterministically ordered fiscal position records. This invariant is not enforced by the functional code. Importing data without explicit sequence number results in multiple records ending up with the same value in this column. Sorting by column 'sequence' is not good enough to have repetitive results in this case. The fiscal position algorithm can return a different record due to database implementation details. Adding field "id" to the default ordering ensures the order of fiscal position records remains deterministic. This is because insertion order is preserved and locked into order-preserving id-values when importing data. runbot-945738 Forward-Port-Of: odoo/odoo#289546 Forward-Port-Of: odoo/odoo#289242
This update corrects minor English wording issues in the Peppol activation flow. The clearer language helps present a more polished and trustworthy experience for English-speaking users.
Original PR description
There were some minor English mistakes on the Peppol activation wizard that might make Odoo look cheap and untrustworthy to English-speaking audiences. This commit fixes these english mistakes. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285462
This fix ensures Guatemala fiscal positions are applied in a consistent order, so invoices use the expected tax rules every time. It prevents random test and invoice calculation failures caused by unpredictable ordering.
Original PR description
Test TestGtFlow.test_gt_edi_basic_invoice nondeterministically fails, but the reported error has always the same values. Turns out the code is picking the wrong fiscal position to apply taxes on the prices of the invoice. `res.partner._get_fiscal_position()` searches auto_apply fiscal positions without explicit order, so it relies on the model's default order-by sequence. `account.fiscal.position-gt.csv` carries two records into the database without sequence number, so the order they are returned in is nondeterministic. The resultset is afterwards stable sorted (no tie-breaker between equal sequence numbers) and filtered, so the wrong/unexpected tax can be applied randomly. Explicit sequence numbers are added to account.fiscal.position-gt.csv so the fiscal positions are always returned in-order (domestic first). This approach matches the convention of the other fiscal-position CSVs. runbot-945738 Forward-Port-Of: odoo/enterprise#132377 Forward-Port-Of: odoo/enterprise#131587
This fixes an issue in the HTML editor where Safari users could lose selected text without the replacement character being inserted. Editing notes and other rich text fields is now more reliable when replacing text at the start of content.
Original PR description
When using Safari, if the first character of the editable is selected and a character is pressed, the selection content is removed, but the character is not inserted. It seems that Safari does not trigger the actual `input` event, nor its native behavior, if the initial anchor node is detached from the DOM after `beforeinput`. This commit avoids this issue by preventing Safari from proceeding with the insertion right after the deletion by instead re-triggering the `insertText` command. Steps to reproduce: - Use Safari - Go to a To do note - Select the first word - Press a letter => The first word was deleted but the letter was not inserted. task-6445669 Forward-Port-Of: odoo/odoo#289225 Forward-Port-Of: odoo/odoo#281223
This fix prevents French e-invoicing test checks from failing when the optional PDP component is not installed. It makes the test expectations match the installed configuration, improving reliability for validation and development workflows without changing customer-facing features.
Original PR description
### Issue: Tests in `TestCIIFR` fail when run without `l10n_fr_pdp` installed The expected XML files contain `PMT`, `PMD` and `AAB` notes that are only generated when `l10n_fr_pdp` is installed ### Cause: The note generation for FR e-invoicing lives in `l10n_fr_pdp` When it is not installed, the notes are absent from the generated XML but still present in the expected test files When `l10n_fr_pdp` is not installed, the expected tree is stripped of `PMT`, `PMD` and `AAB` notes before comparison ### Steps to reproduce: - Install `l10n_fr_account` without `l10n_fr_pdp` - Run `TestCIIFR` from `l10n_account_edi_ubl_cii_tests/tests/test_xml_cii_fr.py` Before the fix, the affected tests fail on the `cbc:Note` comparison runbot-945999 Forward-Port-Of: odoo/odoo#284661
The website editor now handles the card image position control more predictably. Clicking the same position button a second time closes the overlay instead of closing and immediately reopening it, reducing confusion while editing website cards.
Original PR description
Steps to reproduce: 1.Open the HTML editor. 2.Drop a card snippet, e.g. s_product_list. 3.Open the position option and click the button. 4.Click the same button again. 5.Before this fix, the overlay closes and immediately reopens. Before this commit: When selecting the position option on a card, clicking the button would open the overlay. Clicking the same button again would close the overlay and immediately reopen it. After this commit: The first click on the position option opens the overlay. The second click on that option closes the overlay without reopening it. task- 6333122 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users who join a Discuss channel themselves will no longer receive a misleading push notification saying they were invited. This avoids confusion and keeps channel notifications accurate for actual invitations only.
Original PR description
Steps to reproduce: -------------------------------------- 1. Install the mail module 2. Allow push notification permissions from the site settings 3. Open Discuss > Go to Channels 4. Click Join on a…
Steps to reproduce: -------------------------------------- 1. Install the mail module 2. Allow push notification permissions from the site settings 3. Open Discuss > Go to Channels 4. Click Join on a channel where the current user is not a member Observation: -------------------------------------- The current user receives a push notification saying: 'User has invited you to this channel.' This is incorrect; the user joined voluntarily. Nobody invited them Issue: -------------------------------------- The commit https://github.com/odoo/odoo/pull/255052/changes/cddd9491c28e9c949efb24d2330c58e35144af12 Adds a push notification when a user is invited to a channel `_add_members` creates the new member and sends a push notification to all newly added members' partner IDs without checking whether a member joined by themselves or was invited by someone else. https://github.com/odoo/odoo/blob/e9cfa0fd65d234bcff8130a2c790cd80ee443595/addons/mail/models/discuss/discuss_channel.py#L830-L853 Interestingly, the bus notification code just a few lines above already makes this distinction using `member.is_self` but the web push block doesn't apply the same filter. https://github.com/odoo/odoo/blob/e9cfa0fd65d234bcff8130a2c790cd80ee443595/addons/mail/models/discuss/discuss_channel.py#L810-L811 Solution: -------------------------------------- Filter out self-joined members from the web push notification recipients. The push notification should only target members who were invited. OPW-6527691