Tuesday, August 26, 2025
21 changes · saas-18.4
Enhancements to existing features
Odoo removed an internal database checkpoint used while fetching OCR results for extracted documents. This should reduce performance slowdowns when many OCR updates are processed at once, with minimal impact on everyday document handling.
Original PR description
Very similar to commit 7f7ff8d, see full explanation in that commit message. This savepoint was also initiated in a loop which could cause performances issues when too many of them are active at the same time. This one is much less critical and can be removed without much trouble. It was only allowing to recover from a serialization failure, in the case where a user was concurrently editing a document while it was being updated by the OCR. Forward-Port-Of: odoo/enterprise#93000
This update adds automated checks for point of sale IoT device setup and core device behavior, including Six payment terminal flows. It helps reduce the risk of future changes breaking connected hardware or payment terminal integrations.
Original PR description
*: pos_iot, pos_iot_six In this commit: ------------------ - Loaded data for `iot.box`, `iot.device`, and `iot.channel` to test the complete IoT flow from setup to core device functionalities. - Added payment method records and validated the payment terminal integration using Six. task- 4945645 Related PR: https://github.com/odoo/odoo/pull/220801 Forward-Port-Of: odoo/enterprise#91117
The follow-up process now checks related accounting records in a clearer and safer way. This reduces the risk of internal query confusion and helps keep customer follow-up calculations reliable.
Original PR description
Refactored the SQL construction for checking the existence of related account.move records for res.partner entries. The account.move query is now built separately and referenced explicitly, making the code more readable and reducing the chance of ambiguity in field resolution. Using `SQL.identifier(query.table, "id")` ensures that the correct table is referenced in each condition, which is particularly important when dealing with multiple joins or subqueries. Forward-Port-Of: odoo/enterprise#90304 Forward-Port-Of: odoo/enterprise#83770
Resolved issues and error corrections
Website charts and countdowns now immediately reflect updated theme colors after a theme change. This keeps edited pages visually consistent without requiring users to manually refresh or reapply settings.
Original PR description
Before this commit, if theme colors were applied on charts or on countdowns, they would not be updated right after changing the theme colors. This was due to the fact the interactions were not restarted and the old colors were kept. To fix this issue and solve future ones, the interactions are now restarted after any bundle reload. task-4367641
The file import screen now closes correctly when users click Cancel, returning them to the previous view. This prevents an error message from appearing during a routine cancellation, making the import flow smoother and less confusing.
Original PR description
**Before this commit:** - Clicking the `Cancel` button in the file import resulted in a traceback. **Steps to produce:** - Click the `Cancel` button in the file import action. **After this commit:** - Clicking the `Cancel` button now correctly exits the import action and navigates to the previous view. task-4898326 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The editor now clears the previous file choice before opening the file picker again. This prevents a canceled upload from accidentally re-uploading and inserting the last selected file, making the file command behave as users expect.
Original PR description
Currently, the upload local files service does not reset the file input it uses to handle file uploads. As a result, two consecutive uses of the `/file` command can produce undesirable side effects: Steps to reproduce: 1. Use the `/file` command 2. In the OS file picker, select a file and click on the "open" button. 3. Use the `/file` command 4. In the OS file picker, click on the "cancel" button => The system re-uploads the file loaded at step 2 and inserts a file block for that file in the editor. When clicking on the "cancel" button, we should not insert or upload any attachment. This commit fixes this issue by clearing the file input of the upload local file service before re-prompting the user to select a file. This should guarantee that we do not re-upload the previously selected file. Task-4989809 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222794
Product pages no longer show a delivery truck message when the only available option is in-store pickup. This avoids suggesting home delivery is available when customers can only collect their order in store.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Disable all delivery methods except for "Pick up in store"; 2. go to a product page. Issue ----- A delivery truck is shown with its delivery status, even though delivery is not supported. Cause ----- The `delivery_stock_data` info looks for all published "delivery" carriers, including `in_store` types, which is already covered by `in_store_stock_data`. Solution -------- - Exclude `in_store` delivery types when looking for delivery carriers. - If the `deliveryStockData` object is empty, don't render the truck. opw-5010081 Forward-Port-Of: odoo/odoo#223383
Work entry validation now skips schedule checks when an employee has no fixed working calendar. This prevents errors when creating, updating, or validating work entries for employees with fully flexible schedules.
Original PR description
When we validate/write/create a work entry for an employee with a fully flexible working schedule, we can encounter a traceback when trying to call `_attendance_intervals_batch` on a non-existing calendar. To rectify this issue, we continue in the loop when no calendar is set. opw-4979974 opw-4968312 Forward-Port-Of: odoo/odoo#222752
This fix makes an automated website blog test click a button in a more reliable way so the expected setup window opens. It helps prevent false test failures and supports smoother validation of blog and social media features.
Original PR description
Test failure: TestWebsiteBlogUi.test_blog_context_and_social_media. The tour 'blog_context_and_social_media' did not complete successfully because the `.modal-dialog .o_field_widget[name='blog_id']` selector was not found. Investigation revealed that using the standard `"click"` action failed to trigger the modal, likely due to the button being dynamically rendered or not fully ready when the step executed. Additionally, Odoo UI widgets and custom event handlers may require a direct DOM `.click()` call for proper interaction, as they can be sensitive to how events are dispatched. To address this, we replaced the `"click"` action with `this.anchor.click()`, ensuring the click event is performed in a way that reliably opens the modal and allows the tour to proceed as expected. runbot-226540
This update fixes an error that could occur after merging contacts and then selecting multiple contact records. It ensures Peppol-related contact information is calculated safely for each contact, helping users continue working without unexpected crashes.
Original PR description
**Steps to Reproduce:** 1. Install `account_peppol` and `contacts`. 2. Open the Contacts app (list view). 3. Select any two contacts and click on "Merge" from the "Actions" menu. 4. Open any of the merged contacts in form view. 5. Close the form view and click on "Add a line". 6. Select multiple records. **Error:** ValueError - Expected singleton: res.partner(11, 9) **Cause:** The method `_compute_available_peppol_eas` accesses `self.available_peppol_eas` directly. When multiple `res.partner` records were involved, it will raised a singleton error. **Fix:** Loop over each partner to compute `available_peppol_eas` for each. This prevents the singleton error when multiple records are processed. sentry-6807787390 Forward-Port-Of: odoo/odoo#223547
This fix keeps the skills table contained within the employee resume section, preventing it from covering resume content and action buttons when very wide resume tables are added. Users can now view and manage resume entries normally even with large table content.
Original PR description
Steps to reproduce:
1- Go on employee app
2- Click on resume section
3- Click on Add on resume tab
4- Put on description a big table with at least 20 columns
5- Save
The resume table and the buttons "add", "delete" with be hidden by the skill table.
Reason:
The skill table element is too wide
Solution:
The skill table's width is fixed and is contained in resume section element
task-4881917
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#217926Users who open the import records screen and then choose Cancel are now returned to where they started instead of seeing an error. This prevents a confusing interruption during normal navigation and keeps the import workflow reliable.
Original PR description
Steps to reproduce: ------------------- 1. Install a module(ex: helpdesk/contacts) and open contacts. 2. Select the Cog Menu > import records 3. Click on the Cancel button Error: ----- ```python InvalidDomainError: Invalid domain representation: id,in, ``` Cause: ------ The dc05253 changes the behavior to display the imported records instead of redirecting the user to the action from which the import was launched. However, when the user clicks the Cancel button(resIds = undefined in this case) , it leads to an `InvalidDomainError`. https://github.com/odoo/odoo/blob/2627168eea8562477f600c97c42d443a072ddccc/addons/base_import/static/src/import_action/import_action.js#L100-L113 Solution: --------- Used `historyBack` to fall back to the originating action when the user clicks the Cancel button. opw-4985218 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes the restaurant point-of-sale payment test wait until an order is fully synchronized before ending. It helps prevent false test failures and supports more reliable delivery of point-of-sale updates.
Original PR description
### Issue: - In `test_14_pos_payment_sync`, the tour could end before the order was synced to the server, causing errors in later steps. ### Fix: - Added steps to wait until the sync is done before finishing the tour. Runbot Error: 113594, 181563 Task: 4974068 Forward-Port-Of: odoo/odoo#223983 Forward-Port-Of: odoo/odoo#222581
The contract offer screen now hides the signature request button when the current user cannot access any related signature requests. This prevents users from clicking a button that would lead to an error, while keeping it visible for authorized users such as signature administrators.
Original PR description
Before this PR, when logged in as a different user from the one responsible for counter-signing the contract, the smart button still showed, and clicking on it caused an error. This PR fixes that, by hiding the smart button when there are no accessible signature requests. Note that sign admins will still be able to see the smart button; users with access to the signature request. Task-4966129 Forward-Port-Of: odoo/enterprise#90819
Document email templates no longer fail when displaying the company logo text. The logo description now uses the current user's company information, preventing errors for recipients of document-related emails.
Original PR description
The alt for company logo was based on the object's create_uid, but the documents access model does not have the create_uid field, so this would cause an error whenever trying to render this template. Changed the alt to use the user's company_id instead of create_uid company_id. opw-4969479
Swiss payroll ELM transmissions will now include contact person details only when all required contact fields are completed. This avoids sending partial contact information, helping ensure payroll declarations are accepted and processed cleanly.
Original PR description
Contact person information should only be transmitted if all 3 fields are filled Forward-Port-Of: odoo/enterprise#93084
Invoice OCR now chooses the most relevant company or contact when multiple partners share the same VAT number. This reduces incorrect partner selection on extracted invoices, especially for businesses with multiple addresses under one VAT number.
Original PR description
It's possible that multiple partners are sharing the same VAT number, for example, when multiple addresses are set on it (each address will be a child `res.partner` with the same VAT number). Previously, when the OCR matched such partners from their VAT number, it would select one "at random" (based on the default sort of `res.partner`). Now, it will match the one with the highest supplier/customer rank. opw-[4954057](https://www.odoo.com/odoo/49/tasks/4954057) Forward-Port-Of: odoo/enterprise#92398
This fixes an issue where changing a product variant could briefly apply the subscription plan choice to an outdated selector during automated testing. The change makes the subscription purchase flow more reliable by preventing false failures in the variant selection tour.
Original PR description
The subscription plan selection gets removed and replaced (static template website_sale_subscription.SubscriptionPricingSelect) So the change of value occurs, but on the wrong select. This was happening as when changing the variant we will replace the plan_select in the widget with another template and since this will happen before the RPC set the plan_id that we are choosing as the default one we will actually have the old select option back on the dom to be selected. https://github.com/odoo/enterprise/blob/82593f9932e92800251d18453b0c73e5ce9b5ec0/website_sale_subscription/static/src/js/variant_mixin.js#L35-L41 We are setting the select option to the old one after replacing it. This commit introduces a delay to prevent the test to fail (which happened most of the time) runbot-error-110627 Forward-Port-Of: odoo/enterprise#86639
This fixes an issue in Payroll where users could not delete an employee version from the versions list. Removing the incorrect context prevents misleading “record does not exist” warnings and lets HR teams manage employee history normally.
Original PR description
Issue / Current Behavior: It is not possible to delete a version of an employee. Steps to Reproduce: 1. Create an employee. 2. Create a new version of the employee. 3. Click on the smart button of versions and delete a record from the list view. 4. It gives warning that the record doesn't exist or might be deleted. Solution: Fixed the issue when deleting the version by removing the version context. task - 5002995
This fix ensures Indian GST purchase bills can be matched using their Invoice Reference Number without triggering an error. It improves reliability during bill reconciliation and helps avoid interruptions in tax reporting workflows.
Original PR description
Before this IR: - When a purchase document was matched using the IRN number, the variable `matching_keys` was not defined. - This led to an `UnboundLocalError` during bill matching. After this PR: - `matching_keys` is now set together with the IRN number. - This ensures `matching_keys` is always available and prevents runtime errors when IRN matches bills. opw-5037128 Forward-Port-Of: odoo/enterprise#93051
Users can now export calendar invites for planning shifts even when no employee is assigned. The system falls back to the current user's timezone or UTC, preventing an error and keeping shift invitations accessible.
Original PR description
Currently, an error occurs when a user tries to export a calendar invite (ICS) for a planning shift that has no assigned resource. **Steps to reproduce:** - Install the `planning` module. - Go to `Planning > New`, and click `Publish & Send`. - Enable developer mode and go to `Settings > Technical > Email > Emails`. - Open the latest email record and click `iCal/Outlook`. **Error:** `AttributeError: 'bool' object has no attribute 'upper'` **Root Cause:** At [1], when no employee is assigned to the shift, `slot.employee_id` is `empty`, so `slot.employee_id.tz` is `False`, which leads to an error. This commit ensures a valid timezone is always used by selecting the current user's timezone or 'UTC' when the shift has no assigned employee. [1] https://github.com/odoo/enterprise/blob/13ce65b8ca61f9a825f2876e2727cddfae83f894/planning/controllers/main.py#L355 sentry-6781639319 Forward-Port-Of: odoo/enterprise#92984 Forward-Port-Of: odoo/enterprise#91889