Thursday, September 17, 2026
20 changes · saas-19.3
Resolved issues and error corrections
This fix trims extra spaces from saved filter values before the system reads them. It helps prevent filters from failing unexpectedly when values contain leading or trailing whitespace, improving reliability for users.
Original PR description
task-6578010 Forward-Port-Of: odoo/odoo#288643 Forward-Port-Of: odoo/odoo#288528
Clicking informational text shown under a many2one field no longer automatically focuses the field or opens its dropdown. This makes it easier for users to select or copy that extra text without triggering unwanted suggestions.
Original PR description
Clicking on the informative extra text of a many2one field would focus the field and open the dropdown, making it inconvenient for the user to simply select or copy the text. This commit prevents the many2one dropdown from opening when the user clicks on the extra lines. Task-6538439 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Canadian Balance Sheet now displays correctly when using the split horizontally option. Assets are separated from Equity and Liabilities as intended, making the report easier to read and reducing confusion for users reviewing financial statements.
Original PR description
The Canadian Balance Sheet "split horizontally" feature was broken during the refactor [1]. This commit - fixes the correct split between the Assets on the right and the Equity and Liabilities on the left, - remove the redundant split=right on child of aforementioned category. [1]: https://github.com/odoo/enterprise/pull/114127 task-none (DSH finding) **before** <img width="1903" height="861" alt="image" src="https://github.com/user-attachments/assets/58ee1ab8-5ca4-4d80-9567-5588d70b3f64" /> **after** <img width="1916" height="881" alt="image" src="https://github.com/user-attachments/assets/894358cd-d18a-4039-a468-65c7cabb20cf" />
This update fixes an unstable automated test for the payroll pay run process by correcting missing steps in the test flow. It helps improve release confidence and reduces false test failures without changing payroll features for users.
Original PR description
backporting a fix for the payrun tour test. backport of https://github.com/odoo/enterprise/commit/d429ac73d19b56dcea46012c1440c2630fe239be runbot-941109
The Manufacturing app now shows draft manufacturing orders more clearly in the Kanban progress bar. This makes it easier for users to spot orders that have not yet moved forward, reducing confusion when reviewing production status.
Original PR description
Issue before this commit: ========================= The draft progress segment in the manufacturing order Kanban view is barely visible against the background. <img width="442" height="145"…
Issue before this commit: ========================= The draft progress segment in the manufacturing order Kanban view is barely visible against the background. <img width="442" height="145" alt="image" src="https://github.com/user-attachments/assets/9ba3e4ef-7b91-4c82-86ee-1fe0e47f472f" /> Steps to reproduce: =================== - Install MRP. - Create a draft manufacturing order. - Open the manufacturing orders in the Kanban view. - Observe the progress bar and notice that the segment representing the draft state is barely visible Cause of the issue: =================== In this [commit](https://github.com/odoo/odoo/pull/251475/changes#diff-3bad372563263ef117de6ed9e222008e2a27b2ea212df89f72f269066a8eacacR603) the manufacturing order Kanban progress bar was changed to represent order states. Draft orders were assigned the `light` color, which blends into the Kanban background and makes their segment barely visible. After this commit: ================== The progress segment for the draft state is clearly visible, allowing users to easily distinguish draft orders in the Kanban view. <img width="343" height="123" alt="image" src="https://github.com/user-attachments/assets/6646143f-a299-4544-b8b5-115e13ebf8c5" />
This fixes the wording of a French electronic invoicing/reporting setting that had been changed incorrectly. The corrected text better reflects that users may be choosing not to send documents to the French public platform, helping avoid confusion during configuration.
Original PR description
When we removed the pilot phase setting from the view, we changed that setting to only mean Enable e-reporting. But that's a mistake. In fact people are also choosing not to send to the PPF, so the previous sentence was still right. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288518
Product tax selection now shows all relevant taxes in the search popup instead of filtering by goods or services. This gives users more flexibility to apply service taxes to goods, or goods taxes to services, when their business process requires it.
Original PR description
With this commit:- - We remove the tax-scope filter from the Search more taxes in the product page's tax fields (Sales taxes and Purchase taxes). - The purpose of doing so is that we should not restrict the user from using service taxes in goods and vice versa. task-6527424 Forward-Port-Of: odoo/odoo#288187
Long bill reference text in the Outstanding Credits or Outstanding Debits sections is now shortened visually so it stays within the page layout. This keeps Credit Notes and Vendor Bills readable and avoids display issues when references are unusually long.
Original PR description
The "Outstanding credits" or "Outstanding debits" sections of a Credit Note or Vendor Bill will overflow when the "Bill Reference" is too long. We resolve this by applying the text-truncate class.…
The "Outstanding credits" or "Outstanding debits" sections of a Credit Note or Vendor Bill will overflow when the "Bill Reference" is too long. We resolve this by applying the text-truncate class. Steps to Reproduce: 1. Create a new 19.0 db and load demo data. 2. Accounting -> Vendors -> Refunds -> RBILL/2026/09/0001 3. Click the entry in the Outstanding credits section. 4. Enter a long "Bill Reference" value, e.g. asdf asdfasfasdfasdfasdfasdfasdfasdfasdfasdfasdf. 5. Go back to the Credit Note and observe the text overflow. opw-6558982 <img width="1254" height="1162" alt="bill_reference_long" src="https://github.com/user-attachments/assets/8c762b50-65a8-44bf-9a28-bd34887d5928" /> <img width="1620" height="1294" alt="overflow" src="https://github.com/user-attachments/assets/f5c47404-fb7f-4715-8815-cabe5dda3805" /> <img width="1586" height="1159" alt="truncated" src="https://github.com/user-attachments/assets/2a80f656-0a12-4805-9c1d-fd20379655ce" /> Forward-Port-Of: odoo/odoo#288389
Long-pressing an order line in Point of Sale no longer resets a manually adjusted price back to the product's original price. This helps cashiers preserve intended pricing and avoid accidental billing changes during order handling.
Original PR description
Long-pressing an order line recomputed its price and reset it to the product's original price. Preserve the existing price when the product is neither configurable nor part of a combo. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6570304 Forward-Port-Of: odoo/odoo#288053
Renames confusing approval options for time off and allocation requests so they match the approver names shown on employee records. This helps users understand that the HR Responsible, not the Time Off approver, is notified for the relevant approval step.
Original PR description
## Issue Currently, the different options for the approval of a time off (allocation) request are the following: 1. None needed 2. By Time Off Officer 3. By Employee's Approver 4. By Employee's…
## Issue
Currently, the different options for the approval of a time off (allocation) request are the following:
1. None needed
2. By Time Off Officer
3. By Employee's Approver
4. By Employee's Approver and Time Off Officer
On the Employee's view form, in the Settings tab, the approvers are named:
1. HR Responsible
2. Time Off
The *By Time Off Officer* option does not notify the *Time Off* approver, but the *HR Responsible*, which is not clear for the users. It would be clearer to use a similar naming convention for both the Approvers on the Employee's form and the options for the approval of the time off (allocation) requests.
<img width="1878" height="592" alt="6535827" src="https://github.com/user-attachments/assets/bc7ad9bb-6b53-4553-8fc8-fb305e7c0b28" />
## Steps to reproduce
1. Install *Time Off* (`hr_holidays`)
2. For an Employee E, set an HR Responsible and a (different) Time Off approvers
3. Create a Time Off request for the Employee E
- Ensure that the selected Time Off Type has its approval method set to "By Time Off Officer"
4. **The user notified off the time off request is the HR Responsible, which is unexpected, considering that we expect an approval from the "Time Off Officer".**
## Justification
In the `_get_responsible_for_approval` method, when using the "By Time Off Officer" option (`'hr'`), it is clearly the `hr_responsible_id` (HR Responsible) who is selected as "responsible" for the approval.
https://github.com/odoo/odoo/blob/dbed91769c48768f58b6a66bff0ed6d90394de38/addons/hr_holidays/models/hr_leave.py#L1557-L1559
The exact same logic is applied for the allocation requests [here](https://github.com/odoo/odoo/blob/dbed91769c48768f58b6a66bff0ed6d90394de38/addons/hr_holidays/models/hr_leave_allocation.py#L1070-L1072).
## Targeted version
We are targeting version 19.2, as it is the version from which the `responsible_ids` field (which was clearly specifying who had to be notified for the approval of a time off request) was removed (see https://github.com/odoo/odoo/commit/d37cf89a6ff134988b4a7c001a97973cd95a2ea8).
If deemed interesting, the same modification can be backported to previous versions too.
opw-6535827
Forward-Port-Of: odoo/odoo#287686Point of Sale users can now clear the preselected customer filter when viewing quotations or orders. This lets them see all available quotations and orders instead of remaining limited to the customer selected earlier.
Original PR description
When a customer was selected before opening the quotations/orders view, a default partner filter was applied. However, the partner was also added directly to the domain. Therefore, removing the partner filter from the search bar had no effect, as the domain continued to restrict the records to that partner. We now only use the default search filter so that users can remove it and display all available quotations/orders. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6537521 Forward-Port-Of: odoo/odoo#287689
Fixes an error that could appear when a user clicked a shared Sign document link while still editing a website page. This prevents an unexpected crash message and keeps the website editing experience smooth.
Original PR description
# How to reproduce - Go to Sign > Templates - Upload a PDF & click on Share - Copy the link - Go to a page with a EditInBackend systray item (e.g. a Product or Event page) - In the editor, add the…
# How to reproduce - Go to Sign > Templates - Upload a PDF & click on Share - Copy the link - Go to a page with a EditInBackend systray item (e.g. a Product or Event page) - In the editor, add the copied link to a button or some text - Save - While still in editor mode, click the link # The issue A traceback is shown # Cause The traceback is caused by the call to this function : https://github.com/odoo/odoo/blob/f8c29412e71af098b2949f485a8011b01b64b368/addons/website/static/src/services/website_service.js#L336 In our case, `this.currentWebsite.metadata.mainObject` is undefined, so trying to access `.model` throws. `mainObject` is undefined because the sign link opens an XML file, which does not have any metadata associated to it : https://github.com/odoo/odoo/blob/f8c29412e71af098b2949f485a8011b01b64b368/addons/website/static/src/services/website_service.js#L150-L155 The call to `getUserModelName` is done by the `EditInBackendSystrayItem` component which subscribes to the "CONTENT-UPDATED" event : https://github.com/odoo/odoo/blob/f8c29412e71af098b2949f485a8011b01b64b368/addons/website/static/src/client_actions/website_preview/edit_in_backend.js#L33 However, this method should not be called by the bus because the sign page does not have this systray item. The issue is, the display of the component is managed by the `WebsiteSystrayItem`, based on the `hasEditableRecordInBackend` getter : https://github.com/odoo/odoo/blob/f8c29412e71af098b2949f485a8011b01b64b368/addons/website/static/src/client_actions/website_preview/website_systray_item.js#L10 https://github.com/odoo/odoo/blob/f8c29412e71af098b2949f485a8011b01b64b368/addons/website/static/src/client_actions/website_preview/website_systray_item.xml#L9 And the re-render of that component that would remove the `EditInBackendSystrayItem` component is triggered by a call to `renderAndAdapt`, which is also subscribed to "CONTENT-UPDATED" : https://github.com/odoo/odoo/blob/f8c29412e71af098b2949f485a8011b01b64b368/addons/website/static/src/components/navbar/navbar.js#L48 So the destroy of the `EditInBackendSystrayItem`, which should remove the listener that calls `getUserModelName` is trigerred AFTER the call to that function is already done opw-6443794 Forward-Port-Of: odoo/odoo#281763
Website editors can now clear an embedded code snippet and have that empty state saved properly. This prevents old embed content from reappearing after a page reload, making website editing behavior consistent and predictable.
Original PR description
Scenario: - drop embedded code snippet - edit it to add a value - edit it to put it empty - save Result: on reload the embed is not removed and the old value is restored In 18.2, setting it empty would work and you would see an info alert: "Your Embed Code snippet doesn't have anything to display. Click on Edit to modify it." Fix: delete the embed field if it is saved empty. opw-5454289 Forward-Port-Of: odoo/odoo#251537
This fixes an issue in the HTML editor where clicking at the end of text inside a button moved the cursor outside the button. Users can now more reliably edit button labels directly, reducing frustration when creating or updating website content.
Original PR description
Problem: When trying to place the caret at the end of a button's content with the mouse, the caret always moves outside of the button instead of staying inside it. Cause: This happens because of the previous commit https://github.com/odoo-dev/odoo/commit/c8e93dbc806b5ea511cce695afbc9e81e30a1ca9 (which aimed to fix placing the caret after a link when at the end of a paragraph in the editable), which was not fixing the issue properly. Solution: Check if the click happens at the end of a link and the caret will move inside the link then manually place the selection after the link. Steps to reproduce: - Add a button with one character. - Try to put selection after that character. - Selection always jumps after the button. opw-6499237 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288408 Forward-Port-Of: odoo/odoo#284197
Fixed a mismatch in how cancelled online payments are recognized between Odoo and the payment service. This helps ensure cancelled payments are processed with the correct status and reduces related errors.
Original PR description
Fix a typo in payment statu `cancelled`. In odoofin, we send `cancelled` as payment status, but we're expecting `canceled` on Odoo side. This commit fix the typo on Odoo side. Sentry-7699036141
The Norwegian tax report now lists eVAT tax codes in a consistent order. This prevents random test failures and improves confidence that generated tax report files remain stable and reliable.
Original PR description
The Norwegian tax report is built from ordered elements, but the summary detail per tax code is appended from a list that is quasi-directly calculated straight from PostgreSQL. The query does not request a specific result order causing indeterminism (it depends on the query plan chosen: hash vs. sort aggregate, parallel workers) when the whole XML tree is compared against a golden copy in tests. An explicit ORDER BY clause is added to the taxes query. The chosen key is the tax_code, because these can be casted for integer natural sort. The produced XML tree can be compared in its entirety without random failures. REF Runbot; https://runbot.odoo.com/odoo/error/939532 Forward-Port-Of: odoo/enterprise#131702 Forward-Port-Of: odoo/enterprise#131307
The map view now uses the record limit configured on the action when no map-specific limit is set. This makes map behavior consistent with other views such as list and kanban, helping users see the expected number of records.
Original PR description
Backport of odoo/enterprise#130336 The map view only considered the `limit` set in the arch, ignoring the one coming from the action (`ir.actions.act_window.limit`), unlike other views (list, kanban) which fall back to it. task-6531776 Forward-Port-Of: odoo/enterprise#131719 Forward-Port-Of: odoo/enterprise#131423
Users can now click old file links in HTML fields even if the original attachment has been deleted. Instead of crashing, the editor handles the missing file safely, keeping records usable and avoiding client errors.
Original PR description
Clicking a stale /web/content/<id> link in an HTML field crashed the client after the related attachment had been deleted. **Steps to reproduce:** 1. Open any record with an HTML field (e.g. Project…
Clicking a stale /web/content/<id> link in an HTML field crashed the client after the related attachment had been deleted. **Steps to reproduce:** 1. Open any record with an HTML field (e.g. Project > Task description). 2. Upload a file into the HTML field to embed an attachment link. 3. Save the record. 4. Delete the uploaded attachment from Chatter > Files, or from Settings > Technical > Attachments. 5. Reopen the record and click the embedded file link. **Client Error:** `TypeError: Cannot destructure property 'mimetype' of '(intermediate value)' as it is undefined at LinkPopover.loadAsyncLinkPreview` `TypeError: Cannot destructure property 'type' of '(intermediate value)' as it is undefined at LinkPopover.updateDocumentState` When the attachment is missing, ormService.read returns an empty array, so fetchAttachmentMetaData returned undefined instead of entering its catch block. LinkPopover then crashed while destructuring that result in loadAsyncLinkPreview and updateDocumentState. Return a safe fallback metadata object when the attachment cannot be found so both code paths keep working without crashing. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#279281
This fix ensures help text shown from spreadsheet actions keeps its intended trusted formatting instead of appearing as escaped plain text. Users will see clearer guidance and properly rendered help content when opening linked actions from spreadsheets.
Original PR description
Current behavior before PR: - `navigateTo` cleans up the action description using `JSON.parse(JSON.stringify(...))`. - This removes Owl's `markup()` wrapper from the `help` field. - As a result, the trusted HTML is converted to a plain string and gets escaped instead of being rendered. Desired behavior after PR is merged: - Pass the action description directly to doAction. - `_preprocessAction` already provides defensive fallbacks for individual fields, such as `action.domain || [] and action.display_name || action.name || "".` - Therefore, undefined fields or missing keys are handled safely without the need for the JSON round-trip. - This preserves the trusted markup in the help field and renders the HTML correctly. Task: [6428217](https://www.odoo.com/odoo/project/2328/tasks/6428217) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286191
This fix prevents users from triggering duplicate delete actions on the same attachment in Discuss when connections are slow. It avoids unnecessary error messages and improves reliability when managing message attachments before sending.
Original PR description
**Steps to reproduce:** - Open Discuss app - Open any conversation - Setup the browser with throttled connection (e.g. Slow 4G) - Select multiple files to attach but don't send the message - While…
**Steps to reproduce:**
- Open Discuss app
- Open any conversation
- Setup the browser with throttled connection (e.g. Slow 4G)
- Select multiple files to attach but don't send the message
- While some are loading, double click the delete button of one of the loaded attachment preview
- Traceback will appear: `404 Not Found`
**Issue:**
On click the delete button triggers a deletion request on `/mail/attachment/delete`.
Repeatedly clicking the delete button before the first request was completed (and the `AttachmentList` get updated) but after the attachment was deleted, will cause a `404 Not Found` due to the `raise NotFound()` which was added by [1] in `mail_attachment_delete`.
```py
attachment = request.env["ir.attachment"].browse(int(attachment_id)).exists()
if not attachment or not attachment._has_attachments_ownership([access_token]):
request.env.user._bus_send("ir.attachment/delete", {"id": attachment_id})
raise NotFound()
```
**Fix:**
Prevent concurrent deletion requests for the same attachment by keeping track of attachments currently being deleted.
[1] https://github.com/odoo/odoo/commit/50f45dd436b97027cb1461410efeee7057dad4e8#
opw-6499125
Forward-Port-Of: odoo/odoo#288371
Forward-Port-Of: odoo/odoo#285060