Wednesday, November 5, 2025
17 changes · 19.0
Enhancements to existing features
This change updates variable names in the expense posting wizard so it is clearer when operations are running with elevated access rights. It does not change visible user behavior, but it helps reduce the risk of future mistakes that could affect data handling or permissions.
Original PR description
Rename variables that are not sudo-explicit to reduce future potential security oversights
The Windows IoT Box installer has been updated so new installations follow Odoo 19.0 by default. This helps keep newly installed devices aligned with the current release without extra manual setup.
Original PR description
Windows IoT Boxes are now following 19.0 by default after install.
When POS categories are synced to Atlas, their parent category is now included as part of the transfer. This helps preserve the category structure more accurately across systems, so menu organization stays consistent.
Original PR description
In this commit: --- - The parent category of a POS category is now included during synchronization with the Atlas platform. - Added `parent_ref_id` in the category payload to maintain hierarchy. Note: The UrbanPiper platform only supports a single level of sub-categories. Extra: Added exception for `requests.exceptions.JSONDecodeError`. task-5169337 Forward-Port-Of: odoo/enterprise#97213
Resolved issues and error corrections
This change adds a check to make sure menu entries still exist before the system tries to use them. It prevents upgrade and maintenance failures in HR-related apps when menus have been removed, improving reliability for affected databases.
Original PR description
To Reproduce: 1) make a database in 16.0 and go to developer mode. 2) Delete the menus 3) I mocked the views with upgrade mockcrawler. it failed for these xmlids: ``` hr_attendance.menu_hr_attendance_attendances_overview hr_timesheet.timesheet_menu_activity_use hr.menu_hr_employee ``` but we should have a check anyways. 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#230135 Forward-Port-Of: odoo/odoo#215426
Code cleanup and technical improvements
This change removes a recently added filter that tried to detect and block bots from crawling tag pages. The filter was not reliable, and keeping it in place could still allow unwanted indexing while making maintenance harder, so it has been rolled back until a better solution is found.
Original PR description
This reverts [1] because the is_a_bot check is not reliable. Many crawlers spoof user agents or ignore robots rules, so they still index every tag combination and overload tag clouds. We revert while we look for a better protection. [1]: 4b1c3bfa83af2b1851db62df5aca4d5777a3d88c Forward-Port-Of: odoo/odoo#234278
A quality form view was moved to the module that actually depends on the required manufacturing work order features. This fixes module loading issues and helps ensure the view is available in the right place without causing installation or upgrade problems.
Original PR description
view `quality_point_routing_view_form_inherit_quality_mrp` was supposed to be in the module `quality_mrp_workorder` as it has `quality` and `mrp_workorder` as dependency.
The warehouse duplication test now checks whether a purchasing-related field exists before using it. This prevents the test from failing in setups where the purchasing module is not installed, making the test more reliable across different environments.
Original PR description
The test `test_duplicating_warehouses_recreates_their_routes_and_operation_types` was failing with:
AttributeError: 'stock.warehouse' object has no attribute 'buy_to_resupply'
A recent change added to the test :
wh_original.buy_to_resupply = False
However, `buy_to_resupply` is defined in `purchase_stock`. When this module is not installed, the field is absent and the test crashes.
Fix:
Only assign the field if it exists on stock.warehouse.
[RB-232580](https://runbot.odoo.com/odoo/error/232580)
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prWhen customers booked a table from the website, the phone number field could stay empty. This update correctly copies the phone number from the related contact so staff can reach the customer more reliably.
Original PR description
Task: [#5005216](https://www.odoo.com/odoo/project/1737/tasks/5005216) --- The phone number field was not being populated correctly when booking a table from the website. It is now properly filled using the phone number of the `res.partner` associated with the appointment. The field remains unlinked to the partner, as it is just a copy. Forward-Port-Of: odoo/enterprise#92836
In dark mode, the account reports info popover now uses a lighter text color so the formula is readable. This improves usability for users who view reports in dark mode, especially when checking details in debug mode.
Original PR description
When using the dark mode, the popover available only in debug mode on the account reports (when pressing the info button on the right of each line) used to display the formula with a dark color, making it hard to read.
This update fixes an automated rental test so it can run in environments that do not include demo data. It removes the test’s dependency on accounting and stock settings that were not always available, preventing false failures during validation.
Original PR description
The test was failing in no-demo environments because it relied on accounting and stock configurations that were not present. When the test attempted to set property_valuation = 'real_time' on the product category, it triggered a ValidationError because the related stock accounts had not been properly set up for the test's transaction context. runbot-error-230417 Forward-Port-Of: odoo/enterprise#98155 Forward-Port-Of: odoo/enterprise#92292
This change fixes a problem where Gmail and Outlook could show the wrong error message when both features were installed. It also ensures users without an enterprise subscription see a generic message instead of triggering an unnecessary external service check.
Original PR description
Bug === When both module are installed, one overwrite the error messages of the other, because the methods have the same name. For database without enterprise, they won't have a subscription. We don't want to try reaching IAP in that case, and so we show a generic error message. For simplicity, we didn't make a bridge module just for that error, and we just check the version. Task-5113992
This update makes the product image removal checks more reliable in the website shop. It adds a short wait so the system finishes saving before the test verifies the result, which prevents occasional false failures.
Original PR description
Versions -------- 18.0+ Issue ----- The `test_website_sale_add_and_remove_main_product_image_no_variant` and `test_website_sale_remove_main_product_image_with_variant` tours fail because the main…
Versions -------- 18.0+ Issue ----- The `test_website_sale_add_and_remove_main_product_image_no_variant` and `test_website_sale_remove_main_product_image_with_variant` tours fail because the main product image is not removed as expected after the tour completes. Cause ----- Both tours assume that once the product `<img>` element is removed from the DOM, the action is fully completed. The tour then ends, and the remaining Python code verifies the result. However, this assumption can lead to issues. If the save request takes longer than expected, the Python code may execute prematurely and fail. Solution -------- Add a step at the end of both tours to wait for the `<img>` element to be fully saved and updated in the preview DOM. Additionally, during debugging, it was observed that using an alias URL (i.e., a redirect) to an `ir.attachment` could introduce further issues or slow down the test due to the server fetching the image with a remote call. To address this, this commit replaces the alias URL with a simple binary attachment. opw-5159593 runbot-163025 runbot-163615 Forward-Port-Of: odoo/odoo#234150 Forward-Port-Of: odoo/odoo#233978
The receipt printer test now once again sends a confirmation event after printing the status page. This means users will see the expected “Test page printed” notification, making it clear that the test completed successfully.
Original PR description
**Steps to reproduce:** 1. Connect a receipt printer to an IoT box, and pair the IoT box with Odoo. 2. In the device form for the receipt printer, click the 'Test' button. **Expected behaviour:** - Status receipt is printed and a 'Test page printed' notification is shown on the screen. **Actual behaviour:** - Status receipt is printed but no notification is shown on the screen. In odoo/odoo#229731, a QR code was added to the test status receipt printer action. This was achieved by directly sending commands to the printer with the `escpos` library, bypassing the `print_raw` method. However, by bypassing the `print_raw` method it also bypassed the status events that are normally sent to inform the Odoo user of the outcome of the print. This commit adds back these events to the receipt test print action. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix restores consistent behavior in website test utilities by always adding plugins through the helper functions. It helps keep automated website tests reliable after a previous change had partially undone this behavior.
Original PR description
This commit is repeating caafc9a8e356a8693d9c4a20fa29e6ace8359a39, but after the merge of 179480d996a19dff4d56265a610259b1c6e33f99 that undid parts of it task-5176469
This change corrects a validation issue in Odoo’s testing tools when a method’s parameter and return types are specified both in the documentation and in the code. It prevents the checker from failing on matching types, making automated quality checks more reliable.
Original PR description
This commit fixes a bug in `TestDocstring` when a method has type hint specified both in the docstring and as a type hint.
Example:
```
def example(a: list[int]) -> int:
"""
:param list[int] a: a list
:rtype: int
"""
return len(a)
```
the `_test_docstring_params` method will break twice:
- the `rtype` check raises `AssertionError: <class 'int'> != 'int'`
- the `type` check raises `AssertionError: list[int] != 'list[int]'`
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis change fixes an issue where the date picker could reopen after a user selected a date. It improves the experience when entering dates on forms such as customer invoices, especially when the system takes a moment to save the change.
Original PR description
Before this commit, the date picker would reopen after selecting a value. This was caused by `activeInput` being reset after the close, which took time when the `onChange` RPC was slow. As a result, `useEffect` was triggered before `activeInput` had been reset, causing the picker to reopen. To fix this, we've reduced the number of `useEffect` calls. It will no longer be triggered when the input value changes. Steps to reproduce: - Open Customer Invoice - Set the invoice date => the picker will stay instead of being closed. Note that this is a date field with an onChange 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
The edit icon for favorite filters no longer flickers when you hover over it. This makes the search filter menu feel smoother and more stable for users.
Original PR description
This PR fixes an issue related to the edit favourite filter icon. Prior to this PR, the edit favourite filter icon used `d-none` by default and `display: block` on hover. Since `display: none` removes the element from the layout, the parent popover resized on hover, causing a flickering effect. This did not occur for filters with short labels (which had enough room for the icon) or for long labels (where the label was truncated). To prevent the flickering, the icon now uses `visibility: hidden/visible`, which keeps its space in the layout and avoids layout shifts. https://github.com/user-attachments/assets/5308c11e-8706-403c-80e3-fc05ab37a61d task-5237493 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234383