Thursday, May 7, 2026
13 changes · saas-18.4
Resolved issues and error corrections
Push notifications now show normal readable text instead of displaying escaped characters such as ". This makes project task alerts clearer for users who rely on inbox-style notifications.
Original PR description
**Steps to reproduce:** Log in as admin and ensure notifications are handled in Odoo. Enable push notifications and the 'Task Created' subtype for a project. As a second user, create a new task in…
**Steps to reproduce:** Log in as admin and ensure notifications are handled in Odoo. Enable push notifications and the 'Task Created' subtype for a project. As a second user, create a new task in that project. **Current behavior before PR:** admin received escaped content in the push notification (e.g., `A new task has been created in the "Project Name" project`) **Cause:** For inbox users, we send a client-side push notification using `previewText` as the body. This field returns a markup object containing escaped characters, which are converted to a string when passed to the notification body. Since the notification body only accepts plain text, these characters are displayed literally to the user. **Desired behavior after PR is merged:** admin receives the unescaped content in the push notification. (e.g., `A new task has been created in the "Project Name" project`) task-5112810 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240331
This fix stabilizes an automated test for Point of Sale self-ordering by ensuring the test always sees the full list of daily ordering slots. It prevents date- and time-dependent test failures, improving confidence in release validation without changing customer-facing behavior.
Original PR description
Before this commit: = - The test test_slot_limit_orders created slots only for the first day of the week (Monday). - The test scenario includes a slot at "18:00". - On Mondays, the test fails between 18:01 and 23:59 because the "18:00" slot no longer exists for the current day. - On other days, the test passes since slots are generated for the upcoming Monday. After this commit: = - Freezed the time to current day at "00:00" so that slot list can have every slot for that day. task-6043739 runbot-241836 Forward-Port-Of: odoo/odoo#254775
Fixes an issue where opening the merge action for a mailing list could show a misleading “record does not exist” warning. Users can now start merging mailing lists from Email Marketing without being blocked by this erroneous message.
Original PR description
Currently, error occurs when user tries to merge a mailing list. Steps to replicate: - Install `mass_mailing`. - Open Email Marketing > Mailing Lists > Mailing Lists and switch to list view. - Select…
Currently, error occurs when user tries to merge a mailing list.
Steps to replicate:
- Install `mass_mailing`.
- Open Email Marketing > Mailing Lists > Mailing Lists and switch to list view.
- Select a single record, and from cog menu Click merge.
Warning:
```
odoo.http: Record does not exist or has been deleted.
(Record: mailing.list(6,), User: 2)
```
Cause:
- When the user clicks Merge, the `mailing.list.merge` form opens and `default_get()` is executed to populate defaults.
- At this point, `src_list_ids` is added to res in a structured format like `[(6, 0, ids)]` [1].
- Later, `res.get('src_list_ids')` is reused and assigned to `src_list_ids` [2].
- Taking `src_list_ids[0]` [3] returns `(6, 0, ids)`, and its first element `6` is incorrectly treated as a record ID and assigned to `dest_list_id`.
- This leads to an attempt to access a record with ID 6, which does not exist, causing the error.
Solution:
- Instead of reading `src_list_ids` back from `res` after it has been set, we initialize and reuse local variables (src_list_ids, active_ids) at the beginning of the method.
- This avoids relying on transformed values in `res` and ensures that `dest_list_id` is computed using a consistent and valid list record IDs.
[1]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L20-L22
[2]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L24
[3]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L26
sentry-7447326420
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#262466Fixed an issue in Point of Sale where opening the customer list could fail after loading a paid order linked to a loyalty card from an archived program. This helps staff continue serving customers without interruption when older loyalty programs have been retired.
Original PR description
Backport of https://github.com/odoo/odoo/commit/ffe46084665bb8a64ef9cd9f44b85f7178adf6f7 Before this commit, when loading a paid order with a loyalty card that its program had been archived, an error was raised when opening the partner list due to the missing program. opw-6182368 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262575
The LDAP authentication test setup was repaired so it no longer leaves unwanted data behind during automated checks. This helps keep future fixes safer by making the test suite cleaner and ready for additional coverage.
Original PR description
The unit test is tagged `-standard` and `database_breaking` because it was leaving left overs in the database. Using an `HttpCase` over a `BaseCase` solves that issue in addition to make the code way simpler. We want to resurrect this unit test class because we plan to add another unit test in that class for a bug fix. Forward-Port-Of: odoo/odoo#261842 Forward-Port-Of: odoo/odoo#261743
Belgian Peppol participant checks no longer retry with an outdated identifier format when a match is not found. This keeps validation aligned with the currently used Belgian identifier and avoids unnecessary lookup behavior.
Original PR description
When adding peppol, we didn't know if we needed to use the 9925:BE or 0208. Therefore, we switched between them if the endpoint was not found. This has no more use today as we use 0208. opw-5976574 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261307 Forward-Port-Of: odoo/odoo#258297
The website editor now removes outdated image shape and hover-effect data when images are edited or saved. This keeps page content cleaner and prevents old hidden settings from lingering after users remove effects or replace images.
Original PR description
Steps to see the issue: - Add a shape to an image - Remove it => Image element in the DOM still has some data related to the shape. This commits adds a shared method to `ImageShapeOptionPlugin` to…
Steps to see the issue: - Add a shape to an image - Remove it => Image element in the DOM still has some data related to the shape. This commits adds a shared method to `ImageShapeOptionPlugin` to clean shape-related data when we apply a shape, or remove it, the method mirrors the behavior we had before the [html builder refactoring]. Also, commit [1] fixed the issue when the builder transfered shape or hover related data to incompatible images, when replacing an image with a shape/hover on it. However if these data attributes had already been saved prior to that commit, it would stay there indefinitely. The same could happen with hover effects attributes. Therefore, we add a resource that we call before saving data to clean any stale image data. Example of a CORS protected image: [2] [1]: https://github.com/odoo-dev/odoo/commit/137a6d7e59e1d788745c3b796a14839e52a8c5bc [2]: https://tinyjpg.com/images/social/website.jpg [html builder refactoring]: github.com/odoo/odoo/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5172640
This update resolves an issue where commission plans with negative target values caused a system error. The fix ensures the commission plan generation process can handle negative targets correctly, preventing errors and improving the flexibility of commission plan configuration. This change enhances the reliability of sales commission calculations.
Original PR description
Steps to reproduce: ------------------- 1. Install sale_commission 2. Create a commission plan based on targets 3. Try to add a new commission level with negative targets Issue: ------ Adding a commission level with a negative target results in a ```python RangeError: Maximum call stack size exceeded. ``` Cause: ------ https://github.com/odoo/enterprise/blob/2bfe0f32c0cec426fc7345ef716395146cc569ca/sale_commission/static/src/js/commission_plan_graph/commission_plan_graph.js#L50-L56 Negative target values caused infinite recursion in the GCD function, leading to this `RangeError`. Solution: ----------- Since the Euclidean algorithm only works correctly with non-negative integers, apply Math.abs() on both inputs before the recursion starts. This ensures negative targets are handled gracefully without causing infinite recursion. **NOTE:** Backport: c0d748f opw-6182644 Forward-Port-Of: odoo/enterprise#116050
This update resolves an issue where the Mod 349 tax report incorrectly excluded vendor bills with amounts less than 1 Euro. The fix adjusts a calculation to ensure these small amounts are properly displayed, improving the accuracy of tax reporting for Spanish businesses. This ensures compliance and accurate financial data.
Original PR description
Steps to reproduce: - Install l10n_es_reports. - Create a company from France. - Create and post a vendor bill for that company with an amount of 0.12 EUR. - Open the Tax Return report and switch to the Mod 349 report for the current year. - Click the 0.12 EUR amount line. Observed: - The journal items view opens with no records. Cause: - `_get_modelo349_audit_aml_domain()` calls `_custom_modelo349_common()`, which filters lines using: `float_compare(result_dict['value'], 0, precision_rounding=2)` - Using `precision_rounding=2` treats values below 1 as equal to 0, so those lines are excluded from the audit domain. Fix: - Replace `precision_rounding` with `precision_digits=2` so values are only treated as zero when they are effectively below 0.01. opw-6134339 Forward-Port-Of: odoo/enterprise#116102 Forward-Port-Of: odoo/enterprise#114776
This update resolves an issue preventing users from modifying warehouse routes in the Romanian (RO) version of Odoo. The fix addresses a bug where an error occurred when changing routes, blocking modifications. This ensures multi-step routes can be updated without disruption.
Original PR description
### Issue: When changing the routes of a Romanian warehouse, an error is raised, blocking any modification of multi-step routes ### Cause: The code attempts to access `in_type_id` from `warehouse_data` However, when updating routes, `warehouse_data` is empty in the method `_create_or_update_sequences_and_picking_types` This leads to a crash because the code assumes that `warehouse_data` always contains `in_type_id` and `out_type_id` Additionally, even if the data were present, it would result in creating duplicate `stock.picking.type` records ### Steps to reproduce: - Install `l10n_ro_saft_stock` with demo data and switch to `RO Company` - Enable `Multi-steps Routes` in Settings - Try to modify Incoming or Outgoing Shipments on a warehouse - When saving, the following error is raised: "Oh snap! in_type_id" odoo-pr: https://github.com/odoo/odoo/pull/257293 opw-5925087 Forward-Port-Of: odoo/enterprise#114166
This update fixes a minor accounting error related to the reversal of source tax (QST) calculations in Odoo's Swiss payroll module (l10n_ch_hr_payroll). The change ensures accurate tax reporting by correctly calculating and reversing the minimum IS (Incentive Scheme) amount, improving financial compliance.
Original PR description
opw 6133391 Fix for the source tax correction following PR #114463 Forward-Port-Of: odoo/enterprise#115585
This update fixes a limitation in how Odoo updates its UNSPSC product codes. Previously, new codes could only be added during initial installation, not subsequent updates. A new upgrade script now automatically adds the latest UNSPSC codes to the database, ensuring our product data remains current. Existing product codes are not modified.
Original PR description
**Problem:** Periodically, the UNSPSC codes may be updated and they must be added to existing databases. Normally this is done by module update, however, since there are thousands of UNSPSC codes, a CSV imported via SQL is used instead of XML files. This import is only implemented on module install and not module update, so there is no way to update the UNSPSC codes in existing databases. **Solution:** An upgrade script based on the post-init hook has been added, which will add the new codes to the database, if any. Note that: - The version of this upgrade script should be bumped any time the codes list is updated. - Existing records will not be updated opw-5943366 Forward-Port-Of: odoo/enterprise#116063 Forward-Port-Of: odoo/enterprise#112652
This update resolves an error that occurred when the Account Followup module was installed without the Payment module. The fix prevents a template rendering issue caused by attempting to access a missing 'payment.method' field, ensuring payment reminders function correctly.
Original PR description
Repro steps: 1. Initialize a new DB 2. Install account_followup module without payment module 3. Go to Email templates > Payment reminder 4. Click on Preview You will get an error Failed to render QWeb template for Mail Template: 'Payment Reminder' (ID: 9) Target Model: res.partner Language context: en_US Error: Error while render the template KeyError: 'payment.method' Root cause: The method `_show_pay_now_button` that was being called in the template email_template_followup_1 was using self.env['payment.method'] even tho payment module is not a dependency of account_followup Fix: The introduced fix ensures that 'payment.method' model exists before attempting to use it build_error-243030 Forward-Port-Of: odoo/enterprise#116443 Forward-Port-Of: odoo/enterprise#116079