Wednesday, September 2, 2026
27 changes · saas-19.4
Enhancements to existing features
Timesheet users are now directed to Odoo’s newer Timesheets Assistant browser extension instead of the older Activity Watch extension. This helps users find the recommended extension for tracking and completing timesheets more easily.
Original PR description
Before this commit, the links pointing to the browser extension of Activity Watch. However, a new extension called Timesheets Assistant has been published by Odoo to improve the Activity watch extension. This commit replaces the links pointed to the browser extension to set the links for Timesheets Assistant browser extension. task-6470304 Forward-Port-Of: odoo/enterprise#129883
Website editors now see clearer explanations for font weight choices and form requirement settings, reducing confusion when configuring pages. The website editor color picker also displays its hex input correctly in light styling, improving usability while editing.
Original PR description
**[IMP] website: clarify builder option tooltips** Clarify (with tooltips) font weight settings and how multiple form requirement values are combined. ---------------- **[FIX] html_builder, html_editor: fix color picker hex input** Before this commit, the `hex` color input was dark in Website edit mode. After this commit, it uses the light color defined by the builder. task-6259086
The web interface framework was updated to a newer version, improving how unfinished component setup is handled when parts of a page are removed. This prevents editor callbacks from running for content that was never actually displayed, reducing the risk of inconsistent behavior in HTML editing.
Original PR description
Release notes: https://github.com/odoo/owl/releases/tag/v3.0.0-alpha.48 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
Guadeloupe, Martinique, and Réunion are now treated like mainland France when setting up electronic invoicing addresses. This helps businesses in these regions get the correct French electronic address automatically, reducing manual setup and errors.
Original PR description
In France, some drom-com (Guadeloupe, Martinique and Réunion) needs to use pdp just like France. So we should add those 3 for the computation of `peppol_eas`, so it will autocomplete to **France FRCTC Electronic Address**. task-6344558 Forward-Port-Of: odoo/odoo#283675 Forward-Port-Of: odoo/odoo#278272
The mail module now sends publisher warranty information in a standard JSON format instead of a Python-specific format. This improves compatibility with the warranty server and helps ensure the submitted data is processed reliably.
Original PR description
Format the publisher warranty message using json.dumps() instead of Python's native str() representation. This ensures serializeid JSON serialization for the payload sent to the warranty server. Forward-Port-Of: odoo/odoo#285632 Forward-Port-Of: odoo/odoo#283139
Resolved issues and error corrections
This fix keeps low-credit IAP errors identifiable instead of converting them into generic user-facing errors. It helps Odoo handle billing or credit shortages separately from other request problems, improving reliability of services that depend on IAP credits.
Original PR description
Even if `raise_user_error` is enabled, these errors should remain so that the caller can distinguish between a request error and a lack of IAP credits.
This update fixes typos and wording inconsistencies in the Point of Sale LNA checklist. It helps make the checklist clearer and more professional for users who rely on it during localization or review work.
Original PR description
Fixed some typos and inconsistencies on the LNA checklist document Task-[6330795](https://www.odoo.com/odoo/project/1737/tasks/6330795) 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#281950
Employee updates in Swiss payroll no longer create unnecessary history messages for pension mutation records. This keeps employee chatter cleaner and makes important payroll history easier to review, especially when automated hourly updates run frequently.
Original PR description
Calling `_create_or_update_snapshot` after writing on an employee recomputes `lpp_mutations`, deleting and recreating the linked records. Because `lpp_mutations` was tracked, every `write` on an employee generated unhelpful chatter entries, cluttering important history. This was especially noisy during frequent writes in hourly crons. Disable field tracking on `lpp_mutations` to improve chatter clarity and overall user experience. opw-6285407 --- Forward-Port-Of: odoo/enterprise#129628 Forward-Port-Of: odoo/enterprise#128033
Delivery forms now show the product move description again. This restores important context for warehouse and delivery teams, helping them identify products and instructions accurately during fulfillment.
Original PR description
**Issue** The description is missing on the delivery. **Steps to reproduce** - Create and confirm a SO with any product - Go to the delivery -> The description of the product is not showing **Cause** The forward-port commit https://github.com/odoo/odoo/commit/38fff432180a3dbfb75fb0300423acb891016ac0 mistakenly removed the description, instead of moving it. opw-6511774
Live chat visitors will now see the chatbot typing animation between scripted steps again. This fixes a display issue that made chatbot conversations feel less responsive, without changing the chatbot flow itself.
Original PR description
Before this commit, a chatbot never shows that it is typing: the animated dots between two steps of its script never appear in the livechat. This happens because typingMessage tests this.isTypingUi on the Chatbot record, a getter of discuss.channel.member that Chatbot does not have, so the read is always undefined and no typing message is inserted. This comes from "[IMP] mail: disable isTyping when muted", which renamed the reads of the member field and took the read of the chatbot's own isTyping attribute along. This commit tests isTyping again, so the typing message shows while the script waits between two steps.
Fixes an editor issue where replacing a selected link with a newly pasted URL updated the destination but left the old URL visible as the label. Users now see the pasted URL both as the link text and destination when replacing full URL-style links, reducing confusion and incorrect-looking content.
Original PR description
**Current behavior before PR:** Steps to reproduce the issue: - Create a link via typing a valid URL + space. - Copy/Paste a different URL from the browser. - Select the entire link you just created. - Paste the copied URL on top of it. Notice that the label is still the old URL even though the URL actually changed. This happens because after commit [1] When pasting a URL over an active text selection, selected content is converted into a link pointing to the pasted URL. This should not be the case if selected content is a link with same label and URL. **Desired behavior after PR is merged:** If a link is entirely selected and its label is the same as URL then it should replace the existing link label with new URL. [1]: https://github.com/odoo/odoo/commit/d356043a67e1d7291bd1302b1e90a2d9a07718da task-6456004 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281700
The tax included/excluded toggle now avoids showing an unwanted outline when users hover, click, or focus on it. This keeps sales and purchase screens visually cleaner and ensures the same styling is applied consistently across accounting, sales, and purchasing.
Original PR description
The "Tax Excl."/"Tax Incl." toggle badge showed an unwanted outline in two cases: - On real keyboard/click focus, Bootstrap draws its default focus ring. - On plain mouse hover, useNavigation adds a "focus" class. Also, sale.order and purchase.order views were never given the `tax_mode_badge` class, so the account.scss fix silently never applied to them at all.
This fix prevents bank account verification from failing when a batch includes partners missing VAT numbers or bank accounts. Businesses can now verify multiple Polish partner records more reliably, even when some records are incomplete.
Original PR description
When we check for multiple partners with some valid and some being incomplete (no vat or no bank account), a traceback is raised This was due to a bracket accessor, changed into a get in this commit. no-task Forward-Port-Of: odoo/odoo#285631
This fix makes the creation order of manufacturing-related accounting entries predictable when validating subcontracting receipts. It prevents inconsistent results in tests and reduces the risk of confusing or unstable accounting line ordering for the same business operation.
Original PR description
The search order on account move line depends on date, move name and id. This search result order can be non deterministic because, when creating account move line from stock valuation, it depends on…
The search order on account move line depends on date, move name and id. This search result order can be non deterministic because, when creating account move line from stock valuation, it depends on the order from a set, but sets are unordered. **Step to reproduce** Run [test_subcontracting_purchase_bill](https://github.com/odoo/odoo/blob/13b2781978b0edad0df0800404276919b767e32b/addons/mrp_subcontracting_purchase/tests/test_mrp_subcontracting_purchase.py#L268) in: Single app, community, with demo data. **Observation** * The search: When doing the search since we didn't specify any order, the search from account.move.line will ordered by: https://github.com/odoo/odoo/blob/3dd41395e2e4205fa477eb474d4a4dba0a976154/addons/account/models/account_move_line.py#L23 https://github.com/odoo/odoo/blob/3dd41395e2e4205fa477eb474d4a4dba0a976154/addons/account/models/account_move_line.py#L1664 Since, for the components the date and move name are the same it will only depend on the aml ids: * `Account.move.line` creation: When it validate the receipt (`button_validate`) https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/mrp_subcontracting_purchase/tests/test_mrp_subcontracting_purchase.py#L296 It will mark as done the picking (`_action_done`) and the productions (`button_mark_done`) linked to this picking. https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/stock/models/stock_picking.py#L1429 https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/mrp_subcontracting/models/stock_picking.py#L49 Modify the inventory accordingly (`_post_inventory`) https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/mrp/models/mrp_production.py#L2231 while inside of `_post_inventory`, it will process all the production moves, for this it will divided them in set to process them by batch: https://github.com/odoo/odoo/blob/f0e58b9324af18d0cf0264aec2886d098e997f03/addons/mrp/models/mrp_production.py#L1904-L1911 From this set, it will create the `account.move.line`: It retrieve the actual stock move with the browse, and call `_action_done`, from where the stock valuation layer will create the `account.move.line`. https://github.com/odoo/odoo/blob/f0e58b9324af18d0cf0264aec2886d098e997f03/addons/mrp/models/mrp_production.py#L1913 https://github.com/odoo/odoo/blob/f0e58b9324af18d0cf0264aec2886d098e997f03/addons/stock_account/models/stock_move.py#L187 The issue arise because a set read order is non deterministic. runbot-939794 Forward-Port-Of: odoo/odoo#279396
This update adds the missing translation configuration for the Greek electronic invoicing module. It ensures the module can be included in the standard translation workflow, helping Greek localization content stay properly translated.
Original PR description
Commit https://github.com/odoo/odoo/commit/45bd522dde7a67194e14a40d66944a2e34d1f79d introudced a new module without it's related `weblate.json` entry. This commit fixes this omission. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285570
The point of sale quotation list now hides quotations that have already been settled. This prevents staff from accidentally selecting and settling the same quotation more than once, reducing duplicate processing errors.
Original PR description
Once a quotation is settled, opening the quotation list should not allow selecting it again. This commits updates the domain to prevent it. task-6479356 Forward-Port-Of: odoo/odoo#284768
This fix prevents the guided tour feature from crashing when a saved tour can no longer be found. Users, including those on free trials, should now have a smoother experience when resuming product tours.
Original PR description
get_tour_json_by_name returned an empty array instead of False when no tour matched. TourService.getTour then skipped its `!tour` guard and crashed reading `tour.steps.length` on that string. Issue spotted on free trials 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#286059
Users can now open WhatsApp Business account settings after switching Odoo to another language, such as French (Belgium). The fix makes the page rely on a language-independent identifier instead of translated screen text, preventing an error that blocked access.
Original PR description
Currently, an error occurs when a user tries to view the WhatsApp Business account. **Steps to Reproduce:** - Install the `whatsapp_oauth` module. - Go to `Settings` > `Languages` and add `French…
Currently, an error occurs when a user tries to view the WhatsApp Business account. **Steps to Reproduce:** - Install the `whatsapp_oauth` module. - Go to `Settings` > `Languages` and add `French (BE)`, then `switch to it`. - Go to `WhatsApp` > `Configuration` > `WhatsApp Business Accounts (Comptes Whatsapp Business)`. `ValueError: L'élément '<xpath expr="//div[contains(normalize-space(.), 'Receiving Messages')]">' ne peut être localisé dans la vue parente` When the user changes the language, the text in the view is translated [1]. Since the WhatsApp account view tries to locate the div using the plain text Receiving Messages [2]. Since the text has been translated in the parent view, the XPath can no longer locate the element and raise the error. This commit ensures that the XPath uses the name attribute to identify the element, which is language-independent. We cannot use the class attribute because the same class is used by other div elements. [1]- https://github.com/odoo/enterprise/blob/a3db72899cb97612505aebbd5450aeb65205db73/whatsapp/views/whatsapp_account_views.xml#L81-L84 [2]- https://github.com/odoo/enterprise/blob/a3db72899cb97612505aebbd5450aeb65205db73/whatsapp_oauth/views/whatsapp_account_views.xml#L61-L63 7534862409 Forward-Port-Of: odoo/enterprise#130003
The Belgian payroll attendance tests were adjusted so they remain reliable when demo employee data changes the company's worker count. This avoids false test failures in automated validation without changing payroll behavior for users.
Original PR description
The FFE employer contribution rate depends on the company's current worker count. Additional demo employees installed on runbot can move the company across the applicable threshold and change the expected payslip amounts. This commit update the test expectations according to the computed worker count. [error-939674](https://runbot.odoo.com/odoo/error/939674) Forward-Port-Of: odoo/enterprise#129702 Forward-Port-Of: odoo/enterprise#126887
This change makes an automated test for the web reference field behave consistently even when there is a small network delay. It helps reduce false failures in the validation pipeline without changing product behavior for users.
Original PR description
The test is non-deterministic and fails with the runbot error:
found 0 elements instead of 1:
0 matching ".ui-autocomplete .ui-menu-item:nth-child(2)"
if there is even a 100ms network delay. clear() dispatches input events, but without flushing the timers, the dropdown state at the time of click(".o_field_reference input") can be out of sync causing no menu items to render and failing the test.
This change makes the sequence deterministic without changing the assertions:
1. runAllTimers() clears the timers and allows the clear of the input to fully go through.
2. click(".o_form_view") unfocus the input so the next click of the input refocuses and triggers the menu opening.
3. checking contains on the dropdown children ensures the menu items can render before click.
runbot error: 940222
Forward-Port-Of: odoo/odoo#286055This change ensures the India inventory features load the required accounting-related stock component during setup. It prevents test and installation failures caused by a missing field, improving reliability without changing day-to-day user workflows.
Original PR description
The view 'l10n_in_ewaybill_stock.view_picking_form_inherit_ewaybill' is broken in single-app tests because it depends on stock.picking:country_code. That field is provided by module 'stock_account' through auto_install relationship. 'stock_account' auto_installs with 'stock' and 'account' installed. This condition exists on stable so it's safe to add this dependency. The dependency is added to l10n_in_stock because it seemed like the logical place where 'account' and 'stock' functionality comes together. [l10n_in_ewaybill_stock] ──[depends]──> [l10n_in_stock] [l10n_in_stock] ──[depends]──> [stock] [l10n_in_stock] ──[depends]──> [l10n_in] ──[depends]──> [account_tax_python] ──[depends]──> [account] REF Runbot: https://runbot.odoo.com/odoo/error/945482 Forward-Port-Of: odoo/odoo#284990
This fix ensures that applying text color in the HTML editor affects only the exact selected content, not surrounding partially selected formatting. It prevents unintended color changes or messy formatting when users select text across styled inline elements.
Original PR description
Problem: When applying color on a selection that spans across partially selected inline elements (e.g. `<p><b>a[b</b>c]d</p>`), container elements whose contents are not fully selected (such as…
Problem: When applying color on a selection that spans across partially selected inline elements (e.g. `<p><b>a[b</b>c]d</p>`), container elements whose contents are not fully selected (such as `<b>`) were included in `targetedNodes`. This caused improper color formatting/nesting on partially selected elements. Cause: In `ColorPlugin._applyColor()`, `targetedNodes` were filtered by checking `isNodeEditable(node)` and `nodeName !== "T"`, but did not check whether the contents of `node` were fully selected (`areNodeContentsFullySelected(node)`). As a result, partially selected ancestor elements were included in `targetedNodes`. Solution: Filter `targetedNodes` in `_applyColor()` using `this.dependencies.selection.areNodeContentsFullySelected(node)` to ensure only fully selected nodes are targeted when applying colors. Steps to reproduce: 1. Open html_editor. 2. Insert content: `<p><b>ab</b>cd</p>`. 3. Select `b` inside `<b>` and `c` inside `<p>` (`<p><b>a[b</b>c]d</p>`). 4. Apply text color (e.g. red). 5. Observe "ab" and "c" was colored instead of just "b" and "c". task-6456443 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285658 Forward-Port-Of: odoo/odoo#281462
Fixes a crash that could happen when editing a product image in Inventory with AI product features installed. Users can now open the image edit dialog normally, avoiding disruption when maintaining product records.
Original PR description
Steps to reproduce: 1. Install `stock` (Inventory) and `ai_product`. 2. Activate Developer Mode (debug mode). 3. Open the Inventory app and go to Products -> Products. 4. Select any product. 5. Hover over the product image and click the Pencil (Edit) icon. 6. The page crashes with an `OwlError: Invalid component props (CustomMediaDialog) [ ... missingKeys: ["document"] ]`. Cause: The `MediaDialog` (and `CustomMediaDialog` which extends it) defines `document` as a mandatory prop. However, the base `ImageFieldWithMediaDialog` class's `mediaDialogProps` getter failed to provide this prop, leading to a prop validation failure in Owl when the edit dialog was opened. Fix: Add `document: window.document` to `ImageFieldWithMediaDialog.mediaDialogProps`. task-6357622 **Enterprise counterpart https://github.com/odoo/enterprise/pull/123050**
This fix makes an internal website performance test reliable by ensuring it starts from the expected setup every time. It prevents failures caused by demo data from other website features changing the admin profile's publication status during parallel test runs.
Original PR description
# Before this commit: The image controller performance test expects the admin partner to be unpublished. In parallel test runs, the website_partner demo data publishes the admin partner, causing the…
# Before this commit:
The image controller performance test expects the admin partner to be
unpublished. In parallel test runs, the website_partner demo data
publishes the admin partner, causing the test to follow a different
code path and fail.
However, during parallel test execution, the website_partner module
installs its demo data, which updates the admin partner:
```
<record id="base.partner_admin" model="res.partner">
<field name="is_published">True</field>
</record>
```
As a result, user_admin.website_published becomes True.
# After this commit:
The test explicitly restores the required precondition by setting the
admin partner's is_published value to False before executing the
performance check.
As a result, the image controller always follows the expected
"unpublished" code path, making the test deterministic regardless of
whether website_partner or any other module with demo data has already
been installed during parallel testing.
Runbot-241102
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#278550Fixes an issue where updating suggested products could fail for unpublished eCommerce products in a category. This prevents an error during product management and helps staff keep product recommendations updated reliably.
Original PR description
Currently, an error occurs when the user tries to update suggested products. **Steps to Reproduce:** - Install the `website_sale` module. - Go to `Settings` and enable `Automate suggested products`…
Currently, an error occurs when the user tries to update suggested products.
**Steps to Reproduce:**
- Install the `website_sale` module.
- Go to `Settings` and enable `Automate suggested products` under the `eCommerce` section.
- Go to `Website` > `eCommerce` > `Products` > `Products`.
- Create a `product` and, in the `eCommerce` tab, add a `category`.
- Make sure the `product` is `not published`.
- On the `product`, click the `gear icon` and select `Update suggested products`.
`ValueError: TypeError('unsupported operand types in: product.template() | None') while evaluating 'records.action_update_suggested_products()'`
When the user updates suggested products, the system updates the product's suggested
products - optional, accessory, and alternative products [1]. While updating the alternative
products [2], the system tries to find products based on the categories and attributes shared
with the current product [3]. When retrieving products from the current product's category,
it gets None [4] because the products linked to that category are unpublished and are
therefore excluded by the domain [5]. Later, using this None value raise the error.
This commit ensures that when accessing a missing key in the category dictionary, then it falls
back to an empty product recordset.
[1]: https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L346
[2]: https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L384-L386
[3]: https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L471-L483
[4]- https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L482
[5]- https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L445-L456
sentry-7660509183
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#281487This fix prevents an error when loading sample data in Shop Floor if a specific work center schedule was deleted. The system now uses the standard working schedule as a fallback, helping manufacturing users set up sample work orders without interruption.
Original PR description
Currently, an error occurs when loading the sample data in the Shop Floor. **Steps to Reproduce:** - Install the `mrp_workorder` module. - Go to `Employees` > `Configuration` > `Working Schedules`. -…
Currently, an error occurs when loading the sample data in the Shop Floor. **Steps to Reproduce:** - Install the `mrp_workorder` module. - Go to `Employees` > `Configuration` > `Working Schedules`. - Delete the `Work Center 40 hours/week` record. - Go to `Settings` > `Users & Companies` > `Groups`. - Open the `Manage Work Order Operation` group and add the `Administrator` to the `users` list. - Open the `Shop Floor`. If the `Activate your Work Center` dialog appears, click it and then click `Configure Later`. - Click `Load Samples`. `ValueError: External ID not found in the system: mrp.mrp_workcenter_calendar` After the [recent commit], the sample work center uses the `Work Center 40 hours/week` working schedule instead of `Standard 40 hours/week`. As a result, if the `Work Center 40 hours/week` record is deleted, loading the sample data raises the error [1]. This commit ensures that when the Work Center 40 hours/week calendar is not available, it falls back to `Standard 40 hours/week`, restoring the previous behavior [2]. This fallback is required because `resource_calendar_id` is mandatory from the view perspective, even though it is not required at the model level. If it is left empty, the form displays a missing required field. The `Standard 40 hours/week` calendar is always available because it is linked to the main company [3] and its `resource_calendar_id` field uses `ondelete='restrict'` [4], preventing it from being deleted. [recent commit]: https://github.com/odoo/enterprise/commit/336d721f7b353473fe5e07c29ce14ed77a88fb98 [1]- https://github.com/odoo/enterprise/blob/c0045ec3cf94650d66192a4ca3e0dc3c17daa5bd/mrp_workorder/models/mrp_production.py#L213-L216 [2]- https://github.com/odoo/enterprise/blob/51c1e74e90e510d59aad78820e2c29e821ba2854/mrp_workorder/models/mrp_production.py#L214-L217 [3]: https://github.com/odoo/odoo/blob/4c4219a7d9d51f703b15e83ab755faf1f2c8a71d/addons/resource/data/resource_data.xml#L10-L12 [4]: https://github.com/odoo/odoo/blob/4c4219a7d9d51f703b15e83ab755faf1f2c8a71d/addons/resource/models/res_company.py#L12-L13 sentry-7651161729 Forward-Port-Of: odoo/enterprise#126859
This update fixes how the translation test module applies internal patches so it works reliably across different tenants and after the module is uninstalled. It reduces the risk of test-related behavior leaking or breaking in shared environments.
Original PR description
Fix patch for test_translation_mode Patch tools in a compatible way which will work for other tenants. Patch tools in a compatible way which will work after uninstallation. python code translation is not patchable by design. 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#285538