Tuesday, July 15, 2025
19 changes · 18.0
Enhancements to existing features
This update ensures the listed Enterprise modules consistently point to the official Odoo website in their module information. It improves consistency in app listings and helps users identify the official source for these modules.
Original PR description
All modules from odoo/enterprise should have website: https://www.odoo.com
Resolved issues and error corrections
This fixes cases where notification details could be read incorrectly when optional message values were empty. It helps ensure accounting and discussion notifications use the right message information, reducing confusing or inconsistent alerts for users.
Original PR description
Beware values may be Falsy, in that case we have to fallback on message itself. account: correctly check values or messages values in notification discuss: fix values usage in discuss methods mail: fix values / msg non coherency for scheduledDatetime, should always be Falsy if not given in values or message Task-4845982
Miscellaneous changes
Task: 4558792 If 3-step manufacturing is enabled, the creation of an MO should also create 2 stock transfers: "Pick Components" and "Store Finished Product". Currently, when an MO is created via Barcode, only SFP is created. The problem boils down to the newly created stock move not having a `warehouse_id` field set, which causes Odoo to miss the required stock rules. This PR fixes the issue by fetching the `warehouse_id` field in XML, from where it is later passed to JS and back to
Original PR description
Task: 4558792 If 3-step manufacturing is enabled, the creation of an MO should also create 2 stock transfers: "Pick Components" and "Store Finished Product". Currently, when an MO is created via Barcode, only SFP is created. The problem boils down to the newly created stock move not having a `warehouse_id` field set, which causes Odoo to miss the required stock rules. This PR fixes the issue by fetching the `warehouse_id` field in XML, from where it is later passed to JS and back to Python's `create` method. Additionally, by-product moves for MOs created via Barcode were not correctly associated with the MO. This issue was solved by passing the missing fields from XML to Python. Forward-Port-Of: odoo/enterprise#83895
Refunded point-of-sale orders now receive the expected “REFUND” label in the backend order list. This makes it easier for staff to identify refunds and avoid confusing them with regular sales.
Original PR description
Currently, when refunding an order the name of the order does not show "REFUND". Steps to reproduce: ------------------- * Open pos session * Make an order * Refund the order * Go to the backend and see all orders > The refund orders does not show the "REFUND" label Why the fix: ------------ In previous version, when in `sync_from_ui` the state of the order in vals was 'draft'. In this version the state in vals is `paid`. This difference leads to the name being computed in `_complete_values_from_session`. This means that `_compute_order_name` is called before the order is fully created and thus `refunded_order_id` is not yet set and we're always using the next sequence to compute the order name. Now, when we already know the order is a refund we will not compute the name in `complete_values_from_session`. The name will get computed in `write`, which is called by `action_pos_order_paid`, as in previous version. opw-4521070
This fixes an issue where labels for grouped repair records could appear in the wrong language. Users will now see the correct translated label based on their active language, improving clarity in repair workflows.
Original PR description
The `_()` function doesn't work in listcomp as it can't find the env to get the active lang.
The web editor now blocks direct changes to its history records and avoids copying those records during duplication. This prevents errors and helps keep editor history data consistent when content is copied or modified.
Original PR description
This commit prevent direct write to history, also, removes it from copy_data as it would fail anyway when trying to write the history Forward-Port-Of: odoo/odoo#217167
This fixes an internal test condition so it checks for the current accounting enterprise module name instead of an outdated one. It helps keep automated checks accurate during upgrades and reduces the risk of false test failures, with no direct impact on day-to-day users.
Original PR description
This [commit](https://github.com/odoo/odoo/commit/266c6bd8f4d7c64d1f0e02207a3e1bed4f75397d) added a test to skip if the enterprise module `accountant` is not installed. It uses the old name o the module `account_accountant` because the forward port was not adapted.
This fix makes an automated mail test select the correct message when checking edit and reaction actions. It reduces random test failures, helping keep the mail feature validation stable without changing user-facing behavior.
Original PR description
Before this commit, "test_discuss_channel_public_page_as_internal" tour would fail non-deterministically at following step: ``` FAILED: [21/33] Tour discuss_channel_public_tour.js → Step Click on edit (trigger: .o-mail-Message-moreMenu [title='Edit'], .o-mail-Message [title='Edit']). ``` This happens because this tour is run twice, and in the 2nd run the selector to hover and click on 'Expand' is just targeting the 1st message. This works fine in the 1st run, but in the 2nd run this picks the message of previous test instead of the 2nd one. A full run of tour posts a message "cheese" and edits its content to "vegetales", so targeting the message with content "cheese" ensures the right message is picked, which is what this commit does to fix the issue. This commit also properly targets the right message for message reaction. Fixes runbot-error-227756
Internal users who have a passkey can now complete the portal identity check without the process switching to an unsupported verification method. This prevents a rare but disruptive issue that could block internal users from accessing portal features.
Original PR description
When an internal user has a passkey and attempts to pass the portal identitycheck, then the identitycheck's auth_method is set to webauthn which breaks the flow since portal's identitycheck only supports passwords. This scenario is unlikely to occur but it does break the internal users' portal. This is a temporary solution because once I implement passkeys for portal users, I will allow portal users to use webauthn to verify their identity.
Fixed an issue where printing a Bill of Materials could fail if a byproduct was entered with a quantity of zero. The report now handles that case safely and shows a zero cost instead, helping manufacturing users generate BOM reports without interruption.
Original PR description
**Issue**:
Printing the BOM crashes when one of the byproduct quantity is set to 0
**Steps to reproduce**:
- Open the manufactoring app
- Go to settings and activate by-product settings
- Go to Products > Bills of Materials
- Open a BOM
- Put the quantity of one the by-product by 0
- Click on overview
- Click on the print button
**Cause**:
In the `mrp_report_bom_structure.xml` template, there is this division:
- `<td class="text-end" t-esc="byproduct['bom_cost'] / byproduct['quantity']" t-options='{"widget": "monetary", "display_currency": currency}'/>`
without checking if `byproduct['quantity']` is different than 0.
**Solution**:
Added the check on `byproduct['quantity']` in the foreach
**Additional notes**:
Since it makes no real sense to have a non-zero BoM cost associated with a byproduct whose quantity is zero, the cost is set to 0 when the quantity is 0.
opw-4853525
Forward-Port-Of: odoo/odoo#213936Website editor illustrations are now recognized correctly even when their file type includes character encoding details. This restores dynamic color options for SVG illustrations, so users can customize them as expected instead of having them treated like regular uploaded images.
Original PR description
When illustrations mimetypes changed from simple `image/svg+xml` to `image/svg+xml; charset=utf-8`, `html_editor` was not used for website pages yet - and it therefore missed the fix in [1]. Because of this, when an illustration is selected, it is detected as an uploaded image, and the dynamic colors are not available. This commit adapts the mimetype detection. [1]: https://github.com/odoo/odoo/commit/af11070a6d4eeb69ee49c28435341a220eb64203
This fix updates passkey-related automated tests so they work correctly when the HR module is installed. It prevents false test failures caused by differences in how the user preferences screen reloads, helping keep passkey functionality reliably validated.
Original PR description
The HR module caused the tests to break due to the difference in the user preference screen. The user preference screen normally closes after creating a passkey but in the case where HR is installed then the user preferences DOM is still visible while it's reloading the page. Quick bugfix for 18.0 only, the others will be fixed in the forward ports of https://github.com/odoo/odoo/pull/217583
The HR departure process now properly removes a departing user's approver links even when they are only assigned to some approval roles. This prevents archived employees from remaining incorrectly linked as approvers for time off, expenses, or timesheets.
Original PR description
Currently, a user needs to be time off, expense and timesheet approver of an employee for those links to be removed by the departure wizard. If not all the approver fields are the same user, that link will not be removed. Steps to reproduce: - Set Marc Demo as only Time Off approver on an employee. - Archive Marc Demo's employee (This does not remove time off approver from the previous employee) To rectify this issue, we correctly group the `user_domain` so that their contents are properly OR'd. Forward-Port-Of: odoo/odoo#213513
This fix prevents product tag areas from being duplicated when shoppers view or switch product variants in the online store. It keeps product pages cleaner and avoids confusing page structure issues that could affect display or maintenance.
Original PR description
Steps: - Open Odoo 18. - Go to Website > Shop. - Open any product with tags. - Inspect the DOM. Issue: - The `.o_product_tags` div was duplicated. - This resulted in a nested `.o_product_tags` block in the DOM. Reason: - The system was inserting the full HTML tags, including its wrapper, causing the nesting. Solution: - Now only the inside content of the tags is updated, not the whole wrapper. - This keeps the structure clean and avoids duplication. Result: Now, there will be no duplication in the `.o_product_tags` block div section. OPW:4863967 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Changing a live chat chatbot step from a question selection to another step type now removes the old answer options when saved. This prevents outdated or irrelevant answers from staying attached to chatbot flows, reducing confusion for website visitors and staff configuring chatbots.
Original PR description
**Current behavior before PR**: When the step type was changed from "question selection" to another type and the step was saved, answers were not cleared. **Desired behavior after PR is merged**: Now, when the step type is changed from "question selection" to any other type and the step is saved, the answers are cleared. **task**-[4510555](https://odoo.com/odoo/all-tasks/4510555) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website editor sidebar now displays layout options correctly when using longer translated labels, such as Spanish. This prevents unwanted horizontal scrolling and makes editing page snippets smoother for users working in different languages.
Original PR description
Step to reproduce: - Set the odoo backend language to spanish (tested in V16.0) - Go to edit mode - Drop "Text-Image" snippet. - Click on Image from dropped snippet. - Bug: The sidebar "Layout" menu overflows, there is a horizontal scrollbar. Issue: There was an issue with the dynamic width of the we-buttons within the button group. The text in the "Layout" options was overflowing, causing the sidebar to overflow. Solution: This commit addresses the specific issue with the layout option. Without altering any other styles and assuming this is the only case, we equally divide the available space between the buttons using the grid template. task-4378522 Forward-Port-Of: odoo/odoo#217722 Forward-Port-Of: odoo/odoo#189856
This fix prevents the Knowledge app from failing when optional information is missing. It improves reliability by safely handling cases where expected details are not provided.
Original PR description
Just be sure when using an argument that can be False instead of a dict. Task-4845982
The restaurant appointment editor now closes the text color picker when its formatting toolbar scrolls out of view. This prevents a floating control from remaining on screen without its toolbar, making the editing experience cleaner and less confusing.
Original PR description
**Current behaviour before PR:** Steps to reproduce the issue: - Have a long text content in editable, making the container scrollable. - Select first line of the text, in toolbar open color selector. - Scroll down until the toolbar overflows and becomes hidden. Notice that the toolbar disappears when it overflows its container while color picker remains open, floating at the top of container. **Desired behaviour after PR:** Now, when the toolbar overflows and gets hidden, the color selector becomes hidden along with toolbar. Community PR: https://github.com/odoo/odoo/pull/202889 task-4581884