Thursday, September 3, 2026
23 changes · saas-19.1
Enhancements to existing features
Rental stock calculations now reuse an existing shared rule for identifying products currently rented. This makes it easier for future extensions or custom modules to adjust rental quantity behavior consistently without duplicating logic.
Original PR description
There is already an existing hook on product.product ([sale_renting.models.product_product.ProductProduct._get_qty_in_rent_domain](https://github.com/acsone/enterprise/blob/2cd105c93bb7199a5ecea67a919a7ab5d9251cbf/sale_renting/models/product_product.py#L24)), use it to get the domain, so it can be inherited by other modules.
While the upstream method uses `('product_id', 'in', self.ids)` instead of this one's `('product_id', '=', self.id)`, this isn't an issue since there's a `self.ensure_one()` just above.
Forward-Port-Of: odoo/enterprise#129191Resolved issues and error corrections
Automated checks for financial reports now wait for each report section to load before moving to the next step. This prevents occasional false failures in testing and helps keep report quality checks stable after recent performance-related rendering changes.
Original PR description
After https://github.com/odoo/enterprise/pull/127516 report lines that are folded or filtered are no longer kept in the DOM with d-none. They are now removed entirely to reduce the number of rendered…
After https://github.com/odoo/enterprise/pull/127516 report lines that are folded or filtered are no longer kept in the DOM with d-none. They are now removed entirely to reduce the number of rendered components on large reports. This made several tours non-deterministic. The tours unfolded multiple lines in succession using positional nth-child selectors. Since unfolding now creates new rows, the next positional selector could match an existing row before the previous DOM update was completed, causing the tour to click the wrong line. The tour would then wait indefinitely for a child of the intended line to appear. We should wait for the expected child line after each unfold before continuing with the next action. Also make some positional triggers more specific by checking the expected line name. This ensures that each DOM update is completed before the following nth-child selector is evaluated. [error-946088](https://runbot.odoo.com/odoo/error/946088) Forward-Port-Of: odoo/enterprise#128127
Code cleanup and technical improvements
This change removes extra processing around final PDF uploads for Greek electronic invoicing. It relies on the normal Send & Print flow and safely retries uploads when needed, reducing unnecessary transaction handling without changing the user workflow.
Original PR description
The final PDF endpoint is idempotent and is safe to call repeatedly with the same invoice identifiers. Remove the unnecessary PDF-specific lock and explicit commit, let the upload status follow the normal Send & Print transaction and retry the idempotent upload when needed. Related: https://github.com/odoo/odoo/pull/281739 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285889
Corrected a small typo introduced during a previous update in the Website module. This helps ensure the related website functionality uses the intended behavior and avoids minor issues from the forward-port change.
Original PR description
During forward port, typo: should be get instead of set. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The IoT printer test now waits briefly before checking printer communication, preventing occasional false failures caused by timing delays. This improves confidence in automated testing without changing customer-facing printer behavior.
Original PR description
When a new bus channel is subscribed to, the frontend waits for a 300ms debounce before sending the subscription to the server. If we try to send a message back before then, it won't be sent to the frontend. This behaviour caused the IoT printer test tour to occasionally fail. To fix the tour, we simply add a sleep for 500ms, which should guarantee enough time has passed to avoid the issue. Unfortunately there seems to be no cleaner way to wait for the channel list to be updated. This error only affects versions 19.1 and 19.2. In 19.3 the delay when adding a new channel was removed. runbot-241937
The website builder now handles the header width setting correctly for several header designs where live preview could show an inaccurate result. This helps users avoid confusion when configuring website headers and ensures the saved setting is applied as expected.
Original PR description
The header width option is not previewed properly on the following header templates: - `template_header_boxed` - `template_header_sales_one` - `template_header_sales_two` - `template_header_sales_three` - `template_header_sales_four` - `template_header_search` This happens because these templates are not compatible with the action `previewableWebsiteConfig` (their width can't be previewed by adding a single class). This commit fixes the problem by using the action `websiteConfig` instead of `previewableWebsiteConfig` when one of these templates is set. task-6420611 Forward-Port-Of: odoo/odoo#286292 Forward-Port-Of: odoo/odoo#282311
The return creation wizard now checks for duplicate returns within the selected company only. This prevents users working across multiple companies from being incorrectly blocked by returns that belong to another company.
Original PR description
To reproduce the issue: 1) Create two companies in Belgium: A and B 2) Manually create a return for A before its opening date 3) Switch to company B, and keep A active as well 4) Try creating a return of the same type and at the same date as in 2) ===> The wizard blocks you and displays a warning saying there's already a return at this date. There is, but for another company. We fix that by properly filtering the company when searching for existing returns. Moving the _read_group inside the loop on self is okay here: we'll never compute that field for multiple wizards at once. Forward-Port-Of: odoo/enterprise#130303
The Helpdesk SLA Status Analysis report now counts a ticket's open time from creation until closure, matching the Ticket Analysis report. This gives managers accurate visibility into how long tickets remain open instead of confusing it with assignment time.
Original PR description
1. Open Helpdesk > Tickets and create a ticket on the team "Customer Care", assigned to yourself 2. More than an hour later, move it to the "Solved" stage to close it 3. Open Helpdesk > Reporting > Ticket Analysis, switch to the pivot view and pick the "Hours Open" measure -> the ticket holds the hour it stayed open 4. Open Helpdesk > Reporting > SLA Status Analysis and pick the "Hours Open" measure as well -> the ticket holds nothing, as it was assigned as soon as it was created odoo/enterprise#47454 added the "Hours Open" measure of the ticket analysis to the SLA status analysis, but computes it up to the assignment date instead of the closing date. The measure therefore holds the hours until the ticket was assigned, which the report already offers as "Working Hours to Assign". With this commit, both reports count the hours from the creation of the ticket to its closing. Forward-Port-Of: odoo/enterprise#130170
This update fixes an inconsistent automated test for Canadian payment processing by ensuring expected results are checked in a consistent order. It helps keep quality checks reliable and prevents false failures during release validation.
Original PR description
Sorts the expected items in `test_cpa005` to ensure consistent ordering. runbot error: https://runbot.odoo.com/odoo/error/941567 Forward-Port-Of: odoo/enterprise#127703
This fixes an inconsistent employee ordering issue that could cause automated checks around employee time-off return dates to fail unpredictably. Employee records with the same name are now ordered consistently, improving reliability without changing business workflows.
Original PR description
Before this commit, TestPartner.test_res_partner_to_store fails on the all-modules and per-country builds: AssertionError: '2024-06-06' != '2024-06-07' : Return date is the return date of the main…
Before this commit, TestPartner.test_res_partner_to_store fails on the all-modules and per-country builds: AssertionError: '2024-06-06' != '2024-06-07' : Return date is the return date of the main user of the partner This happens because the test reads the first entry of the hr.employee list, which holds one employee per user of the partner: back on the 7th for the main user, on the 6th for the other. This comes from "[FIX] hr*: load out-of-office dates from all user employees", which added the employees of the partner to the payload, where it held those of the main user only. The problem is that the list keeps the order of employee_ids, which is 'name' with no tiebreaker, and both employees are named test1, as an employee takes the name of its user and creating the second user renames the partner. Postgres is then free to return either one first, and the failing builds get the second one. This commit fixes the issue by ordering the employees on 'name, id', so that employees sharing a name keep a stable order instead of the one the database picks. The test asserts the whole hr.employee list, one entry per user of the partner, rather than its first entry alone, and that assertion pins the order. https://runbot.odoo.com/odoo/error/945994 Forward-Port-Of: odoo/odoo#286236
When users reduce or remove column layouts, the editor now drops columns that contain no real content instead of leaving behind extra blank paragraphs. This keeps edited pages cleaner while still preserving meaningful content and keeping empty layouts editable.
Original PR description
#### Description of the issue this PR addresses: - When reducing the number of columns or removing a column layout, empty columns were previously unwrapped like any other column. - As a result, columns containing only placeholder paragraphs contributed empty paragraphs to the resulting content, even though they did not contain any meaningful user content. #### Desired behavior after PR is merged: - Fully empty columns are discarded when they are removed. - Non-empty columns continue to be merged as-is, preserving their content. - A single empty paragraph is still kept when all columns are empty to ensure the editor remains editable. - Rename `Remove columns` to `Remove column layout` and update its description to `Convert columns to regular content` to better reflect the operation. task-6296536 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284687 Forward-Port-Of: odoo/odoo#270220
The automated Click All test was repeatedly reopening the Shop menu and never finishing, causing Website app build checks to fail. This change skips that menu during the automated test walk so validation can complete reliably without affecting normal users.
Original PR description
Before this commit, every Click All build failed on the Website app:
FAIL: Subtest TestMenusAdmin.test_01_click_everywhere_as_admin
AssertionError: Script timeout exceeded
This happens because the Shop menu is an `ir.actions.act_url` on the current tab, so clicking it loads the website preview as a new page. Clickall resumes from the state it keeps in the local storage, but restarts the menu walk of the app at its first menu, so it reaches Shop again and the same menus are tested over and over, until the 1200 seconds script timeout.
This commit adds the menu to the Clickall blacklist. Master and saas-19.4 carry that entry from "[FIX] web: blacklist shop menu from Clickall to prevent infinite reload loop".
https://runbot.odoo.com/odoo/error/944407The website translations endpoint is no longer handled as a full website page because it already receives the requested language directly. This prevents unexpected language redirects and cookie conflicts, making translation loading more reliable for users.
Original PR description
/website/translations does not require request.website or language redirection logic as `lang` is passed explicitly. Drop `website=True` to prevent unexpected language redirects and cookie conflicts. Backport of 4faddd8b44 (odoo/odoo#269325). runbot-231758 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281738
The website editor no longer shows a theme background option for tab blocks because that option did not work correctly. This keeps the available choices aligned with what users can reliably apply when designing website tabs.
Original PR description
The theme background options (`o_cc` classes) on the `s_tabs` snippet's tabs doesn't work since 18.4 (html_builder refactor). It was not supported either in previous versions. We decided to fix it so it would be useable in master (20.0) but leave stable versions as is, by restraining the available tabs and removing the theme one. task-5951656 Forward-Port-Of: odoo/odoo#277528
The Romanian tax return formerly shown with the generic label "Tax" is now named "D300". This makes it easier for users to identify the correct declaration when selecting or generating Romanian tax returns.
Original PR description
Before this commit: When generating a Romanian tax return, one of the return types in the list was labeled "Tax", which was too generic to know which specific tax declaration it referred to. After this commit: The tax return is now renamed to "D300", making it easy to identify this return in the list instead of seeing a generic "Tax" label. task - 6388087 Forward-Port-Of: odoo/enterprise#124583
The website editor search field now shows a pointer cursor when users hover over the clear icon in browsers that display it. This small usability fix makes it clearer that users can quickly clear their snippet search.
Original PR description
Steps to reproduce: - Open the website editor. - Open the "Insert a block" dialog. - Enter text in the search bar. - Hover over the clear icon. => The cursor does not indicate that the icon is clickable. Before this commit, the search clear icon kept the default cursor. After this commit, the clear icon uses a pointer cursor to indicate that it is clickable. Note that Firefox does not natively add this clear icon to search inputs, unlike Chrome. This fix only affects browsers that render it. task-6259086 Forward-Port-Of: odoo/odoo#283435
This fix makes an automated rental pricing test use a fixed date so it no longer fails during certain late-night UTC hours. It helps keep quality checks reliable without changing how customers use the website rental flow.
Original PR description
Scenario:
- be (or switch your computer) at time between 21:01 and 23:59 UTC
- run test test_product_attribute_value_config_get_combination_info
Result:
This error is happening:
Traceback (most recent call last):
File "…/tests/test_website_sale_product_attribute_value_config.py",
line 106, in test_product_attribute_value_config_get_combination_info
self.assertEqual(combination_info['price'], price_3_hours)
AssertionError: 6.42 != 15.0
Cause: since the time range is on multiple day, we favor a weekly price
that is more interesting and the result is not the 3 hours price.
Fix: set the date for the test.
runbot-227695
Forward-Port-Of: odoo/enterprise#130062This fixes an issue where online payment lines in restaurant point of sale could be treated as adjustable for tips or payment changes. Online payments are now correctly locked from these adjustments, helping prevent incorrect payment handling at checkout.
Original PR description
In commit ea56e09c1adb, the `canBeAdjusted` override on `PosPayment` was accidentally replaced with `cancelPayment`. However, `canBeAdjusted` is required when `pos_restaurant` is installed to prevent online payment lines from being treated as adjustable (for tips/adjustments). This commit restores `canBeAdjusted` returning `false` for online payments and removes the unused `cancelPayment` method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286259
When a timesheet date is changed from a linked task, the Timesheet Assistant now updates immediately instead of showing the old date until refresh. This helps users trust that the assistant reflects their latest saved changes and avoids confusion during time entry.
Original PR description
Steps to Reproduce: - Install timesheet_grid and activate Timesheet Assistant - Open a timesheet and click the task external link - Change the timesheet date from the task form and save Issue: When the timesheet date is changed from the task, the assistant still shows the old date until the page is refreshed Fix: Reload assistant timesheets after the linked task is saved and refresh or clear the selected timesheet based on the new date task-6454988
This fix makes the restaurant point-of-sale order tracking check wait until payment validation is fully completed and synchronized. It prevents false test failures where the system checked order details too early, improving confidence in automated quality checks without changing user-facing behavior.
Original PR description
The order tracking tour only waited for the feedback screen to be shown after validating the payment. Since order validation is performed asynchronously while the feedback screen is displayed, the tour could finish before the updated order was synced to the backend. This caused the Python test to still see the original quantity and `is_edited` set to false. To fix we wait for the feedback screen continue button to be enabled, which ensures order validation and synchronization have completed before the tour ends. [error-940386](https://runbot.odoo.com/odoo/error/940386) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a timing issue in Mail where mention suggestions could reopen after being dismissed, preventing the Escape key from discarding a reply in some cases. The change makes the behavior more stable and avoids intermittent failures in automated testing, reducing the risk of unreliable reply handling.
Original PR description
Two independent causes made "reply: discard on pressing escape" red, one commit each. "[FIX] mail: wait for the mention suggestions before Escape" is the one that fixes the reported failure, and it holds on every branch: the test presses Escape while the mention fetch is in flight, and the suggestions arriving from the server re-open the list that Escape closed, so the re-opened list takes the second Escape and the reply is never discarded. The test now waits for the fetched suggestions before pressing Escape. "[FIX] mail: keep the suggestion list closed on a re-render" backports "[FIX] mail: keep composer suggestion list closed on unrelated re-render", which entered at 19.0 and never came down. Here NavigableList is re-opened on every patch, so opening the emoji picker after Escape brings the dismissed list back, and it then steals the Escape meant for the picker. https://runbot.odoo.com/odoo/error/946314 Forward-Port-Of: odoo/odoo#286041 Forward-Port-Of: odoo/odoo#284725
The Helpdesk team card layout has been adjusted so the email alias lines up properly with the team name. This creates a cleaner, more consistent display for users managing helpdesk teams without changing any business process.
Original PR description
In this commit, we remove the margin before the mail alias, ensuring aligment within the helpdesk team card. task-6416578 Forward-Port-Of: odoo/enterprise#129865
Users adding a certificate key file without a password will no longer see an immediate misleading error banner. The warning now appears only when a password was entered and is actually incorrect, making the certificate setup experience clearer.
Original PR description
When adding a key file without entering a password, an error banner is immediately displayed, incorrectly suggesting that the password may be invalid. Only show the error banner when a password was provided and is incorrect. Also refactored the compute function to avoid repeated try-except blocks. task-6299175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285744 Forward-Port-Of: odoo/odoo#283589