Friday, August 28, 2026
17 changes · saas-19.1
Resolved issues and error corrections
This fix narrows how document-related messages are found so the system only retrieves messages for the intended item type. It helps prevent unrelated mailings from being shown or processed by mistake, improving reliability in Documents.
Original PR description
Description of the issue/feature this PR addresses: Updates the `_get_mail_messages` domain filter to include the target model, preventing accidental retrieval of incorrect mailings. runbot-242254
Fixes an issue where archiving or deleting one user could remove a shared partner from restricted discussion channels, even when another active user for the same partner still qualified for access. Partners are now only unsubscribed when no remaining associated user has the required group access, preventing unnecessary loss of channel membership.
Original PR description
Before this commit, archiving or deleting a user removed its partner from every group restricted channel, even when another user of that partner was still active and in the group the channel requires. This happens because the members to unsubscribe are searched on partner_id alone, so the search cannot tell whether the partner keeps another user. This commit fixes the issue by unsubscribing a partner only when none of its remaining users has the group the channel requires. Forward-Port-Of: odoo/odoo#283933 Forward-Port-Of: odoo/odoo#283807
Fixed a formatting issue in the inventory report PDF where location rows did not align with newly added columns. This restores missing gridlines and borders, making printed inventory counts clearer and more professional.
Original PR description
When new columns were added to the stock inventory report, the location grouping row was not updated. This results in mismatched column counts, causing missing gridlines and broken borders in the PDF output Fixed by ensuring the location row's column count matches the header <img width="603" height="200" alt="image" src="https://github.com/user-attachments/assets/86872bee-f315-4bdd-b3f2-a525e3bb5fe0" /> ### Steps to reproduce: - Ensure warehouses are activated in the settings - Go to Barcode -> Count Inventory - Add a Product - Select the gear Icon then "Print Inventory" - You will notice that the location row has missing gridlines opw-6307728 Forward-Port-Of: odoo/odoo#275918
This fixes a Windows-specific issue where static file paths could be split incorrectly after path normalization. It helps ensure Odoo can reliably locate and serve static resources on Windows environments.
Original PR description
In commit 31aad6c, path normalization was added which also resulted in `/` being converted into `\` on Windows. There the `path.split('/')` did not work.
This commit changes the `'/'` to `os.sep` to fix the issue.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#285216This update corrects how user groups are handled in the Sign app. It helps ensure users receive the right access behavior when working with signing features, reducing confusion or incorrect permissions.
Original PR description
opw-6518598
Appraisals now keep the template chosen by the user when they are confirmed or reset, instead of switching back to the first generic template. This makes appraisal records easier to find with template filters and prevents confusion from unexpected template changes.
Original PR description
Issue: When a user selects a generic appraisal template other than the first one, confirming or resetting the appraisal silently replaces that selection with the first generic template. Filtering…
Issue: When a user selects a generic appraisal template other than the first one, confirming or resetting the appraisal silently replaces that selection with the first generic template. Filtering appraisals by the originally selected template then fails to return the appraisal. Steps to reproduce: * Configure multiple appraisal templates without department restrictions. * Create an appraisal and select a template other than the first one. * Confirm the appraisal. * Filter appraisals by the selected template. Cause: `_compute_appraisal_template()` only preserved templates directly linked to the appraisal's department. Generic templates have no department relation, so a valid selected template was discarded whenever the computation was triggered by a state dependent department recomputation. The generic fallback then stored the first template instead. https://github.com/odoo/enterprise/blob/5c57ccbb13269af28de0a6c7f35454be52424f43/hr_appraisal/models/hr_appraisal.py#L195-L209 Solution: We need to distinguish the generic default loaded on an unsaved form from a compatible generic template already stored on an appraisal. Preserve the latter across recomputations while retaining department template priority during creation and rejecting templates that no longer match the appraisal's department or company. opw-6449041 Forward-Port-Of: odoo/enterprise#127566
Users can now click read-only links in the HTML editor to open the link popover and inspect the destination. This fixes a frustrating issue where non-editable links appeared unresponsive, improving confidence when reviewing website or article content.
Original PR description
Problem: Clicking a non-editable link does nothing, making it impossible to open or inspect the link. Solution: Allow the link popover to open in read-only mode for non-editable links. Steps to reproduce: - Run `/article`. - Click on the inserted article link. - Observe that nothing happens. opw-6442026 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283473 Forward-Port-Of: odoo/odoo#280224
Customers can no longer set optional products on sales orders to negative quantities through the portal. This keeps customer-facing order changes consistent and prevents invalid quantities that should only be handled by sales staff when needed.
Original PR description
Since the fusion of `sale.order.option` model into `sale.order.line` model, the optional products (editable from portal) lines are not deleted when reaching a quantity of 0 or below. This could allow some customers to set negative quantities, which makes no sense as it's only something that should be set by the salesman if necessary. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284493
This fixes cases where the same user group has more than one internal identifier, but permission checks only recognized one of them. Users and administrators should now get consistent access results regardless of which valid identifier is used.
Original PR description
A group can be identified by multiple xmlids. We add support to provide a list of "refs" to the `SetDefintions` object.
Reproductible issue:
```
demo = self.env["res.users"].browse(5)
demo.has_group("accountant.group_account_user") # False
demo.has_group("account.group_account_user") # True
assert self.env.ref("accountant.group_account_user") == self.env.ref("account.group_account_user")
```
task-6471260
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#284866The accounting report for invoiced but not delivered sales now excludes delivery fee lines. This prevents non-deliverable shipping charges from appearing as outstanding delivery items, making the report more accurate for finance review.
Original PR description
Issue: --- Delivery lines are included in `invoiced not delivered` report, which is wrong as delivery lines are not deliverable. Steps: 1- Create a SO with a good product and add a delivery line. Set the product line as delivered and create an invoice. 2- Open accounting, and from review tab, open `Invoiced not Delivered`. As you see, delivery lines are included in the report. Fix: --- On stable we could fix it inside `_get_accrual_domain` by checking if `delivery` is installed. On master we need to implement a solution to be able to differentiate the lines that won't be delivered. opw-6360894 Forward-Port-Of: odoo/enterprise#123517
Financial reports now hide the unallocated earnings or losses line when it has a zero balance across all report columns. This reduces clutter and makes trial balance reports easier to read by removing rows that do not add useful information.
Original PR description
… zero The unallocated earnings/losses line was displayed even when its balance was zero in every column group, cluttering the report with uninformative rows. We therefore filter out lines whose balance is zero across all column groups. Forward-Port-Of: odoo/enterprise#129129
This change makes an automated CRM forecast check wait until a deal is fully marked as won before moving on. It reduces random test failures in the release process, helping teams get more dependable validation without changing CRM behavior for users.
Original PR description
The crm_forecast tour is red randomly on runbot on the Won banner step. We click the won button and go back directly, so the kanban can be loaded before the lead is won. Now we wait for the ribbon first. runbot-242139 Forward-Port-Of: odoo/odoo#284721
This fix prevents an unexpected error when the system handles report actions. It improves reliability for users by allowing the process to use the correct record context instead of ending in a traceback.
Original PR description
opw-6360013 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#274977
The registration wizard for France's PDP service no longer shows an unnecessary “Production” label when the system is already in production mode. This avoids confusing wording for users during setup without changing the underlying registration process.
Original PR description
It makes no sense to mention (Production) on pdp registration wizard when you are in prod mode Forward-Port-Of: odoo/odoo#280501 Forward-Port-Of: odoo/odoo#280360
Invalid VAT warning messages now preserve the exact VAT number entered by the user, such as Swiss VAT numbers beginning with CHE. This avoids confusing truncated messages and helps users identify and correct the value that failed validation.
Original PR description
Before this change: When entering or importing a VAT number (e.g., CHE-115.391.649), an invalid VAT warning displays a string missing its country_id (e.g., E-115.391.649). This confuses users and masks the actual input string that triggered the validation failure. To reproduce: 1. Open any contact record and set the Country to Switzerland. 2. Enter an invalid or manually formatted Swiss VAT number like `CHE-115.391.649`. 3. Save or trigger the VAT validation check. 4. Observe the warning banner showing `E-115.391.649` instead of `CHE-115.391.649`. After this change: The validation warning logic preserves the original user input when constructing the alert message, ensuring error notifications accurately display VAT number. Issue introduced by: * https://github.com/odoo/odoo/commit/ac95d2d6d80a368dfb190d0ac21da2af479a8488 * https://github.com/odoo/odoo/commit/a2afe3292e1cd0a4f339dc47707e469653d13ea0 opw-6474217 Forward-Port-Of: odoo/odoo#284305
Appointment invitation emails now use the required permissions when creating public calendar links. This prevents failed email generation for attendees and keeps appointment invitations working smoothly.
Original PR description
Since calendar attendee access tokens are restricted to system users, appointment mail templates must sudo token reads when generating public calendar links. This follows the same pattern as the calendar mail templates and avoids an AccessError when rendering attendee invitation emails. ref: https://github.com/odoo/enterprise/commit/88a3cca752a5f726cd0260b485fc93f65a268cf8 Task-4711415 Forward-Port-Of: odoo/enterprise#129511
This fixes an automated check for the field service sales flow by adjusting the order of signing steps and handling expected page navigation. It helps keep quality checks stable so future updates are less likely to be delayed by false failures.
Original PR description
Solution: Reorder the signing steps and add `expectUnloadPage` when needed runbot-939241 Forward-Port-Of: odoo/enterprise#127442