Thursday, January 15, 2026
23 changes · saas-18.4
Enhancements to existing features
Odoo now includes Minute and Kilowatt hour as standard units of measure aligned with UNECE recommendations for Peppol. This helps electronic invoices use the correct unit codes instead of falling back to a generic unit, improving compliance and consistency across localizations.
Original PR description
**Issue:** 2 UoM that is in the UNECE Recommendation No.20 for Peppol don't exist in Odoo: - MIN: Minute - KWH: Kilowatt hour Even if they are created manually, they are not used in the UBL/CII electronic invoices. Instead, the default code (i.e. "C62" for "Units" is used). Some localization modules create the "Kilowatt hour" UoM as they need it. (l10n_cl and l10n_tr_nilvera) So it's better to have a "generic" one available for every module. opw-5269119 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243535 Forward-Port-Of: odoo/odoo#238342
This update enables public users to access documents without needing to create a traditional Odoo user. When a user invites a public member, they can now create a linked user account, streamlining the document sharing process and improving user convenience. This change simplifies document access for external partners.
Original PR description
Purpose ======= We can share a document to a partner without a user, and with `access_via_link == 'none'`. In that situation, the partner is forced to create a user, but if he clicks on signup, then the new user won't be linked to the partner set on the `documents.access` (a new partner will be created). Now, when inviting a member, if he doesn't have a user, we invite him to create a user. If the partner has a user, then we just redirect him to the login page. Task-5242208 Forward-Port-Of: odoo/enterprise#104339 Forward-Port-Of: odoo/enterprise#100628
Resolved issues and error corrections
Restaurant preparation displays now show the correct preparation time for each course as soon as it is sent to the kitchen. This prevents staff from seeing zero or duplicated timers, helping kitchen teams track course timing more accurately.
Original PR description
Before this commit: -- - In the preparation display (PDIS), the first course shows a preparation time of 0 untill the second course is fired. - After course 2 fired, course 1 and course 2 have same preparation time value. After this commit: -- - Each course shows its correct preparation time when fired. task-5421616 Forward-Port-Of: odoo/odoo#241251
Documentation and clarification updates
This pull request adds an individual Contributor License Agreement signature record. It helps confirm that the contributor has accepted the legal terms required for contributions to Odoo.
Original PR description
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241035
This fix ensures Danish NemHandel invoice XML keeps the prepaid amount when it has a real value, such as for reconciled credit notes. It prevents valid invoices from failing electronic invoice validation during Send & Print.
Original PR description
To reproduce: create an invoice that is reconciled (typically a credit note) before Send&Print. Check the validity of the xml with a schematron => it fails due to the value of the PrepaidAmount The node PrepaidAmount gets removed because it was wrongly thought to be always empty. We now only remove it if the value is at 0. 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#242008
Product carousels on the website now display clean product names when variant display is disabled. This prevents internal product references from appearing to customers in a specific attribute setup, keeping storefront presentation consistent and professional.
Original PR description
**Issue**
When a product has a free text attribute with one value, the product reference appears in the name of the product on the product carousel.
**Expected behavior**
The product reference should not appear in the name of the product on the product carousel.
**Steps to reproduce**
1. Create a product to be sold online
2. Give it an internal reference
3. Add a free text attribute with one value
4. Set a product carousel on a website page
5. Disable "show variants" in the settings of the carousel
=> The product reference appears in the name of the product
**Note**
The issue happened only if the free text attribute has only one value, with more than one value, the product reference did not appear.
**Fix**
Updated the QWeb template to use the prepared clean title with data.get('display_name') instead of record.display_name
opw-5410822
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#242791Fixes an issue in the HTML editor where removing formatting from a table cell containing an empty colored text element could trigger an infinite loop and error. Users can now safely clear formatting in this situation without disrupting their editing workflow.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Create a m x n table - Write some text in a cell, apply color on text - Delete text and keep empty colored element - Select cell - Trying to remove format throws infinite loop error in removeAllColor **Desired behavior after PR is merged:** Clicking on remove format button should remove color from empty colored element without causing traceback. task-5454993 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242938 Forward-Port-Of: odoo/odoo#241829
Group direct messages no longer get treated like one-to-one conversations when they have only a few members. This prevents confusing chat banners, status indicators, and notification labels so users see group conversations represented correctly.
Original PR description
Before this commit, the "correspondent" property of Thread would be computed for channels of type group (group DMs) having less than 3 members. This would lead to various confusing behaviours, including: 1. The "back on" banner being shown. 2. The chat bubble showing an IM status. 3. The notification item not showing the message author's name. This commit fixes the issues by not computing `correspondent` for channels of type group. task-5462395 Forward-Port-Of: odoo/odoo#243628 Forward-Port-Of: odoo/odoo#242058
Website carousel snippets now keep a consistent height after an image is replaced, even when the new image has a different shape. This prevents visible page jumping while visitors browse carousel slides, making edited pages look smoother and more polished.
Original PR description
In a carousel snippet all carousel items keep a consistent height to prevent layout jitter when sliding. The height synchronization was broken in some snippets (e.g. s_image_gallery and s_carousel_cards) after replacing an image with one of a different aspect ratio. This fix restores the uniform height computation. Steps to reproduce: 1. In the website builder, add a carousel snippet (e.g. s_image_gallery). 2. Replace one of its images with another which is significantly tall. 3. Navigate through the carousel and observe height changes causing a jitter effect. task-5135520 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
Portal rating cards will now appear only in areas that explicitly request them, such as ecommerce and eLearning. This prevents ratings from showing unexpectedly in other customer portal pages, like helpdesk tickets, creating a more consistent user experience.
Original PR description
*: test_mail_full Modules using portal rating can set an `data-display_rating` attribute when calling the portal chatter template to indicate whether they want the rating feature displayed. Currently, only two modules have this attribute set to true: ecommerce and elearning. For other modules that don't set this attribute, even if there is a rating, such as when rating a ticket in the helpdesk module, we don't want the rating card feature to be shown in portal chatter. This change ensures that the feature is only available if the module requests it. task-5347848 Forward-Port-Of: odoo/odoo#243495 Forward-Port-Of: odoo/odoo#243255
The analytic distribution widget now closes as expected when users click elsewhere in the Bank Reconciliation screen. This helps ensure changes are kept consistently, matching the behavior users already see on invoices.
Original PR description
**Issue** When editing a line on the reco widget, close and keep change on analytic widget on unfocus **Steps to Reproduce** 1. Activate Analytic Accounting 2. Go on the Bank Reconciliation Widget 3. Edit a line 4. Change the Analytic Distribution. 5. Click elsewhere. 6. The Analytic Widget should close and keep the changes. (as it does on invoices) **Fix** Properly detect the condition for closing the widget. task-5232476
This update fixes an issue that could block customers from migrating Italian localization data from version 16.0. It ensures the migration works even when an expected exemption reason field is missing, reducing upgrade interruptions.
Original PR description
Migration from 16.0 fails because l10n_it_exempt_reason column does not exist Forward-Port-Of: odoo/odoo#240862
This fix prevents the editor from inserting Tab indentation into items that should not be indented, such as tables, attachments, or read-only content. Users selecting mixed content and pressing Tab will now get more predictable formatting limited to editable paragraph-style text.
Original PR description
#### Description of the issue this PR addresses: - Tab indentation was applied to non-paragraph and non-contenteditable blocks, leading to incorrect indentation behavior when a selection contained mixed block types. #### Desired behavior after PR is merged: - Filter selected blocks to indent only contenteditable paragraph-related elements (h1–h6, p, pre, blockquote, and div.o-paragraph), while excluding blocks marked as contenteditable="false". #### Steps to Reproduce: - Open a new to-do record. - Insert: Table, Table of Content, Banners, attachment, (18.2 - Toggle List) - Select all editor content using Ctrl + A. - Press the Tab key multiple times. => Multiple editor tab characters are inserted at unintended positions. task-5452410 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241806
This fixes an issue where USB receipt printers could stop working when a status check did not return data quickly enough. The system now handles empty printer responses correctly, helping avoid disruptions such as printer features being disabled when the lid is open.
Original PR description
When using the `python-escpos` library with a USB printer, we had to patch the read method to retry due to the result not always being immediately available. However, in the case where all the retries are exhausted, it currently returns `None`, whereas the library always expects a `bytes` result. This commit fixes the issue by returning `b""` when no result can be read. This prevents the `python-escpos` functionality from being disabled when the printer lid is open. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a Firefox-specific display issue where restoring or showing a tall page section could leave a blank gap until the user scrolled again. The editor now scrolls to the beginning of the section, giving users a more stable and predictable editing experience.
Original PR description
Steps to reproduce: - On Firefox, drop a snippet taller than the page height. - Remove it. - Undo. => The page shows a white gap until you scroll again. Same issue when showing a hidden tall snippet. After investigation, no real explanation was found for this bug in Firefox. We only observed that changing the "center" parameter to "start" in the "scrollIntoView" function fixes the issue. In the end, this is not a bad idea, since scrolling a snippet to its beginning arguably makes more sense than centering it, especially when the snippet’s height is larger than the viewport. task-5194559
This update makes automated self-order tests click the intended product in the product list rather than accidentally matching a similar item shown in the cart. It improves test reliability and helps prevent false failures during point-of-sale self-order validation.
Original PR description
Before this commit, trigger to click on a product in the product list was the same trigger to click on a product in a cart list ... With the following scenario, step CartPage.clickBack() can take few…
Before this commit, trigger to click on a product in the product list was the same trigger to click on a product in a cart list ...
With the following scenario, step CartPage.clickBack() can take few times to show the back screen, but as the trigger is the same for clickProduct on a product list screen than a cart screen, the last step clik on "o_self_product_box" ... but in the cart (and not in the product list)
ProductPage.clickProduct("Coca-Cola"), => OK
ProductPage.clickProduct("Coca-Cola"), => OK
Utils.clickBtn("Checkout"), => OK
CartPage.checkProduct("Coca-Cola", "5.06", "2"), => OK CartPage.clickBack(), => OK
ProductPage.clickProduct("Coca-Cola"), => NOK
To fix it, it is enought to just be more precise on the trigger to avoid confusions.
This fix fixes probably a pair of tours.
error-runbot-id~227669
(and probably others)
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#243749Website editors no longer see an Add New button when all items in certain page snippets have been removed. This prevents an error screen and makes editing pages with lists, timelines, FAQs, and similar snippets more reliable.
Original PR description
Steps to reproduce: - Drag and drop a "Topics List" snippet onto a web page. - Remove all "Topic" items from the snippet so that none remain. - Click the "Add New" button. - A traceback occurs. This bug is caused by the fact that the "Add item" option is defined in the "Options" section of the parent element of the topics. As a result, the option button remains visible even when no topics exist anymore. Clicking it then triggers a traceback because the option attempts to duplicate an element that does not exist. In this commit, we fix the issue by adding an "applyTo" on the option, targeting the topics, so that the "Add New" button no longer appears when no topic is present. Note that the same bug exists for other snippets, and this commit fixes them as well. task-5462596
This update resolves an issue where a payroll rule parameter setup could trigger a system error. The fix ensures that computed fields are always initialized, preventing errors when conditions aren't met. This improves the stability and reliability of payroll calculations.
Original PR description
Steps to reproduce: -------------------------------- 1. Install `hr_payroll` module without demo 2. Go to Payroll > Configuration > Rule Parameters 3. Create a new rule parameter with code 4. In…
Steps to reproduce:
--------------------------------
1. Install `hr_payroll` module without demo
2. Go to Payroll > Configuration > Rule Parameters
3. Create a new rule parameter with code
4. In history page select the date in future
Observation:
--------------------------------
Traceback occurs:
```
File '/home/odoo/odoo/community/odoo/orm/fields.py', line 1456, in __get__
raise ValueError(f'Compute method failed to assign {missing_recs}.{self.name}')
ValueError: Compute method failed to assign hr.rule.parameter(2,).current_value_one_line
```
Issue:
--------------------------------
https://github.com/odoo/enterprise/blob/bbf53fbfc19e4c422cfefabd4689fc0f5156d359/hr_payroll/models/hr_rule_parameter.py#L88-L106 The compute method assigns values only inside conditional blocks. When both conditions fail, the method exits without assigning any value to the computed fields, causing a compute error
Solution:
--------------------------------
Initialize the computed fields with `False` before the conditional logic. If the second condition is met, the correct value is then assigned. This prevents the traceback and ensures proper field computation.
opw-5438500
Forward-Port-Of: odoo/enterprise#102924This update fixes a potential issue where applicants could incorrectly reopen and re-sign expired job offers. The system now prevents access to these offers, ensuring data integrity and a smoother applicant experience. A database constraint has also been added to enforce valid offer durations.
Original PR description
This commit improves the offer validation logic to avoid invalid or unintended signature attempts. Fixes included: - Block access to offers that are already fully signed, preventing applicants from reopening the link and unintentionally reverting the offer to a partially signed state. - Add an SQL constraint on the `validity` field to disallow negative values, ensuring that expired/invalid offers cannot be accessed due to incorrect validity data. These changes ensure that expired or fully processed offers no longer expose active signature links and that offer validity is consistently enforced at the database level. task-5405456 Forward-Port-Of: odoo/enterprise#103734 Forward-Port-Of: odoo/enterprise#101834
This update resolves two issues impacting the Knowledge editor. First, it prevents copy-pasting headings from causing URL redirection problems by resetting unique identifiers. Second, it stabilizes the heading link button by throttling mouse movements, reducing unnecessary page reloads.
Original PR description
### [FIX] knowledge: prevent heading link id duplication on copy/paste Prior to this commit, copy/pasting a heading would preserve its `data-heading-link-id` resulting in mismatches for URL redirections. After this commit, such ids are always reset to guarantee unicity. ### [FIX] knowledge: throttle mousemove for heading link button Prior to this commit, every `mousemove` event could cause a layout trashing to reposition the heading link button. After this commit, the repositioning is debounced at a more reasonable rate. task-5384684
A technical issue preventing users from creating and saving bank statements within the Bank Journal Transactions module has been resolved. The fix addresses a problem where the system couldn't access necessary data, resulting in an error. This ensures users can now correctly create and save bank statements.
Original PR description
We get an owl error: `TypeError: Cannot read properties of undefined (reading 'root').` The code tries to read data from this.env.model, but it is undefined. Steps To Reproduce: 1. Install `account_accountant` 2. Go to Accounting Dashboard > Bank > `...` > Transactions 3. Open in the list view 4. Select any number of transactions 5. Type something in the statement field of one of the rows 6. Press Create and Edit to create a new Statement 8. Save the statement Ticket [link](https://www.odoo.com/odoo/project.task/5352277) opw-5352277 Forward-Port-Of: odoo/enterprise#101232
Shopee has updated the API paths used for testing their integration with Odoo. This update requires a change to the Odoo testing environment to ensure continued functionality. The team has corrected the API path configuration to align with Shopee’s new requirements.
Original PR description
Shopee has changed the API path and the original testing API paths are no longer valid. Forward-Port-Of: odoo/enterprise#103939
This update corrects a test within the Odoo website's barcode lookup feature. Recent changes in the main Odoo codebase now prevent products created through the website from automatically publishing if a category isn't selected. This fix ensures the website test accurately reflects this new behavior, maintaining consistent functionality.
Original PR description
Align barcodelookup website test with the community change where products created from the website are not auto-published when no category is selected. opw:5408903 SEE ALSO: Community PR:https://github.com/odoo/odoo/pull/242779 Forward-Port-Of: odoo/enterprise#103778