Daily updates from Odoo
Friday, July 18, 2025
50 changes · saas-18.4
Resolved issues and error corrections
This fix adds the missing database lookup support needed when opening related invoice records for Indian withholding flows. It helps avoid slow searches on large accounting datasets, improving performance without changing user-facing features.
Original PR description
FK columns in large tables like `account.move` need to be indexed if an opposite one-to-many relationship is defined, otherwise reading that o2m requires a full Seq Scan of the table. Introduced via #183335 Forward-Port-Of: odoo/odoo#218517 Forward-Port-Of: odoo/odoo#218497
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 CRM Lost filter now correctly includes records that were archived when marked as lost. This helps sales teams review lost opportunities and activity reporting without missing important historical records.
Original PR description
#### Issue: The `Lost` filter does not reveal any records, as any records moved to the lost status are archived. #### Solution: Override default context that hides archived records when using the filter. opw-4937003 Forward-Port-Of: odoo/odoo#219524
Importing Italian electronic invoices now handles zero-price lines with a zero discount or surcharge without causing an error. This prevents affected vendor bills or invoices from being blocked during import, improving reliability for Italian localization users.
Original PR description
Error "division by zero" raised when importing a XML invoice with `price_unit == 0` and `ScontoMaggiorazione == 0` introduced by #206238 Forward-Port-Of: odoo/odoo#217670
The 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
One-day employee leaves now create timesheet entries using the average daily hours, aligning them with leave calculations. This prevents flexible schedules from causing incorrect timesheet amounts for single-day absences.
Original PR description
After https://github.com/odoo/odoo/pull/209570 , the way work intervals are computed might not reflect real working time for flexible employees, since the virtual schedule is based on a weekly span. In this PR we chose to allocate a timesheet for single day leaves corresponding to average hours per day to be consistent with hr_holidays calculation. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219230 Forward-Port-Of: odoo/odoo#218353
Theme preset colors in the website builder now apply the full styling marker needed for consistent color combinations. This prevents selected presets from appearing incomplete and ensures the styling is also cleaned up when a color is removed.
Original PR description
In the `html_builder`-based website builder, when a theme preset is selected, the `o_cc1~5` class is applied, but the `o_cc` (without number) class is not added. This commit adds the `o_cc` class when applying a theme preset, and removes it when the color is removed. task-4367641
This update increases the allowed time for a website test that checks a full page flow with several embedded frames. It helps prevent false test failures in some Odoo editions, improving release validation reliability without changing customer-facing features.
Original PR description
## Version 18.0+ ## Issue Task 4141409 introduced long tests to simulate complete flow. As this test relies on many iframe checks and these iframes being slow to load, the test time limit is reached. The test fails on Single App and Community but not with Enterprise might be related to performances linked to modules interactions. runbot-223225 Forward-Port-Of: odoo/odoo#214870
The “Seen by” popup in Mail no longer shows a date that could be mistaken for when someone actually read a specific message. This avoids confusion caused by showing a general channel activity date instead of a true per-message seen time.
Original PR description
Before this commit, the “Seen by” tooltip displayed each member’s channel-level `last_seen_dt`, which for older messages could misleadingly be interpreted as “seen today” even if the user hadn’t actually viewed it recently. Furthermore `last_seen_dt` isn’t kept up to date client-side (and only gets fetched on reload), thus causing more confusion. This commit removes the date from the “Seen by” popup. Tracking a true per-message “seen at” timestamp for every user would require significantly more complex modeling and will be revisited later if necessary. task-4630168 Forward-Port-Of: odoo/odoo#219441 Forward-Port-Of: odoo/odoo#211490
Tables marked as non-editable no longer show editing controls in the website editor. This prevents accidental changes to important checkout totals and keeps protected page content consistent.
Original PR description
Before this commit tables that should not be editable were instead editable by using the table_menu overlay Steps to reproduce - go to shop - add any item to cart - go to checkout - open editor => the checkout total table is editable using the table_menu overlay when it shouldn't After this commit uneditable tables do not display the table_menu overlay
This fixes an issue where editing all text inside certain website navigation bar buttons could accidentally remove the button. Navbar buttons now behave like regular buttons in the website editor, making menu button text changes safer and more predictable.
Original PR description
reproduction: 1. Go to website, and edit the website 2. In the navigation bar, the `contact us` button cannot be fully edited, e.g. when editing the text inside the button, when delete all the text…
reproduction: 1. Go to website, and edit the website 2. In the navigation bar, the `contact us` button cannot be fully edited, e.g. when editing the text inside the button, when delete all the text and then add new text, the button is removed **Before this commit:** Buttons in the navbar without the `nav-link` class were excluded from the `feff` padding. In saas-18.3, even without introducing the new website builder or using the html editor, the issue is still there. This suggests that the old `zwnbsp` padding mechanism also excluded these buttons in the navbar. However, since editing a button in the navbar follows the same flow as editing one in the main editing area, these buttons should be properly padded like normal buttons. **After this commit:** Buttons in the navbar without the `nav-link` class are now padded like normal buttons in the main editing area, to make sure the text inside the button can be fully edited. task-4898446 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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
Users can now return to the expense list after opening an expense from dashboard filters such as “To Submit.” This fixes a navigation issue that left users stuck on a record view and improves day-to-day expense review workflows.
Original PR description
**Steps to reproduce:**
- Install the `hr_expense` module.
- Go to the Expense menu and click on "To Submit" in the My Expense dashboard.
- Open any record from the list view.
**Observation:**
- You can't go back to the list view after opening a record.
**Cause:**
- A tag `menu` was added to the action to hide breadcrumbs, but it removed all breadcrumb navigation, unable to go back.
https://github.com/odoo/odoo/blob/92993d7790bb641e5822a5358db35c7fcc7bd091/addons/hr_expense/static/src/components/expense_dashboard.js#L44
**Solution:**
- Used a better way by passing `{ clearBreadcrumbs: true }` to stop the breadcrumb from changing when a filter is applied.
opw-4790643
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#218397
Forward-Port-Of: odoo/odoo#217492This change increases the allowed run time for the web unit test suite so normal test runs are less likely to fail just because they take slightly longer. It helps reduce false failures in development checks and supports smoother maintenance without changing customer-facing behavior.
Original PR description
The suite usualy lasts around ~~33~~ 38 minutes. The timeout of ~~35~~ 40 minutes seems too close and thus fails too often.
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
This update makes an internal mail suggestion tool available for custom extensions. It helps partners and developers apply custom mail behavior more cleanly without changing core code.
Original PR description
Useful for custom patches. Forward-Port-Of: odoo/odoo#219470
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
Users can now enter decimal values in website shadow settings without triggering an error. This prevents editing interruptions when fine-tuning visual styling such as header shadows.
Original PR description
**Problem** Before this commit, if the user entered a decimal value in any of the shadow settings, a traceback popped up. This was due to a regex not supporting decimal values. **How to reproduce** 1. In edit mode 2. Click on header 3. Enter a decimal value (e.g. "1.1") in any of the shadow settings (e.g. "blur") 4. Press enter 5. Problem: traceback when clicking on the header, even after saving and reloading **Solution** This commit fixes the regex in `parseBoxShadow` such that it correctly matches decimal values. task-4367641
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
This update polishes several website builder controls so they are easier to scan and use. Product page option headings now align consistently, accordion actions are more prominent, border style choices have more room, and undo/redo icons behave correctly for right-to-left languages.
Original PR description
**[FIX] website_sale, html_builder: fix alignment of options title** Steps to reproduce: - Go to /shop and click on a product - Edit the page => "Product Images" and "Product Details" don't have any left margin, they are not aligned with the rest of the options. task-4879833 **[FIX] website: set accordion Add New option to primary** task-4879833 **[FIX] html_builder: set more space on border style select** task-4879833 **[FIX] html_builder: reverse undo/redo icons in RTL languages** Undo and redo icons should be reversed in RTL languages. Culturally, like in LTR languages, the "forward" icon should go in the direction of reading, while the "reward" icon should go in the opposite direction. task-4879833
This fixes how the HTML editor identifies content that should be excluded from its history tracking. It helps prevent incorrect undo or history behavior in edited website content after recent website changes.
Original PR description
`data-skip-history-hack` was introduced during initial website refactor, the selector to detect the nodes under that attribute was incorrect. Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
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
Internal users who have a passkey can now complete portal identity checks without being blocked by an unsupported verification method. This keeps portal access working reliably while passkey support for portal users is still being prepared.
Original PR description
When an internal user has a passkey and attempts to pass the portal identitycheck, then the identitycheck's auth_method is set to webauthn which breaks the flow since portal's identitycheck only supports passwords. This scenario is unlikely to occur but it does break the internal users' portal. This is a temporary solution because once I implement passkeys for portal users, I will allow portal users to use webauthn to verify their identity. Forward-Port-Of: odoo/odoo#219162 Forward-Port-Of: odoo/odoo#218427
The website theme editor now reads saved measurement units correctly when showing number fields. This prevents misleading values, such as a 1px border appearing as 16px, helping users adjust button styling accurately.
Original PR description
When a value is converted to the used display unit, the builder number input only relies on the configured `saveUnit`. This is wrong when the existing value is not stored using that unit. This commit uses the actual saved unit when converting saved values to the display unit. Steps to reproduce: - Go to Theme/Buttons - Select "Outline" as "Primary Style" => "Border Width" indicates 16px while it is actually 1px, because it is interpreted as 1rem. task-4367641
This fix ensures the website/page builder no longer replaces other active style settings when updating its own design variables. It reduces the risk of visual conflicts with other Odoo features, customizations, or browser extensions.
Original PR description
Commit [1] used the `adoptedStyleSheets` property, but overrides it every time `setBuilderCSSVariables` is called. This means the document can never have more than one adopted stylesheet, and it will override stylesheets adopted either on other parts of the code (Odoo codebase, custom code) or from outside (browser extensions). By pushing it once and updating the same stylesheet on subsequent calls, we avoid potential clashes. [1]: https://github.com/odoo/odoo/commit/4cf0b7c51dadd05433c4d77222b65aafad39269b
Fixes an issue in the website editor where previewing a Form snippet success message could crash and leave the preview button out of sync. This makes it easier for website editors to check form confirmation messages before publishing.
Original PR description
This commit fixes the `toggleEndMessage` option, showing/hiding the success message preview. Steps to reproduce: - Drop a "Form" snippet and click on it. - Set its "On Success" option to "Show…
This commit fixes the `toggleEndMessage` option, showing/hiding the success message preview. Steps to reproduce: - Drop a "Form" snippet and click on it. - Set its "On Success" option to "Show Message". - Click on the eye button to show the message preview. => Traceback This happens because the `builderOptions` dependency was missing in the `ToggleEndMessageAction` class. Once that fixed, another issue was revealed: - Click on the eye. => The button state does not match the fact that the preview is now toggled. This happens because the added preview class is a system class, meaning that the mutations containing it are ignored. This caused the button action to not add a step in the history (since there is no mutation), preventing the `DOM_UPDATED` event to be triggered, which is the one triggering the update of the widgets. This commit therefore makes this class observed (so not a system class anymore) and cleaned when needed, so in the `clean_for_save_handlers` and `on_cloned_handlers` resources. This class was also renamed to be more relevant. The CSS was also changed to scope this class rules in the "Form" snippet ones, to be applicable only in that snippet. A bit of cleaning was also done. Notably, the `updateContainers` calls to activate the newly added fields were replaced by `setNextTarget`, following what was done in commit [1]. This allows to properly update the containers and to stay consistent on undo/redo. [1]: 203a7af2c2b27c02be7b201f5c707f46caa34573 task-4367641
This fix updates editor and website test automation to use the proper toolbar expansion helper. It reduces intermittent test failures caused by timing delays, helping keep future releases more stable without changing user-facing behavior.
Original PR description
This commit will use the expandToolbar utility in all tests that need to expand the toolbar. Tests that didn't use this utils could fail indeterministically. They fail because the expand is debounced, which means you have to wait longer than a frame animation sometimes. So we opted to use the waitFor. Here's the commit that introduces debounce: https://github.com/odoo/odoo/commit/982fbd75267787c26abf7c6c3c73acaeb6d5bf38#diff-bbe541897d87fdda0566776a1f38db00c056baeb2a5a992bba92ac82816c2d37R320
The website HTML/CSS resource editor now automatically hides when users navigate to another page or start editing or translating content. This prevents an outdated editor panel from staying visible and creating confusion while managing website pages.
Original PR description
In the [html_builder refactoring] functionality that was hiding the resource editor was lost. Before, whenever you had opened the editor and navigated to another page/ started editing/translating, it would hide it. **To reproduce the issue:** 1. Open the website and click on "Site" in the navbar. 2. Select the HTML/CSS editor. 3. Click on Edit/New or navigate to another page (e.g., "Contact Us"). Observe that the resource editor remains visible. [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb Related to task-4367641.
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
The website builder now clears its saved reload selection when users save or discard changes, so reopening the editor starts in the expected default state. This prevents the header or another previously edited area from being automatically reselected, reducing confusion for website editors.
Original PR description
> [QSM] Cannot find the right steps to systematically reproduce it: sometimes, when I enter edit mode, the header is automatically selected if I clicked on it outside of edit mode first (instead of…
> [QSM] Cannot find the right steps to systematically reproduce it: sometimes, when I enter edit mode, the header is automatically selected if I clicked on it outside of edit mode first (instead of being in the "Add blocks" panel) -> Could you look at the code to see if the issue can be found there? Idea: could it be that some event handlers of the editor are not properly cleaned up when discarding? Steps to reproduce: - Open website builder - Click on the header - Change "Content Width" (or any other option that triggers a reload) - Optionally do other changes anywhere that do not trigger reloads - Click "Discard" (or "Save") to close the builder - Click "Edit" to open it again - Bug: The "Edit" tab is active, and the header selected again With the initial website refactor, keeping the target after a reload was done by saving the target in the state of the component `WebsiteBuilderClientAction`, and using it during setup of editor (which is re-created after a reload). The stored value was not cleared when exiting the builder, so the last one stored got reused on the next normal opening NOTE: In `builderOptions` plugin, this commit move the initialization of containers from the setup of the plugin to the resource `start_edition_handlers`. This is because `updateContainers` requires (in the general case) that the plugins `dragAndDrop` and `setup_editor_plugin` have been setup. (this is not achievable through `dependencies` because `dragAndDrop` already depends on `builderOptions`). This issue was not caught manually because the options concerned with `reloadTarget`: - have `editableOnly: false`, which bypass the check for `o_editable` that is added in the setup of `setup_editor_plugin` - target elements that have `.oe_unmovable`, which bypass the search made by `dragAndDrop` (which needs values from setup) These 2 conditions have no strong reasons to always be true, and were not in the test for simplicity (and because I did not know that constraint) Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
This fixes an issue in the website builder where users could delete the footer's scroll-to-top button content and then had no way to restore it. The button can now only be removed through the intended sidebar setting, helping prevent accidental website layout problems.
Original PR description
> [VBAL] Footer: it is possible to manually delete the content of the of "scroll top" button, and there is no functional way to bring it back: https://drive.google.com/file/d/1IaEESlpSkfYRrc4b4wVjV2efS2-CHuGo/view?usp=drive_link. Steps to reproduce: - Open website builder - Click on the footer - Enable "Scroll Top Button" - Click on the button and delete its content - On the link tool that appears, click "Remove Link" - Bug: It is not possible to add it back With the website builder refactor, the removal of this button from within the document was not prevented NOTE: the supported way to remove the button is to disable it from the side bar by toggling "Scroll Top Button" Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Event reminder emails no longer fail when an event track has no scheduled date. The system now uses safe default values for missing date information, helping staff send reminders without unexpected errors.
Original PR description
In saas-18.3, a new mail template…
In saas-18.3, a new mail template [mail_template_data_track_reminder](https://github.com/odoo/odoo/blob/045ebed2c2e4645dd9c36452196f4c72b88d55af/addons/website_event_track/data/mail_template_data.xml#L33) was introduced for the `event.track` model. This template relies on the computed field `is_one_day`, which depends on the `date` and `date_end` fields. If the `date` is not set, evaluating [object.is_one_day](https://github.com/odoo/odoo/blob/045ebed2c2e4645dd9c36452196f4c72b88d55af/addons/website_event_track/data/mail_template_data.xml#L122C1-L123C1) in the template leads to a traceback during rendering. This commit resolves the issue by making the `_compute_is_one_day` method more robust. It now defaults `is_one_day` to False when both `date` and `date_end` are missing. Similarly, the `_compute_track_time_data` method has been updated to handle the absence of these fields, preventing any invalid date computations. The following test cases were added to verify the fix: - When both `date` and `date_end` are missing, `is_one_day` is correctly set to False. - When both fields are missing, all time-related computed fields are set to safe default values without raising errors. Steps to Reproduce: On a saas-18.3 runbot: 1. Create an Event Track record without setting a track date. 2. Try sending the email using the "Add reminder via email" feature. → This results in a traceback due to missing date values. [tbg-2099](https://upgrade.odoo.com/odoo/action-178/2099?debug=1) opw-4910692 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#217872
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
Accounting report errors shown after migration are now easier to understand. The message identifies the affected report, line, and label, and includes an example so teams can more quickly fix customized reports.
Original PR description
When customer migrate to 18.3, they might reach the cross-report error if they had customizations in a report using a subformula. The error message was very technical and is now improved by at specifying the report name (useful when using sections), line name and the label as well as providing an exemple on what a cross_report expression is. task-4938291 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218658
The website editor now correctly prevents users from editing the logout button in the account dropdown. This avoids accidental changes to a standard navigation action and keeps the editing experience consistent after the recent website refactor.
Original PR description
During website refactor [1], the CSS snippet that prevents editing the logout button was not migrated to the new asset, making the button editable. This snippet was originally in `website.edit_mode.scss`. Steps to reproduce: - Enter edit mode - Click on username in navbar (e.g. Mitchell Admin) - Dropdown opens - The "Logout" button is editable, which it shouldn't be. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
Point of Sale users can now close several sessions at once without running into errors. This helps teams complete end-of-day operations more smoothly when managing multiple registers or sessions.
Original PR description
This commit ensures that multiple sessions can be closed without errors by using each record’s ID within the recordset. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219308
Automation rules using the Update Record action now safely do nothing when no update path has been configured. This prevents scheduled automation from crashing and helps keep CRM workflows running smoothly even when an action is incomplete.
Original PR description
When executing an automation rule with an "Update Record" action, if no update path is configured, an error occurs. **Steps to reproduce:** 1. Install the **CRM** and **Automation Rules** modules. 2.…
When executing an automation rule with an "Update Record" action, if no update path is configured, an error occurs.
**Steps to reproduce:**
1. Install the **CRM** and **Automation Rules** modules.
2. Create a new **automation rule**:
- Model = Lead, Trigger = After Creation
3. Add an **action**. Type = Update Record (do not configure the update path)
(Tip: select another action type and switch back to reset the path.)
5. Create a new lead.
6. Run the scheduled action: Automation Rules: check and execute.
**Error:**
```
AttributeError: 'bool' object has no attribute 'split'
....
ValueError: AttributeError("'bool' object has no attribute 'split'") while
evaluating 'model._cron_process_time_based_actions()'
```
**Cause:**
In `_traverse_path`, the `update_path` is expected to be a string for `.split()`, but if not configured, it is `False`, leading to the traceback. - [1]
[1] - https://github.com/odoo/odoo/blob/5842c9f4821772fe44cfe7244162edec1ffff88e/odoo/addons/base/models/ir_actions.py#L701
**Fix:**
This commit ensures that no action is performed if the update path is not defined, avoiding the traceback.
sentry-6722927119
Forward-Port-Of: odoo/odoo#217723Fixed an issue where product tags on the online shop page could be duplicated in the page structure when product variants changed. This keeps product pages cleaner and helps avoid display or maintenance issues for tagged products.
Original PR description
Steps: - Open Odoo 18. - Go to Website > Shop. - Open any product with tags. - Inspect the DOM. Issue: - The `.o_product_tags` div was duplicated. - This resulted in a nested `.o_product_tags` block in the DOM. Reason: - The system was inserting the full HTML tags, including its wrapper, causing the nesting. Solution: - Now only the inside content of the tags is updated, not the whole wrapper. - This keeps the structure clean and avoids duplication. Result: Now, there will be no duplication in the `.o_product_tags` block div section. OPW:4863967 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219001 Forward-Port-Of: odoo/odoo#218320
Fixed an issue in the Gantt view where selecting a custom range with the same start and end date could break the Today button and prevent moving to the next period. This ensures resource booking schedules remain navigable for same-day planning.
Original PR description
Steps to reproduce ================== - Go to Appointments > Schedule > Resources Bookings - Select a custom range with the same start date and stop date - Click apply - Click on Today - Use the next arrow => Nothing changes Cause of the issue ================== If there is 0 day between the start and stop dates, clicking on today will have the stop date before the start date. opw-4754203 Forward-Port-Of: odoo/enterprise#88919
The AI Composer no longer shows @ mention or # channel suggestions that do not work in this context. This prevents user confusion and avoids errors when slash commands are used in AI composer messages for channels.
Original PR description
* = test_discuss_full_enterprise Disabled all @ (mentions) and # (channel) suggestions in ai_composer to prevent non-functional options. also prevents error when using / commands in ai_composer type of the channels. task-4918914 Forward-Port-Of: odoo/enterprise#89415
This update removes an incorrect preset value from a Swiss payroll configuration field. It helps ensure payroll transmission settings reflect the actual company setup and avoids misleading default information.
Original PR description
…lated field Forward-Port-Of: odoo/enterprise#90425
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
This fixes an automated check for changing rental duration on the website shop by removing an unnecessary date picker click during the waiting step. It helps keep the rental shopping flow validation stable, reducing false build failures without changing the customer-facing experience.
Original PR description
remove click on datepicker in the wait step build-error-213702 Forward-Port-Of: odoo/enterprise#90355 Forward-Port-Of: odoo/enterprise#89873
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
Additional automated tests were added for the Planning calendar to confirm batch creation and deletion of records works as intended. This reduces the risk of regressions in calendar scheduling behavior after recent framework-related changes.
Original PR description
This commit's purpose is to add some testing for the task-4485911. This task implemented the use of the new framework tool that allows to create and delete records in batch in the calendar view. Some js customisation was needed in order to better fit our use case. Due to a short timing the testing is done in this followup commit instead of the initial task. task-4891810 target : saas-18.4
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
The Mexican electronic invoicing localization now shows the payment method field again on bank statement lines. This lets users edit required payment details during bank reconciliation, reducing manual workarounds and potential reporting issues.
Original PR description
Since https://github.com/odoo/enterprise/commit/2335c953723dce66af8811fdfbfd5b811d42b109 The field l10n_mx_edi_payment_method_id is no longer available on statement lines to be edited by the end user. Forward-Port-Of: odoo/enterprise#90195