Tuesday, July 15, 2025
32 changes · saas-18.4
Enhancements to existing features
Point of Sale no longer shows a warning suggesting an IoT Box subscription is invalid when certificates are always provided. This avoids unnecessary confusion for users setting up or using IoT-connected printers.
Original PR description
As we always provide a certificate for IoT Boxes, it made no sense to tell users that their subscription was not valid. Task: 4942391 Forward-Port-Of: odoo/odoo#218866
Resolved issues and error corrections
Serial-connected IoT devices now include their device data in websocket responses. This helps Odoo services read device information more reliably while the underlying driver handling is being standardized.
Original PR description
Serial drivers use their own way to handle actions. Waiting for a refactoring of their logic to conform to all drivers' one, we need to provide the device data to the websocket response in order to read it using `iot_http` service. Enterprise PR: odoo/enterprise#89900
Features or functions removed from Odoo
This change removes now-unnecessary website service mocks from html builder tests. It simplifies internal test maintenance without changing customer-facing behavior.
Original PR description
Tests moved from website to html_builder were mocking website service as it was a required dependency. After the work of this [PR] it became okay to remove the mocks from the tests. Tests should work normally without the need to have website service present. [PR]: https://github.com/odoo/odoo/pull/217994 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an unreliable automated test for public mail discussion pages by ensuring the test selects the intended message when editing or reacting. This helps reduce false failures in validation runs, improving confidence in releases 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 Forward-Port-Of: odoo/odoo#219009
The mail test now waits until sending is actually available before submitting a message. This reduces random test failures and helps keep delivery checks stable without changing user-facing behavior.
Original PR description
Before this commit, tour "test_mail_group_public_page_as_portal" failed non-deterministically at the following step: ``` FAILED: [14/37] Tour discuss_channel_public_tour.js → Step Check message is…
Before this commit, tour "test_mail_group_public_page_as_portal" failed non-deterministically at the following step:
```
FAILED: [14/37] Tour discuss_channel_public_tour.js → Step Check message is shown (trigger: .o-mail-Message-body:contains("cheese")).
```
When looking at screenshot from runbot, it shows that the message is indeed not on UI, but the composer still contains "cheese" in input, which means the message hasn't been effectively posted.
This can happen when the press Enter is made before the composer is not in a state to send the message. In practice the conditions should be met: have some text in composer and some attachments have been attached and fully uploaded. However test it running steps fast and it can trigger the "press Enter" sooner than it's actually made available.
This commit fixes the issue by pressing Enter when the "send" button is enabled, which is the right time when press Enter is also available to use.
Fixes runbot-error-229828
Forward-Port-Of: odoo/odoo#218999This fixes an issue where labels shown for grouped repair-related records could appear in the wrong language. Users should now see the correct translated wording based on their active language settings.
Original PR description
The `_()` function doesn't work in listcomp as it can't find the env to get the active lang. Forward-Port-Of: odoo/odoo#218919
This fix updates point of sale loyalty tests to use the customer name that matches the demo data. It helps keep automated checks reliable and prevents false build failures without changing customer-facing behavior.
Original PR description
steps to reproduce : 1. on multi enterprise 2. run the test `test_loyalty_program_different_orders` change partner name and in the test and the tour to match the demo data build_error-223079 Forward-Port-Of: odoo/odoo#218373
Website headers set to appear over page content now keep their chosen transparency after saving. This prevents semi-transparent header backgrounds from unexpectedly becoming opaque, helping website editors preserve their intended design.
Original PR description
> [QSM] Try to set up a "Over the content" header with a semi-transparent color => You can't During the initial website refactor, the alpha of colors of header was not saved, but multiplied in the value. Steps to reproduce: - Open website builder - Set "Header Position" to "Over the Content" - On the header change the color of "Background" to a color with alpha - Save - Bug: the background of header is opaque Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
The portal discussion area now safely handles cases where message highlighting is unavailable. This prevents crashes when users load older chatter messages on portal documents, keeping the communication history accessible.
Original PR description
PR #198829 introduces a new getter as `showLoadOlder`. `messageHighlight` feature is not available in portal chatter. This fix guards `messageHighlight` usages in this getter to avoid crashing in portal chatter. Steps to reproduce: - Go to a portal document with chatter - Send 30 messages to make `loadOlder` true - The chatter crashes when loading because `messageHighlight` is null
Fixed an issue in Restaurant Point of Sale where opening a table could show an error if the screen name was empty. This helps staff access tables reliably and avoids interruptions during service.
Original PR description
Fix error appearing when trying to open a table in POS restaurant, with an empty screen name. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218371
The event page submenu option in the website editor has been corrected after a recent internal change caused it to fail. This restores expected editing behavior for event pages, helping users manage event navigation without disruption.
Original PR description
Since [1] when actions were converted to classes, the event submenu option fails. This commit fixes the few references that were taken from the wrong location. [1]: https://github.com/odoo/odoo/commit/b4b215325db61fbbe9793545293c8b6fbc99f310 task-4367641
The Version Control alert in the website editor now uses clearer styling, with a stronger background and visible button colors. This makes the alert easier to read and its choices easier to use, reducing confusion for editors.
Original PR description
This commit fixes the style of the "Version Control" alert. Indeed, its background color is too light, making it difficult to read the white text on it, and the buttons do not have any color unless hovered, making the options hard to use. This commit restores the style used before the refactoring. task-4367641
Manufacturing users can now print a Bill of Materials even when a byproduct has a quantity of zero. The report safely shows a zero cost in that case, preventing an error during BOM overview printing.
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#217848
Forward-Port-Of: odoo/odoo#213936Fixed an issue in the website builder where standalone text and datetime form fields did not stretch to the full available width. This makes conditional visibility settings and similar form layouts look more consistent and easier to use.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents settings form data from being reused from a cache when it should be recalculated. It helps ensure administrators see accurate, up-to-date settings behavior after changes.
Original PR description
Since [1], the data for the views has been cached, including the `on_change` of the settings. The data of the settings shouldn't be cached. task-id: 4942256 [1] https://github.com/odoo/odoo/commit/e5cee98d6ebbf318386ec4002007fbecc0fb3937
SVG illustrations in the HTML editor are now recognized even when their file type includes character set details. This prevents them from being mistaken for regular uploaded images, so users can access dynamic color options as expected.
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/6ea62c104dabc343c07046ab8b8b95532fb1ac87 task-4367641
Creating a new subtask from the subtask view now automatically keeps the original parent task filled in. This prevents missing parent links and helps teams maintain accurate task hierarchy without manual correction.
Original PR description
Previously, when creating a sub-task via "task form view > create a sub-task > view > new task", the 'Parent Task' field was empty. Now, the parent task's reference is correctly included in the creation flow, ensuring the 'Parent Task' field is properly pre-filled. task-4797845 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212661
This change updates an automated test for the HTML editor's link popover to prevent intermittent failures. It helps keep quality checks stable so fixes and updates can move through validation with fewer false alarms.
Original PR description
The fix at [1] did not fix the issue. This is another attempt. runbot-227759 [1]: https://github.com/odoo/odoo/pull/215168/commits/9a3c9ecca14fb8701e4f934cf5285297cbe26310 Forward-Port-Of: odoo/odoo#218114
When an employee is archived through the departure process, related approver assignments are now cleared even if the departing user was only assigned to one approval role. This prevents inactive employees from remaining listed 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
Users can now create a new workcenter directly while setting up manufacturing operations, even before selecting a bill of materials. This removes an unnecessary company value that caused an error and interrupted the setup flow.
Original PR description
**Current behavior:** Can't create a workcenter from the operations (workorder) form view without having a BoM filled in (due to company check issue). **Expected behavior:** Can **Steps to reproduce:** Open `Manufacturing / Configuration / Operations` -> create new -> type in a new workcenter name -> hit create -> error **Cause of the issue:** in `mrp_routing_workcenter_form_view` we get some context for a `default_company_id`- it's not only unnecessary because `Mrp.Workcenter` will get a default company just fine via its its `resource.mixin` inheritance. The currently provided company comes from the BoM, thus the issue happens when the BoM has not yet been filled in on the view. **Fix:** Remove the context in the view. opw-4836904 Forward-Port-Of: odoo/odoo#217950
This fix prevents survey answer statistics from running into translation lookup problems. It helps ensure translated survey content displays correctly without warnings or errors caused by the previous implementation.
Original PR description
Issue: Prior to this commit, a translation issue occurred due to the use of a list comprehension. The _get_translation_source function attempts to scan the local variables, but in the context of a list comprehension, only variables defined within the comprehension are accessible. As a result, variables like uuid and cursor were not available to the _get_lang function, ultimately leading to an error. Fix: Replaced the list comprehension with a standard for loop to ensure proper access to local variables. runbot-135198 Forward-Port-Of: odoo/odoo#216030
Fixes an issue where archiving an employee could prevent departure-related details from being recorded when that employee was responsible for another employee's time off. This helps ensure HR records remain accurate during employee offboarding.
Original PR description
When we archive an employee that is the time off responsible of another employee, the `_clean_leave_responsible_users` method will clear our cache before we set some departure related fields. This will cause us to have to recompute the relation for `employee_ids` and the domain that ensures the suggested employees in the wizard are not already archived will prevent us from finding the employee we were archiving. To ensure these fields are written properly, we save the value of `employee_ids` before archiving the employee. opw-4729600 Forward-Port-Of: odoo/odoo#211174
Self-ordering in consultation mode now shows the location/preset selection step, so customers can view menu prices that match the selected preset and pricelist. Ordering remains disabled, keeping the mode limited to menu browsing only.
Original PR description
- We now display the `location` page (to select a preset) also when the self order is in `consultation` mode, so the user can see the price of the products with the selected preset selected (and its price lists). - The user is still only allowed to consult the menu, and not order anything. task-id: 4934256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218299
The website editor sidebar now handles longer translated labels in the Layout options without creating a horizontal scrollbar. This improves usability for Spanish-speaking users editing image-based snippets while keeping the change limited to the affected sidebar controls.
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
Internal users can now add sub-contacts without needing Accounting permissions when Spanish Facturae e-invoicing is installed. This removes an unnecessary access restriction that caused errors while managing contacts with FACe Center roles.
Original PR description
**Steps to reproduce:** - Install l10n_es_edi_facturae - With an admin user, create a contact - From the contact, add a "FACe Center" sub-contact with a Role - Save the contact - With a user that doesn't have any Accounting rights, try to add a sub-contact to the previously created contact **Issue:** An access error is raised because some Accounting rights are needed to access "l10n_es_edi_facturae.ac_role_type" records. **Cause:** "l10n_es_edi_facturae.ac_role_type" is only readable for "account.group_account_invoice" group and "account.group_account_readonly" group. **Solution:** There's is no point to restrict the read access to an Accounting group. The model is made readable for all internal users. opw-4788636 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217370
Fixed an issue that caused an error when testing a live chat chatbot step that creates and forwards a lead. This helps sales and support teams test chatbot flows reliably before using them with website visitors.
Original PR description
When user tests the chatbot with create lead and forward step, A traceback will appear. Steps to reproduce the error: - Install ``website_crm_livechat`` module - Go to Livechat > Configuration >…
When user tests the chatbot with create lead and forward step, A traceback will appear. Steps to reproduce the error: - Install ``website_crm_livechat`` module - Go to Livechat > Configuration > Chatbots > Open Welcome Bot > Add a line > Step Type: Create Lead & Forward > Save & Close - Test > the chat will open > Click on ``I have a pricing question`` > The Bot will ask for an email > Enter a valid email > Send Traceback: ``` KeyError: im_livechat.channel() ``` When user clicks the Test button a discuss channel is created as shown in [1]. In this case, the discuss channel created for the chatbot test script does not have a ``livechat_channel_id``. https://github.com/odoo/odoo/blob/5c7a4716ef1b1c55e1ce8848c11c27c79768d1ec/addons/crm_livechat/models/chatbot_script_step.py#L109-L111 Here, ``livechat_channel_id`` will be an empty record. So, It will raise the above traceback. [1]: https://github.com/odoo/odoo/blob/5c7a4716ef1b1c55e1ce8848c11c27c79768d1ec/addons/website_livechat/controllers/chatbot.py#L52 sentry-6729421960 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217902
This fixes an error that could occur when translated messages were prepared while removing surveys linked to website courses. It helps ensure users see the proper translated warning instead of encountering a system error.
Original PR description
Issue: Prior to this commit, a translation issue occurred due to the use of a list comprehension. The _get_translation_source function attempts to scan the local variables, but in the context of a list comprehension, only variables defined within the comprehension are accessible. As a result, variables like uuid and cursor were not available to the _get_lang function, ultimately leading to an error. Fix: Replaced the '_' function comprehension with 'self.env._' for proper access to the 'self' and 'env' object. runbot-159884 Forward-Port-Of: odoo/odoo#217487
Replacing a background video in the website editor now keeps the video URL correctly formatted. This prevents broken or confusing links when users update background videos on pages.
Original PR description
Problem: After https://github.com/odoo/odoo/pull/175663/commits/75c2343ed3a41f32964fc91a007c6b11b5a75d9f, if a background video is added and then replaced, the resulting video URL contains a duplicated protocol in video selector. Cause: For background videos, the URL is retrieved from `iframe.src`, which already includes the protocol. The current logic unconditionally prefixes the URL with a protocol, leading to duplication. Solution: Check whether the URL already contains a protocol before prefixing it. Steps to reproduce: - Add a block - Add a background video - Open the video selector to replace the background video -> The resulting URL has the protocol duplicated opw-4931945 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218554
This fix keeps website live chat available when some page templates still use the older availability setting. It prevents live chat from disappearing after updates where templates and scripts are not fully aligned.
Original PR description
In [1], the "can_load_livechat" key was added to determine if the live chat should be loaded on a page. However, templates might not have been updated. This commit provides a fallback to the old "isAvailable" value in this case. [1]: https://github.com/odoo/odoo/pull/217695 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#218817
View-only users can no longer see or use the PDF split option in Documents. This prevents a confusing error when shared PDF links are opened by users without editing rights, making document sharing smoother and clearer.
Original PR description
When a user with only view permissions attempts to split a PDF, an error occurs: Unexpected token '<', "<!doctype "... is not valid JSON **Steps to Reproduce:** - Go to Documents. - Choose a PDF file. - Click on Share and select Internal Users with Viewer permission. - Copy the generated link. - Open the link in another window as a non-manager user. - Click on split PDF then split The fix consists in hiding the pdf split functionality for users without edit permission. opw-4354451 Forward-Port-Of: odoo/enterprise#89692 Forward-Port-Of: odoo/enterprise#75803
This fix ensures Hong Kong payroll HSBC Autopay files use the same rounded payment amounts shown on payslips. It prevents rare discrepancies between employee payroll records and bank payment files, reducing reconciliation issues.
Original PR description
Explanation: In some rare cases, the autopay amount in payslip and the amount in hsbc autopay file doesn't match. This is due to hsbc autopay files are trimming all the decimal places, and the amount in payslip are rounded. Forward-Port-Of: odoo/enterprise#89118
This update fixes a translation-related warning that could occur when checking addresses in the AvaTax integration. It improves reliability for users working in translated environments without changing business workflows.
Original PR description
Prior to this commit, a translation issue occurred due to the use of a list comprehension. The _get_translation_source function attempts to scan the local variables, but in the context of a list comprehension, only variables defined within the comprehension are accessible. As a result, variables like uuid and cursor were not available to the _get_lang function, ultimately leading to an error. We replaced the list comprehension with a standard for loop to ensure proper access to local variables. runbot-159883 Forward-Port-Of: odoo/enterprise#88651