Friday, July 4, 2025
47 changes · saas-18.4
Resolved issues and error corrections
Price list rules now update correctly when products or variants are changed, reducing pricing mistakes. Archived price lists are hidden from rule views, and price-related labels and inputs are clearer based on enabled settings.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website builder now shows a more accurate preview of the Color Blocks snippet before it is placed on a page. This helps users make layout choices with confidence because the preview better matches the final page result.
Original PR description
The `s_color_blocks_2` block uses paddings expressed using the `vw` unit. Inside the snippets modal, this makes them evaluated to a value that does not reflect the aspect ratio of the actual block. This commit forces the padding of the block during preview to fixed values so that it better matches the dropped version inside the page. At the time of writing, there is no other block that uses that unit. task-4367641
The website builder no longer shows the “Round Corners” setting when editing Font Awesome icons. This removes an unintended option, making the icon settings clearer and reducing confusion for website editors.
Original PR description
The `BorderConfigurator` used in `FontAwesomeOption` did include the field to specify "Round Corners". This was unintended. This commit removes the "Round Corners" field from the "Icon"'s options. task-4367641
This fixes cases where website-specific hidden elements could still appear because the system checked a shared template status instead of the current website's setting. Website editors can now more reliably show or hide menu and template options for each website.
Original PR description
Fixed cache pollution of _get_cached_template_info and added tests regarding the website editor, more specifically on enabling or disabling options related to views. Context: - Base: - the xmlid and…
Fixed cache pollution of _get_cached_template_info and added tests
regarding the website editor, more specifically on enabling or disabling
options related to views.
Context:
- Base:
- the xmlid and key of ir.ui.view are unique;
- the ir.ui.view are inherited if they are active, otherwise inheritance
is not applied;
- _get_cached_template_info(key) returns the cached record values.
- Website:
- the key of ir.ui.view are not unique; they can exist for different
websites and without a website;
- the ir.ui.view are inherited if they are active, otherwise inheritance
is not applied. If a specific inherited view exists (for the current
website), the default view (with same key) is not applied;
- for t-call, the specific view are used only if the view is active,
otherwise the default view is displayed;
- is_view_active(key) should return False if the view of the website in
question is inactive. If the default view is False, but the website
view is True, then the response should be True;
Issue:
`is_view_active` returns True if a view with this key is active, ignoring
the website-specific inactive view.
The issue was seen because the editor changes the display (active) of the
views by copying them with the website reference. So when we want to
change the menu, and hide it, the view is copied and set active=False.
Part of the menu was still visible because it uses a
`t-if="is_view_active(...)"`.
Issue introduced by: 97c2dd2ec569d34b044da6aa6f473277b48ada12Website editors now see image gallery, image wall, and carousel card settings in the expected order again. This makes page editing more predictable and also restores missing border and shadow controls for carousel cards.
Original PR description
Since the conversion to `html_builder`, the image gallery and image wall options order was shuffled. This commit restores the initial order by splitting the options in two templates and specifying sequences on each part. task-4367641
This fixes an issue where newly added image blocks could inherit placeholder styling, making the final image appear faded or incorrectly rounded. Website editors now get the expected image appearance immediately after drag and drop, reducing manual cleanup.
Original PR description
> [BVR] Drag and drop an "Image" Inner Content block. The image has the opacity-50 class (and also the rounded class — unclear why). The opacity-50 class is probably for the placeholder, but it should be removed for the image The commit b401f887a2d844720a34d73ba4dcadb78bf7ee29 adds the argument `node` to `openMediaDialog` in `ImageSnippetOptionPlugin.onSnippetDropped`. This caused the style of the placeholder to be used for the dropped image (including the `opacity-50`) task-4367641
This fix prevents a hidden backup preview frame from interfering with mouse actions in the website builder. Users can resize website elements more reliably, reducing frustration while editing pages.
Original PR description
Since [1] when the fallback iframe was reintroduced in `html_builder`-based website builder, the resize operations do not behave properly anymore - some mouse events seem to be caught by the wrong iframe. This commit avoids this by sending the fallback iframe a bit below the main one. [1]: https://github.com/odoo/odoo/commit/e167c3b4bfeda7b4482a755563dbd0fb90d70cbe task-4367641
Product unit labels are now hidden across sales, purchasing, inventory, manufacturing, and point of sale screens when the Units of Measure feature is not enabled. This reduces unnecessary information and avoids confusion for users who do not use multiple units of measure.
Original PR description
**Description of the issue/feature this PR addresses:** Should not show product uom when the feature "Units of Measure" is not activated  --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216905 Forward-Port-Of: odoo/odoo#190006
This fix prevents visitors or editors from posting comments or uploading files from the blog comment area while the website builder is open. It keeps editing mode focused on page design and avoids accidental public interactions during content changes.
Original PR description
> [MOU, chrome]: Enable comments on a blog post page > You can send comments from the "Edit" mode (already spotted on master, but with the new code, a user can also upload documents...) Steps to reproduce: - Go to `/blog` - Open website builder - Enable "Comments" at the "Bottom" - Bug: you can write messages, send them, ... while still in editor mode This commit blocks with `pointer-event: none` on `#discussion` because this is the id of the top div of `portal.message_thread` task-4367641
This update fixes how employee version status is calculated by separating the logic into clearer parts. It helps make HR records more reliable and easier to maintain without changing the day-to-day user experience.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents purchase stock tests from failing when an optional product matrix feature is not installed. It only uses extra product attribute information when that attribute is actually available, improving reliability in single-app test environments.
Original PR description
### Description of the issue/feature this PR addresses: [build_error-227711](https://runbot.odoo.com/odoo/error/227711) ### Current behavior before PR: When testing for proper move descriptions, we…
### Description of the issue/feature this PR addresses:
[build_error-227711](https://runbot.odoo.com/odoo/error/227711)
### Current behavior before PR:
When testing for proper move descriptions, we add a second (no variant) attribute to the product only if the module `purchase_product_matrix` is installed.
In its absence (such as in a single-app test), we only have a single attribute_line, and referring to a second line throws an IndexError:
```
Traceback (most recent call last):
File "/data/build/odoo/addons/purchase_stock/tests/test_create_picking.py", line 886, in test_move_description
'product_no_variant_attribute_value_ids': [Command.set(product_with_description.attribute_line_ids[1].product_template_value_ids[0].ids)],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
File "/data/build/odoo/odoo/orm/models.py", line 6375, in __getitem__
return self.browse((self._ids[key],))
~~~~~~~~~^^^^^
IndexError: tuple index out of range
```
### Desired behavior after PR is merged:
Instead, we should only populate the `product_no_variant_attribute_value_ids` of the order line when the no_variant attribute is present in the product, i.e. only when the optional module is installed.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix prevents users from being redirected to another website page after clicking Edit while the editor is still loading on a slow connection. It keeps the website builder focused on the intended page, avoiding a broken editing session and user confusion.
Original PR description
With a slow connection, it is possible to click on edit, then click on a menu link before the builder opens and be redirected. This should not be possible and was not the case before [1]. Steps to reproduce: - Set your network to "regular 3G" - Click on Edit - Click on another menu item => The iframe is redirected, then the builder sidebar opens but you can't edit the page. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Website builder snippets now appear in the correct default language when editing multilingual websites, including after switching between websites. The related automated test has also been restored to help prevent this issue from returning.
Original PR description
\* = html_builder, website This PR re-enable the `test_snippet_translation` test that were broken and skipped after the DOM changes introduced by the new Website Builder and adapts it's tour selectors. (commit 2) It also fixes some translation related issues that were introduced by the new Website Builder. (see commit 1 and 3)
This fixes a visual issue where the first row of color choices in the editor color picker did not line up with the rows below. It also improves usability by keeping the selection shape correct on touch devices and making keyboard navigation between rows more consistent.
Original PR description
Steps to reproduce: - Go to the html_editor (via Project for example) - Select a text and open the colorpicker | Current | Expected | |--------|--------| |  |  |
Odoo now correctly translates invoice email buttons when multiple invoices for customers using different languages are sent and printed together. This prevents customers from receiving emails with a button label in the wrong language, improving communication quality and professionalism.
Original PR description
**Issue**: When multiple invoices with different customer languages are sent and printed together, the invoice email button may appear with an incorrect translation for some of them. **Steps to…
**Issue**: When multiple invoices with different customer languages are sent and printed together, the invoice email button may appear with an incorrect translation for some of them. **Steps to reproduce**: - Open the Accounting app - Go to Customers > invoices - Create a new invoice with a customer with its language set to German - Create a new invoice with a customer with its language set to English - Go back to Customers > invoices - Select the two invoices just created and click on action > Sent & Print and then click on the Sent & Print button - Go to Settings > Technical > Email > Emails and check the two last emails. One of them should have the invoice email button wrongly translated **Cause**: Before sending an email, it retrieve the `type_name` using the lang of the customer https://github.com/odoo/odoo/blob/28c3b9cf10488536dce5a4927fdbe8fcd6e5a839/addons/account/wizard/account_move_send.py#L596C1-L605C14 This will trigger that compute method https://github.com/odoo/odoo/blob/a6368e8a5787f3067d09d79516a2924b3f1207f0/addons/account/models/account_move.py#L841C1-L850C67 which set the `type_name` of all the records. Since the compute method only depends on move_type, it does not recompute type_name per record. As a result, all records may share the same type_name, regardless of language context. Please notice that `type_name` is used to display the invoice email button in the right language. **Solution**: Make the compute method `_compute_type_name` depending to the lang parameter, thus it will use the right `type_name` for each email to send. opw-4748741 Forward-Port-Of: odoo/odoo#216811
This fixes a problem in Odoo's web testing tools where drag-and-drop data could miss updates added during a test. The change makes these simulated interactions behave more like real browser behavior, helping prevent false test results and improving confidence in web interface quality.
Original PR description
Before this commit, the 'types' property of datatransfers used in Hoot interactions was mocked to insert the initial types of the given 'items' and 'files'. However, this didn't account for the items added dynamically on the datatransfer object. The good thing is that it doesn't actually need to be mocked, since it already works with the given 'files' and 'items' types without having to override the 'types' descriptor. So the mock has been removed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217313
This update makes an automated website popup test more reliable by allowing extra time for the popup to appear before checking it. This reduces occasional false failures in the test system without changing the customer-facing website behavior.
Original PR description
Before to this commit, the ‘closing s_popup with the X button updates the invisible elements panel’ test failed from sometimes on runbot. We think boostrap.js takes longer than normal to display the popup. Solution: We're going to increase the waiting timeout so that the crash doesn't recur. We've taken this decision because the problem is very specific and probably link to bootstrap.js. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update makes an automated website builder color picker test more stable by ensuring actions are fully processed before checks continue. It reduces false test failures, helping development and release validation run more smoothly without changing customer-facing behavior.
Original PR description
Since [1] introduced the test, it may fail due to race conditions. By waiting for an animation frame after clicks, we make sure the call had the time to be processed. [1]: https://github.com/odoo/odoo/commit/b3512d76af44d3f48d8b0027495c220df550b602 runbot-229604
This fix makes the sales signature test wait until the signature area is ready before accepting and signing. It prevents false error messages during automated checks, helping keep the sales signing flow stable for users.
Original PR description
In commit, we make sure that the signature is present in the modal before reaching the step where we click on "accept & sign". If the canvas is not yet loaded at this step, then there is an error message "Signature is missing". 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#217202 Forward-Port-Of: odoo/odoo#217099
The website shop test for comparing list prices now enables pricelist selection before running. This ensures the test can show all configured pricelists and helps prevent false failures in release validation.
Original PR description
Before this commit, the `compare_list_price_price_list_display` tour failed due to a missing feature flag. The user was unable to select a pricelist as only one was available. This commit enables the pricelist feature before the tour, ensuring that the drop-down selector displays all the configured pricelists. runbot-162702 Forward-Port-Of: odoo/odoo#217069
Sales orders created under a branch company now calculate unit prices correctly when product taxes belong to the parent company. This prevents incorrect displayed prices when fiscal positions convert price-included taxes to price-excluded B2B taxes.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Set up 10% price-included tax; 2. copy the tax to a B2B version that's price-excluded; 3. create a B2B fiscal position mapping the first tax to the second; 4.…
Versions -------- - 17.0+ Steps ----- 1. Set up 10% price-included tax; 2. copy the tax to a B2B version that's price-excluded; 3. create a B2B fiscal position mapping the first tax to the second; 4. create a $10 product using the first tax; 5. create a branch for the current company; 6. switch to the branch company; 7. set up a sale order with the fiscal position; 8. add the product to the order. Issue ----- While the line displays the correct B2B tax, the unit price displays $10, as if it was computed without any taxes, instead of a price-excluded tax. Cause ----- In the `_compute_price_unit` method, it filters out all tax records linked to the product that don't have the same company as the order line, so the parent company's tax does not get factored in. Solution -------- Rather than requiring strict equality between companies, also allow taxes that belong to a parent company of the line's company. opw-4853042 Forward-Port-Of: odoo/odoo#217012 Forward-Port-Of: odoo/odoo#216124
Follower invitation emails no longer show an extra divider between the header and message body. This small visual fix makes notification emails look cleaner and less confusing for users receiving updates on leads, tasks, and similar records.
Original PR description
When adding an Odoo user as a follower to a lead/task/..., there are two separators between the message header and its body. This commit removes the extraneous separator. Steps to reproduce: - Open a lead/task/... - Add Marc Demo as a Follower - Toggle the option to have them notified task-4889715 Forward-Port-Of: odoo/odoo#217291
The chat hub menu now handles the “Reset initial position” action correctly. This prevents an error for users who want to restore the chat window to its default placement, making the messaging experience smoother.
Original PR description
**Purpose of this PR:** Fix an error that occurred when clicking 'Reset initial position' in the chathub menu. Forward-Port-Of: odoo/odoo#214203
Link editing now handles links that contain images, buttons, or other formatted content without removing or breaking that content. This prevents issues in apps like Todo and Recruitment where editing a link could damage the email/template formatting or leave the edit popover stuck open.
Original PR description
reproduction: 18.0+18.1: 1. In Todo, insert an inline image, and create a link including the image and some text 2. click on the text part, click edit button, modify the label area and click apply 3.…
reproduction: 18.0+18.1: 1. In Todo, insert an inline image, and create a link including the image and some text 2. click on the text part, click edit button, modify the label area and click apply 3. the image is removed Test case 2: 1. go to Recruitment, and open an application and click "Send interview" 2. click on the link inside the template, change the url 3. apply, format of the button breaks 18.2: same flow with test case 2, click apply causing a traceback 18.3: same flow with test case 2, click on the link, do nothing and click away, the popover not close Fix: a partial back port of https://github.com/odoo-dev/odoo/pull/4633 The idea is that when the link doesn't only contain text, we don't show the label input field nor apply the label to the link. Because the label field extracts/display the text content of the link element, the field doesn't support html fragment, applying the label on a link including another element inside will break it. on 18.4+, we only rename the variable from isLabelHidden to showLabel task-4881878 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217226 Forward-Port-Of: odoo/odoo#215023
This fixes an inventory issue where reducing a sales order quantity could create an extra incorrect delivery transfer when a route uses its own destination location. The change ensures stock adjustments use the intended route destination, keeping warehouse movements accurate and avoiding confusing duplicate pickings.
Original PR description
Steps to reproduce: - Install Sales and Stock - Activate the multi-step routes setting - Go to a Delivery route in the warehouse - Change the `location_dest_id` of the operation type set on the rule…
Steps to reproduce: - Install Sales and Stock - Activate the multi-step routes setting - Go to a Delivery route in the warehouse - Change the `location_dest_id` of the operation type set on the rule - Enable the "Location Dest. Taken from Rule" checkbox - Ensure `rule.location_dest_id` and `operation_type.location_dest_id` are different - Create a Sales Order (SO) for a product with quantity = 5 and confirm - Change the SO line quantity to 3 and save Issue: A second picking is created with a move taking the product from `rule.operation_type.location_dest_id -> rule.operation_type. location_src_id` with quantity = -2. This happens because the decrease in the SO quantity triggers a negative move, and this move is not merged with the existing positive move. Instead, a new move is created in the opposite direction. In `_merge_moves`: https://github.com/odoo/odoo/blob/3c4275fb00255e519f01bf5547eff1db3a59d4b5/addons/stock/models/stock_move.py#L1191-L1193 It checks if the negative move has similar characteristics to the existing positive moves. However, the `neg_key(neg_move)` differs in `location_dest_id`, so the merge fails. This happens because the negative move does **not** read the `location_dest_id` from the rule — unlike the procurement, which **does** use the rule and therefore creates positive moves with the correct destination. When the negative move is created with the procurement, it initially has the correct `location_dest_id`. But then: https://github.com/odoo/odoo/blob/b984c72df398c4fe942d8894442e4e893ca0660e/addons/stock/models/stock_move.py#L1191 triggers `_compute_location_dest_id`, which doesn't consider the `rule.location_dest_id` and defaults to `operation_type. location_dest_id`, causing the merge to fail due to mismatched destination_locations. The positive move has read the correct value, because when it was assigned to a picking, the picking has the correct destination from the procurement. But for the neg_move it has picking None so it maps to the operation_type without consdiering the location from rule checkbox. opw-4793171 Forward-Port-Of: odoo/odoo#212355