Wednesday, February 25, 2026
14 changes · saas-18.4
Enhancements to existing features
This update adds a shorter command option for running selected tests, making it quicker for developers and release teams to use existing test filtering. It does not change business features or customer-facing behavior, but helps streamline internal quality checks.
Original PR description
Backport of https://github.com/odoo/odoo/pull/234287 <img width="408" height="151" alt="image" src="https://github.com/user-attachments/assets/7f22826f-6887-432b-8baf-8a6778b9cadf" /> Forward-Port-Of: odoo/odoo#249854 Forward-Port-Of: odoo/odoo#249123
Resolved issues and error corrections
This fixes a timing issue where buttons could briefly show and remove a loading state even when an action completed quickly. Avoiding that unnecessary change helps keep website builder history clean and reduces random test failures without changing normal user workflows.
Original PR description
__Before commit__ When using `makeButtonHandler`, a loading effect is applied to the button if the handler takes more than 400ms to execute. However, if the handler finishes sooner, the effect is still briefly added and removed, triggering a DOM mutation. If a button is clicked and the website builder opens immediately after, this mutation may be recorded in the current history step despite being unnecessary. This causes the `design-themes` tour `theme_menu_hierarchies` to fail in a non-deterministic way with the following warning: "should not have any 'characterData', 'remove' or 'add' mutations in current step when you update the selection" __Fix__ Ensure the loading effect is never added if the handler execution time is shorter than the debounce duration. This fix is applied to both `makeButtonHandler` functions in the codebase. The test case is only added for the interaction use case, as the other instance resides in legacy code. runbot-229803
Miscellaneous changes
This commit adds the new modules of pos_edi_ubl and l10n_jo_edi_pos to weblate. Forward-Port-Of: odoo/odoo#250324
Original PR description
This commit adds the new modules of pos_edi_ubl and l10n_jo_edi_pos to weblate. Forward-Port-Of: odoo/odoo#250324
Fiscal position views now show inactive taxes consistently in the "Replaces" tax mapping field, matching the behavior seen from the tax configuration screen. This helps accounting users review and maintain tax replacement rules without missing archived taxes that may still be relevant.
Original PR description
Observed issue: inactive taxes are shown in "Replaces" `original_tax_ids` field if the form view of a tax is opened through "Configuration"->"Taxes", but not shown under "Replaces" in a fiscal position tree view, nor are they shown in the same "Replaces" field of the tax form view when opened from the fiscal position tree view. Cause: the fiscal position link calls `action_open_related_taxes` on partner (path `/account.tax/[id]`), while the "Configuration"->"Taxes" calls `action_tax_form` on tax (path `/taxes/[id]`), which has additional context element `'active_test': False` among others. Solution: adding the context to the fiscal position action produces the desired behavior, but it might break something else as it affects the whole view. task-5917667 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247787
Archived employee records with only one version can now be deleted without triggering an incorrect validation error. This removes an unnecessary blocker for HR data cleanup while preserving the rule that employees must keep an active version when applicable.
Original PR description
Version – saas-18.4 Issue: Deleting an archived version of an employee that has only a single version raises a `ValidationError` stating: `Employee %s must always have at least one active version.` Steps to Reproduce: - Make an archived version of an employee which have exactly one version. - Try to delete that archived version - Validation Error will occur which states that `Employee %s must always have at least one active version.` Cause: The validation logic prevents deletion when the number of versions being deleted equals the total number of unarchived versions of the employee. Fix: Improved the ValidationError logic by ensuring that no error is raised when the version being deleted is archived. Impact: Archived employee versions can now be deleted without raising unnecessary errors. Task – 5347109 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where a product could remain unpublished after being assigned to a website category during the product creation flow. The update ensures the publishing status is saved correctly and the automated check waits for the category update to finish, reducing false failures and improving reliability.
Original PR description
Error: AssertionError: False is not true self.assertTrue(product.website_published) Cause: Commit https://github.com/odoo/odoo/commit/ca198cfc7c41a8c15b2734518016007aa1c16457 relies on _onchange_public_categ_ids to set website_published=True when a category is assigned. Two issues: 1. website_published was not in the dialog form view, so its onchange value was never tracked or sent to the server on save. 2. The tour clicks Save before the onchange response is received, so the product is saved without website_published=True. Fix: - Add website_published as an invisible field in the dialog form view so its value is tracked and sent on save. - Wait for the category badge to appear before submitting, ensuring the onchange has completed before save. runbot-237976 Forward-Port-Of: odoo/odoo#249027
Website background image tests now load and cache needed images ahead of time, reducing failures caused by slow or hanging network requests. This makes automated testing more stable and faster, helping teams catch real issues with less disruption.
Original PR description
Background option tests were failing in nightly builds sometimes because of the network hang. This commit aims to fix the errors by prefetching the images and caching them. Here's the `background_option` test suite and the total time it took to finish with a throttled network (fast 4G) before and after the commit, respectively. | Before commit | With commit | |--------|--------| |<img width="610" height="224" alt="image" src="https://github.com/user-attachments/assets/a98fb1fe-27a1-4f73-901f-7d7ade8ecd86" />|<img width="610" height="224" alt="image" src="https://github.com/user-attachments/assets/c9ed0948-8112-4f2b-b843-c887c9302b76" />| | 26.7 (s) | 15.4 (s) | runbot-237641
Invoices for Qatar now spell the currency name as "Riyal" instead of "Rial" when showing the total amount in words. This avoids incorrect wording on customer-facing accounting documents for Qatar companies.
Original PR description
Steps to reproduce: 1- Install Accounting and 'l10n_qa' modules 2- Switch to Qatar company and enable "Total amount of invoice in letters" under accounting settings 3. Issue an invoice and preview it The issue: The description of the amount uses "Rial" Expected behavior: The amount should use "Riyal" opw-5919587 Forward-Port-Of: odoo/odoo#250299
Searching for an archived account now correctly displays its related journal items. This helps finance users review historical accounting activity without needing to reactivate old accounts.
Original PR description
This commit makes it possible to see the journal items for archived account when searching for the account. Previously, when searching for an account that is archived, its journal items weren't shown. task-5905559 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249422
Input fields now size themselves more accurately across browsers, including cases with thicker borders or browser differences. This prevents text fields from overflowing and improves form usability without relying on fragile browser-specific checks.
Original PR description
Before this PR, `autoresizeInput` used a fixed buffer of `5px` to compensate for input borders. This caused incorrect sizing when inputs had thicker borders, leading to overflow issues. Safari 16 and…
Before this PR, `autoresizeInput` used a fixed buffer of `5px` to compensate for input borders. This caused incorrect sizing when inputs had thicker borders, leading to overflow issues. Safari 16 and earlier versions did not include padding and border in `scrollWidth`. To work around this, browser detection via regex was used to add a hardcoded extra value. A similar issue appeared in Firefox 145, where scrollWidth also excluded padding and border, causing inputs to overflow again. After this PR, The buffer is no longer hardcoded. The border width is now calculated dynamically and applied correctly to the final width. Browser sniffing has been removed entirely. Instead, the logic detects at runtime whether scrollWidth includes padding; if not, the missing padding is added to the computed width. This makes the behavior consistent across browsers and prevents overflow without relying on user agent checks. task-[5412025](https://www.odoo.com/odoo/project/1519/tasks/5412025) Forward-Port-Of: odoo/odoo#241315
This update resolves an issue where helpdesk users with limited access were unable to view tickets due to a restriction in accessing related stock data. The fix adds a permission group to allow helpdesk users to read the necessary stock information, ensuring they can properly access and manage tickets. This improves usability for helpdesk staff.
Original PR description
To reproduce: ============= - install helpdesk_stock - with user having only User rights on helpdesk and nothing on other modules - try to access a ticket -> AccessError Problem: ======== when reading the ticket, the field `suitable_product_ids` is computed, and it requires read access to records the user doesn't have access to, which raises an AccessError. Solution: ========= Add the group `stock.group_stock_user` to the field, so that only users having access can read it. backport of https://github.com/odoo/enterprise/pull/59605 opw-5907657 Forward-Port-Of: odoo/enterprise#108139 Forward-Port-Of: odoo/enterprise#107291
This update addresses a necessary refresh of tax codes within the Odoo Enterprise system, which hadn't been updated for four years. The change ensures continued accurate tax calculations and avoids potential issues related to outdated tax information. A future enhancement will automate this update process for users.
Original PR description
It's been 4 years since the last update [1]. No codes were removed. At some point it would be nice to add this to the avatax_sync_company_params() method so it can be initiated by the user. But we need to update this file regardless, and the mechanism would need to be smart enough to not cause duplicates when e.g. the user has synced it themselves, we then update the csv and they then update the module. [1] https://github.com/odoo/enterprise/pull/30220 opw-5928245 Forward-Port-Of: odoo/enterprise#108209
This update fixes an issue where warehouse names with only numbers (e.g., '01') were displayed incorrectly in the barcode app. The fix removes a browser setting that caused numerical warehouse codes to be reversed, ensuring they are always shown in the correct order. This improves the accuracy of product information displayed to users.
Original PR description
### Steps to detect the bug: - Download stock apps - Enable "storage locations" settings under warehouse index - Change name of warehouse with a name composed only of numbers (ex. 01) - Create a…
### Steps to detect the bug:
- Download stock apps
- Enable "storage locations" settings under warehouse index
- Change name of warehouse with a name composed only of numbers (ex. 01)
- Create a product (with barcode number)
- Insert a number of products available with smart button "on hand"
- Create a new delivery for that product
- Go to barcode app and search for the delivery you just created
- Click on it and see that the name of the warehouse will be stock/01 instead of the correct 01/stock
### The problem:
The previous configuration used direction: rtl; on the warehouse name
element in the barcode app. So if the string contains only letters the
standard visual order is maintained, however, when the string consists
entirely of numbers the rtl property forces the browser to reorder them
from right to left.
### The reson to introduce the fix:
By removing this property, it is ensured that numerical warehouse codes are displayed in their natural sequence without being flipped.
opw-5730199
Forward-Port-Of: odoo/enterprise#107920This update removes unnecessary HTML wrapping from article content, streamlining the structure and preventing potential performance issues. The change ensures articles render with a cleaner HTML format, improving overall website efficiency. This is a minor fix addressing a technical detail.
Original PR description
Prior to this commit, `_get_transformed_body_from` wrapped the source body in a `div` because `lxml.html.fragment_fromstring` is used with a `create_parent=True` argument. That argument is required because otherwise, the function throws an error if there are multiple root nodes in the parsed string, which is frequent in an article body. The final returned string still contained that additional `div` ancestor. This does not break an article per se, but repeated usage would increase the html structure depth by 1 every time, and that additional `div` was not part of the function desired transformations. task-5960616 Forward-Port-Of: odoo/enterprise#108310