Tuesday, September 2, 2025
19 changes · saas-18.4
Enhancements to existing features
This update adds a way for developers to rerun selected tests directly from the Odoo shell after changing test code. It shortens debugging cycles by avoiding a full server restart for test-only changes, while business logic changes still require restarting the shell.
Original PR description
This commit introduces a new function `run_tests` to the Odoo shell. This function allows users to run specific tests directly from the shell, even after the test code is modified. This significantly…
This commit introduces a new function `run_tests` to the Odoo shell. This function allows users to run specific tests directly from the shell, even after the test code is modified. This significantly speeds up the debugging process by avoiding the need for a full server restart. In the odoo shell ``` >>> from odoo.tests.shell import * >>> run_tests(env, 'test_tags', modules=[module_name], reload_tests=True) ``` Note: `run_tests` automatically reloads test modules but does not reload Odoo model code. A shell restart is still required after any change to business logic. used by https://github.com/HydrionBurst/odoo-test-vscode for hot test vscode extension: [odoo-test-0.0.1.vsix.zip](https://github.com/user-attachments/files/22089685/odoo-test-0.0.1.vsix.zip) tutorial: https://github.com/HydrionBurst/odoo-test-vscode?tab=readme-ov-file#-hot-test 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#225175 Forward-Port-Of: odoo/odoo#224048
This update improves how tooltips are checked in website builder rows, delaying the check until a user hovers over the row. This reduces unnecessary work during page editing and can make the builder feel more responsive.
Original PR description
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
This update improves internal automated tests for the website and HTML builder by using a safer way to prepare test page content. It helps make test results more reliable without changing what end users see or how they use the product.
Resolved issues and error corrections
In Point of Sale, opening All Orders from the customer list no longer clears the currently selected customer. This avoids extra re-selection steps and keeps checkout workflows smoother for sales staff.
Original PR description
Before this commit, opening the All Orders from the partner list would reset the selected partner. As a result, the user had to reselect the partner after returning, which disrupted the workflow. opw-4972314 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224828 Forward-Port-Of: odoo/odoo#222507
Website image grid blocks such as Masonry now keep images inside their rounded or bordered containers. This prevents visual overflow and makes edited website layouts look as intended for visitors.
Original PR description
When a border radius and/or width is applied to an image grid item (e.g. in "Masonry"), the image overflows its parent box. This happens because the style was only applied to the column, not the image itself. This commit adds necessary style to the image to take into account the border radius and width of the parent box. Steps to reproduce: 1. In Website Builder, add the "Masonry" snippet. 2. Select a block with an image (i.e. the block with the largest image) and apply a border radius. 3. Notice that the image does not respect the border radius. Related to task-3358501
This fixes a timezone issue when sending order dates for POS online payments. Orders are now formatted in UTC as expected by the backend, helping prevent incorrect order timestamps caused by local timezone conversion.
Original PR description
In 2a5f1ab, we formatted the `order_date` with `toFormat(...)`, however, that transforms the date into local, while the backend expects it to be in UTC. In this commit, we set the date tz back to UTC before formatting it. opw-4942697 Forward-Port-Of: odoo/odoo#225041 Forward-Port-Of: odoo/odoo#224085
This fixes a Point of Sale gift card issue where an order could show a second gift card line with a zero amount. The change helps keep receipts and order totals clearer by treating tiny rounding-like values as zero.
Original PR description
When selling some product and applying a giftcard, there could be 2 giftcard lines applied on the order one with a correct amount and the other one with 0 as amount. Steps to reproduce: ------------------- * Create a gift card with 50€ * Open PoS and add a Desk Pad and a Black Drawer > Observation: There are 2 giftcard lines applied on the order Why the fix: ------------ Sometimes the discountable amount could get weird values that are really close to 0 but that was not interpreted as False. To fix this we use `floatIsZero()` instead. Note: ---------- I will introduce a hoot test in 18.3 to cover this weird use case. opw-4866358 Forward-Port-Of: odoo/odoo#224870 Forward-Port-Of: odoo/odoo#223948
Inventory settings can now be saved even if the Replenish on Order route was previously deleted. This prevents an unexpected error and avoids blocking users from updating configuration settings.
Original PR description
Currently, an error occurs when saving settings if the `Replenish on Order (MTO)` route has been deleted. **Steps to reproduce:** - Install the `stock` and `purchase` modules. - Go to inventory…
Currently, an error occurs when saving settings if the `Replenish on Order (MTO)` route has been deleted.
**Steps to reproduce:**
- Install the `stock` and `purchase` modules.
- Go to inventory settings > enable `Multi-Step Routes` and `Replenish on Order (MTO)`.
- Go to inventory > Configuration > Routes and delete the `Replenish on Order (MTO)` route.
- Open the Settings app and click `Save`.
**Error:**
`AttributeError: 'NoneType' object has no attribute 'sudo'`
**Root Cause:**
After PR [1], at [2], `self.env.ref('stock.route_warehouse0_mto', raise_if_not_found=False)` can return `None` if the MTO route is missing. The code then directly calls `.sudo()` on this `None` value, causing an error.
**Fix:**
This commit moves the `.sudo()` call inside the `if route:` block, ensuring it is only executed when the route exists. This prevents errors when the MTO route is deleted and allows users to save settings without an access error.
[1]:
https://github.com/odoo/odoo/pull/221757
[2]:
https://github.com/odoo/odoo/blob/dfb14be8b83e3c48c1b186b0d7d7a66753381c9e/addons/stock/models/res_config_settings.py#L64
sentry-6839993384Fixes an issue in the website editor where removing a popup or undoing its creation could leave the page unable to scroll. This helps editors continue working normally on longer pages after popup changes.
Original PR description
Following the [html_builder refactoring], commits [1] and [2] removed the functionality that was responsible for toggling the popup's visiblity when we remove it or undo its creation. Steps to see the issue: - Have enough content on the page to be able to scroll it - Start editing and drop the popup - Undo => We can't scroll. The same happens if we just remove the popup. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb [1]: https://github.com/odoo/odoo/commit/a3722219038fff [2]: https://github.com/odoo/odoo/commit/06101974532157c521155a7fbb2179aa85b060db
The Send & Print wizard now consistently hides the Download option regardless of the user's language settings. This prevents confusion for non-English users and keeps the accounting workflow aligned with the intended behavior.
Original PR description
Since 7ad7a1d976391e81eaa03be7076cc61f4a6cfcbe we don't show Download option in the Send & Print wizard. However, we were checking the tuple `(value, label)` which works only if language is set to English. With this commit, we only check the technical value opw-4965650 Forward-Port-Of: odoo/odoo#221763
This update adjusts automated checks for the eLearning course publishing flow after changes in the website builder. It helps ensure future updates do not accidentally break course publishing for eLearning managers.
Original PR description
This commit adapt the broken test test_course_publisher_elearning_manager after refactoring of the website builder.
This fixes an issue where users editing menus in Studio could not create or edit a client action because the default form view failed to load. The change removes an outdated customization so Odoo can generate the form normally, improving reliability when configuring menus.
Original PR description
Steps to reproduce ================== - Install studio,contacts - Go to contacts - Open studio - Click on "Edit menu" - Click on the pencil next to a menu item - Set the action type to ir.actions.client - Type a random string next to it, for example "test123" - Click on "Create and Edit" => No default view could be found Cause of the issue ================== The following commit removes the binary fields from the default view as it caused a traceback https://github.com/odoo/odoo/commit/70d51d2103118287b1ebafdae396c7b86e6b9257 A more general fix has been made in https://github.com/odoo/odoo/commit/e1edcb06ef2619835d07717f00cbf6f04f026366 Since the binary fields are already removed in the super call, the override doesn't find them. Solution ======== There is no need for the override anymore opw-5023188 Forward-Port-Of: odoo/odoo#224752 Forward-Port-Of: odoo/odoo#224634
This fix prevents Spain VeriFactu electronic reporting from failing when a company has no tax ID set. Instead of showing an unexpected error, the system now handles the missing value more safely during batch sending checks.
Original PR description
Replaced `['NIF']` with `.get('NIF')` to avoid a `KeyError` when the company does not have a NIF.
When the VAT value is not set on the company and the `_send_as_batch_check` method is executed, the system raises an error from [1].
This PR updates the code to use `.get('NIF')` instead of direct access, making it more robust.
[1]: https://github.com/odoo/odoo/blob/dff2423ac320fdb97d6bf1f106dc84be1d71cac2/addons/l10n_es_edi_verifactu/models/verifactu_document.py#L1165
**sentry-6829500308**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#224982The email composer now filters templates so users only see templates assigned to them or templates available to everyone. This prevents templates intended for another user from appearing in sales email workflows, reducing confusion and accidental use of the wrong message.
Original PR description
**Steps to reproduce:** 1. Install Sales. 2. Create an email template for the 'sale.order' model and assign it to the admin user under the settings page in the 'User' field. 3. Log in as the demo…
**Steps to reproduce:** 1. Install Sales. 2. Create an email template for the 'sale.order' model and assign it to the admin user under the settings page in the 'User' field. 3. Log in as the demo user. 4. Create a quotation and click the 'Send by Email' button. 5. In the wizard, click the three dots between the attachment and AI logo in the footer. 6. Observe the templates list. **Issue:** - The template created for the admin user appears for the demo user as well. **Cause:** https://github.com/odoo/odoo/blob/07626050bd0104fecd8799b56d30245d00da3f27/addons/mail/static/src/core/web/mail_composer_template_selector.js#L31-L44 - The domain used to fetch templates was incorrectly filtering for templates assigned to any user (instead of filtering for templates assigned to the current user or not assigned at all). **Solution:** - Corrected the domain to include only templates assigned to the current user and not assigned to anyone. opw-4901492 Forward-Port-Of: odoo/odoo#222073 Forward-Port-Of: odoo/odoo#217641
The leave statistics view has been adjusted so information no longer overlaps in the interface. This makes absence and time-off figures easier for HR teams and employees to read and use.
Original PR description
This commit addresses an overlapping styling issue in the leave stats task-4945729 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221099
The barcode app now opens the scrap flow correctly for completed manufacturing orders even when there are no by-products. This prevents users from hitting an error screen and keeps warehouse production cleanup tasks moving smoothly.
Original PR description
Issue ----- Trying to scrap a production through the barcode app gives the user a traceback. Steps to reproduce ----- - Have a done MO - Go to barcode and try to scrap it --> Traceback Cause ----- When preparing the context for the scrap window, we try to map the MO's byProducts. When there is no byProduct, we end up trying to apply a mapping on "nothing". ----- Ticket: opw-4792599 Forward-Port-Of: odoo/enterprise#92925 Forward-Port-Of: odoo/enterprise#90623
The employee form warning shown when wages fall below the legal minimum can no longer be edited. This avoids confusion and helps prevent accidental changes while keeping the warning informational.
Original PR description
When an employee’s wage falls below the minimum, the warning displayed on the employee form appeared with editable fields. This was misleading and could allow accidental changes. task-5051879
The Documents app now recognizes older redirect records when someone opens a shared document content link. This preserves access to existing links and avoids broken document downloads or previews after link changes.
Original PR description
We do not currently check for `documents.redirect` records when accessing the `/documents/content/<access_token>` endpoint. This commit fixes this by redirecting if a `document.redirect` with the appropriate `access_token` was created for backwards compatibility. opw-4517698 Forward-Port-Of: odoo/enterprise#92342 Forward-Port-Of: odoo/enterprise#92313
The duplicate transaction search now works even when users leave the Starting Date blank. Instead of showing an error, the system uses today’s date so accounting teams can continue their bank review without interruption.
Original PR description
Currently, an error occurs when attempting to find duplicate transactions in the bank. Steps to Reproduce: - Install the `Accountant` module. - In the `Accounting` Dashboard, click on `Bank`. - In…
Currently, an error occurs when attempting to find duplicate transactions in the bank.
Steps to Reproduce:
- Install the `Accountant` module.
- In the `Accounting` Dashboard, click on `Bank`.
- In Actions, click `Find Duplicate Transactions`.
- Clear the `Starting Date` and click save.
Traceback:
```py
psycopg2.errors.UndefinedFunction: operator does not exist: date >= boolean
LINE 6: AND move.date >= false
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
```
This error occurs when the system attempts to detect duplicate transactions without a `Starting Date`. During the check, it evaluates the condition `move.date >= date_from`. Since `date_from` is False, the comparison triggers an error.
This commit ensures that if the `Starting Date` is empty when finding duplicate transactions, it uses today’s date as the `Starting Date`.
Reference commit: https://github.com/odoo/enterprise/pull/87000/commits/806ab2d56952e9d0f597cf1ab36ea2f180a84323
Forward-Port-Of: odoo/enterprise#92497