Daily updates from Odoo
Tuesday, August 26, 2025
24 changes · saas-18.4
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
Restricted website editors can now save allowed website content without triggering an access-rights pop-up caused by hidden technical page elements. The change ensures only full website editors can edit underlying website templates, reducing confusion while preserving access limits.
Original PR description
Steps to reproduce: - Install website_event, with demo data - Change Marc Demo's website access to "Restricted Editor" - Log into Marc Demo and visit an event's website page e.g."Live Music Festival"…
Steps to reproduce: - Install website_event, with demo data - Change Marc Demo's website access to "Restricted Editor" - Log into Marc Demo and visit an event's website page e.g."Live Music Festival" - user is able to edits is footer contents,make a change - try to save. Observation: A pop-up for access right appears Cause: after this fix odoo/odoo@11e94cb059901ffc3c521a431259d627beb69e1e , we allow website to be editable for restricted user if, user can modify other models, which are editable from website,like event. And, if website is editable, we brand the ir.ui.views nodes, https://github.com/odoo/odoo/blob/3ceb04bf2aa90442430f5bf321bac4a9d872752c/addons/website/models/ir_qweb.py#L93-L94 but restricted user do not have access to ir.ui.view model, causing access issue Note: if a node is branded, that means it is editable Fix: Brand ir.ui.view nodes only if user has full access to website editor opw-4659114 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224038 Forward-Port-Of: odoo/odoo#221202
Saudi electronic invoicing no longer blocks invoices when a branch company differs from the journal company. This helps businesses using branch structures generate the correct QR code for the appropriate company while staying aligned with invoicing requirements.
Original PR description
This commit removes the previously enforced restriction in https://github.com/odoo/odoo/commit/d6175d0552c18006913e969eac7006666164609c that required the company specified on an invoice to match the company specified on the associated journal and makes sure that the company used to create the QR is the appropriate company whether in a branch or in a main company task-5005477 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224024 Forward-Port-Of: odoo/odoo#222935
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
Customers using Click & Collect can now request a notification when an item becomes available again directly from checkout. This helps avoid lost sales when products go out of stock after they were added to the cart.
Original PR description
## Versions 18.4+ to limit templates impact. ## Issue Users can't choose to be notified when a product becomes available again on the checkout page. ## Steps to reproduce Ensure eCommerce website is…
## Versions
18.4+ to limit templates impact.
## Issue
Users can't choose to be notified when a product becomes available again on the checkout page.
## Steps to reproduce
Ensure eCommerce website is set up with a shop;
- In Settings app:
- Enable "Click & Collect" and click "Configure Pickup Locations":
- Add a company as a warehouse and publish the "Pick up in store" location;
- In Sales app:
- Create a product with the following attributes:
- Name: A;
- Product Type: Goods;
- Track Inventory: enabled;
- Sales: enabled;
- Under Sales tab:
- Out-of-Stock (Continue Selling): disabled;
- On Hand: 1.
- Click "Go to Website":
- Add 1 to cart then go to cart;
- Click the "Checkout" button;
- Under "Choose a delivery method", select "Pick up in store" then "Select a Location";
- Choose a location.
- (In another browser tab) Go to the product's page:
- Set "On Hand" quantity to 0.
- (Back in the checkout tab) Refresh the page:
- The product appears as unavailable under the pick-up location:
- No option is available to request a back-in-stock notification.
## Solution
Apply `website_sale_stock` logic
https://github.com/odoo/odoo/blob/7bc57a49e5bf9061cfb66e179075538cd17bfd2f/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml#L1-L61 as in `website_sale_stock_wishlist`
https://github.com/odoo/odoo/blob/7bc57a49e5bf9061cfb66e179075538cd17bfd2f/addons/website_sale_stock_wishlist/views/website_sale_stock_wishlist_templates.xml#L7-L45
opw-4979335This 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 fixes cases where dropdown select menus did not receive focus, especially when opened empty or reopened in website, forum, and builder flows. Users can now interact with tag and choice selectors more reliably, improving form usability and reducing friction.
Original PR description
…n later opens in some case tests of interests: - `autofocus in select menu` (there are 2 of them, one in website, one in html_builder) - `Selecting a choice calls onSelect and the displayed value is updated` (in web) - `http://localhost:8069/forum/help-1/ask` (there is the select menu for the tags at the bottom) There is the select menu for tags in the 'new question' page in forum, it never focus the selectmenu in tests with setupHTMLBuilder never focus the selectmenu in tests with setupWebsiteBuilder and the one in web/core only does not focus on first open 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 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
Fixes an issue where adjusting the checkout time from the weekly Attendance view could accidentally save the current time instead of the selected time. This helps prevent incorrect attendance records when managers or employees edit attendance entries.
Original PR description
Steps to Produce: - Go to the Attendance interface and select week. - Drag the second half of the column to adjust checkout. - Save the change. Issue: - Dragging on half cell deletes the checkout value from the context. - As a result, the system sets the checkout time to the current time instead of the dragged value. - This leads to incorrect attendance records. Fix: - Ensure the checkout value remains in the context when dragging the cell. - Preserve the modified checkout time so it reflects the user's intended change instead of defaulting to the current time. Task-4958060 Forward-Port-Of: odoo/enterprise#91119
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
This fixes an issue that prevented multiple connected cameras from being used at the same time in Quality IoT setups. Cameras are now identified uniquely and existing camera configurations are preserved, while a related communication error over the websocket is also prevented.
Original PR description
Due to an issue with the `CameraInterface`, the same identifier would be chosen for any connected camera (`camera-2`), meaning only one camera could be used at once. To fix this, the `camera.id`…
Due to an issue with the `CameraInterface`, the same identifier would be chosen for any connected camera (`camera-2`), meaning only one camera could be used at once. To fix this, the `camera.id` property is used as the identifier instead. The `libcamera` documentation says the following: > The camera ID is a free-form string that identifies a camera in the > system. IDs are guaranteed to be unique and stable: the same camera, > when connected to the system in the same way > (e.g. in the same USB port), will have the same ID across both > unplug/replug and system reboots. However, we will also still return the last camera with the `camera-2` identifier, so that existing device configurations in the backend don't get lost. In master we will remove this legacy identifier. You can see the legacy camera with the others in the list below: <img width="801" height="385" alt="image" src="https://github.com/user-attachments/assets/6f3a6408-bcb4-46b0-980e-b5a8881f6df0" /> In addition, another small fix was made to the `CameraDriver` to ensure a string is sent rather than raw bytes, this prevents a traceback when communicating over the websocket. task-4792552 Forward-Port-Of: odoo/enterprise#93076
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