Friday, April 10, 2026
16 changes · 18.0
Enhancements to existing features
This update prevents unnecessary creation of user settings for Odoo Portal users. Previously, the system would automatically create these settings, which was inefficient and potentially problematic. This change streamlines the process and improves system performance.
Original PR description
By default, portal does not need res.user.settings. Since this linked record is optional, we should avoid to create it is not needed. This commit adds a check to avoid introducing logic that may create res_users_settings by mistake for portal user.
Resolved issues and error corrections
This update resolves an issue where the Helpdesk return wizard incorrectly displayed receipt operations alongside delivery operations. The fix specifically excludes receipts from the wizard's domain, ensuring users only see eligible deliveries for returns. This improvement enhances the accuracy and usability of the Helpdesk return process.
Original PR description
Steps to reproduce: - 1. Create a Sale Order for a customer and fully process the delivery. 2. Create a Helpdesk ticket for that customer. 3. From the ticket, click the 'Return' button to open the wizard. 4. Select the sales order or open the 'Delivery to Return' dropdown. Issue: - The list of available pickings shows both receipts and deliveries operations. Fix: - The domain for the return wizard is updated to explicitly exclude receipts. Note: - This bug is present until saas-18.4. From 19.0 onward it is already fixed in this PR: https://github.com/odoo/enterprise/pull/90371 task-5075205 Forward-Port-Of: odoo/enterprise#95418
Features or functions removed from Odoo
This update removes redundant logging related to test execution and signal changes. Specifically, logging around `at_install` and `HttpCase` changes has been removed to streamline testing and improve performance. This change does not impact business functionality.
Original PR description
This log was added to know when a test would call signal change, sometimes problematic during at_install. This information is also interesting when a change has to be signaled during HttpCase. We can skip the log in case nothing has to be done.
This update resolves an issue where material resources with assigned roles were incorrectly displayed when filtering by employees in the Planning app. The fix improves the filter logic to accurately exclude these resources, ensuring that only employee-type resources and those without assigned roles are shown.
Original PR description
Steps to Reproduce: 1. Open the Planning app. 2. Go to Configuration -> Materials. 3. Set a role on either the demo material resource laptop or toolkit. 4. Go back to the Planning view. 5. Apply the view filter employee (filter by Employees). Issue: The material resource with a role should not be visible, but it is still present. Current behaviour: When filtering the Planning view by Employees, material resources with an assigned role remain visible. Expected behaviour: Material resources with an assigned role should be excluded from the Planning view when filtered by Employees — only employee-type resources and resources on which role is not set should appear. Fix: Improved the filter domain so unnecessary data are excluded. Task-4526989 Forward-Port-Of: odoo/enterprise#92816
This update resolves an issue where payroll transmission data was being incorrectly sent to non-production environments. This change ensures that test and development environments are not affected by production payroll data, improving the stability and accuracy of testing. It's a minor fix focused on preventing data leakage.
Original PR description
Forward-Port-Of: odoo/enterprise#113504
This update fixes an issue where search filters applied in the MRP Planning view would disappear when navigating away and returning via the breadcrumb. The fix ensures that search state is correctly maintained, improving the user experience and preventing lost filter settings. This enhances consistency and efficiency in planning processes.
Original PR description
Issue: In the MPS view, when the user sets a search filter, navigates away and then returns via the breadcrumb, the search filters that were applied are gone. This happened because the MPS client action was not passing `globalState` to the `WithSearch` component. Fix by passing `globalState` in `withSearchProps`. task-5368078 Forward-Port-Of: odoo/enterprise#113125
This update ensures that negative discount values, which were previously only visible in PDF reports, are now consistently displayed in the Sale Order preview (portal view). The change aligns the report output with the portal's behavior, providing a more accurate representation of discount amounts.
Original PR description
Steps to produce: --- - Install the `Sales` module. - Enable discounts from settings. - Create a Sale Order with a negative discount on an order line. - Preview the Sale Order and click on the view…
Steps to produce: --- - Install the `Sales` module. - Enable discounts from settings. - Create a Sale Order with a negative discount on an order line. - Preview the Sale Order and click on the view details button. Issue: --- - Negative discount values are not shown in the preview (portal view), but they are displayed in the generated PDF. Root cause: --- - At [1], the portal template includes a condition to display discounts only when they are greater than 0, while the report templates lack this check, leading to inconsistent behavior. Solution: --- - Applied the same condition in the report templates to align the PDF output with the portal preview behavior. Before: --- <img width="787" height="136" alt="image" src="https://github.com/user-attachments/assets/d32311be-4aec-4d6f-b905-d5e52f712ba4" /> After: --- <img width="775" height="139" alt="image" src="https://github.com/user-attachments/assets/2614a8ad-dca6-49ca-b720-5c234aa91cf6" /> [1]https://github.com/odoo/odoo/blob/0f463fd247d2f5da79d6ec2b6bec18774f6f600b/addons/sale/views/sale_portal_templates.xml#L539 Enterprise PR: https://github.com/odoo/enterprise/pull/111916 opw-6061568 Forward-Port-Of: odoo/odoo#255735
This update fixes an issue where product names on invoices weren't always displayed in the correct language when using child contacts. The change ensures that invoice line labels are translated based on the language of the invoice contact, regardless of the parent contact's language. This improves the user experience for multilingual invoicing.
Original PR description
### Issue before this commit: When creating an invoice using the child contact of a parent contact that has a different language with respect to the father, the label of the invoice line was not…
### Issue before this commit: When creating an invoice using the child contact of a parent contact that has a different language with respect to the father, the label of the invoice line was not always displayed in the child contact language but in the father's contact language. ### Steps to reproduce the issue: 1. Activate at least 2 languages (X and Y) 2. Create a product and set the translation for that product in the activated languages 3. Create a Contact with the language X 4. Create a child contact (invoice adress type) for that contact with language Y 5. Create a new invoice setting the customer as the child contact 6. Add the product you created 7. See the label is displayed in the language of the parent contact ### Cause of the issue: The computation of the invoice line name relied on line.partner_id.lang. However, the partner_id of the move line is automatically set to the commercial partner that can be different (can be the father's contact) to the contact used on the invoice. As a result, the product description was translated using the wrong language. ### Reason to introduce the fix: To ensure that invoice line labels are correctly translated according to the language of the selected invoice contact, the computation now uses the language of move_id.partner_id instead of line.partner_id. This guarantees consistent and expected behavior in multilingual environments, especially when using different contacts under the same commercial partner. opw-5955875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254833
This update optimizes how Odoo processes QWeb templates, specifically addressing a performance issue introduced in Markupsafe version 2.1.4. The change reverts to a faster implementation of the `striptags` function, resulting in quicker template compilation times, particularly with large inputs.
Original PR description
Starting version 2.1.4 of markupsafe, they decided to adapt the `striptags` function to use in-python-loops instead of the original implemenation that relied on pre-compiled regex. A problem has been…
Starting version 2.1.4 of markupsafe, they decided to adapt the `striptags` function to use in-python-loops instead of the original implemenation that relied on pre-compiled regex. A problem has been spotted with qweb templates that used `striptags` with large inputs, which led to the investigation of this function and it was found that the old implementation is actually faster. In fact, the PR introducing this change in Markupsafe, made these claims with no benchmarks whatsoever: https://github.com/pallets/markupsafe/pull/413/changes The new implementation of markupsafe is O(N x M), where n is the number of tags and M being the length of the input string. The old regex approach does a single c-level scan to check the existence of the regex which is performing much better for varying input size. The benchmark cases below are in the form `<case_description>_<number_of_tags>`. We can see that in the cases where the current implementation is slightly faster is when there are no tags in the input which can be explained by the fact that the while loops will simply exit early. The time lost in the regex implementation is likely due to the deeper call stack to scan for the regex. Apart from that, in the case of an unclosed tag, the regex implementation is also slower because it still needs to scan the entire line. However, in that case the time taken is a handful of milliseconds, so it's not really a performance regression there either. Apart from that, the old implementation is consistently much more performant, for both small and large inputs. Benchmarks: | Case | Regex ms | Current ms | Speedup | |----------------------------------------------|----------|------------|---------| | plain_text_50k_words | 3.020 | 2.627 | 0.9x ← current_implementation | | unclosed_tag_then_50kb_text | 0.367 | 0.032 | 0.1x ← current_implementation | | unclosed_tag_then_500kb_text | 3.787 | 0.273 | 0.1x ← current_implementation | | multiple_unclosed_open_tags_then_50kb_text | 18.912 | 0.371 | 0.0x ← current_implementation | | multiple_unclosed_open_tags_then_500kb_text | 189.007 | 8.209 | 0.0x ← current_implementation | | unclosed_comment_then_500kb_text | 7.276 | 0.412 | 0.1x ← current_implementation | | 5k_small_tags | 0.986 | 22.096 | 22.4x ← regex_old_implementation | | 20k_small_tags | 4.125 | 492.186 | 119.3x ← regex_old_implementation | | 50k_small_tags | 12.658 | 5499.602 | 434.5x ← regex_old_implementation | | 1k_nested_divs | 0.155 | 0.923 | 5.9x ← regex_old_implementation | | 10k_nested_divs | 1.648 | 48.410 | 29.4x ← regex_old_implementation | | 2k_tags_with_attrs | 1.058 | 12.013 | 11.4x ← regex_old_implementation | | 20k_tags_with_attrs | 13.185 | 6068.755 | 460.3x ← regex_old_implementation | | 2k_multiline_tags | 0.815 | 10.819 | 13.3x ← regex_old_implementation | | 20k_multiline_tags | 8.939 | 4231.768 | 473.4x ← regex_old_implementation | | 1k_comments | 0.222 | 1.292 | 5.8x ← regex_old_implementation | | 1k_comments_hiding_tags | 0.163 | 1.121 | 6.9x ← regex_old_implementation | | 2k_mixed | 0.278 | 2.392 | 8.6x ← regex_old_implementation | | 10k_mixed | 1.400 | 50.959 | 36.4x ← regex_old_implementation | | qweb_shop_200_products | 0.907 | 7.880 | 8.7x ← regex_old_implementation | | qweb_shop_1000_products | 4.296 | 194.647 | 45.3x ← regex_old_implementation | This PR is needed because requirements.txt in Odoo specifies the following dependency: `MarkupSafe==2.1.5 ; python_version >= '3.12' \# (Noble)` This means that all versions running Ubuntu Noble, will be having the same issue introduced in version 2.1.4 of markupsafe. opw-5999688 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a technical issue preventing activity states from being consistently shared across different tabs within Odoo. Previously, changes to activity states weren't reliably reflected across all views. This fix ensures that activity updates are properly synchronized, improving user workflow and data consistency.
Original PR description
Since [1], the activity state, which is supposed to be shared accross tab through a broadcast channel, isn't anymore. This PR fixes the responsible typo. [1]: #161286 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where self-orders placed on one Point of Sale (PoS) configuration were incorrectly appearing in another. The fix corrects a technical error in how self-order data was being retrieved, ensuring orders are now associated with the correct PoS configuration.
Original PR description
Steps to reproduce ------------------ 1. Create two PoS configs in the same company (e.g. Bar and Restaurant) 2. Enable self ordering for the Bar 3. Open Bar, go to its self-order mobile menu and make an order 4. Go back, open Restaurant, click on Orders tab -> The Bar's self-order shows up in the Restaurant's order list. What's happening ---------------- In the `getServerOrders` override added in 6782262a4d96, we were fetching self-orders without table by `company_id` instead of `config_id`. So it pulls in self-orders from ALL configs in the company. The fix ------- Replace `company_id` filter with `config_id in [config + trusted]`, same pattern used in the base `getServerOrders`. opw-6068187
This update resolves an issue preventing credit note exports to Mojeracun when a recipient bank account isn't specified. The fix corrects errors related to XML generation and data structure, ensuring credit notes are now correctly formatted and exported without errors.
Original PR description
**Steps to reproduce:** * Install `l10n_hr_edi` module. * Generate an invoice and validate it. * Generate a credit note from that invoice. * Without a recipient bank account, try to send the credit…
**Steps to reproduce:**
* Install `l10n_hr_edi` module.
* Generate an invoice and validate it.
* Generate a credit note from that invoice.
* Without a recipient bank account, try to send the credit note to Mojeracun.
**Observed behavior:**
* Two errors are raised before the XML is generated:
1. `AttributeError: 'NoneType' object has no attribute 'get'` in `_invoice_constraints_eracun_new` when checking for whitespace in the bank account number.
2. `ValueError: The following child node is not defined in the template: CreditNote/cac:BillingReference/cbc:IssueDate` during XML serialization.
**Cause:**
* issue 1 : https://github.com/odoo/odoo/commit/96cf6626d2b3e75637b908244cf2fa4da615c16b#diff-16f43166a8e5a637cb57b5695a1332845ba5440d989e25fcd59c828aa55cb036R81
* In the mentioned commit `_invoice_constraints_eracun_new`, `node.get('cac:PayeeFinancialAccount', {})` returns `None` instead of `{}` when the key exists but its value is explicitly set to `None` (which happens when no bank account is set). Chaining `.get()` on `None` raises `AttributeError`.
* issue 2 : https://github.com/odoo/odoo/commit/47ef0c2cb96be9fffdc4985255661807980839c6#diff-16f43166a8e5a637cb57b5695a1332845ba5440d989e25fcd59c828aa55cb036R146
* In the mentioned commit in `_ubl_add_billing_reference_nodes`, `cbc:IssueDate` was added as a direct child of `cac:BillingReference`. The UBL template only allows `cac:InvoiceDocumentReference` as a child of `BillingReference`, while `cbc:IssueDate` belongs inside `cac:InvoiceDocumentReference`.
**Fix:**
* Replace `.get('cac:PayeeFinancialAccount', {})` with `.get('cac:PayeeFinancialAccount')` to safely handle an explicitly `None` value before chaining further calls.
* Move `cbc:IssueDate` inside `cac:InvoiceDocumentReference` in the `BillingReference` node, matching the structure defined in `ubl_21_common.py`.
opw-6088424This pull request updates the core spreadsheet component within Odoo. It includes several bug fixes and improvements to rendering, testing, and overall stability. These changes ensure the spreadsheet functionality continues to operate correctly and efficiently.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/74d5391b59 [REL] 18.0.63 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/74d5391b59 [REL] 18.0.63 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/3070d45ea6 [IMP] tests: add image snapshots for renderer store tests [Task: 5933130](https://www.odoo.com/odoo/2328/tasks/5933130) https://github.com/odoo/o-spreadsheet/commit/2b5930f24e [FIX] renderer: rendering tests are wrong [Task: 5933130](https://www.odoo.com/odoo/2328/tasks/5933130) https://github.com/odoo/o-spreadsheet/commit/936b957cbd [IMP] tests: update jest to v30 [Task: 5933130](https://www.odoo.com/odoo/2328/tasks/5933130) https://github.com/odoo/o-spreadsheet/commit/8a7a1a8985 [FIX] format: keep negative accounting suffix in large number [Task: 6068834](https://www.odoo.com/odoo/2328/tasks/6068834) https://github.com/odoo/o-spreadsheet/commit/e3bb0e35e4 [FIX] cf: add sanity checks on conditional format type/operator [Task: 6106092](https://www.odoo.com/odoo/2328/tasks/6106092) https://github.com/odoo/o-spreadsheet/commit/3591e31de4 [FIX] live-server: specify host to avoid issues with some browsers [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update fixes a bug in the HTML Editor where email addresses weren't automatically converted to clickable links after a space. Now, typing an email address followed by a space will correctly create a mailto link, making it easier for users to directly send emails from within Odoo.
Original PR description
Before this commit: when typing an email address, it's not converted to a mailto link after spacing. After this commit: the mailto link is created after spacing. task- 6053993 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update addresses a recurring issue where a test related to formatting inline code in the HTML editor would sometimes fail unpredictably. The fix ensures the color picker is displayed before attempting to select a color, preventing these intermittent test failures. This improves the stability of the HTML editor functionality.
Original PR description
Purpose of this PR: - Ensure color picker is rendered before selecting a color to avoid non-deterministic failures. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where changing a contact's name automatically updated the associated account holder's name, regardless of whether they were originally the same. Now, the account holder name only updates if the contact's name changes, maintaining data accuracy and preventing unintended modifications to bank account information.
Original PR description
**steps to reproduce:** 1. Create a contact 2. On the accounting tab, add one bank account 3. Change the name of the contact 4. The record's name updates automatically the field "Account Holder Name"…
**steps to reproduce:** 1. Create a contact 2. On the accounting tab, add one bank account 3. Change the name of the contact 4. The record's name updates automatically the field "Account Holder Name" **problem:** When changing a profile's name in the contacts app, the account holder name changes to be the same as the profile's name. **expected behaviour:** "Make the account holder name update if partner.name is changed ONLY if they were the same before the change. Otherwise keep the account holder name as is." - Referenced from the feature ticket: 5222712 That means if contact's name is the same as the account holder name, then any change to the contact's name, should as well update 'account holder name' accordingly, but if you changed the account holder name itself, then you change contact's name (if they're not the same) then the account holder name shouldn't be updated to match the contact's name. **cause:** The account holder name depends on `partner_id.name` https://github.com/odoo/odoo/blob/2394a9a7f0ece2d5a2185fa4e715d943fc044733/odoo/addons/base/models/res_bank.py#L104-L107 So whenever you change the contact's name, the account holder name changes accordingly. **Fix:** Upon creation, the account holder name is set to the partner name if no name is provided. Additionally, when the partner name changes, the account holder name is updated only if it previously matched the partnername; otherwise, it is left unchanged. **NOTE:** This is a backport of this PR: https://github.com/odoo/odoo/pull/233965 opw-5913464 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248886