Tuesday, July 29, 2025
54 changes · saas-18.4
Resolved issues and error corrections
Fixed an issue where changing a blog post author in the website editor did not properly refresh the displayed author avatar. This helps editors see accurate author information while preparing or updating blog content.
Original PR description
The test that check avatar update on author's changes has been skipped during the merge of the initial website builder refactor, and was not re-enabled. During this time, the change to use classes for actions has been merged but broke the patch in `website_blog`. This commit adapts the patch to apply to the action instead of the plugin Actions to classes: b4b215325db61fbbe9793545293c8b6fbc99f310 Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Fixes an issue in the website editor where changing a table of contents navigation from side to top could cause it to be covered by the main website header while scrolling. This keeps page navigation visible and reliable for editors and visitors after layout changes.
Original PR description
To reproduce the issue: - Open Website and start editing - Drop a table of content snippet and click on its navbar - Change the navbar's position from left to top - Scroll down => Website's main navbar appears on top of the table's navbar and hides it. We change the snapshot system's logic to refresh the table of content interaction when we change the position (i.e. switch class from s_table_of_content_horizontal_navbar to s_table_of_content_vertical_navbar). This commit follows the [html_builder refactoring]. Related to task-4367641 [html_builder refactoring]: odoo/odoo@9fe45e2b7ddb
Agents will no longer see a misleading warning when leaving a live chat that has already ended. This reduces confusion in the Discuss sidebar and keeps the warning focused on cases where leaving would actually end an active live chat.
Original PR description
Before this PR, when leaving a live chat from the discuss sidebar action as an agent, the user was always getting a warning that this action would end the livechat, even when the livechat has already ended! task-4926337 Forward-Port-Of: odoo/odoo#220754
Mobile users can now open subtasks in the main task view instead of a pop-up dialog. This makes the discussion area available, so teams can communicate with customers directly from the subtask.
Original PR description
Before this commit, when the user is in mobile view and go to a task with subtasks and selects a subtask, the form view of that subtask is opened inside a dialog form view instead of opening the…
Before this commit, when the user is in mobile view and go to a task with subtasks and selects a subtask, the form view of that subtask is opened inside a dialog form view instead of opening the record in the main view. Because of that, the chatter for that subtask is not displayed. This commit opens the form view in the main view instead of opening it inside a form view dialog to be able to display the chatter of the subtask selected. Steps to reproduce the issue: ---------------------------- 1. Install project and go to project app. 2. Create a project A. 3. Add a task inside the project A 4. Add a subtask inside the new task created in step 3 5. Open the form view of the task created in step 3 in mobile 6. Click on the kanban record contained the subtask created in step 4 Expected behavior: ----------------- The chatter should be displayed in the form view of that subtask to be able to communicate with the customer. Current behavior: ---------------- Since the form view of the subtask selected is opened inside a form view dialog the chatter for that subtask is not displayed. task-4278273 Forward-Port-Of: odoo/odoo#220814 Forward-Port-Of: odoo/odoo#200178
Fixes an issue where updating stock quantities for one company while logged into another could use the wrong product cost. This prevents incorrect inventory valuation entries and keeps product costs accurate in multi-company setups.
Original PR description
**Problem:** when updating quantity of a product in company A from a user logged in on company B the svl are created with wrong values and standard price is incorrectly updated **Steps to…
**Problem:** when updating quantity of a product in company A from a user logged in on company B the svl are created with wrong values and standard price is incorrectly updated **Steps to reproduce:** - check two companies on the top right of the screen (comp A and comp B) - create a storable product with a avco category - make sure that the cost method of the category is avco both when logged in with company A and B (the cost method is company dependent) - while logged in with comp A create, confirm, receive and validate a PO for a quantity of 1 and a unit price of 100 - do the same while logged in with comp B but with a unit price of 10 - open the product form (cost should be 100 or 10 depending on the company) - while logged in on comp B click on the 'on hand' smart button - update from 1 to 2 the on hand quantity in the WH of comp A - switch to comp A and come back to prodcut form **Current behavior:** the standard price is 55. additionaly, when opening inventory/reporting/valuation and chossing the product we see that the svl created has a value of 55 **Expected behavior:** standard price should stay at 100 and the svl should be created with a value of 100 **Cause of the issue:** Product_price_udpate_before_done calls get_price_unit to compute the new standard price. https://github.com/odoo/odoo/blob/750265bac921936a7c29cf73f8f9e926eea4a926/addons/stock_account/models/stock_move.py#L345 Inside get_price_unit, because the move has no unit_price we use self.product_id.standard_price which will take the standard price of comp B https://github.com/odoo/odoo/blob/750265bac921936a7c29cf73f8f9e926eea4a926/addons/stock_account/models/stock_move.py#L59 opw-4852096 Forward-Port-Of: odoo/odoo#219549 Forward-Port-Of: odoo/odoo#217524
This fix moves dashboard editing style rules to the correct view so they only apply where needed. It helps ensure dashboards look and behave properly when users edit them, without affecting the read-only view.
Original PR description
Some css rules required for the edition mode of dashboards was mistakenly added on the wrong (readonly) view. Task: 4962437 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
The color picker now displays the correct theme colors after they are changed in the Theme tab. This makes the editing experience more reliable because users see the same colors in the interface that are applied to their content or website.
Original PR description
Before this commit, updating the theme colors in the "Theme" tab would not correctly update the interface of the colorpicker, but the colors would be applied properly. This commit adds a props to the colorpickers in order to use the correct theme colors (Odoo or Website Theme) depending on which should be used. task-4367641
This fixes issues in the website builder where clearing a date option could leave the field blank after repeated use, and where some design options no longer fell back to their intended default styling. It helps website editors get immediate, predictable results when configuring dates, numbers, borders, navigation, animations, logos, and theme settings.
Original PR description
[FIX] html_builder: handle clear button in BuilderDateTimePicker When the `clear` button was used three consecutive times in the BuilderDateTimePicker, the input field would remain empty instead of…
[FIX] html_builder: handle clear button in BuilderDateTimePicker When the `clear` button was used three consecutive times in the BuilderDateTimePicker, the input field would remain empty instead of reverting to its previous value. This occurred because `useDomState` wasn't being triggered due to no state change. Additionally, this fix ensures that the input field now updates immediately upon using the `clear` button, eliminating the need for subsequent validation or clicking outside the DateTimePicker. Steps to reproduce: - Drop `s_countdown` snippet. - Open DateTimePicker with the "Due Date" option. - Click the clear button, then apply. - Repeat the previous step two more times (for a total of three times). - The input field remains empty instead of displaying the current date. ------------------------------------------------------------------------------------------------------- [FIX] html_builder, website: reintroduce null default for options This commit restores the previous behavior where `data-customize-website-variable="null"` was used to set a null default value for website options, ensuring that SCSS correctly applies its own default styles to elements. This functionality was lost during the website refactor [1]. Additionally, the `BuilderNumberInput` now defaults to 0, aligning with the previous default in `UnitUserValueWidget`. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
This update brings the spreadsheet component to the latest 18.4.3 version and fixes several issues affecting spreadsheet editing and calculations. Users should see more reliable row sizing, cleaner pasted content, corrected formulas, and improved pivot behavior.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4b596d77d [REL] 18.4.3 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4b596d77d [REL] 18.4.3 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/8e43be7a8 [FIX] header_sizes_ui: preserve row sizes on insert and move ops [Task: 4885579](https://www.odoo.com/odoo/2328/tasks/4885579) https://github.com/odoo/o-spreadsheet/commit/76a224263 [FIX] evaluation: test array formula invalidation [Task: 4954710](https://www.odoo.com/odoo/2328/tasks/4954710) https://github.com/odoo/o-spreadsheet/commit/a45061c1d [FIX] auto_complete: remove toggle button for data validation [Task: 4854464](https://www.odoo.com/odoo/2328/tasks/4854464) https://github.com/odoo/o-spreadsheet/commit/30a11dd57 [FIX] Composer: Remove formatting when pasting external content [Task: 4910559](https://www.odoo.com/odoo/2328/tasks/4910559) https://github.com/odoo/o-spreadsheet/commit/71ec7d472 [FIX] Formulas: `COLUMN/ROW` spread with range [Task: 4916369](https://www.odoo.com/odoo/2328/tasks/4916369) https://github.com/odoo/o-spreadsheet/commit/cea21be36 [FIX] spreadsheet_pivot: empty row when number added to char field [Task: 4878778](https://www.odoo.com/odoo/2328/tasks/4878778) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
The website editor now stops live page interactions as soon as editing begins, preventing public-view behavior from interfering with editing tools. This helps keep pages stable and avoids potential editing glitches when website builder plugins initialize.
Original PR description
**[FIX] website: stop interactions on page edit** Since [1], interactions are restarted (stopped and started again) when the first normalize is triggered in edit. This means that all the plugins are…
**[FIX] website: stop interactions on page edit**
Since [1], interactions are restarted (stopped and started again) when
the first normalize is triggered in edit. This means that all the
plugins are started while the interactions are still in their "public"
state, potentially causing issues down the line.
By stopping all interactions as soon as the website builder switches to
edit, we ensure that the DOM is in a valid state for the edition
plugins.
Note that some edit interactions trigger some plugins shared methods
(in the website edit service, either through the `shared` object, or
through the `applyAction` method, whose action itself might then call a
shared method).
This is the reason why we do not restart them immediately. They will be
restarted with the 1st normalize anyways, which happens just after the
plugins' setup.
[1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2Shipping connector settings no longer show installation checkboxes that pointed users to older connector modules. Users are now directed to the Apps menu to choose the appropriate carrier connector, with clearer labeling for newer REST API versions and legacy options hidden by default.
Original PR description
We have recently introduced several new versions of the delivery connectors, based on the newer REST APIs introduced by the shipping companies (USPS, FedEx, UPS, DHL). However, in the settings we still link with installation checkboxes to the old modules. To avoid confusion for the user, we remove these checkboxes and refer the user to the Apps menu instead for manual installation of the preferred shipping connector. In the apps menu, we clarify that these new modules are only compatible with the new REST APIs, and we also hide the legacy modules by default by making them application: False. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218487 Forward-Port-Of: odoo/odoo#201583
This update makes removing website building blocks more consistent and reliable in the website editor. It reduces duplicated logic and helps prevent protected elements from being removed accidentally, improving editor stability for users.
Original PR description
This commit improves the code of the `remove` plugin: - Rename the `on_remove_handlers` and `after_remove_handlers` resources as `on_will_remove_handlers` and `on_removed_handlers` respectively, to…
This commit improves the code of the `remove` plugin: - Rename the `on_remove_handlers` and `after_remove_handlers` resources as `on_will_remove_handlers` and `on_removed_handlers` respectively, to be more consistent. - Adds a `is_unremovable_selector` resource in order to use it to get the selectors of the elements that are unremovable. It allows to have the resources in the different option plugins, instead of duplicating these selectors in multiple files. - Merge back the behaviors of `removeElementAndUpdateContainers` and `removeElement` as it was not correct to split them and in order to have only one main `removeElement` function. Its goal was to replace the old `remove_snippet` event, and it was clearly not used everywhere. - Remove the use of the `remove` plugin where only the JS element `remove` function was needed. We know if a given case needs to activate the parents/siblings and there are other ways to activate them anyway. - Use the `remove` plugin when this time it was necessary (e.g. when a "Table of Content" is empty). - Clean the code. task-4367641
This fixes cases where website pages and partner-related records could show a Publish button even when publishing was not actually allowed. The change makes publishing permissions more accurately calculated, reducing confusing access warnings for users managing website content.
Original PR description
*: website_crm_partner_assign, website_customer, website_membership, website_partner Commit [1] (alongside commits [2] and [3]) introduced a new context key `can_publish_unsudo_main_object` with the…
*: website_crm_partner_assign, website_customer, website_membership, website_partner Commit [1] (alongside commits [2] and [3]) introduced a new context key `can_publish_unsudo_main_object` with the goal of properly computing `can_publish` without sudo... but it missed using it properly. The related test was passing... because it was also not properly written. This commit fixes the issue by using the context key at the proper places. However, this limits the fix to pages and partners at the moment as the bug is not critical in stable versions. It however fixes a test while run in no-demo (which becomes the norm in later versions). With that in mind, this also changes the view (by *adding* things to be as stable as possible) to go around the use of the context key and make new databases properly compute `can_publish` for all records type. Old databases will keep the old behavior for some models, which leads to displaying the "Publish" button but not be able to use it (access right warning). [1]: https://github.com/odoo/odoo/commit/d47d824fc484e1592fc4af8d0d378d5a4a579550 [2]: https://github.com/odoo/odoo/commit/1a83b2508b9383e2b7df192f8641751f71f852da [3]: https://github.com/odoo/odoo/commit/436a167dedb2ed008bcb88e8a4eccafc8d20812c Related to runbot-161791 Forward-Port-Of: odoo/odoo#220424 Forward-Port-Of: odoo/odoo#219389
Fixed an issue in Point of Sale loyalty programs where customers with existing points could still claim a reward after the program's maximum usage limit had already been reached in the session. This helps ensure promotions are applied fairly and according to configured limits.
Original PR description
When an existing partner with points tries to claim a reward from a loyalty program that has reached its max usage in the current session, he was still able to claim the reward. Steps to reproduce: ------------------- * Create a loyalty program with max usage set to 1 * Create a partner and assign points to him * Open PoS and select any partner and make an order * Claim the reward from the loyalty program * Select the partner that already has points * Make an order and try to claim the reward again > Observation: The reward can be claimed, even though the max usage is already reached. Why the fix: ------------ When updating programs, we were not removing the couponPointChanges for programs that are not applicable anymore. We now make sure to delete them when the program is not applicable anymore. opw-4805704 Forward-Port-Of: odoo/odoo#220658 Forward-Port-Of: odoo/odoo#218425
The website editor no longer shows the eCommerce categories option in a mega menu when no product categories exist. This avoids confusing website editors with an option that cannot be used.
Original PR description
To reproduce the issue: 1. Delete all ecommerce categories if you have any. 2. Open website and add a Mega Menu 3. Start editing and click on the mega Menu 4. eCommerce categories option is available which shouldn't be the case as we currently don't have any category. This commmit follows the [html_builder refactoring]. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
This update fixes broken website media replacement test flows after recent website builder changes. It re-enables the related automated test and ensures SVG images can support shapes, helping keep website editing behavior reliable.
Original PR description
test_01_replace_media tests was broken and disabled after the new website builder changes.This PR adapts the tour steps accordingly and re-enables the related test. Additionally, In this PR[1] we prevent adding shape for SVG image. now we support the shape on SVG image. [1]: https://github.com/odoo/odoo/pull/128084
Fixed the portal invitation email preview so it uses the contact's details instead of relying on incomplete portal user information. This prevents an error when staff preview the Portal: User Invite template and ensures the recipient name is shown correctly.
Original PR description
[FIX] portal: display template for portal invite Steps to reproduce: ---- - Install portal module - Grant a portal access to a contact - Go to the email template (Portal: User Invite) for the contact - Click on Preview -> Traceback Issue: --- The display was based on the user itself referencing to a partner. And there was no name for the portal users. Fix: --- Changed the view so now the different values are based on the partner.Also added the name to this function based on the partner name. opw-4444729 Forward-Port-Of: odoo/odoo#211548 Forward-Port-Of: odoo/odoo#194322
When users add a website block containing images, the image quality setting now appears immediately without requiring another edit first. This makes image optimization controls available at the expected moment and avoids confusion during page editing.
Original PR description
Since `html_builder`, when a block contains an image, its quality cannot be updated before another change is done. This commit specifies the mimetype of the image before the first transformation so that the quality option can properly evaluate its visibility condition. Steps to reproduce: - Drop a block with an image (or several images, or a background image) - Select the image (or the block with a background image) => The Quality option did not show up. task-4367641
Invoice analytic allocations now add up exactly to the original invoice line amount, avoiding small rounding differences such as a one-cent mismatch. This improves accounting accuracy and prevents confusion when reviewing analytic items.
Original PR description
**PROBLEM** Sometimes, the sum of the generated analytic lines for an invoice line doesn't equal the amount on the invoice line. For example, in invoice line with a price of 182.25, with an analytic…
**PROBLEM** Sometimes, the sum of the generated analytic lines for an invoice line doesn't equal the amount on the invoice line. For example, in invoice line with a price of 182.25, with an analytic distribution split into 98% and 2%, the generated analytic lines amount to 182.26 (off by 0.01) because of rounding. **STEP TO REPRODUCE** 1. install the accounting module and enable the Analytical Accounting option. 2. create an invoice, with a line with a price of 182.25, and a distribution of 98%/2%. 3. confirm the invoice. 4. go to Accounting/Analytics Items and notice the sum of analytical line is 182.26 instead of 182.25. **CAUSE** We only apply rounding after having calculated all the analytic line amounts. This mean we will sum the rounding error. In our example, the computation is like so: 98% of 182.25 = 178.605 rounded to 178.61 2% of 182.25 = 3.645 rounded to 3.65 178.61 + 3.65 = 182.26 **FIX** We compute the last analytic line for each plan, relatively to the other. `last_line_amount = invoice_price - sum(rounded_other_line_amount)` This ensure that the sum of analytic lines is always equal to the invoice price. opw-4848784 Forward-Port-Of: odoo/odoo#220614 Forward-Port-Of: odoo/odoo#214736
This fix prevents website forms from failing when a field is renamed and visibility rules are involved. It avoids an error caused by invalid circular dependencies, helping users keep editing forms without interruptions.
Original PR description
This PR ensures to fix the traceback-error of the circular field dependency in the form.
This fix prevents an error when users create an Analytic Distribution while working with multiple companies, including one without fiscal localization configured. It helps accounting users continue setup and configuration smoothly without being blocked by a crash.
Original PR description
Currently, an error occurs when a new company is created without selecting a `Fiscal Localization`, and then both companies are selected while creating a new `Analytic Distribution`. Steps to…
Currently, an error occurs when a new company is created without selecting a `Fiscal Localization`, and then both companies are selected while creating a new `Analytic Distribution`. Steps to reproduce: --- - Install `Accounting` module(without demo) - Enable `Analytic Accounting` - Create a New company and switch to it - Select both companies and Open `Analytic Distribution` and click `New` Traceback: --- `TypeError: 'bool' object is not subscriptable` At [1], we are searching by `account_type`, but if `Fiscal Localization` is not set for the current company, there will be no records in `account.account`. However, due to the multi-company setup, it still return accounts from the first company. In such cases, the `code` field is empty, which causes the `code` to be treated as False. [1]: https://github.com/odoo/odoo/blob/d155edfd729ab9b53f38939fe24b6d1e7b578083/addons/account/models/account_analytic_distribution_model.py#L55-L58 sentry-6754820454 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220089
Fixes purchase orders billed in a foreign currency before goods are received so invoice amounts reflect the full ordered quantity, not just one unit. It also prevents small unwanted exchange differences from being created when the receipt is later validated, improving accounting accuracy.
Original PR description
**Current behavior:** Creating a purchase order in a foreign currency and billing the product prior to reception will produce 2 issues: A) The bill line for the product will only make a conversion of…
**Current behavior:** Creating a purchase order in a foreign currency and billing the product prior to reception will produce 2 issues: A) The bill line for the product will only make a conversion of 1 single unit of the product with the defined currency exchange rate, making the amount on the line incorrect when qty > 1 B) When the receipt is finally validated, there will be an unwanted exchange difference on the journal items generated due to asymmetrical rounding for the bill AMLs and receipt valuation AMLs **Expected behavior:** Correct bill line currency amounts and symmetric rounding. **Steps to reproduce:** 1. Set the company currenct to IQD, make a product invoiced on ordered qty, for sake of example set cost to 500 IQD 2. Create a currency exchange record to USD with a company rate of `0.00756` 3. Create a PO for 13 of the product created in step 1, with a discount of 1% 4. Confirm the PO and create the bill -> post it * Issue A) look at invoice line, see only 1 unit in the converted currency amount is accounted for by the `balance` 5) Receive the product -> look at the journal items generated and see that there is a diff of 0.185 IQD **Cause of the issue:** A) commit: 90158f6 added a method to try and calculate an AML balance from its purchase line values, but mistakenly is using `qty_received` instead of `qty_to_invoice` which explains why this issue only presents for the bill-before-receipt flow B) commit: 9f046d5 is using `round=False` context for `AccountTax.compute_all()` when the expected key is `round_base` **Fix:** A) Replace `qty_received or 1` with `qty_to_invoice` * Also make the test added in 90158f6 more robust B) Add `round_base=False` alongside the `round` key (not removing as that existing one could have become expected in this context) opw-4689170 Forward-Port-Of: odoo/odoo#220323 Forward-Port-Of: odoo/odoo#205850
A live chat chatbot test now waits until form changes are fully saved before finishing. This prevents false test failures and helps keep automated quality checks stable without changing user-facing behavior.
Original PR description
Tour "test_chatbot_clear_answers_on_step_type_change" could fail with following error before this commit: ``` Tour finished with a dirty form view being open. Dirty form views are automatically saved when the page is closed, which leads to stray network requests and inconsistencies. ``` The tour was saving the changes to form view but was not awaiting a trigger when the form is saved, thus the tour could end and still see form is dirty. This commit replaces `.o_form_view` to `.o_form_saved` for awaiting the form is fully saved and not dirty at end of test tour. Fixes runbot error 230296 Forward-Port-Of: odoo/odoo#220810
Event tickets sold through Point of Sale now keep the same “Registered” status as tickets sold through the website after payment. This avoids incorrectly marking attendees as already attended and keeps event records consistent across channels.
Original PR description
Before this commit, if we buy an event registration from PoS and pay for it, its state will be 'done', i.e. "Attended" [1]. While if we buy the registration from the website and pay for it, its state is 'open', i.e. "Registered" [2]. We want the state of the registration to be 'open' when we buy it. After this commit, we set the state of events bought from PoS to 'open' as well, matching the case where we buy them from the website. [1]: https://github.com/odoo/odoo/blob/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c9/addons/pos_event_sale/models/event_registration.py#L14 [2]: https://github.com/odoo/odoo/blob/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c9/addons/event_sale/models/event_registration.py#L40 opw-4920574 Forward-Port-Of: odoo/odoo#219622
Fixes a visual issue where product ribbons could shift away from product images when customers zoomed in or out on website product pages. This keeps promotional or status labels correctly positioned, preserving a polished shopping experience.
Original PR description
<b>Steps to Reproduce:</b> 1. Install Sales and eCommerce modules. 2. Go to Sales → Products, open any product, go to Sales tab, and set a Ribbon. 3. Navigate to Website → Shop, search for the…
<b>Steps to Reproduce:</b> 1. Install Sales and eCommerce modules. 2. Go to Sales → Products, open any product, go to Sales tab, and set a Ribbon. 3. Navigate to Website → Shop, search for the product and open its page. 4. Zoom in or out. <b>Issue:</b> - The ribbon on the product image becomes misaligned (shifts away from the image) when zooming in or out on the product detail page. This results in a broken visual layout. <b>Cause:</b> - A previous change in [PR #175473](https://github.com/odoo/odoo/pull/175473) unintentionally replaced the height class (h-100) with width (w-100) on ribbon container, causing layout instability during zoom operations. <b>Solution:</b> - Restore the proper layout by reintroducing h-100 to both the ribbon container and inner image div. This ensures the ribbon stays correctly positioned relative to the image regardless of zoom level. <b>opw-4854217</b> <b>Before FIX :</b>  <b>After FIX:</b>  Forward-Port-Of: odoo/odoo#216545
Autocomplete fields now preserve spaces when users type multi-word search terms, preventing words from being visually joined together. This improves data entry clarity across contact, employee, resource, unit of measure, and tag selection fields.
Original PR description
This commit fixes an issue in many2x autocomplete fields where typing a complete word followed by a space would result in that space being removed, causing the next word to stick to the previous one. The problem stemmed from how highlighted search results wrap the matched text in a \<span\>, which inadvertently isolates adjacent spaces. Combined with the display: flex styling of parent elements, these isolated spaces were visually trimmed. To resolve this, each autocomplete result item is now entirely wrapped in a \<span\>, preventing space trimming and ensuring proper word separation during input. task-4898120 Forward-Port-Of: odoo/odoo#218768
Online paid self-ordering sales now appear correctly in the POS ticket list. Staff will see paid orders marked as paid and offered the refund action instead of being prompted to load them again.
Original PR description
**Steps:** - Configure POS with self-ordering via QR code and online payment. - Open a session and place a paid order through self-ordering. - In the POS UI, open the TicketScreen and apply the "Paid Orders" filter. **Issues:** - The paid order does not show the "Paid" tag. - The "Load Order" button appears instead of the "Refund" button. **Cause:** - The paid order retains an outdated uiState, with `uiState.locked` incorrectly set to false. **Fix:** - Use `finalized` instead of `uiState.locked` to determine order state on TicketScreen. - Remove the unused `locked` property from `uiState` in posOrder. Task: 4745869 Related: odoo/enterprise#86684 Forward-Port-Of: odoo/odoo#220729 Forward-Port-Of: odoo/odoo#207406
This update makes a website test wait until an image is fully loaded before checking its size. It reduces random test failures, helping keep the release process more stable without changing customer-facing behavior.
Original PR description
The goal of this commit is to avoid potential undeterminism that could occur in the `drop_404_ir_attachment_url` test (introduced by [this commit]). Before this commit, an error was thrown if the image was not loaded at the time the test checks the `naturalWidth` and `naturalHeight` property of the image. This could lead to undeterministic error as nothing ensures that the image is loaded at that time. To solve the problem this commit first waits for the image to be loaded before accessing the `naturalWidth` and `naturalHeight` property of the image. Side note: even if the source of the image is of type `data:` it is not directly loaded. [this commit]: https://github.com/odoo/odoo/commit/fbc6a697c1adf67ee8a90c49b0150d6ca170e081 task-4931144 Forward-Port-Of: odoo/odoo#220204 Forward-Port-Of: odoo/odoo#217968
Removing a background image from website cover blocks now also removes the leftover color overlay. This prevents pages from keeping an unintended tinted appearance after editors remove parallax background images.
Original PR description
Since the `html_builder`, when a block has a parallax background image and the image is removed, any applied color filter remains applied. This happens because the `editingElement` of the image toggle is the parallax span instead of the actual section - and therefore the color filter element is not properly located. This commit finds out about that situation and removes the filter from the right element. Steps to reproduce: - Drop a "Cover" block - Remove its background image => Its color filter remained present in the DOM. task-4367641
This fix makes mail conversation loading more consistent and avoids an error when a conversation is missing. It helps prevent unexpected failures when opening or reusing already loaded mail threads.
Original PR description
1. Ensure the thread is not undefined before calling exists. 2. `hasReadAccess` was only checked after the RPC, but if the thread data was already fetched the condition was not checked. The choice is made to remove the condition as it makes the code more flexible. The caller can always decide to check `hasReadAccess` afterwards if necessary. How to reproduce: https://github.com/odoo/odoo/pull/220605 Forward-Port-Of: odoo/odoo#220782
Users who leave a Discuss call while camera permission is still pending will no longer trigger an error if camera access is rejected. This makes video call handling more reliable and avoids disruptive traceback messages in edge cases.
Original PR description
Before this commit, a traceback would occur of the camera access was rejected after leaving a call that requested it. This race condition could also happen in other cases where the call is left before the camera promise resolves. Forward-Port-Of: odoo/odoo#220770
Fixes an issue in the web editor where changing a button into a regular link could leave the wrong editing controls visible and cause an error when saving. This improves reliability for website content editors making simple button style changes.
Original PR description
Problem: Saving the button snippet after changing its type to a link throws an error because `snippet_key` is `undefined`. Cause: The button snippet editor should be disabled if the button is changed…
Problem: Saving the button snippet after changing its type to a link throws an error because `snippet_key` is `undefined`. Cause: The button snippet editor should be disabled if the button is changed to a link. However, `updateOptionsUIVisibility` is only triggered on click events. In this case, the element type changes through the editor itself, not by clicking, so the UI isn't updated accordingly. Solution: Trigger a `click` event on the link element programmatically to call `updateOptionsUIVisibility` and hide the button snippet editor when the element is no longer a button. Steps to reproduce: - Drop a button snippet - Click inside the button to edit - Notice the Button snippet editor appears - Change the type to "Link" instead of "Primary" - The Button snippet editor is still visible - Click the floppy disk icon (save) in the snippet editor -> A traceback occurs opw-4936796 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220787 Forward-Port-Of: odoo/odoo#219660
This fix updates a Point of Sale automated test so it uses its own measurement unit instead of relying on demo data. This helps prevent false test failures and keeps release validation more reliable.
Original PR description
Before this commit: = - The test `test_quantity_package_of_non_basic_unit` used `product_uom_inch`, which is `archived` by default, causing the test to fail without demo data. - It only worked with demo data because `l10n_us_account` `unarchives` this UoM. After this commit: = - Created a **test UoM** to ensure consistent test behavior. Runbot-error: 223122 Forward-Port-Of: odoo/odoo#219292 Forward-Port-Of: odoo/odoo#214547
Shared Helpdesk ticket links now show the logo and branding of the company that owns the ticket, even when viewed by someone who is not logged in. This prevents customers from seeing the wrong company identity on portal pages in multi-company setups.
Original PR description
**Steps to reproduce**: 1. Install `helpdesk` only 2. Create a second company and configure a distinct logo for both the default and new companies. 3. Create a Helpdesk ticket under the new company.…
**Steps to reproduce**: 1. Install `helpdesk` only 2. Create a second company and configure a distinct logo for both the default and new companies. 3. Create a Helpdesk ticket under the new company. 4. Use the 'Share Ticket' (gear icon) feature to generate a portal link. 5. Open the link in an incognito window or a different browser (where no user is logged in). 6. Observe the logo shown in the portal navigation bar. **Observed behavior**: The portal incorrectly displays the logo and branding of the default/main company, even when the Helpdesk ticket belongs to a different company. **Issue**: When no portal user is logged in, the `res_company` used in the portal rendering context defaults to the system’s primary company (`env.company`). The template expects `res_company` to be explicitly set to reflect correct branding. See: https://github.com/odoo/odoo/blob/880954ebfc1106411b7f7a7d60aee05dfae60893/odoo/addons/base/models/ir_qweb.py#L781 **Solution**: Explicitly pass `ticket_sudo.company_id` as `res_company` in the portal view context to ensure correct company branding is used. opw-4855281 Forward-Port-Of: odoo/enterprise#90600
Sales commission achievement reports now include down payments and other invoice lines that do not have a product attached. This prevents mismatches between invoice analysis and commission results, especially for plans expected to match invoiced amounts.
Original PR description
In the sale achievement report, down payments and other account move lines that have no product attached to them would not be accounted for in the sale commission achievement report. This was due to the fact that the table was being inner joined on product_id which would get rid of records that had no product. Because of this behavior there would be a mismatch between the invoice analysis of a user and their commission even if the rate was 100% on the commission plan. Left joining the products onto the account move line keeps the lines with no products and fixes the discrepancy between the report and the invoice analysis. opw-4625340 Forward-Port-Of: odoo/enterprise#91010 Forward-Port-Of: odoo/enterprise#83477
Users working across multiple companies can now send signature templates from the company they are currently using. This prevents an access error that blocked signature requests when the template was linked to a different default company.
Original PR description
Problem: In a multi-company environment, users are unable to send templates in non-default companies despite them creating the template. A traceback gets thrown because the template is using the…
Problem: In a multi-company environment,
users are unable to send templates in non-default
companies despite them creating the template.
A traceback gets thrown because the template
is using the default company on the create user,
instead of the current environment's company.
Purpose: The user should be able to send templates they created in any allowed companies.
Steps to Reproduce on Runbot:
[ADMIN]
1. Install Sign
2. Navigate to Settings > Sign > Enable "Sign Default Terms & Conditions"
3. Create another company and allow Marc Demo access
[Marc Demo]
1. Change to a non-default company
2. Try to send a signature request (e.g. upload pdf to sign > send)
3. Traceback gets thrown
```
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/mylynahy/src/odoo/odoo/fields.py", line 1161, in __get__
value = env.cache.get(record, self)
File "/home/mylynahy/src/odoo/odoo/api.py", line 1020, in get
raise CacheMiss(record, field)
odoo.exceptions.CacheMiss: 'res.company(2,).sign_terms_type'
During handling of the above exception, another exception occurred:
...
odoo.addons.base.models.ir_qweb.QWebException: Error while render the template
AccessError: Due to security restrictions, you are not allowed to access 'Companies' (res.company) records.
Records: BE Company CoA (id=2)
User: Marc Demo (id=6)
This restriction is due to the following rules:
- company rule employee
Note: this might be a multi-company issue.
Contact your administrator to request access if necessary.
Template: sign.sign_template_mail_request
Path: /t/table/tr[5]/t[1]/td/a
Node: <a t-att-href="\'%s/sign/terms\' % record.get_base_url()" class="text-dark"/>
```
opw-4706828
Forward-Port-Of: odoo/enterprise#85402This fix removes leftover code from an earlier reconciliation model update. It reduces maintenance risk in accounting-related workflows without changing the user experience.
Original PR description
In this commit: https://github.com/odoo/enterprise/pull/80787/commits/04a304d58a56c7d2eeb70429340eb048fa9f2be6 We refactored the reconciliation model to be easier to use for users. However, by doing the refactor we forgot to remove some code. no task id Forward-Port-Of: odoo/enterprise#90310
Creating a helpdesk ticket from the timesheet timer now keeps the selected support project context, preventing validation errors about missing analytic accounts. The timer also correctly recognizes helpdesk projects even before they have existing tickets, so users see the ticket option instead of a task option.
Original PR description
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket…
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket Issue: ------ 1. Validation error raised: `At least one analytic account must be set.` 2. When we select a helpdesk project that does not have any ticket linked to it already, the field next to it is set to `Task` (task_id) instead of `Ticket` (helpdesk_ticket_id). Cause: ------ 1. When creating the ticket, we don't provide the default project who got the analytic account linked to it. 2. The field `helpdesk_ticket_id` is hidden because we consider that we the project is not linked to any helpdesk team; this is because we retrieve the projects based on tickets already created only. Solution: --------- 1. Set the default project in the context when creating the ticket (like for a task). In the create method, if no team is provided and we have a default project (from `list_value` or the `env.context`), we set the team based on the project if the project is linked to a helpdesk team. 2. Fetch all projects that have `helpdesk_team` field set. opw-4404097 Forward-Port-Of: odoo/enterprise#91110 Forward-Port-Of: odoo/enterprise#76779
Credit card payments in the Italian POS are now assigned the correct default index for fiscal printers. This prevents valid card payments from being incorrectly reported as not paid on Italian fiscal receipts.
Original PR description
In Italy if a payment method is of type 'Credit card' (type 2), and it's index is 0 the payment made with it is considered as 'Not paid' by the italian fiscal printer. Why the fix: ------------ We change the default index of the payment method to 1, so that it is considered as 'Paid' by the fiscal printer. opw-4963421 Forward-Port-Of: odoo/enterprise#90919
The Accounting dashboard now correctly opens the bank reconciliation list showing only transactions that still need review. This prevents already checked transactions from appearing in the “To Check” view, helping users focus on pending items.
Original PR description
**Issue** When accessing bank transactions via the "To check" link in the Accounting dashboard, the expected filter to show only unchecked transactions is not applied. As a result, all transactions are displayed, including those that have already been checked. **Steps to Reproduce** 1. Navigate to Accounting > Dashboard > Bank 2. Create two bank statement lines: one marked as checked, the other unchecked 3. Return to the dashboard 4. Click the “1 To Check” link 5. Observe that both entries are shown, instead of only the unchecked one **Root Cause** The corresponding filter (`to_check`) is missing from the search view of the `account.bank.statement.line model`. Although the action context correctly includes `search_default_to_check=True`, Odoo is unable to apply the filter without a matching `<filter name="to_check" ... />` in the search view definition. Opw-4945705 Forward-Port-Of: odoo/enterprise#90803
This fix moves dashboard styling rules to the correct editing view instead of applying them to the read-only dashboard view. It helps ensure dashboards look and behave correctly depending on whether users are viewing or editing them.
Original PR description
Some css rules were mistakenly added to the readonly action of the dashboard instead of it edition action. Task: 4962437
Rental orders with multiple planned service lines now check staff or resource availability before creating planning shifts. This prevents the same resource from being assigned to overlapping shifts and creates an open shift when no resource is available, reducing scheduling conflicts.
Original PR description
Steps to Reproduce: ---------------------- - Install the sale_renting_planning module. - Create a rental service product with `Plan Services` enabled. - Create a rental order with multiple lines for the same product. - Confirm the rental order Issue: --------------------------- - You'll see that some generated shifts are assigned to same resource causing conflict. Cause: --------------------------- - Shifts are being generated at the same time for all the SOL which cause them to be assigned to the same resource and make conflict. Fix: ----------------------------- - In this commit when the shift values are generated we will check if the resources are available or not. If no resource is available then it will create open shift for that SOL. task-4829807 Forward-Port-Of: odoo/enterprise#88767
Clearing a document selection from the control panel now also clears the details panel. This prevents users from seeing outdated document details after they have removed the current selection.
Original PR description
The details panel does not update when clearing the selection through the control panel. Steps to Reproduce: ==================== - Open the detailsPanel. - Select a document. - Click on a blank space, which removes the current selection. - Re-select a document. - Click the ‘x’ button on the control panel to clear the selection. - The document selection in the detailsPanel does not get cleared. Technical =========== In DocumentsRightPanel and how DocumentsDetailsPanel is handled, The panel relies on the `state.focusedRecord` to determine which record's details to display. However, when clicking the ‘X’ button in the control panel to clear the selection, the `state.focusedRecord` is not being Updated or cleared, the detail panel still shows the previously focused record. After this PR: Clicking the ‘x’ will properly clear the selection from the detailsPanel. Task-4752944 Forward-Port-Of: odoo/enterprise#85272
Shipping settings no longer show install checkboxes that pointed users to older connector versions. Users are now directed to the Apps menu to choose the right shipping connector, with clearer labels for the newer REST API versions and legacy connectors hidden by default.
Original PR description
We have recently introduced several new versions of the delivery connectors, based on the newer REST APIs introduced by the shipping companies (USPS, FedEx, UPS, DHL). However, in the settings we still link with installation checkboxes to the old modules. To avoid confusion for the user, we remove these checkboxes and refer the user to the Apps menu instead for manual installation of the preferred shipping connector. In the apps menu, we clarify that these new modules are only compatible with the new REST APIs, and we also hide the legacy modules by default by making them application: False. Forward-Port-Of: odoo/enterprise#90010 Forward-Port-Of: odoo/enterprise#81354
Bank reconciliation now handles models using a different currency correctly, so foreign currency amounts and company-currency balances are no longer treated as the same value. The receivable and payable actions also avoid creating automatic reconciliation models unexpectedly, reducing unintended accounting setup changes.
Original PR description
Before this commit when applying a reco model with a different currency, the amount currency and the balance were equals. task-4931177 Before this commit when applying the receivable or payable button, the automatic reco models would be created. We don't want that behavior task-4930730 Forward-Port-Of: odoo/enterprise#89775
This update fixes an issue that could cause automated checks to fail when preparing default Swiss payroll records. It helps keep Swiss payroll transmission workflows stable and reduces the risk of setup-related interruptions.
Original PR description
https://runbot.odoo.com/odoo/runbot.build.error/115307 Forward-Port-Of: odoo/enterprise#90487
Field service sales orders with zero-priced products now correctly show as ready to invoice when Anglo-Saxon accounting is enabled. This prevents valid no-charge items from being blocked by an incorrect 'Nothing to Invoice' status.
Original PR description
Before this commit: When Anglo-Saxon accounting is enabled and a product with sale price of zero is added to SO through field service, the invoice_status show 'Nothing to Invoice'. After this commit: With Anglo-Saxon accounting enabled, adding product with a zero sale price to an SO through field service will display the invoice_status as 'To Invoice' instead of 'Nothing to Invoice'. task-3957962 Forward-Port-Of: odoo/enterprise#70132
Fixes errors that could block customers using invitation links during appointment booking. Users can now move back to the date/time or meeting selection steps without seeing server or access errors when multiple resources are available.
Original PR description
Fixes two issues regarding the buttons on the front-end progress bar in the appointment flow, when using an invitation link. Commit messages give steps to reproduce.
1. Fix 500 error when clicking 'Date & time' with more than one resource / user configured on the invitation link.
2. Fix 403 error when using the operator ('meeting' actually) step button with more than one specific resource in the invitation link.
Task-4897098
Forward-Port-Of: odoo/enterprise#90335
Forward-Port-Of: odoo/enterprise#88521The optional columns menu no longer shows the “Add custom field” button when users view bank statement lines. This prevents users from seeing a customization option that should not be available in the bank reconciliation workflow.
Original PR description
`Add custom field` button shouldn't be displayed with `account.bank.statement.line` model. Since c6ade2de937a30a13620a64a4779ebd827088755, we use an action to open the bank reconciliation widget, therefore in the `computeStudioEditable` method, we didn't pass in the first condition `!action.xml_id` anymore and we were returning `true`. With this commit, we return `false` if model is `account.bank.statement.line`. Steps: - Install `accountant` - Go to Accounting dashboard - Click on the `Bank` card title - Toggle the list view - Open the optional columns dropdown -> The `Add custome field` button is displayed opw-4953156 Forward-Port-Of: odoo/enterprise#90935
This fixes a setup gap where the VAT return journal could be missing when accounting reports or accountant features were installed after accounting was already configured. Businesses get more reliable VAT return preparation, with the journal created only when appropriate to avoid unnecessary clutter for invoicing-only users.
Original PR description
Issue: The VAT return journal is not created when installing `account_reports` (or `accountant`) after `account`, when the CoA is already created. Solution: Create it in the post init hook. Note that…
Issue: The VAT return journal is not created when installing `account_reports` (or `accountant`) after `account`, when the CoA is already created. Solution: Create it in the post init hook. Note that we force the creation of the journal only when `accountant` is installed because it would make noise for invoicing only in most cases. It will still be created automatically when needed. Also, make the code a little bit more robust: * instead of mixing "default misc journal" and vat return journal logic, just use one logic * the function `_get_tax_closing_journal` could return multiple journals but was always used as if it could only contain one * the function `_get_tax_closing_journal` could not return any journal. Instead, we now create the journal or look for a value on the parent companies if any. * Manage `show_on_dashboard` in `create` also by using an inverse field. Even if in normal cases the journal will always be created after the company the thus set through `write`, it is not impossible to set it in `create` when creating company branches. Since it is always done when setting the journal on the company, there is no need to set the field in the post-init hook. Forward-Port-Of: odoo/enterprise#91126
The HR Referral autocomplete now keeps spaces in suggested names, making search results easier to read and recognize. This fixes a display issue so users can more confidently select the right referral-related record.
Original PR description
This commit applies the same methodology as in https://github.com/odoo/odoo/pull/218768 to resolve the missing spaces issues in many2x autocomplete search results. task-4898120 Forward-Port-Of: odoo/enterprise#90138
The point of sale integration now uses the correct order completion status when displaying tickets. This removes an unused internal flag, helping prevent incorrect order state handling and keeping the checkout experience more reliable.
Original PR description
In this commit: ==== - Use `finalized` instead of `uiState.locked` to determine order state on TicketScreen. - Remove the unused `locked` property from `uiState` in posOrder. Task-4745869 Related: odoo/odoo#207406 Forward-Port-Of: odoo/enterprise#91097 Forward-Port-Of: odoo/enterprise#86684
WhatsApp debug logging now handles file replies safely instead of trying to save raw file content as text. This prevents crashes when customers reply with PDFs, images, or other files while request debugging is enabled.
Original PR description
When Debug requests is enable on the whatsapp business account and user replies with the file, a traceback will appear. Steps to reproduce the error: - Install ``whatsapp`` and ``contacts`` - Create…
When Debug requests is enable on the whatsapp business account and user replies with the file, a traceback will appear. Steps to reproduce the error: - Install ``whatsapp`` and ``contacts`` - Create a whatsapp business account > Enable Debug requests - Create a contact > Add a phone number > send whatsapp message with any whatsapp template - Now reply with the file(ex. pdf or image) in message from the contact's whatsapp. - Traceback in terminal Traceback: ``ValueError: A string literal cannot contain NUL (0x00) characters.`` https://github.com/odoo/enterprise/blob/b52a93da7d680b60646cb08a9126cf6c12f5307d/whatsapp/models/whatsapp_account.py#L166 Here, ``message`` contains NUL (0x00) characters because user replies with the file, value for the ``message`` comes from the below response. response: https://github.com/odoo/enterprise/blob/b52a93da7d680b60646cb08a9126cf6c12f5307d/whatsapp/tools/whatsapp_api.py#L49-L57 Here, ``res.text`` contains NUL (0x00) characters. So, it will lead to the above traceback. sentry-6314521165 Forward-Port-Of: odoo/enterprise#91055 Forward-Port-Of: odoo/enterprise#83274
Saving a spreadsheet global filter with a duplicate label and a restricted value range no longer causes a crash. Users now see the duplicate label error directly, making the filter setup flow clearer and more reliable.
Original PR description
Steps to reproduce: - Create a global filter with label 'aa' - Create a new text filter with the same label - Check 'Restrict values to a range' - Select a range with some values - Confirm the range selection - Click the save button Current behavior before PR: - A traceback occurred when saving the new filter with a duplicate label and a selected range. After the crash, the duplicate label error was shown. Desired behavior after PR is merged: - The duplicate label error is raised directly without triggering a traceback. Task: [4813177](https://www.odoo.com/odoo/2328/tasks/4813177) Forward-Port-Of: odoo/enterprise#90155