Friday, July 18, 2025
18 changes · saas-18.4
Enhancements to existing features
Recruitment screens that list or compare applicants should load faster thanks to added database indexes. This improves day-to-day navigation in applicant and talent pool views without changing how users work.
Original PR description
Description ----------- Add indexes on `linkedin_profile` & `pool_applicant_id` to support: - `_get_similar_applicants_domain` - `_compute_application_count` - `_compute_talent_pool_count` - `_compute_is_applicant_in_pool` These are called from many places, especially when browsing applicants. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219221
Tax return entries on the accounting dashboard, such as monthly VAT returns, can now be opened directly from their label. This makes it faster for users to review the relevant tax return details, with the view filtered and grouped for clearer navigation.
Original PR description
This commit improves the accounting dashboard by making the tax return entries (e.g., VAT Apr, VAT May) clickable. Clicking on a return now opens Tax Return view filter by return type and the grouped by month for better clarity and consistency. > Task-4912633 Forward-Port-Of: odoo/enterprise#89533
The automatic bank statement reconciliation background job was reworked to better report its progress and continue processing when one statement line fails. This helps reduce repeated job failures and keeps reconciliation running more reliably without manual intervention.
Original PR description
This commit aims at refactoring the following cron _cron_try_auto_reconcile_statement_lines The refactoring has 2 main purposes: 1. Start using progress notification API (to mitigate the cron being disabled after 5 failures) 2. Skip a record that caused an exception while in a cron (otherwise it would keep crashing on the same statement line) task-4900818 Forward-Port-Of: odoo/enterprise#88678
Resolved issues and error corrections
Email Marketing now correctly marks successful mailings as completed even when another mailing in the same queue run fails. This helps prevent campaigns that were already sent from staying in progress and being resent later.
Original PR description
**Steps to reproduce:** - Install `Email Marketing` app - Setup mail catcher - Create a first mailing `test_1` - Insert a dynamic field in the body template to trigger an error (easy way is to setup…
**Steps to reproduce:**
- Install `Email Marketing` app
- Setup mail catcher
- Create a first mailing `test_1`
- Insert a dynamic field in the body template to trigger an error (easy way is to setup a dynamic field and then change the `Recipients` type)
- Ensure this mailing has recipients
- Create a second mailing `test_2` with correct template / recipients
- Disable the `Mail Marketing: Process queue` action to prevent automatic processing (optional but could avoid issues)
- For `test_1` and then `test_2`, click on "Send" to trigger the `action_launch()`
- Manually trigger the scheduled action `Mail Marketing: Process queue`
- An error should be raised as expected ('Failed to render QWeb template')
- The mails for `test_2` are properly sent
- However `test_2` remains in `sending` state instead of `done`
**Issue:**
This issue is caused by the transaction rollback when the `test_1` error is raised. When sending the mail, `_action_send_mail` is called with `auto_commit` set to `True` before the mailing state is updated to `done` but after it is set to `sending`.
This means that, when there is an issue later on, the uncommitted changes will be rolled back, which removes the last state modification and the state gets back to `sending` even if the mails were properly sent.
This could lead to unintended behavior such as mailings being retried and resent on next trigger.
**Fix:**
Explicitly called `commit()` after the state update and disabled the `auto_commit` of `_action_send_mail()`.
Could be better to use `post_send_callback` parameter from
`def send(self, auto_commit=False, raise_exception=False, post_send_callback=None):`
but we would need to modify multiple function signatures (which seems bad in stable).
No test was added as the issue require manual committing which is not supported in tests.
opw-4832616
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#219429
Forward-Port-Of: odoo/odoo#214591The website builder now opens the image shape selector immediately instead of waiting for every shape preview to load. Shape previews are loaded together in groups, making the interface feel more responsive while avoiding distracting flicker.
Original PR description
Steps to reproduce: - In the website builder, select an image - Click on "Shape" => It takes several seconds to open, without any feedback to the user. In [commit 1], the `Img` component's…
Steps to reproduce: - In the website builder, select an image - Click on "Shape" => It takes several seconds to open, without any feedback to the user. In [commit 1], the `Img` component's `onWillStart` was wrongly rewritten to await the image load. In this commit, we don't await the `Img` load to avoid a laggy interface. When each `<Img>` in a group appears one at a time, the visual effect is not optimal. In such a case, we can wait for all the images in the group to display them all at once. This commit adds an `ImgGroup` wrapper component to be used in those situations. After the 1st load, images are cached by the browser and should appear immediately. Note that the intent of the `ImgGroup` was initially to also display a placeholder until the images are shown. This was finally scrapped, as the builder images should load fast enough that we don't need to actually show a placeholder. As a matter of fact, if present, those placeholders give a worse impression because they trigger several visual changes on the page in a small time frame. [commit 1]: https://github.com/odoo/odoo/commit/3cc5ff6e96493f2b068090f880987def3787895e#diff-b4107c5542b3089f488c9a60dd38df72710d0702d5c1ee2de36eb80bc884697c task-4367641
Fixes an issue that caused the website editor to crash when creating a new product ribbon in the online shop. The update also restores the expected ribbon styling controls, making product display customization smoother for eCommerce users.
Original PR description
To reproduce the issue introduced in this [commit], - Open website, having eCommerce installed and at least one product set - Go to /shop and start editing - Click on a product - Ribbon option: Click on create a new ribbon => We receive a traceback because "dependencies" aren't set as static. In the 2nd commit, linted the code for readability. 3rd commit sets ribbon text and background color pickers to have only 2 enabled colors, and removes borders from the product option [commit]: https://github.com/odoo/odoo/commit/b4b215325db61fbbe9793545293c8b6fbc99f310
This fixes a website editor issue where newly created text links were not properly marked for translation. Translated pages can now keep link edits, reorder links, and save new translated links without losing changes.
Original PR description
After the initial website builder refactor, new links in text on the website do not contain the class `o_translate_inline`. NOTE: before the refactor it was added only for new links inside paragraph (the bugs described here were present in blocks which are not paragraph) Steps to reproduce: - Open website builder - Select some text and add a link from the toolbar - Again, with some text after in the same text block - Save - Change the website language - Open website builder in translate mode - Bugs: - You cannot change the links - You cannot make it so that the links are in another order - Edit the text to make the translation different - In the edited block, select some text and create a new link - Save - Bug: The edits are lost (the block with the new link is reset) Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
This fix recalculates website navigation items when page layout settings are changed. It prevents menus with many links from overflowing after switching to a narrower boxed layout, keeping edited websites visually consistent.
Original PR description
The issue happens when the navbar contains many items and the website page layout is customized to a smaller size, causing the navbar to overflow. Steps to reproduce: - Open website and start editing - Click on the navbar and change content width to "Full" - Go to the theme tab and change the "Page Layout" option from "Full" to "Boxed" => We have an overflow. This commit follows the [html_builder refactoring]. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
Fixed an issue where choosing a background image in the website theme editor had no visible effect. This ensures businesses can apply their intended site branding and visual design without needing a workaround.
Original PR description
This commit fixes a bug in the new version of the editor where setting a background image in the website theme would do nothing. Steps to reproduce - open editor - open theme tab - set any image as background => nothing happens After this commit the background image shows correctly.
Basic internal users can now open more Website app screens without being blocked by access-rights warnings. This helps teams view available event, job, and website records more reliably, especially in test and no-demo environments.
Original PR description
*: event, website_event, website_hr_recruitment The functional desire is to be able to access the website app as a basic internal user and see records views that you can see. In practice, there are…
*: event, website_event, website_hr_recruitment The functional desire is to be able to access the website app as a basic internal user and see records views that you can see. In practice, there are quite a few technical issues preventing that (the user easily gets hit with "you don't have the rights to access this" because of internal fields of the main models and screens could maybe be different or the framework should be a bit more smarter about this. This commit adds bandaids on the problem to at least allow some access without warning on some things (by hiding specific fields in the website views, etc). The main reason for this commit is keeping the no-demo runbot tests happy (especially in later versions where it became the standard). In master, this should definitely be reviewed to work more robustly and more well-thought from a functional point of view. Some (all?) examples of issues solved: as an internal user without any access rights (except being an internal user), try to: - Access the kanban view of events in the website app - Group the list view of events by "stage" in the website app - Access the list view or kanban view of jobs in the website app - Go on an event in the website app, try to access the form view with the related top-right button - Go on a job page in the website app, try to access the form view with the related top-right button Note: the publish button also kinda has the same problem for pages. This will be fixed in a dedicated PR after this one. runbot-161791 Forward-Port-Of: odoo/odoo#219356 Forward-Port-Of: odoo/odoo#219128
Point of Sale users without sales document access can now load loyalty programs correctly. This prevents access-right issues from blocking loyalty features at checkout, helping stores continue applying rewards smoothly.
Original PR description
Before this commit, the loyalty program was not loaded for PoS users who lacked access rights to sale documents. This issue occurred because the system attempted to read the `total_order_count` field, which is computed based on sale orders, causing a failure in loading the loyalty program. opw-4847852 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219412 Forward-Port-Of: odoo/odoo#217772
Fixed an issue where a PDF opened in a separate pop-out window could keep showing the previous bill when users moved to another bill. This ensures the attachment preview stays in sync with the selected record, reducing confusion during bill review.
Original PR description
Steps: - Install `account_accountant` - Open bills - Create two bills with two different PDF - Go to list view, open first bill - On the pager you have now 2 records (1/2) - Click on the…
Steps:
- Install `account_accountant`
- Open bills
- Create two bills with two different PDF
- Go to list view, open first bill
- On the pager you have now 2 records (1/2)
- Click on the attachment_preview to open PDF in a PopOut
- Click on the next button in the pager
- PopOut is not updated (still with the first PDF)
since https://github.com/odoo/odoo/pull/214726
Before to this commit, the popout service returned an object containing `createManager` (which also contains useful getters such as `.id` and `.externalWindow` used to retrieve the window and communicate with it), and it also contains all createManager's methods using the following code:
```js
return {
createManager,
...createManager(), // ❌ Converts getters to static values
};
```
But all that getters become obsolete as a copy of the object is made at that precise moment and so, for example, `externalWindow` will remain null forever instead of being re-evaluated each time it's accessed.
Since other parts of the code (such those in charge of updating the popout when props are updated) use `externalWindow`, this no longer worked at all, as it never detected an external window.
The solution (in stable) is to use this code instead:
```js
const service = createManager();
service.createManager = createManager;
return service; // ✅ Preserves getters behavior
````
This ensures `externalWindow` getter is properly re-evaluated on each access and returns the current state of the external window.
In master a fix containing breaking changes will be made to improve the service.
opw-4948511
Forward-Port-Of: odoo/odoo#219296This fixes an issue where reducing a sales order line to zero after a return-for-exchange could create an unnecessary receipt instead of canceling the replacement delivery. The change keeps exchange return stock movements aligned so the expected delivery cancellation happens correctly, reducing inventory confusion and manual cleanup.
Original PR description
When dealing with a "return for exchange" case, some SM won't be merged To reproduce the issue: 1. Confirm a SO with a product 2. Process the delivery 3. Return > Return for exchange 4. Process the…
When dealing with a "return for exchange" case, some SM won't be merged To reproduce the issue: 1. Confirm a SO with a product 2. Process the delivery 3. Return > Return for exchange 4. Process the receipt 5. Set the SOL qty to 0 Error: a receipt is created. The second delivery should actually be canceled This happens because the SM from step 5 is not merged into the SM of the second delivery. When editing a SOL qty, a procurement is ran and its values are based on the SOL: https://github.com/odoo/odoo/blob/66c5d10833af8946ab5d3f887086f9ba08d36ab3/addons/sale_stock/models/sale_order_line.py#L228-L230 https://github.com/odoo/odoo/blob/66c5d10833af8946ab5d3f887086f9ba08d36ab3/addons/sale_stock/models/sale_order_line.py#L378 Where we define a specific `date_deadline` https://github.com/odoo/odoo/blob/66c5d10833af8946ab5d3f887086f9ba08d36ab3/addons/sale_stock/models/sale_order_line.py#L260 However, when we return for exchange, we also run a procurement, but its values are defined differently: https://github.com/odoo/odoo/blob/30e60b55736cfd5f3116ebbc680b49d9113ca419/addons/stock/wizard/stock_picking_return.py#L238 And nothing defines `date_dealine` Since the values of both SM are not the same, they won't be merged, cf https://github.com/odoo/odoo/blob/9f8c364f056c8937409f8ed91b8d1fa436c2d7c0/addons/stock/models/stock_move.py#L1119 Hence the creation of the receipt picking OPW-4688679 Forward-Port-Of: odoo/odoo#218431
This fixes date and date-time default values in the website form builder so they display in the correct format and can be removed after being set. It helps website editors avoid confusing date displays and makes form setup behave as expected.
Original PR description
> [BLSE] After setting a default value for a date in a form, it is not possible to remove it
Editing a posted payment after resetting it to draft no longer clears its journal entry name unless the journal itself is changed. This prevents unnecessary new numbering when users update unrelated details like the amount, reducing confusion and avoiding unexpected gaps in accounting sequences.
Original PR description
Since PR #204507, the move name is reset whenever a payment with a `move_id` is modified, which was intended to allow changing the journal. However, this also resets the journal entry name unnecessarily when unrelated fields (e.g. amount) are updated. This causes confusion for users, especially when the payment is re-posted and a new sequence is generated, leading to gaps in the journal entry numbering without any apparent reason. This fix ensures the journal entry name is only reset when the `journal_id` field is updated. Steps to reproduce: 1. Create a payment and post it 2. Reset it to draft 3. Change the amount 4. Check the journal entry name → it is reset to '/' 4. Repost the payment, and a new sequence is generated Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4886466) opw-4886466 Forward-Port-Of: odoo/odoo#218002 Forward-Port-Of: odoo/odoo#216214
Completed signing certificates are once again downloaded as separate files instead of being combined with the original PDF. People involved in a signing request, including signers and copied recipients, can now access and download the original documents while unrelated users remain excluded.
Original PR description
This PR targets reverting to the previous behavior where certificate of completion is never merged with the original PDF but downloaded separately. It also handles the downloading of completed original documents in the list form/view: - For users who are involved in a sign request (either as a signer or CC'd), the original documents are now available for download. They are now granted read access to the related sign documents. - This ensures that any user who is asked to sign or is CC'd on a sign request can view and download the original documents, without exposing templates or documents to unrelated users. task-id-4886240
Subscriptions with recurring products now require a recurring plan before previewing or starting payment. This prevents customers and sales teams from reaching payment steps that would fail later, making the subscription flow clearer and more reliable.
Original PR description
Reproduce: 1. Create a Subscription with a recurring product but without selecting a recurring plan 2. Click on "Preview" 3. Proceed to confirm and attempt to make a payment. Issue: - The subscription is treated as regular SO, and the make payment then raise Error - When generate a payment link or proceed to payment then raise Error Solution: - Add validation in the `action_preview_sale_order` method to raise `UserError` - Add validation during payment link generation: disable the payment button and display a warning message in the wizard to prevent proceeding task-4925735
Returned check approvals can now only be assigned to users in the Accounting Administrator or Bookkeeper groups. This prevents inappropriate users from being selected as approvers and helps maintain proper financial controls.
Original PR description
Before this commit: - In the account_return_check any user can be set as approver, regardless of the group. After this commit: - Only Accounting Administrator and Bookkeeper groups can be set as approver on the check. task-4934329