Thursday, April 9, 2026
19 changes · 18.0
Enhancements to existing features
This update ensures Odoo correctly handles tax exemption reasons required by international standards (Peppol). It adds missing tax exemption reasons, improving compliance with regulations and facilitating accurate financial reporting related to UBL invoices.
Original PR description
Some tax exemption reasons were missing, This commit ensures having all the tax exemption reasons introduced by Peppol task-6048561 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254841
Resolved issues and error corrections
This update corrects a display issue where the product count in the stat button on Sale Order Lines created from tasks would incorrectly show '0 products' until the task was saved. Now, the count accurately reflects the products associated with the task, improving the user experience when creating sales orders.
Original PR description
Previously, when creating a Sale Order Line on the fly from a task, the product count in the stat button showed '0 products' until the task was saved. Now, the counter no longer drops to 0 when the record is not saved. task-4276677 Forward-Port-Of: odoo/enterprise#95100
A bug was preventing users from deleting timesheet records when a delete confirmation dialog was open. Pressing Enter would start/stop the timer instead. This update ensures that the delete confirmation dialog is correctly triggered, resolving this unexpected behavior.
Original PR description
When a delete confirmation dialog is open in the timesheet list view, pressing Enter starts/stops the timer instead of confirming the dialog. This happens because the timer's window keydown handler does not check for active modals before intercepting the Enter key. Add a `.modal` check consistent with the grid renderer's onKeyDown. Steps to reproduce: 1) Open timesheet list view 2) Select a record and delete it 3) When the confirmation dialog opens, hit ENTER key Current behavior: The Timer starts recording timesheet Expected behavior: The record should be deleted For ref: https://youtu.be/tzm_3RNe1ig Forward-Port-Of: odoo/enterprise#112583
This update resolves a problem where overridden group names in the accounting module weren't being properly translated. The fix ensures that translated versions of these group names are exported, preventing inconsistencies between the English source strings and the translated versions used within Odoo. This improves the accuracy of translations for users.
Original PR description
The `account_accountant` module overrides the English name of several `res.groups` records owned by `account`. Without `account_accountant`-scoped XMLIDs for those records, the overridden names are never exported into this module's POT file. At runtime, `account`'s translations are loaded instead, which no longer match the overridden English source strings. We fix this by registering additional XMLIDs under `account_accountant` so the overridden names get translated independently. Forward-Port-Of: odoo/enterprise#112898
This update corrects an error in the forum tour, ensuring it correctly guides users through the drag-and-drop process for adding content. The tour has been updated to support both text snippets and forms, enhancing the user experience for the website forum.
Original PR description
This commit fixes the incorrect steps in the forum_cover_dropzone tour added in #257527. The tour util adding the s_text snippet was removed to add a snippet using the drag and drop method. The snippet added was changed to form snippet to also check that forms can be dropped in the s_cover in website_forum.
This update fixes a technical issue where sending snailmail letters with a large number of pages (over 8) would result in a generic error. The change provides a more specific error message, helping users quickly understand and resolve sending failures. This improves the user experience and reduces support requests.
Original PR description
When a user attempted to send a letter with snailmail that had more than 8 pages, sending would fail, and a generic error message is logged on the letter. This commit makes the error message generated in that flow more specific to help users better understand the root cause of sending failure. task-5883011 Forward-Port-Of: odoo/odoo#257867
This update fixes an issue where surveys with conditional questions weren't displaying the correct follow-up questions after a user skipped a question and then answered the initial one. Now, the survey accurately triggers and displays the next relevant questions based on user responses, ensuring a smoother and more accurate survey experience. This improves data collection reliability.
Original PR description
Problem: In a survey that allows roaming, when a user skips a question with conditional questions triggered by its answers, submits the survey and then answers the question, the triggered questions…
Problem: In a survey that allows roaming, when a user skips a question with conditional questions triggered by its answers, submits the survey and then answers the question, the triggered questions are not displayed next. The survey either gets submitted or displays the next skipped mandatory question. Steps to reproduce: 1. Create a survey with roaming allowed and at least 2 questions. 2. Make the first question mandatory and add an answer that triggers the display of the second question. 3. Start the survey, skip the first question and submit the survey. 4. After skipping the first question and trying to submit, answer the first question with the answer that should trigger the second question. 5. Notice how the second question is not displayed and the survey is submitted or the next skipped mandatory question is displayed instead. Cause: When looking for the next question to display, the survey only checks for skipped mandatory questions. It doesn't check if there are any triggered questions that should be displayed before the next skipped mandatory question. opw-5917891
This update ensures that archived product labels are correctly displayed when filtering within the Odoo Sales dashboard. Previously, the system incorrectly filtered out archived products, causing issues with spreadsheet global filters. This fix resolves this issue by correctly loading display names for all records, including archived ones.
Original PR description
## Description: Steps to reproduce: - Open Dashboard > Sales > Sales. - Search for an item to filter. - Click the "Product" filter. - Click "Search more". - Search for an archived product. - Select it to add it to the filter. Issue: The filter needs `nameService.loadDisplayNames()` to resolve the label of the selected record ids. In 17.0, that service calls `webSearchRead()` without `active_test=False`, so archived records are filtered out and treated as missing. This makes spreadsheet global filters fail on archived records. Fix: Fetch display names with `active_test=False` in the shared web `nameService`, so already-known archived record ids can still be resolved. Task: [6094596](https://www.odoo.com/odoo/project/2328/tasks/6094596) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257534
This update enhances the Odoo packaging process for Windows by adding optional dependencies. This allows for a more streamlined installation experience for Windows users, reducing potential conflicts and improving overall stability. It's a technical update focused on improving the Odoo platform's compatibility.
This update fixes an issue where invoicing a Point of Sale order multiple times in Odoo could create unnecessary stock picking records. This was happening when backend users repeatedly clicked 'Invoice,' leading to duplicate pickings, especially with the 'Anglo-Saxon' configuration. This change ensures that invoices are processed correctly without creating redundant stock movements.
Original PR description
Calling `action_pos_order_invoice` on an already-invoiced POS order (e.g. a backend user clicking "Invoice" more than once) would unconditionally invoke `_create_order_picking`, producing one extra `stock.picking` per click under anglo-saxon + update_stock_at_closing configurations. opw-6092999 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257509
This update resolves an issue where users without project access rights were unable to view project details from their timesheets. The fix adds a temporary override (sudo) to grant access, allowing users to correctly see project information. This ensures all users can access the relevant project data.
Original PR description
### Steps to reproduce: - Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps - Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets =…
### Steps to reproduce:
- Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps
- Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets = User:own timesheets'
- In Sales, create a service with the following specifications:
- 'Create on Order' is 'Project'
- 'Invoicing Policy' is 'Based on Timesheets'
- Create a new quotation that requests this service and click 'Confirm'
- In 'Project' > 'Configuration' > 'Projects', choose the newly created project and add a line that has the new employee in the 'Invoicing' tab
- Log in as that employee and go to 'Timesheets'
- Create a new entry for the newly created project
- Click the project's name
> Access Error: You are not allowed to access 'Collaborators in project shared'
(project.collaborator) records.
### Cause of Issue:
This happens because the user doesn't have access rights to the 'Project' app, hence they don't have access to `collaborator_ids` which are retrieved here. https://github.com/odoo/odoo/blob/3dfb2849acd899ccbf4048f2a15dff3c74aed96d/addons/project/models/project_project.py#L1113-L1120
### Fix:
Since an access to the 'Projects' app isn't necessary to view a project assigned to you, `sudo()` is necessary for hr_timesheet users without project access rights.
opw-6074833This update resolves an issue preventing the Account EDI UBL import from working correctly in the Odoo Community edition. Specifically, a problem with missing country data was causing errors during the import process. The fix ensures proper data handling, allowing imports to succeed.
Original PR description
If you're in community, the retrieval of account results in a traceback, failing the import **[FIX] account_edi_ubl_cii: empty country fails the import** If you don't find a country, we try to run _run_vat_test with False as a value, resulting in an Error when we do apply a lower() on it. A simple way to reproduce is to put the GB code in the UBL (which is the right value), while the xml_id is uk. We also fix it there. Runbot-242379 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where product names displayed in purchase order lines would change when navigating between pages. The fix ensures product names are consistently shown, improving order clarity and reducing potential confusion for users. This change maintains the ability to search for products using vendor codes or names.
Original PR description
**Steps to reproduce:** * Install the *Purchase* module * Create a product and set an *Reference* and Under the *Purchase* tab, add a vendor and define a *Vendor Product Code*. * Create a Purchase…
**Steps to reproduce:** * Install the *Purchase* module * Create a product and set an *Reference* and Under the *Purchase* tab, add a vendor and define a *Vendor Product Code*. * Create a Purchase Order with the same vendor set as on the product. * Add the configured product to the *Purchase Order Lines*. * Add the same product again on a second line and save the order. * Activate debug mode * Go to the view:Form and add a limit to have only 1 POL per page * Return to your PO * Go to the second page **Observed behavior:** * The *product display name* in the purchase order lines is different on the second page compared to the first page. **Cause:** * On the first page, purchase order lines are fetched via a web_read on the purchase order. * On subsequent pages, lines are fetched via a web_read directly on the purchase order lines. * The client requests both name and product_id.display_name. product field context includes partner_id, causing product_id.display_name to be computed as the vendor name. * As both values resolve to the vendor name, the original product name is lost, leading to inconsistent display across pages. **Note:** A similar issue was addressed in this commit : https://github.com/odoo/odoo/commit/28d53e0e565e266ca3fa2b67e359b4383fa42c36 * but its consequence it breaks the search using the vendor code/name in POL. * That change was reverted in this commit duo to the there consequence : https://github.com/odoo/odoo/commit/c9e8a802315be27a076ae677b9191c075e4c239d **Fix:** * This ensures the product name is propagated correctly in the form view while preserving search by vendor code or name. --- opw-5170924
This update resolves a warning appearing on Odoo.sh production branches during module updates. The change lowers the logging level from WARNING to DEBUG, aligning with existing practices and ensuring updates appear green, indicating a successful process. This improves the overall reliability and visual status of Odoo deployments.
Original PR description
Description of the issue/feature this PR addresses: During a module update (-u ModuleName), the check introduced by #220983 patches temporarily a field with "company_dependent=True" because the…
Description of the issue/feature this PR addresses: During a module update (-u ModuleName), the check introduced by #220983 patches temporarily a field with "company_dependent=True" because the overriding module is not loaded yet. But currently it is logged as a warning and makes Odoo.sh production branch appears in yellow (warning state), while the update is actually fine. Current behavior before PR: Logs may contain warnings such as: - Patching res.partner.ref with company_dependent=True - Patching product.template.sale_ok with company_dependent=True - Patching product.product.default_code with company_dependent=True even though there is no actual issue (ok normal behavior) The main problem is that this makes Odoo.sh production branches appear not with green status, while the update module is actually fine. Desired behavior after PR is merged: Keep the same mechanism, but lower the log level from WARNING to DEBUG. This aligns the behavior with the "translate=True" patch logic, which is already logged at DEBUG. Having the production branches green. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a translation issue by ensuring Belgian province names are displayed in their native Dutch and French. This improves the user experience for customers and partners in Belgium, aligning with localization standards.
Original PR description
The `name` field of `res.country.state` is not translatable. For that reason we want to have the province names in their native language. [opw-6107258](https://www.odoo.com/odoo/project.task/6107258)
This update resolves an issue where attachment overviews (the blue boxes) weren't appearing in the chatter after uploading a file. This change ensures that users can always see the previews of attached files within the chatter interface. This was necessary due to a shift in rendering strategy for attachments, which initially caused this display problem.
Original PR description
--- When in the chatter, we can create an activity. If we add an attachment to the notes of this activity and save it, the overview of the attachment won't show in the chatter. 1. Open an app that gives you access to the chatter, for instance, an invoice in Accounting. 2. Click on Activity. Click on Log a Note... and on the button Upload a file. Upload an attachment and save. The overview of the file (blue box with the name of the attachment) should appear. The overview doesn't appear Since 19.0, we want to replace static rendering with embedded components everywhere for rendering attachments, but this creates issues for the rendering of the overview in the chatter. Therefore, after internal discussion, we agreed to keep rendering overviews statically. Backport of: https://github.com/odoo-dev/odoo/commit/4a2412b93bcac9e71826f7c0101243cdb882ddf6 opw-6035026 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the 'Jump to Present' button in the Odoo chatter interface would disappear for some users. The change simplifies the button's visibility detection, ensuring it's consistently displayed regardless of message volume or layout, improving user experience.
Original PR description
**Description of the issue this PR addresses:** ---------------------------------------------- In 18.0, the Jump to Present button in chatter could fail to appear when the user scrolled away from the latest messages. **Current behavior before PR:** ---------------------------------------------- - The present detection threshold relied on both viewport height and the cumulative height of recent messages. - In some chatter layouts, this threshold could exceed the visible area, preventing the Jump to Present button from appearing. **Desired behavior after PR is merged:** ---------------------------------------------- - The present threshold is based only on the viewport height. - The Jump to Present button appears consistently regardless of message size or chatter layout. Task-5435586 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at https://www.odoo.com/submit-pr
This update resolves a technical error in the Danish accounting module (l10n_dk) that prevented proper processing of accounts without a standard code. The fix ensures the system correctly handles these accounts, improving data accuracy and functionality. This change was made as part of a larger effort to enhance the reliability of the Odoo accounting system.
Original PR description
From https://github.com/odoo/odoo/pull/256541.
```yml
File "/home/.../odoo/addons/l10n_dk/migrations/1.4/end-migrate.py", line 102, in migrate
if len(account.code) < 6:
TypeError: object of type 'bool' has no len()
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#258299This update fixes an issue where Arabic text on invoices was incorrectly formatted in English reports. The change ensures parentheses and other symbols wrap correctly around Arabic characters, improving invoice readability for international users. This resolves a visual discrepancy in the generated PDF documents.
Original PR description
**Problem:** When printing an invoice in English (LTR report) with a product whose name contains Arabic text and parentheses (e.g., لوحة توزيع كهربائية 100 أمبير (شنايدر )), the brackets appear in…
**Problem:** When printing an invoice in English (LTR report) with a product whose name contains Arabic text and parentheses (e.g., لوحة توزيع كهربائية 100 أمبير (شنايدر )), the brackets appear in the wrong position in the generated PDF. **Steps to reproduce:** 1. Create a product named: لوحة توزيع كهربائية 100 أمبير (شنايدر ) 2. Create an invoice with that product 3. Print the invoice PDF in English 4. Observe the brackets are misplaced in the description column **Current behavior:** Parentheses appear detached from the Arabic word they enclose, floating at the wrong end of the text. **Expected behavior:** Parentheses correctly wrap the enclosed Arabic text. **Cause of the issue:** Odoo's report CSS sets `direction: ltr` on elements that are ancestors of the line description span. When CSS `direction: ltr` targets the same element as `dir="auto"`, wkhtmltopdf's WebKit engine lets the CSS rule win, keeping the paragraph base direction as LTR. The Unicode BiDi algorithm then resolves parentheses (neutral characters) using LTR as the base direction, misplacing them. **Fix:** Placing `dir="auto"` directly on the `<span>` that renders the line description — rather than the parent `<td>` — avoids the CSS override. wkhtmltopdf then detects the first strong character (Arabic) and uses RTL as the base direction for that span, allowing the BiDi algorithm to correctly position the brackets. opw-5884712 Forward-Port-Of: odoo/odoo#251190