Tuesday, July 22, 2025
23 changes · saas-18.3
Enhancements to existing features
This update improves Odoo's internal testing process by automatically identifying certain types of tests, such as website tours and database query checks. It helps teams run the right test groups more consistently and reduces the chance of missing important test labels.
Original PR description
This commit add the possibility to automatically add test-tag on a test method at runtime. A generic method `get_method_additional_tags` is added on `BaseCase` test class. That method can be overridden to return a list of test-tags that will be added on the test methods. With this mechanism, the `HttpCase` class override this method to add a `is_tour` test-tag when the `start_tour` method is used in the test method. Also, the `start_tour` method will now emit a warning when the method is called without being tagged `is_tour`. That way, all the tours can now be started with the `is_tour` test-tag. Forward-Port-Of: odoo/odoo#218811 Forward-Port-Of: odoo/odoo#212315
Bank statement lines now include an optimized search index for payment references. This helps users find matching transactions more quickly, especially in large accounting databases.
Original PR description
see https://github.com/odoo/enterprise/pull/90077 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The tax search experience now shows a broader set of taxes by removing the default Document Fiscal Position filter and related column. This helps users find taxes outside the usual default scope more easily, reducing confusion during accounting setup or document entry.
Original PR description
In this PR: - Removed the **Document Fiscal Position** default filter and **original_tax_ids** column from the tax field search view to improve user experience when searching for taxes outside the default scope. Task-4899979
Resolved issues and error corrections
The automatic invoice sending job now reports how many invoices it actually processed and how many remain. This avoids misleading progress logs that previously showed zero records processed, helping administrators better understand scheduled invoice sending activity.
Original PR description
The scheduled action for the automatic sending of invoices currently does not explictly use the `_notify_progress` method introduced since Odoo 18 to track the progress of CRON jobs. This means that implicitly, by default the CRON will log `processed 0 records, 0 records remaining` at each run. This can be confusing, as the automatic invoice sending CRON is batched, and might run multiple times in sucession, reporting each time that it processed 0 records (which might not be true). ## Proposed fix: We correctly count the total account moves that need to be processed (using a `search_count`) and calculate the number of processed records and the remaining ones. opw-4926541 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218763
Code cleanup and technical improvements
The picture-in-picture button icon in public call pages now displays correctly. This avoids confusion for visitors and ensures the call controls look and behave as expected.
Original PR description
Before this commit, the picture in picture icon was not displayed on the public page. Call actions always add the `fa fa-fw` class. However, this action uses odoo icons. In the public page, the `fa` class is loaded after odoo icons, thus shadowing most of the `oi` class declarations. This commit ensures the correct lib prefix is used according to the action's icon. 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 fixes an unreliable automated test for the mail app’s connection warning. It helps ensure quality checks pass consistently without changing the customer-facing product behavior.
Original PR description
The "show warning when bus connection encounters issues" test simulates a disconnected WebSocket that fails to reconnect. In this scenario, an alert is shown to warn the user that some features may…
The "show warning when bus connection encounters issues" test simulates a disconnected WebSocket that fails to reconnect. In this scenario, an alert is shown to warn the user that some features may be unavailable or slow. However, the websocket worker’s initial reconnect delay is 1.5s, with an added random jitter up to 1 second which means the first reconnect attempt can take up to 2.5s. The test waits up to 2.5s for the alert to show, which is not always enough. The reconnect attempt alone may be that long, and under high CPU load, processing the resulting event can take even longer. This commit reduces the initial reconnect delay and the jitter during this test, ensuring that the reconnect attempt fails and the alert is shown within the expected time. fixes runbot-226443 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#219649
This fix makes Odoo's automated guided tours handle page navigation more reliably. It reduces random failures in tests or demos that move between pages, helping teams trust tour results when validating the application.
Original PR description
In this commit, we add expectUloadPage to goToUrl util. This util redirect to another page an involves a unload event so we need to add this key to this util to avoid undeterministic behaviors in tours that use it. 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#219672
Products now correctly show the "Available in Self Order" field when a point of sale uses self-ordering without category restrictions. This helps businesses manage which products customers can order themselves without missing visibility controls.
Original PR description
Before this commit, in a PoS config with self-ordering and no category limit, the "Available in Self Order" field was incorrectly missing for some products that should have displayed it. opw-4914554 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Electronic invoice exports now include the product barcode in the standard item identification field, matching how barcodes are read during imports. This improves consistency and helps recipients or connected systems identify products more reliably from exported UBL invoice files.
Original PR description
[FIX] account_edi_ubl_cii: export product barcode too Currently we use the `Item/StandardItemIdentification` as the barcode when importing a product. But we do not export the same information. In 18.0+ the `Item/StandardItemIdentification` was added to the UBL XML (for exporting) in commit 72e312815f372de88388c47c612bb5f44b4d8b4e. But there it is only used in `l10n_co_dian`. After this commit we export and fill the tag "by default". task-4941855 Forward-Port-Of: odoo/odoo#219391 Forward-Port-Of: odoo/odoo#218779
Messages received while the Discuss app is open no longer create hidden chat bubbles that appear later after leaving Discuss. Users still receive notifications, and livechat conversations continue to open bubbles as needed.
Original PR description
**Current behavior before PR:** Receiving a new message while the Discuss app is open creates a chat bubble in the background. These bubbles become visible after leaving the Discuss app. **Desired behavior after PR is merged:** Chat bubbles are no longer created while the Discuss app is open, except for livechat messages. Messages still trigger notifications, but no background bubbles are inserted. task-[4752392](https://www.odoo.com/odoo/project/1519/tasks/4752392) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219796 Forward-Port-Of: odoo/odoo#215125
Employees in Indian companies can now open approved time off requests without encountering an access error. The fix prevents the system from trying to update leave details after a request has already been approved, improving reliability for day-to-day HR workflows.
Original PR description
**Steps to reproduce:** 1. Install l10n_in_hr_holidays and l10n_in 2. Switch to IN company 3. Create an employee related to Marc Demo in IN Company 4. Log in with Marc Demo and create a timeoff 5. Approve the timeoff by Mitchel admin 6. Open the form view of approved timeoff by Marc Demo **Issue:** - The _get_durations method in l10n_in_hr_holidays attempts to update the l10n_in_contains_sandwich_leaves field whenever it runs, including when opening the form view of an approved time off. This causes an access error, as updates are not allowed for Marc demo in the approved state. **Solution:** - Added a state check in the _get_durations method to prevent updating the field for approved records. opw-4741162 Forward-Port-Of: odoo/odoo#218525 Forward-Port-Of: odoo/odoo#209233
This fix prevents the Website editor from showing an error when a user presses Tab after clicking a header menu without placing the cursor in editable content. It makes the editor handle missing selections safely, improving stability during page editing.
Original PR description
This PR fixes traceback issue: Steps to Reproduce for 1st traceback: 1. Go to Website in edit mode. 2. Click on the menu in the header such a way that the cursor is not placed inside. 3. Press the tab key. 4. You will receive the traceback. Issue: When the selection is null, the anchorNode also becomes null, resulting in closestUnbreakable being null. Therefore, we should avoid accessing nodeName on a null element to prevent errors. Fix: Safely access elements using optional chaining to prevent errors when elements are not found. task-4577864 Forward-Port-Of: odoo/odoo#200548
Fixed an issue in the HTML editor where pressing backspace after an empty file attachment box could also delete the previous character. This helps users edit content with attached files more reliably and prevents accidental text loss.
Original PR description
Problem: When pressing backspace after text followed by an `o_file_box`, both the last character and the file box are deleted at once. Cause: An empty `o_file_box` is skipped in `findPosition` because it's treated like a zero-width space (`.textContent === "\ufeef"`), causing incorrect position resolution. Solution: `o_file_box` elements should not be skipped during position checks, even when empty. Steps to reproduce: - Go to Quality ---> Quality Control --> Control Points - Create New. - Add text - Add a file just after the text - Delete all content of the file box - Place the cursor after the file box and press backspace -> The character before the file box is also deleted opw-4903841 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216559
Expense approval activities now go to the manager selected on the expense, rather than the employee's default manager. This helps ensure the right person is alerted and can review submitted expenses without delays or misrouting.
Original PR description
When an expense is submited and you've selected a different manager than the default one, this is not the right person that gets the activity linked to the expense. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213162
Users without administration settings access can now use the Reload AI Data action on invoices without hitting an access error. This keeps invoice AI data refresh available to functional users and avoids an unexpected failure during their workflow.
Original PR description
When clicking on the "Reload AI Data" button (`account.move::action_reload_ai_data`), a user not in `base.group_system` group encounters an access rights error when searching on `ir.module.module` model in `account.move::is_indian_taxes()`:
```python
def is_indian_taxes(self):
l10n_in = self.env['ir.module.module'].search([('name', '=', 'l10n_in')])
return self.company_id.country_id.code == "IN" and l10n_in and l10n_in.state == 'installed'
```
This commit adds `sudo()` to the `search` call to ensure that the check for the 'l10n_in' module does not fail for users not belonging to "Administration/Settings" group.
This prevents a traceback and ensures that functional users can reload AI data.
Forward-Port-Of: odoo/enterprise#90021This fix ensures products already scanned from different locations keep their original source locations when an empty destination package is scanned. It helps warehouse teams avoid inaccurate picking records while still assigning all relevant items to the correct package.
Original PR description
Issue ===== When a package is scanned as the destination package, if a source location was previously scanned, the source location will be updated for every product who will be packed. How to…
Issue ===== When a package is scanned as the destination package, if a source location was previously scanned, the source location will be updated for every product who will be packed. How to reproduce ================ - Enable multi-locations and package; - Create an empty package, two locations and two products; - Create a delivery in the Barcode app; - Scan the first location then the first product; - Scan the second location then the second product; - Scan the empty package -> The package is rightly assigned as the result package for both lines, but the source location of the first product was update for the last scanned source location. Cause of the issue ================== When a source location was previously scanned, when a line is updated (`updateLine`), we update the line's source location. Usually, that's the wanted behavior but in this case, we don't want to the source location of already processed lines when we scan a destination package. Solution ======== When calling `updateLine` from `_assignEmptyPackage`, give a key in the parameters to not update the source location. [opw-4859851](https://www.odoo.com/odoo/project.task/4859851) Forward-Port-Of: odoo/enterprise#90091 Forward-Port-Of: odoo/enterprise#89142
This update adds missing internal labels to automated tests so they are recognized correctly by the test system. It helps keep quality checks reliable without changing customer-facing helpdesk or subscription behavior.
Original PR description
With the new test-tags features that allows to add additional test tags at runtime, the tests that starts a tour or that are using a query_count and that are not detected as such must be tagged respectively `is_tour` or `is_query_count`. Forward-Port-Of: odoo/enterprise#90152 Forward-Port-Of: odoo/enterprise#89934
This fixes a point of sale restaurant booking issue where the date filter stayed active after users switched away from the kanban view. The filter is now properly removed or updated, preventing stale booking results and reducing confusion for staff.
Original PR description
Steps to reproduce: - Open booking in a pos restaurant - Switch from kanban view to any other view - The filter on the date is not removed Issue: The onRemove method in the kanban_controller is never called. Fix: It is not possible to call the code an onWillUmount since onWillUmount is called after the onMount of the desired view. The deletion of the filter needs to be handled in the control_panel. Also each time createStartFilter was called, a new filter was added and never removed. In this commit if a filter already exists it is simply updated. Task-4916512
This fix ensures asset setup only updates accounts that already exist. It prevents the system from accidentally creating incomplete account records during installation or setup, keeping accounting data cleaner and more reliable.
Original PR description
In the post init hook for account_asset we are updating the chart accounts to add the asset models, and then we load those assets. The update should only be performed on accounts that already exist, otherwise the load will create empty account records with all values null except the assets, which is not the intention here. This fix filters the update to existing accounts only, and filters the asset that use those accounts. [ci error](https://runbot.odoo.com/odoo/runbot.build.error/229788)
The AI assistant now avoids sending the same user question twice when preparing a response. This helps produce cleaner, more accurate replies and reduces unnecessary AI processing.
Original PR description
Prior to this commit, we send messages to the llm like the following:
```
[
{'content': Markup('<p>first question</p>'), 'role': 'user'},
{'content': Markup("<p>Sure, I'm here to help. What's your first question?</p>"), 'role': 'assistant'},
{'content': Markup('<p>second question</p>'), 'role': 'user'},
{'role': 'system', 'content': "You are a RAG assistant.\n\nToday's date to be used: 2025-07-18"},
{'role': 'user', 'content': 'second question'}
]
```
We're actually duplicating the user's prompt and this is because of the retrieval of the chat history. Before calling generate_response, we post the user's message. Therefore, he's message is already recorded in the db. We should then skip the most recent message to assemble the chat history since its just the same to the prompt.This update simplifies an automated check for signing documents through the customer portal by removing a fragile step tied to another app. It helps reduce false test failures, supporting more reliable releases without changing the signing experience for users.
Original PR description
We remove the last step, which depends on the mail module and is too complex. The reason for this step was to avoid a failed to fetch received after termination. This problem must be solved in another way. runbot-error-id~163605 Forward-Port-Of: odoo/enterprise#84480
This update reorganizes how Point of Sale test data is prepared by moving it into the mock server used during automated testing. It should make test coverage easier to maintain and reduce false failures from overly slow test scenarios, without changing day-to-day user workflows.
Original PR description
*: pos_account_tax_python, pos_adyen, pos_event, pos_hr, pos_loyalty, pos_pine_labs, pos_razorpay, pos_restaurant, pos_restaurant_adyen, pos_sale, pos_self_order, pos_stripe, pos_viva_com Change data generation for tests to have it in the mock server. Also adding load arguements to search_read of models of mock server. --- This PR also removes the test `test_load_pos_demo_data_by_pos_admin` which performs an action that takes too long, so towers consider the test to be erroneous.
Test data for several Point of Sale-related apps is now generated through the mock server instead of separate test files. This makes automated tests easier to maintain and helps keep quality checks more consistent across appointment, IoT, restaurant, payment, and delivery integrations.
Original PR description
*: , pos_iot, pos_restaurant_appointment, pos_tyro, pos_urban_piper Change data generation for tests to have it in the mock server.