Thursday, August 7, 2025
12 changes · saas-18.4
Resolved issues and error corrections
Videos embedded in sanitized website content now remain visible when users reopen the editor. This makes it easier to review, change, or remove videos without confusion, while preserving the existing saved-page behavior.
Original PR description
Scenario: - Insert a video in a sanitized html field (for example event.event().description) - Save - Edit Result: the video disappear when editing, so it's hard to remove it or modify it, but reappear when leaving edition. Cause: sanitized field remove iframe, so we need to re-add the iframe when editing the page. Fix: run the code that re-adds the iframe when editing the page. opw-4919773 Forward-Port-Of: odoo/odoo#219397
Archived time off types are now hidden from employee profiles in the Employee app. This prevents outdated or inactive leave balances from confusing employees and HR teams.
Original PR description
In this bug, if a time off type is archived, it is still displayed in employee app. Steps to reproduce the bug: 1- Create a database with employee and time off modules installed 2- Allocate a time off to an employee 3- Archive the time off type 4- Open Employee app and go to the employee profile 5- The archived days are still displayed opw-4900060 Forward-Port-Of: odoo/odoo#221449 Forward-Port-Of: odoo/odoo#217517
This fix prevents preview actions in the website/editor tools from incorrectly flagging content as modified. Business users can preview pages or blocks without triggering unnecessary unsaved-change warnings or save prompts.
Original PR description
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
The Stripe documentation link in the Point of Sale payment provider settings has been fixed. This helps users reach the correct setup instructions without confusion or dead-end navigation.
Original PR description
Before this commit: ---------------- - The Stripe documentation link in the POS payment provider configuration was broken, leading to a poor user experience. After this commit: ------------------------------- - The Stripe documentation link has been corrected to ensure proper access to setup instructions. Task - 4797691 Forward-Port-Of: odoo/odoo#210515
Printing delivery operation reports now works even when an item has no reserved quantity. The report also hides zero-quantity lines, making delivery documents cleaner and easier to read.
Original PR description
**Steps to reproduce:** 1. Install Inventory > Go to Inventory > Configuration > Tick Storage Locations. 2. Go to Operations > Deliveries > create a new delivery. 3. Add two products: one with…
**Steps to reproduce:** 1. Install Inventory > Go to Inventory > Configuration > Tick Storage Locations. 2. Go to Operations > Deliveries > create a new delivery. 3. Add two products: one with on-hand quantity, one without. 4. Set demand quantities > mark as To Do, check availability, and try to print. **Issue:** - A traceback (IndexError: tuple index out of range) occurs when printing picking report if a product has no reserved quantity, due to missing move lines. **Cause:** - The template attempts to access `move.move_line_ids[0]` without checking if `move_line_ids` is non-empty. This raises an IndexError if there's no move lines. https://github.com/odoo/odoo/blob/f539705023993e284dce5dc1027c3c3af9c42d75/addons/stock/report/report_stockpicking_operations.xml#L143-L146 - Also, move lines with zero quantity are displayed in the picking operation report. <img width="529" height="94" alt="image" src="https://github.com/user-attachments/assets/61c439a2-16c4-44aa-a664-fbec672f6226" /> **Solution:** - Add a check to ensure `move.move_line_ids` is non-empty before accessing the first element. - Add filter to avoid rendering move lines with zero `quantity` in the delivery. **opw-4961985** Forward-Port-Of: odoo/odoo#220317
Users without Time Off access can now change the type of a leave request without hitting an access error. This prevents interruptions when employees request or adjust time off, such as switching from paid time off to sick leave.
Original PR description
Steps: ([demo](https://drive.google.com/file/d/1nphgXlAc_w3z0oE7ickuTaGhl5khLhxo/view?usp=drive_link)) - Remove Time Off access to "Demo" user - Login as demo - Request a "Paid Time Off" - Change the Request time off type to "Sick" Actual result: - overtime_id field access error Expected result: - no error Caused by: https://github.com/odoo/odoo/pull/207780 opw-4929659 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218095
Portal users can now access marketing cards in the same way public users already could. This avoids access issues for recipients who are often partner contacts, making shared marketing cards easier to view.
Original PR description
The access right that allows public users to read cards should obviously apply equaly to portal users. Recipients will very often be partners so them not being allowed is very annoying. task-5000332 Forward-Port-Of: odoo/odoo#222037
Purchase order PDFs now handle very long product purchase descriptions without the text overlapping the table header when the document spans multiple pages. This makes printed purchase orders clearer and more reliable for users and suppliers.
Original PR description
**Steps to reproduce**: 1. Install the `purchase` module. 2. Go to a product's `Purchase` tab and add a long purchase description (approx. 40–45 lines). 3. Create a Purchase Order using this product.…
**Steps to reproduce**: 1. Install the `purchase` module. 2. Go to a product's `Purchase` tab and add a long purchase description (approx. 40–45 lines). 3. Create a Purchase Order using this product. 4. Print the PDF of the Purchase Order (via gear icon). **Observation**: The long product description overlaps with the table header when the table spans multiple pages in the generated PDF. **Issue**: wkhtmltopdf does not handle multi-page table headers properly by default. causing header/content overlap when the table breaks across pages. **Solution**: Apply a known wkhtmltopdf workaround by explicitly setting: `<thead style='display: table-row-group;'>` This ensures headers will not repeat same as sale order. ref(https://github.com/odoo/odoo/pull/53909) Before: <img width="1003" height="426" alt="image" src="https://github.com/user-attachments/assets/38b7b4de-ea81-445f-8cd2-ae164fcb7531" /> After: <img width="1000" height="414" alt="image" src="https://github.com/user-attachments/assets/ef09ef94-2a26-468a-b6e7-03d93b4515b8" /> opw-4908457 Forward-Port-Of: odoo/odoo#219830
This fix prevents original list prices from being exposed in hidden page elements for rental products that should not show a sale price. It helps keep website pricing consistent with configured pricelists and avoids search engines or visitors discovering prices meant to remain unavailable.
Original PR description
Versions
--------
- 17.0+
Steps
-----
1. Create a pricelist setting product prices to zero;
2. configure website to make zero-priced products unavailable for sale;
3. go to /shop as a public user;
4. open the product page of a zero-priced product;
5. open the browser console;
6. use `document.querySelector('.css_non_editable_mode_hidden .oe_currency_value')`
Issue
-----
The query returns an element with the product's original list price.
Cause
-----
In `website_sale`, this element is part of a `t-if` that only gets rendered when `editable` is `True`. A `website_sale_renting` override changes the conditional to `not combination_info.get('is_rental')`.
Solution
--------
Instead of replacing the `t-if` attribute in the override, add `and not combination_info.get('is_rental')` to it, ensuring it remains hidden outside of editable mode.
opw-4865141
Forward-Port-Of: odoo/enterprise#91728
Forward-Port-Of: odoo/enterprise#91112The VoIP call timer now uses the user's device time consistently instead of mixing it with server time. This prevents calls from showing a negative starting time when clocks differ slightly, improving call display reliability.
Original PR description
It was reported that the timer for the call would sometimes start as a negative number. Examining the code that computes it suggests that the timestamp sent by the server was a few seconds in the future compared to luxon.DateTime.now() (client time). This discrepancy is most likely due to the clock skew between the client and the server. This commit adapts the code so that it only computes time based on client-side values, effectively preventing clock skew issues. Task-4930666 Forward-Port-Of: odoo/enterprise#91738
This fix prevents Spanish Amazon sales invoices from locking their invoice reference too early during processing. It helps ensure invoice names are assigned correctly and reduces the risk of errors in invoice creation or posting.
Original PR description
Accessing `invoice_line_ids` was flushing and protecting `move_name` too early. runbot-162079 Forward-Port-Of: odoo/enterprise#91703
This fix ensures multi-select product options sent through UrbanPiper appear as checkboxes in DoorDash instead of radio buttons. It improves menu accuracy for restaurants using DoorDash integrations and prevents customers from seeing the wrong option selection behavior.
Original PR description
Steps: - Configure urban piper in pos.config - Select products that has attribute and its type is multi-checkbox - Sync menu. Issue: - For Doordash multi-checkbox appears as radio instead of checkbox. Cause: - max_selectable is -1 which is not supported by Doordash. Fix: - Send static value as 30 instead of -1. task- 4971545 Forward-Port-Of: odoo/enterprise#91499