Monday, January 26, 2026
13 changes · 18.0
Enhancements to existing features
This update expands Odoo's language support to include Spanish, recognizing the significant number of Spanish speakers. Enabling Spanish translations improves usability and accessibility for a wider range of users. This enhancement aligns with Odoo's commitment to global business solutions.
Original PR description
The official language is English, but Spanish is spoken by ~41 million. task-5247124
This update expands Odoo Enterprise's language support to include Spanish, recognizing the significant Spanish-speaking population. Enabling Spanish translations improves usability for a wider customer base and aligns with global market needs. This change enhances the overall user experience for Spanish-speaking users.
Original PR description
The official language is English, but Spanish is spoken by ~41 million. task-5247124
Resolved issues and error corrections
This update fixes an issue where changes made through the HTML editor's 'handleNewRecords' feature weren't consistently reflected in the undo/redo history. By ensuring these changes are recorded in the correct step, the undo/redo functionality now works reliably, providing a smoother editing experience for users.
Original PR description
Before this commit, mutations added by "handleNewRecords" resource may not have been added in the correct step. So the undo/redo didn't work properly. Mutations added by handleNewRecords must be in the same step as the mutations that trigger it. 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 Peppol invoices were generating multiple duplicate attachments, causing clutter in the system. The fix ensures that attachments are updated instead of created anew, preventing this duplication and improving the user experience. This change ensures invoices sent via Peppol are properly formatted and organized.
Original PR description
When sending a customer invoice via Peppol, the system creates duplicate attachments (4 instead of 2 expected), cluttering the chatter and the attachment sidebar. This commit: - Implements a search-and-update logic for attachments to ensure idempotency (updates existing instead of creating duplicates). task-5438951 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 Forward-Port-Of: odoo/odoo#244425 Forward-Port-Of: odoo/odoo#241130
This update resolves an issue preventing Odoo from installing correctly on Debian systems. Previously, the installation process failed due to an incorrect package name. Now, Odoo will automatically install the latest version of the necessary PDF library, ensuring a smooth and successful installation. This improves the reliability of Odoo deployments on Debian.
Original PR description
Description of the issue/feature this PR addresses: when installing from source code, the 'setup/debinstall.sh' script fails because the package 'python3-pypdf2' actually does not exist in Debian. Current behavior before PR: Instructions documented in 'Source install' fails in the script execution. Desired behavior after PR is merged: The odoo installation works fine in Debian, installing the latest pypdf package (see https://github.com/odoo/odoo/issues/92595#issuecomment-1407329907). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a minor issue where the tour navigation could briefly fail due to delays in updating browser URLs. The fix ensures the tour's navigation works reliably by waiting a short time after URL changes before removing the browser's 'close tab' listener. This enhances the overall user experience.
Original PR description
In this commit we fix the function callWithUnloadCheck. Since router.pushState may be delayed (debounced with setTimeout), we wait a short amount of time before removing the beforeunload listener.
This update fixes a rounding discrepancy in purchase withholding calculations for Argentinian businesses. Previously, the withholding amount was slightly off, leading to inaccurate tax reporting. The change ensures the correct withholding amount is calculated and applied, improving financial accuracy.
Original PR description
Steps to reproduce: - Set company to (AR) Responsable Inscripto - In Accounting > Settings, choose Round per Tax as the rounding method. - Go to Accounting > Taxes, duplicate IIBB WTH CABA 0%, and set Amount to 4.5%. - Open partner ADHOC SA, in the accounting tab add the new tax in Purchase Withholding - Create a new vendor Bill to vendor ADHOC SA with unit price 156,087.00 - Confirm and open Payment wizard Issue: Withholding amount is 7023.91, but it should be 7023.92 It occurs that the computed amount is 7023.915. Then when the tax repartition values are computed, the value is rounded and rounding difference are redistributed in the tax lines, so it seems the value has been rounded down. opw-5154585
This update corrects a bug related to how monetary fields are displayed in Odoo reports and dashboards. A recent change introduced a requirement for `min_precision` that caused errors when applied to monetary fields. The fix prevents this error by intelligently avoiding the problematic method call, ensuring consistent and accurate monetary display.
Original PR description
Before 8c199f7783527735b35c9fbda334cbdcd55a004f, it was possible
to use the float widget with a monetary field in qweb (not used in
standard code).
By using something like:
```
<span
t-field="o.amount"
t-options="{
'widget': 'float',
'precision': o.currency_id.decimal_places
}"
/>
```
where `amount` is a monetary field.
It worked as `precision` is defined in the options, which means that
`get_digits` was not called, so no errors were raised (the method only
exists for float fields).
Now that `min_precision` has been added, `get_min_display_digits` is
called if it is not set.
Which causes an error, as the method does not exist for monetary
fields.
As we are in stable, we cannot ask users to add a `min_precision` key
to their options, so the fix is to use `hasattr` to avoid calling a
method that doesn't exists.This update corrects a nightly failure related to the default timezone used for appointments. The fix changes how the timezone is handled during testing, ensuring consistent behavior. This prevents disruptions to appointment scheduling and improves overall system reliability.
Original PR description
**Issue:** Default tz of `'appointment.appointment_default_resource_calendar'` is not always `"Europe/Brussels"`. **Fix:** Override in test instead of asserting its value. opw-5163892
This update resolves an issue where carousel snippets were being incorrectly cropped in the preview modal. Now, the snippet preview automatically adjusts to the content's height, ensuring a complete and accurate representation of the carousel. This improves the user experience when creating and editing snippets.
Original PR description
Steps to reproduce: - Drag and drop a Carousel. - Add content to the first slide of the carousel to make the snippet taller. - Save the snippet as a custom snippet. - Open the snippet dialog. - Issue: The height of the preview for the saved snippet is forced to 550px, causing the snippet to be truncated. After this commit, the height is no longer forced; it now adapts to the snippet content. task-5156137
This update resolves a bug in the website editor that occurred when users manipulated selections in Chrome, leading to invalid offsets. The fix ensures that the selection plugin validates offsets before using data, preventing errors and maintaining editor stability. This improves the user experience and prevents unexpected behavior.
Original PR description
**Description of the problem** In the website editor, the user can manipulate the page in such a way to generate a problematic `SelectionPlugin.activeSelection`, which still points to an existing…
**Description of the problem** In the website editor, the user can manipulate the page in such a way to generate a problematic `SelectionPlugin.activeSelection`, which still points to an existing `anchorElement`, but has an invalid `offset`. **How to reproduce** This seems to be reproducible only on Chrome. 1. Enter in the website edit mode 2. Drop the `s_newsletter` snippet 3. Drop the `s_popup` snippet 4. Click on the popup, and delete it 5. Click on the blank space inside the `s_newsletter` snippet 6. Delete the `s_newsletter` snippet 7. The error occurs Notes: 1. Snippet different than `s_newsletter` can be used to reproduce the problem, as long as they contain a blank space. 2. It is important to make sure that the movement of the mouse pointer does not trigger any preview when going from step 5 to step 6. **Why the problem happens** On Chrome, clicking on a blank area can cause `document.getSelection()` to return a selection with a null `anchorNode.` When this happens, `SelectionPlugin.getSelectionData()` will use the already existing `activeSelection` if `activeSelection.anchorNode` is still connected. Before this commit, this method only checked that `anchorNode` was connected, without validating offsets. This leads to the following edge case: 1. The user removes the `s_popup` 2. At this point, `document.getSelection()` would point to the `s_newsletter` snippet, so if the user just deletes the snippet nothing bad would happen. But instead, if: 3. The user clicks on a blank area in `s_newsletter`, `document.getSelection()` will now return a null `anchorNode` 4. The user delete the `s_newsletter` snippet, and `SelectionPlugin.getSelectionData()` is called by an handler after the deletion 5. At this point: `document.getSelection()` has a null `anchorNode`, so the method will check if `activeSelection.anchorNode` is still connected, WITHOUT validating the offsets. 6. Since `anchorNode` is still connected, this selection will be used, and an error will be triggered shortly after, because the offset is too high (pointing to `s_popup` which does not exist anymore). **Fix** After this commit, when `SelectionPlugin.getSelectionData()` checks that `activeSelection.anchorNode` is still connected it also checks that the offsets are valid (meaning that they are smaller than the number of nodes). task-5430500
This update resolves a bug that caused the follow-up report to crash when users unfolded partner lines while prefix groups were enabled. The fix corrects an error in how the report processed data, ensuring stability and preventing unexpected errors for users.
Original PR description
When prefix groups were enabled, and a prefix group line had been unfolded, the report crashed when trying to unfold the partner. This happened because res_ids_map is computed for each of the unfolded lines, including the prefix groups one, which then had no 'res.partner' key, causing a key error.
This update resolves a technical issue that prevented users from adding attachments when sending emails to large groups of contacts (501+). The fix addresses a limitation in how the system handles data volume, ensuring the email composer function works reliably with larger contact lists. This improves the user experience for sending bulk emails.
Original PR description
Steps to reproduce: 1. Install 'contact' 2. Create 501+ contacts (e.g. by duplicating existing one) 3. Select all contacts in list view and click Send Email (from Action menu) 4. Try to add an attachment Issue: - A traceback is raised in the mail composer: `SyntaxError: Unexpected end of JSON input` Cause: `res_ids` is not set on the composer when more than 500 records are selected. This is expected, as the compute method `_compute_res_ids()` does not write `res_ids` when the number of active_ids exceeds 500 (to avoid storing large payloads on the field). Because of this, the code trying to JSON.parse(res_ids) fails. see: https://github.com/odoo/odoo/blob/abc8417413faf598fb83106de4328571d71888aa/addons/mail/wizard/mail_compose_message.py#L400 Solution: - Fallback to context.active_ids when res_ids is not available opw-5351374