Thursday, August 7, 2025
17 changes · saas-18.2
Resolved issues and error corrections
This fix prevents long product purchase descriptions from overlapping the table header when purchase orders are exported to PDF across multiple pages. It improves readability and ensures printed purchase documents remain professional and usable for vendors and internal teams.
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 fixes an error that appeared when an employee without Time Off access changed the type of a leave request. Users can now update requests such as switching from paid time off to sick leave without being blocked by an internal overtime field permission issue.
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
The system now ignores empty index definitions instead of attempting to create them and failing. This avoids installation errors for modules that contain optional or blank index settings, improving reliability without changing user-facing features.
Original PR description
Currently when trying to create an index with a falsy definition, either a string or a callable, psql raises a SyntaxError preventing the installation of the module. This commit fixes that by skipping the index creation in case of a falsy definition. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Portal users can now open and read marketing cards, matching the access already available to public users. This helps recipients who are often customer or partner contacts access the cards without unnecessary permission errors.
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
Users can now create work entries from the list view in French payroll without encountering an error when dates are not yet set. This improves reliability during manual payroll data entry and prevents an avoidable interruption in the workflow.
Original PR description
Currently, a traceback occurs when a user attempts to create a work entry in the list view. **To reproduce this issue:** 1) Install the `l10n_fr_hr_work_entry_holidays` module. 2) Switch to the `French` company and open the payroll. 3) Open the work entries in list view and try to create a new record. **Error:** ``` AttributeError: 'int' object has no attribute 'seconds' ``` **Cause:** By default, when creating a work entry through the list view, no `start` or `end` date is provided. This leads to the traceback originating from the following line when computing the duration. https://github.com/odoo/odoo/blob/84b15dc1f866e27d5c8a5fe3e457c2f982bcb133/addons/l10n_fr_hr_work_entry_holidays/models/hr_work_entry.py#L28-L32 **Solution:** Adding an extra check of the `start` and `end` date would resolve this issue. opw-4943104 Forward-Port-Of: odoo/odoo#221442 Forward-Port-Of: odoo/odoo#220127
The Stripe help link in Point of Sale payment provider settings now points to the correct documentation. This helps users reach the right setup instructions without confusion or extra support effort.
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
This fixes an internal automated test for the Time Off app that was failing because it relied on a fragile screen element lookup. The test has been rewritten to avoid unnecessary UI tour steps, helping keep validation stable without changing end-user behavior.
Original PR description
The #217517 PR is causing a test failure on runbot.
The problem was due to use of ```$('.o_stat_info:contains("Time Off")')``` to get the element in tour.
To avoid unnecessary use of tour, the test is re-written.
runbot-230486
Forward-Port-Of: odoo/odoo#221865
Forward-Port-Of: odoo/odoo#221706Fixes an issue where quickly adding and removing slides in the website carousel editor could trigger an error. This makes carousel editing more reliable for website content managers and reduces interruptions while updating pages.
Original PR description
Previously, when rapidly adding and removing slides in the Carousel snippet (s_carousel), a JavaScript traceback would occur under certain conditions. Step to reproduce: 1. Drag and Drop a Carousel Snippet (s_carousel) on the page. 2. Rapidly `add -> remove -> add` slides button in editor. 3. Traceback occurs. Cause: - The issue occurred because the currently active slide was passed as the target to activate a snippet. During rapid DOM changes, the active slide could be destroyed or not yet rendered, resulting in a race condition and JavaScript error. Solution: - Additional guards have been added in the `_activateSnippet` function to ensure the `editorToEnable` target is still present in the DOM. task-4270369 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222055 Forward-Port-Of: odoo/odoo#214721
This fixes an invalid command in stock label print templates that could prevent Zebra label printers from correctly recognizing the end of a label. The change helps ensure product labels print reliably without malformed printer instructions.
Original PR description
In the ZPL, the `^XZ` command indicates the end of a label. For an unknown reason (a typo ?), the PR [1] replaces some of them by `^XZj` which is not a valid ZPL command. [1]: https://github.com/odoo/odoo/pull/187225
This fixes an expense creation issue for accounting administrators who do not have dedicated expense permissions. They can now create expenses for themselves without seeing a confusing validation error, while access to create expenses for other employees remains restricted.
Original PR description
- Create a user and its related employee without any expense access rights but with accounting admin rights. - With that user create a new expense. - On the employee field select a different employee…
- Create a user and its related employee without any expense access rights but with accounting admin rights. - With that user create a new expense. - On the employee field select a different employee and save. - The following error appears: Validation Error The operation cannot be completed: Missing required value for the field 'Description' (name). Model: 'Expense' (hr.expense) - create/update: a mandatory field is not set - delete: another model requires the record being deleted, you can archive it instead Since b1ac6f52d37cd59fdb973ce87f93d1d0a69dd204, the field employee_id is no longer invisible for users without hr_expense rights. However, in the method _search_filter_for_expense, users without hr_expense rights but with account rights are able to select every employee (commit 87cca4a9ee64c890ccbd24e2d6766f9f8799a0c0). But in hr_expense, the method _compute_is_editable only considered hr_expense rights, which meant that users trying to create a new expense with only accounting rights would get an error if they were not the approver of the employee they tried to create the expense for. After this commit: If the user has no hr_expense rights but has account rights, they will only be able to create expenses for themselves. opw-4780218 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Notification messages for invitation emails and password reset instructions now use corrected grammar. This improves clarity and professionalism in user-facing account communications.
Original PR description
**Before this commit:** - The notifications for `Send an Invitation Email` and `Send Password Reset Instructions` contained grammatical mistakes. **After this commit:** - The grammatical mistakes have been corrected. task-4975439 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220840
Demo employee contracts for Egypt, Saudi Arabia, and Turkey now use the correct local payroll structures. This prevents Belgian payroll rules from being assigned by mistake when Belgian payroll is also installed, making demo payroll data more reliable for evaluations and testing.
Original PR description
*: eg, sa, tr - Assign the correct payroll structure to employee contracts in demo data to prevents incorrect assignment of the Belgian payroll structure when l10n_be is installed. Task: 4862722
Fixed the Field Service task analysis report so drill-down results stay limited to Field Service tasks. This prevents unrelated tasks from appearing and gives users accurate detail when reviewing report counts.
Original PR description
Issue: - When the user drills down in the pivot view, all tasks are displayed. Cause: - The action was not passing the FSM project domain. Fix: - In this commit, we have passed the FSM project domain, so that only the relevant FSM tasks will be displayed during drill down. Steps to reproduce: - Install the industry_fsm module. - Go to Industry > Reporting > Task Analysis. - Group by Assignees. - Check any count column number and drill down. task-4688139
Upsell-related expiration notices now keep the standard expiration message instead of being treated like renewal expirations. This helps customers see clearer, more appropriate messaging when their access status is tied to upsell handling.
Original PR description
Upsell expiration are not handled the same way as renewal expiration, so we can keep the default expiration message for any expiration reasons other than a renewal Forward-Port-Of: odoo/enterprise#91839 Forward-Port-Of: odoo/enterprise#91730
The VoIP call timer now uses the user's device timing consistently instead of mixing it with server timing. This prevents calls from showing a negative starting time when device and server clocks differ slightly.
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 ensures multi-choice product options sent from Point of Sale to DoorDash are treated as checkbox selections instead of radio buttons. It prevents customer ordering confusion when restaurants sync menus through UrbanPiper.
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
This fix prevents invoice reference information from being locked too early when processing Spanish Amazon sales invoices. It helps avoid incorrect or blocked invoice naming during accounting workflows, reducing disruption for users handling Amazon sales in Spain.
Original PR description
Accessing `invoice_line_ids` was flushing and protecting `move_name` too early. runbot-162079 Forward-Port-Of: odoo/enterprise#91703