Thursday, June 26, 2025
100 changes
Enhancements to existing features
The web interface no longer shows the reset filter button in the action helper. This simplifies the filtering experience and removes an extra control that was no longer needed.
Original PR description
This commit removes the button used to reset filters in the action helper. task-4891535
Resolved issues and error corrections
The website editor once again shows the size of a selected image. This helps content editors quickly check image weight while building pages, supporting better page performance decisions.
Original PR description
When converting the website builder to `html_builder`, the tag that displayed the selected image's size was forgotten. This commit re-introduces it. task-4367641
Features or functions removed from Odoo
The bank reconciliation list now relies on the standard Odoo selection behavior instead of a module-specific customization. This keeps the user experience consistent across list views while preserving the ability to add lines to a selection by clicking them.
Original PR description
This reverts commit f40533c0b3410676aee29a2b48454213966613f7. In this commit, we added a customization for the bank rec widget by changing the way selection records in a list view works. Before the change: selecting a record then clicking on the line of another record -> the last record is selected, others already selected are ignored After the change: selecting a record then clicking on the line of another record -> the last record is added to the selection But after this: https://github.com/odoo/odoo/pull/212148, this is the standard behaviour, so the bank rec customization is no more needed. task-4816580
Code cleanup and technical improvements
This internal cleanup makes appointment, rental, and website studio builder components easier to reuse across modules. It improves maintainability and supports future enhancements without changing the user experience.
Original PR description
*: website_sale_renting, website_studio This refactor adds `export` to all classes extending `BuilderAction`, allowing them to be reused or imported from other modules. It improves modularity.
Miscellaneous changes
runbot-error-223159 runbot-error-223635 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212102
Original PR description
runbot-error-223159 runbot-error-223635 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212102
Empty HTML property fields now display as blank in list views instead of showing the word "False". This makes records easier to read and avoids confusion for users reviewing lists with optional HTML content.
Original PR description
Bug === Create an HTML properties, and don't set a value. It is displayed as "False" in the list view, while it should be an empty string. Change the HTML formatter, so it's consistent with the text formatter. Task-4896271
Currently, when a loyalty program has expired, loyalty card are still getting created even though points are not granted. Steps to reproduce: ------------------- * Create a loyatly program and make it sot that is has already expired * Open pos and make an order selecting any customer * Go to the backend and check the loyalty program > Observation: 1 card has been created with 0 points Why the fix: ------------ Not loading the expired programs prevent the creation of loyalty cards.
Original PR description
Currently, when a loyalty program has expired, loyalty card are still getting created even though points are not granted. Steps to reproduce: ------------------- * Create a loyatly program and make it sot that is has already expired * Open pos and make an order selecting any customer * Go to the backend and check the loyalty program > Observation: 1 card has been created with 0 points Why the fix: ------------ Not loading the expired programs prevent the creation of loyalty cards. Using the same logic as module `sale_loyalty` https://github.com/odoo-dev/odoo/blob/5acb89b8ba9be0e18bca65e26c03f47199fcfb4b/addons/sale_loyalty/models/sale_order.py#L461-L465 opw-4671522 Forward-Port-Of: odoo/odoo#208730 Forward-Port-Of: odoo/odoo#208134
Currently, an error is raised when attempting to export the XML for a draft invoice. **Steps to Reproduce:** - Install the `account_edi_ubl_cii` module. - Create an invoice with customer **OpenWood**. - Without confirming the invoice, go to `Print > Export XML`. **Error:** `AttributeError - 'bool' object has no attribute 'replace'` **Cause:** In draft state, the invoice name is `False`, leading to an `AttributeError` when calling `replace()` on bolean value. - [1] [1] - https://
Original PR description
Currently, an error is raised when attempting to export the XML for a draft invoice. **Steps to Reproduce:** - Install the `account_edi_ubl_cii` module. - Create an invoice with customer **OpenWood**. - Without confirming the invoice, go to `Print > Export XML`. **Error:** `AttributeError - 'bool' object has no attribute 'replace'` **Cause:** In draft state, the invoice name is `False`, leading to an `AttributeError` when calling `replace()` on bolean value. - [1] [1] - https://github.com/odoo/odoo/blob/8bc24feca01a7d0e45606ac97e45ddf442670392/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_bis3.py#L32-L33 Restrict the XML export feature to only allow export for posted invoices, where the name is always defined. Sentry - 6695898207 Forward-Port-Of: odoo/odoo#215389
[FIX] website: fix the website_form_editor_tour tour The primary objective of this commit was to solve the `website_form_editor_tour` tour that was failing undeterministically because this flow happend; - The user types something ("A") as input and clicks somewhere else to commit its change. - The DOM is updated with the new value. - The user types something else ("B") on the same input. - The options are rebuild with the DOM value. -> "A" is displayed in the option input and "B" is
Original PR description
[FIX] website: fix the website_form_editor_tour tour
The primary objective of this commit was to solve the
`website_form_editor_tour` tour that was failing undeterministically
because this flow happend;
- The user types something ("A") as input and clicks somewhere else to
commit its change.
- The DOM is updated with the new value.
- The user types something else ("B") on the same input.
- The options are rebuild with the DOM value.
-> "A" is displayed in the option input and "B" is lost.
From version 18.4, [this commit] was merged to solve the problem so the
fix of the tour is removed.
The `timeout` of the tour is increased as it failed in the multi-build
due to a `Script timeout exceeded` error.
runbot-64572
[this commit]: https://github.com/odoo/odoo/commit/e4191c983ec6444b866f7d16de7b3bc9208ab8c3
Forward-Port-Of: odoo/odoo#213417
Forward-Port-Of: odoo/odoo#213197## Version 18.0+ ## Issue When an animation is set on wishlist button icon, only one product appears per eCommerce page. Same behavior for compare and add-to-cart buttons. ## Steps to reproduce - Enable wishlists from `Settings` App; - Go to shop frontend view in edit mode: - Select a wishlist button icon on any product by clicking on it; - From editor's view, move to `Icon` section: - Add an animation (e.g. `On Appearance`). - Save and refresh; - Move to any shop pag
Original PR description
## Version
18.0+
## Issue
When an animation is set on wishlist button icon, only one product appears per eCommerce page.
Same behavior for compare and add-to-cart buttons.
## Steps to reproduce
- Enable wishlists from `Settings` App;
- Go to shop frontend view in edit mode:
- Select a wishlist button icon on any product by clicking on it;
- From editor's view, move to `Icon` section:
- Add an animation (e.g. `On Appearance`).
- Save and refresh;
- Move to any shop page and see only 1 product.
> [!important]
> Not reproducible in FireFox or Safari.
opw-4784323
Forward-Port-Of: odoo/odoo#215409
Forward-Port-Of: odoo/odoo#213773The field priority is not required (even if it has a default) so it is possible to have False instead of a str. Traceback occures when merging leads that contains historical data. ``` File "/home/odoo/src/odoo/saas-18.3/addons/crm/models/crm_lead.py", line 1501, in _merge_opportunity merged_data = opportunities._merge_data(self._merge_get_fields()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/odoo/src/odoo/saas-18.3/addons/crm/models/crm_lead.
Original PR description
The field priority is not required (even if it has a default) so it is possible to have False instead of a str.
Traceback occures when merging leads that contains historical data.
```
File "/home/odoo/src/odoo/saas-18.3/addons/crm/models/crm_lead.py", line 1501, in _merge_opportunity
merged_data = opportunities._merge_data(self._merge_get_fields())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/addons/crm/models/crm_lead.py", line 1457, in _merge_data
data[field_name] = fcallable(field_name, self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/addons/crm/models/crm_lead.py", line 1555, in <lambda>
'priority': lambda fname, leads: max(leads.mapped('priority')) if leads else False,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: '>' not supported between instances of 'str' and 'bool'
```
Forward-Port-Of: odoo/odoo#214152**Version**: - saas-18.3 **issue**: - The calendar privacy field has no label. **cause**: - after merge this PR https://github.com/odoo/odoo/pull/195101 a new group was added in the mail module, which caused the label to no longer display. **solution**: - Add the new group in the calendar module to restore the label visibility. task-4748282 Forward-Port-Of: odoo/odoo#207952
Original PR description
**Version**: - saas-18.3 **issue**: - The calendar privacy field has no label. **cause**: - after merge this PR https://github.com/odoo/odoo/pull/195101 a new group was added in the mail module, which caused the label to no longer display. **solution**: - Add the new group in the calendar module to restore the label visibility. task-4748282 Forward-Port-Of: odoo/odoo#207952
We added a function in the ticket screen in order to override it in the modules `pos_urban_piper` and `pos_blackbox_be`. task-id: 4781945 enterprise PR: https://github.com/odoo/enterprise/pull/87989 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215300 Forward-Port-Of: odoo/odoo#214861
Original PR description
We added a function in the ticket screen in order to override it in the modules `pos_urban_piper` and `pos_blackbox_be`. task-id: 4781945 enterprise PR: https://github.com/odoo/enterprise/pull/87989 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215300 Forward-Port-Of: odoo/odoo#214861
This PR https://github.com/odoo/odoo/pull/214829 caused a Runbot error. The test introduced in the PR is failing because it compared a list converted from a set to a hardcoded list, leading to inconsistent order. Using a sorted list when converting the set fixes the issue. Forward-Port-Of: odoo/odoo#215773
Original PR description
This PR https://github.com/odoo/odoo/pull/214829 caused a Runbot error. The test introduced in the PR is failing because it compared a list converted from a set to a hardcoded list, leading to inconsistent order. Using a sorted list when converting the set fixes the issue. Forward-Port-Of: odoo/odoo#215773
In this commit, we add a step to ensure that the popover comparator is visible in the DOM before moving on to the next check step. 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#215810
Original PR description
In this commit, we add a step to ensure that the popover comparator is visible in the DOM before moving on to the next check step. 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#215810
`odoo-bin cloc -p /mypath` should work on the given path, but results in an error when trying to split the database because `',' in opt.database` fails as it is `None`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215604
Original PR description
`odoo-bin cloc -p /mypath` should work on the given path, but results in an error when trying to split the database because `',' in opt.database` fails as it is `None`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215604
When there is invalid characters in the field, sending may lead to unexpected behaviour. normalize and keep only the first one Task-id: 4894083 Forward-Port-Of: odoo/odoo#215784 Forward-Port-Of: odoo/odoo#215580
Original PR description
When there is invalid characters in the field, sending may lead to unexpected behaviour. normalize and keep only the first one Task-id: 4894083 Forward-Port-Of: odoo/odoo#215784 Forward-Port-Of: odoo/odoo#215580
Allow batch write on model using the `HtmlFieldHistory` mixin. task-4852381 task-4731389 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215010 Forward-Port-Of: odoo/odoo#213116
Original PR description
Allow batch write on model using the `HtmlFieldHistory` mixin. task-4852381 task-4731389 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215010 Forward-Port-Of: odoo/odoo#213116
Before this commit, the widget integer was used for a float and was raised as an error. This commit fix it. 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#213727
Original PR description
Before this commit, the widget integer was used for a float and was raised as an error. This commit fix it. 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#213727
Before this commit the opacity slider in the custom color picker ( introduced in this [commit]) in the custom tab would change its opacity at the top based on the opacity of the color you selected, which isn't expected behaviour. To see the issue: - go to any apps where you can edit text (for example, Knowledge) - select any text and expand the toolbar to see the colors options - click on "Apply font color" and navigate to the Custom tab - slide the opacity slider down => slider's opac
Original PR description
Before this commit the opacity slider in the custom color picker ( introduced in this [commit]) in the custom tab would change its opacity at the top based on the opacity of the color you selected, which isn't expected behaviour. To see the issue: - go to any apps where you can edit text (for example, Knowledge) - select any text and expand the toolbar to see the colors options - click on "Apply font color" and navigate to the Custom tab - slide the opacity slider down => slider's opacity changes, this happens because its style's linear gradient goes from our colors opacity value to 0 instead of 100 to 0. [commit]: https://github.com/odoo/odoo/commit/7bbe05b34541d641dd431662e835d2a26e1adfab Forward-Port-Of: odoo/odoo#215434
To adapt to the merge of `hw_drivers` and `hw_posbox_homepage` into `iot_drivers`, we need to update the `odoo.conf` file to change the modules to load. Task: 4860513 Forward-Port-Of: odoo/odoo#215725 Forward-Port-Of: odoo/odoo#215536
Original PR description
To adapt to the merge of `hw_drivers` and `hw_posbox_homepage` into `iot_drivers`, we need to update the `odoo.conf` file to change the modules to load. Task: 4860513 Forward-Port-Of: odoo/odoo#215725 Forward-Port-Of: odoo/odoo#215536
Before this commit, when plain text (e.g., "Some tax") was imported from a CSV file into the HTML field `description`, the system wrapped it in a `<p>` tag during normalization via `html_normalize`, since plain text is not valid HTML. After this commit, we add a check before record creation: - If the value is plain text without any HTML, we wrap it in a `<div>` to make it valid HTML. - If it already contains HTML, we leave it untouched. This avoids unintended `<p>` wrapping by `html_n
Original PR description
Before this commit, when plain text (e.g., "Some tax") was imported from a CSV file into the HTML field `description`, the system wrapped it in a `<p>` tag during normalization via `html_normalize`, since plain text is not valid HTML. After this commit, we add a check before record creation: - If the value is plain text without any HTML, we wrap it in a `<div>` to make it valid HTML. - If it already contains HTML, we leave it untouched. This avoids unintended `<p>` wrapping by `html_normalize`. Note: if content is wrapped in a `<div>`, `html_normalize` will strip it out. This ensures consistent HTML formatting for the description field during create/write operations and prevents unexpected automatic wrapping by the system. task-4862728 Forward-Port-Of: odoo/odoo#215469 Forward-Port-Of: odoo/odoo#214113
For Jordan E-invoicing, the reason for return of a credit note is mandatory in the XML. Before this commit, if the return reason (`ref`) was empty in a credit note, an error from JoFotara pops up during validation. This commit makes sure the user is notified of missing `ref` before submitting the XML to JoFotara. task-4869028 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215542
Original PR description
For Jordan E-invoicing, the reason for return of a credit note is mandatory in the XML. Before this commit, if the return reason (`ref`) was empty in a credit note, an error from JoFotara pops up during validation. This commit makes sure the user is notified of missing `ref` before submitting the XML to JoFotara. task-4869028 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215542
Task: 4610586 If an operator is added in the side panel of Shop Floor, and an MO has multiple work orders, then after marking all of the steps as done, the selected user is assigned to all of them except the final one. This commit fixes the error, assigning the selected operator to all completed work orders. Forward-Port-Of: odoo/enterprise#87019 Forward-Port-Of: odoo/enterprise#84790
Original PR description
Task: 4610586 If an operator is added in the side panel of Shop Floor, and an MO has multiple work orders, then after marking all of the steps as done, the selected user is assigned to all of them except the final one. This commit fixes the error, assigning the selected operator to all completed work orders. Forward-Port-Of: odoo/enterprise#87019 Forward-Port-Of: odoo/enterprise#84790
Steps to reproduce: - Install payroll, l10n_mx_hr_payroll (mexican localisation) - Install l10n_mx_hr_payroll_account - Switch to a Mexican Company - Create a payslip for a mexican employee with amount < 4000 - Compute the sheet for the payslip Error message appears, this error message is not a descriptive to the user or not telling what could have gone wrong. This happens because the mexican pay structure has some salary rules that has to be computed, one of these rules is `Retiremen
Original PR description
Steps to reproduce: - Install payroll, l10n_mx_hr_payroll (mexican localisation) - Install l10n_mx_hr_payroll_account - Switch to a Mexican Company - Create a payslip for a mexican employee with…
Steps to reproduce: - Install payroll, l10n_mx_hr_payroll (mexican localisation) - Install l10n_mx_hr_payroll_account - Switch to a Mexican Company - Create a payslip for a mexican employee with amount < 4000 - Compute the sheet for the payslip Error message appears, this error message is not a descriptive to the user or not telling what could have gone wrong. This happens because the mexican pay structure has some salary rules that has to be computed, one of these rules is `Retirement, assault in elderly and old age (CEAV) IMSS (Employer)` that has mode of code. This mode means calling safe_eval on the code raw text of it written in the xml file on the data folder. This rule aims to find the suitable taxation level to be applied on the salary. It reads the limits of each level and check if the `integrated_daily_wage` of the employee falls in this level and applies that taxation level. There is no upper limit on the salary, But there is a min level, hence if the integrated_daily_wage < mdw (minimum daily wage) the function returns None that used as index in the taxation table leading to an unreadable Exception from the safe_eval call. https://github.com/odoo/enterprise/blob/747482f34ca8210d89d81b3363ec5a8fc3a4ff6f/l10n_mx_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml#L1111-L1120 opw-4576482 Forward-Port-Of: odoo/enterprise#88308 Forward-Port-Of: odoo/enterprise#83364