Thursday, November 20, 2025
5 changes · master
Resolved issues and error corrections
Fixes an issue where reusing a saved AI live chat website block could crash the website editor. Users can now save and re-add the AI chat snippet from custom blocks without interruption.
Original PR description
Steps to reproduce: ------------------------- 1. Install Website and AI modules. 2. Open the website editor. 3. From the Intro block, search for the AI snippet and add the snippet contains 'Need…
Steps to reproduce:
-------------------------
1. Install Website and AI modules.
2. Open the website editor.
3. From the Intro block, search for the AI snippet and add the snippet contains 'Need Help?'.
4. Click on the added block, then click the Save icon from the Style tab.
5. Save the snippet
6. Go to Blocks → Custom Blocks and add the saved snippet.
Observation:
-------------------------
A traceback is raised:
```
TypeError: Cannot read properties of null (reading 'remove')
at AILivechatOptionPlugin.onSnippetDropped
```
Issue:
-------------------------
The `onSnippetDropped` method
https://github.com/odoo/enterprise/blob/bb3699cc112acb3ec545d3aa5f3d8f7263a5dac6/ai_website_livechat/static/src/website/plugins/ai_livechat_option_plugin.js#L39-L51 executes every time a snippet is dropped into the layout. When the snippet is first added, the method removes the `<div>` with class `s_ai_livechat_preview`. Upon saving, the snippet is stored without that `div`. When re-adding the saved snippet from custom tab, the method runs again but fails since the `s_ai_livechat_preview` element no longer exists, resulting in the traceback.
Solution:
-------------------------
Added the optional chaining operator to safely remove the `s_ai_livechat_preview` div only when it exists.
opw-5227072
Forward-Port-Of: odoo/enterprise#99276The Copy to Clipboard option now appears correctly for regular conversations when the AI module is installed. This fixes a visibility issue in message actions and adds test coverage to help prevent the problem from returning.
Original PR description
Before this commit, "Copy to Clipboard" was sometimes not visible in the message action list when message had some text content. This happens because message actions can condition overridden by some…
Before this commit, "Copy to Clipboard" was sometimes not visible in the message action list when message had some text content. This happens because message actions can condition overridden by some other modules, and the way overrides of action condition work is to have boolean value taking precedence over the local condition of action. This architecture is meant to provide exhaustive list of actions to allow, which is quite useful to control what livechat visitors can have. However this architecture requires overrides to properly return `undefined` when the local condition should apply, which was not the case for an override by `ai` module. So when `ai` module is installed, the "copy to clipboard" feature as not available. This commit fixes the issue by adapting the condition in `ai` module to return `undefined` on non-AI conversations, and add test coverage for both `@mail` discuss suite and all overrides of discuss in `@test_discuss_full_enterprise`. opw-5240768 https://github.com/odoo/odoo/pull/236295 Forward-Port-Of: odoo/enterprise#99794
The IoT connection flow now checks the device token before looking up older device records. This prevents unnecessary error logs when an IoT box reconnects after being unpaired or used with another database.
Original PR description
Steps to reproduce: 1. Connect an IoT box 2. Now unpair it from the IoT box homepage (record stays in DB) 3. Connect the same box again to a different DB but with the same IP (e.g. when a developer switches branch) 4. Now go back to the original DB 5. Observe a traceback in the DB logs when the IoT calls /iot/setup (`cannot access id on NoneType`) This traceback occurs because we were checking for an old IoT box record before checking if the token matches. We simply swap the checks around to prevent the traceback.
Website content generation issues are now recorded as warnings instead of errors when they do not block the user. This keeps monitoring reports cleaner while users still receive the appropriate notification when generation fails.
Original PR description
- Currently, we log an error whenever an error occurs during content generation for any webpage. - However, it is a non-blocking error so it can be safely converted to a `_logger.warning`, as we already notify user about the error through a notification [1]. - Additionally, the errors caught here will be all UserErrors so no need to log another error, so we log a warning instead. - This commit converts the `_logger.error` into `_logger.warning`. [1]: https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/ai_website/static/src/components/dialog/add_page_dialog.js#L74-L80 sentry-6974000714 Forward-Port-Of: odoo/enterprise#98844
Fixed an issue where using backspace on the VoIP keypad did not delete highlighted characters when the selection started at the beginning. This restores expected editing behavior for users entering or correcting phone numbers while preserving safeguards against cursor errors.
Original PR description
This commit fixes a regression introduced in commit [1] prevented deleting when a selection began at index 0; extend the guard so the numpad (keypad) backspace still removes the highlighted characters while keeping the cursor-safety logic. [1]: https://github.com/odoo/enterprise/commit/73b01fa5e1f56d4ab71d67760b15942fb2fa0e31 task-5217676 Forward-Port-Of: odoo/enterprise#99835 Forward-Port-Of: odoo/enterprise#99358