Daily updates from Odoo
Wednesday, July 9, 2025
29 changes · master
Enhancements to existing features
The IoT app device list now shows each device's connection status. This makes it easier for users to quickly identify whether devices are online or need attention without opening each device record.
Original PR description
This PR adds the connection status to the device list view in the iot app Forward-Port-Of: odoo/enterprise#89632
A Web Studio automated test was adjusted to match recent changes in the available editor options. This helps keep quality checks stable and reduces the chance of false test failures after similar updates.
Original PR description
In https://github.com/odoo/odoo/pull/216638, the lists of operators available for selection in the tree editor have been changed for several field types. Here we adapt a studio test to that change and make it less likely to fail if similar changes would be brought. Task ID: 4894524
IoT devices are now shown with a cleaner name format in places that support formatted display, such as POS configuration dropdowns. This makes it easier for users to identify the device, its connection, and its IoT box at a glance.
Original PR description
Before this commit, IoT device names would dislplay in the format '[iotbox] Device Name'. After this commit, in environments with formatting enabled (such as the device dropdown when configuring in POS), we show the name with the following format: Device Name Connection IoT box Where Connection and IoT box are using muted text. task-4922608  Forward-Port-Of: odoo/enterprise#89703 Forward-Port-Of: odoo/enterprise#89664
Resolved issues and error corrections
This update prevents translation-related errors that could occur when sharing referral links or working with loan records. The change improves reliability by adjusting how translated text is prepared, without changing user-facing features.
Original PR description
Issue: Prior to this commit, a translation issue occurred due to the use of a list comprehension. The _get_translation_source function attempts to scan the local variables, but in the context of a list comprehension, only variables defined within the comprehension are accessible. As a result, variables like uuid and cursor were not available to the _get_lang function, ultimately leading to an error. Fix: Replaced the list comprehension with a standard for loop to ensure proper access to local variables. runbot-98198 Forward-Port-Of: odoo/enterprise#88632
The intercompany rules settings now use clearer wording for the option related to creating invoices. This reduces confusion for users configuring automated transactions between companies.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/4b57698670a7762bb206ccb24417d63c8edc1a46 change the ux of the intercompany rules, but the naming is confusing for users. task-4907810 Forward-Port-Of: odoo/enterprise#89368
The Time Off Type configuration form now displays localization and payroll-related options in a more consistent two-column layout. This makes the setup screen easier to scan and use, with the Payroll section placed more logically below Negative Cap settings.
Original PR description
* = l10n_in_hr_holidays, l10n_ae_hr_payroll, l10n_be_hr_payroll Steps: - Navigate to Time Off > Configuration > Time Off Types. - Open any time off type form with localization or payroll-related options. Issues: - Configuration fields (including localization modules) appeared misaligned. - The Payroll section was not utilizing space effectively in the layout. Fix: - Aligned all configuration fields in a consistent two-column layout, including localization and payroll-related options., - Repositioned the Payroll section below the Negative Cap section. Task - 4759116
This fix adjusts the payroll expense test setup so it no longer uses a default account that could cause duplicate accounting entries to be selected. It helps keep payroll expense reconciliation checks reliable after recent accounting logic changes.
Original PR description
This commit removes the default account set in the setup of test_payroll_expense. Because of 67b5fc47ca4aa1abb60f198a87d7784ef400f796 the filter in get_all_amls_to_be_reconciled would get multiples amls instead of only one. community pr: https://github.com/odoo/odoo/pull/211443 opw-4751270 Forward-Port-Of: odoo/enterprise#88862 Forward-Port-Of: odoo/enterprise#86987
The update prevents an error when users run automatic reconciliation models without any bank statement lines available. Instead of failing with a database error, the process now exits cleanly, improving reliability for accounting workflows.
Original PR description
SQL syntax error occurs when trying to auto reconcile transactions via reconcile models,it is because there are no statement lines to reconcile. **Steps to reproduce:** * Install `accountant` module (No demo data needed) * Accounting Dashboard> Bank dropdown menu * Under reconciliation>Models>Internal Transfers>Run Now `syntax error at or near ')' LINE 57: WHERE st_line.id IN ()` **Solution:** * Return the function if there are no statement to reconcile. **Sentry-6610155279** Forward-Port-Of: odoo/enterprise#85937
This fix prevents an error when assigning scanner devices during Point of Sale IoT configuration. Businesses can complete scanner setup more reliably without manual troubleshooting.
Original PR description
The error occurs because `append()` is used on the Many2many field `iface_scanner_ids` in `pos_config`, which is not allowed. Traceback: `AttributeError: 'iot.device' object has no attribute 'append'` Many2many fields should be updated using `|=` to add records, as the Python list method `append` is not supported for relational fields. [1]- https://github.com/odoo/enterprise/blob/5bff585cfa24940626b14cdeaeae07b50a931e94/pos_iot/wizard/auto_config_pos_iot.py#L55 sentry-6719710908 Forward-Port-Of: odoo/enterprise#89123
Opening the filters panel while editing the subscription dashboard no longer causes an error. The fix ensures filter suggestions only use filters relevant to the current dashboard data, improving stability for users managing spreadsheet dashboards.
Original PR description
Steps to reproduce: 1. Edit the subscription dashboard 2. Open the filters side panel => Boom This is caused by the fact that the suggestions store was trying to match filters that are not matching the current model. Task: 4911733 Forward-Port-Of: odoo/enterprise#89606
The update corrects test reference files so they now verify XML namespace details for payment and electronic invoicing formats. This helps catch formatting issues earlier and improves confidence that country-specific electronic documents remain compliant.
Original PR description
Before, we weren't asserting XML namespaces when calling `assertXmlTreeEqual`. As a result, many expected XMLs in EDI tests had incorrect namespaces. Now that we change the test method to check namespaces, we also need to fix the expected XMLs. Community PR: https://github.com/odoo/odoo/pull/214764 task-none Forward-Port-Of: odoo/enterprise#89476 Forward-Port-Of: odoo/enterprise#87950
This fix ensures the Indian GSTR-1 report JSON always includes the expected document issue field, even when there are no entries. It prevents automated validation failures and helps keep tax report generation reliable.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705 Forward-Port-Of: odoo/enterprise#89711 Forward-Port-Of: odoo/enterprise#89635
The VoIP softphone now uses a minus icon instead of an X for hiding the call window. This makes users less likely to worry that clicking the control will end their call, improving confidence during active calls.
Original PR description
The "cross icon" (X) is believed to be too "scary"; people don't dare to click it in the middle of a call out of fear of hanging up, even though the softphone window might be in their way. The "minus icon" (-) might deceive one's expectations by hiding the window rather than minimizing it, but we decided that it was still better this way. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89555
CSV imports for bank statement lines now preserve the statement reference already present in the imported file instead of creating a new bank statement every time. This prevents duplicated or incorrect bank statements when teams export and re-import reconciliation data.
Original PR description
…id during import In the override of execute_import of account_bank_statement_import_csv.py a new account.bank.statement was always created even if the import contained statement_id. Steps to reproduce: - Export an account.bank.statement.line in bank rec with the statement_id included. - Import it back. The statement_id of the imported lines is a new one. opw-4753864 Forward-Port-Of: odoo/enterprise#87885 Forward-Port-Of: odoo/enterprise#87165
The Signed Contract button on salary offers now opens the correct employee contract version after all signatures are complete. This prevents confusion for HR users and ensures they review the right signed employee information.
Original PR description
- Fixed an issue where clicking the "Signed Contract" smartbutton after full signature opened an incorrect employee version. Task-4873800 Forward-Port-Of: odoo/enterprise#89051
This fix makes an internal quality check correctly detect missing database indexes in all test environments, preventing issues from being missed before release. It also adds the missing indexes found by the corrected check across accounting, ESG, payroll localization, and point-of-sale areas, improving consistency and reducing future performance risk.
Original PR description
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria…
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria used to ignore the field for indexing was if it belongs to a `test` model in some test module. The best-effort heuristic used for this is to see if there is some `ir.model. data` associated with the model in question and if all module's names associated with these data entries have `test`, then we can ignore the field for indexing. But due to the semantics of `all` for empty collections: ```py assert all([]) is True ``` models that had *no* `ir.model.data` associated at all, e.g. install `--without-demo` and no master data, the field would be ignored for indexing, leading to a passing test. But on nightly, where the CI is run with demo data also, the field isn't ignored anymore and is caught by the test's assertion for indexing suggestion as expected. This leads to errors that are never addressed by the developer that added the fields in question. This commits corrects the test and add the missing indexes that were raised from the CI's false-positive that were missed. Reference --------- runbot-227546 Forward-Port-Of: odoo/enterprise#89732 Forward-Port-Of: odoo/enterprise#88998
This fixes an error that could block Uruguay electronic invoice XML generation when a user manually removed a journal item description. The system now safely handles empty descriptions, helping invoices continue to be processed and sent to DGI.
Original PR description
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description…
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description automatically populates with the product name upon line creation. However, users can intentionally clear this field. If the description field becomes empty, its value is interpreted as `False`. This leads to an `AttributeError: 'bool' object has no attribute 'replace'` traceback when the `_l10n_uy_edi_get_line_nom_and_desc` method attempts to process this boolean value, as it expects a string. This issue specifically affects the generation of the "DscItem" tag in the XML file sent to DGI. ### Solution: To prevent this error, an additional validation has been implemented for the line description. This validation ensures that if the field's value is `False`, it is not processed by the `_l10n_uy_edi_get_line_nom_and_desc` method, thus avoiding the traceback. Forward-Port-Of: odoo/enterprise#89407
Fixed an issue where purchase order discount lines could create an extra budget report entry with the discount counted twice. Budget views now reflect invoiced purchase lines more accurately, helping teams avoid overstated budget impacts.
Original PR description
Steps to reproduce: - Create a new Budget with budget line having Project [TEST] - Create a purchase order with 2 lines: 1. Product A, analytic [TEST], price unit 100, qty 1 2. Product B, analytic [TEST], price unit -10, qty 1 - Confirm the PO, mark products as received - Create the bill and confirm - Go back in PO, click on Budget smart button, open list view Issue: The budget report will correctly show a line for each invoiced line, but an extra line with double discount amount is present Occurs because we use a SQL code to replicate the qty_invoiced field of a purchase order line, but we adjust the sign based on the aml balance instead of taking into account the move type opw-4775631 Forward-Port-Of: odoo/enterprise#89545
This fixes an internal issue in cash basis accounting reports where report filters could fail because the filtering rules were being modified incorrectly. The change helps reports run reliably and avoids runbot errors without changing business workflows.
Original PR description
Domains are immutable, append replaced by the and operator. runbot error 229710
VoIP now removes parentheses when cleaning phone numbers, so numbers copied or entered with common formatting are processed more reliably. This helps avoid call issues caused by formatted phone numbers such as those containing brackets.
Original PR description
Add parentheses to the list of characters that are stripped from phone numbers. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89625 Forward-Port-Of: odoo/enterprise#89551
Code cleanup and technical improvements
This update reorganizes shared tour-testing utilities so they are easier to split into separate loading bundles later. It should not change day-to-day user behavior, but it supports future performance improvements by loading automatic tour code only when needed.
Original PR description
In this commit, we move step_utils to the root of web_tour/static/src. The goal is to move all the files that are in tour_service into web_tour/static/src and then split it into tour_automatic and tour_interactif in order to create 2 separate bundles and be able to lazy load what tour_automatic needs only when we launch an automatic tour.
This update reorganizes how Frontdesk page content is handled so formatting is applied closer to where the content originates. It should not change the visitor experience, but it makes the Frontdesk code easier to maintain and less prone to future display issues.
Original PR description
markup should be used as close as possible to the data source.
The barcode-related screens were updated to use safer, cleaner ways of building interface text and layout. This reduces internal security warning noise and helps keep warehouse barcode features easier to maintain without changing day-to-day user workflows.
Original PR description
Use markup template and html functions to make the code cleaner and safer while no longer triggering ci/security flag.
The social app’s post formatting code was reorganized to use safer, more consistent markup handling. This reduces internal security warning noise and helps protect how social content is displayed without changing the user experience.
Original PR description
Use markup template and html functions to make the code cleaner and safer while no longer triggering ci/security flag. Also markup should be used as close as possible to the data source. https://github.com/odoo/odoo/pull/216159
The VoIP keypad code was updated to use safer, cleaner markup handling. This reduces internal security scan noise and helps maintain the feature without changing how users interact with it.
Original PR description
Use markup template and html functions to make the code cleaner and safer while no longer triggering ci/security flag.
This update cleans up the live chat helpdesk code by reducing duplicated logic and removing unused pieces. It should make the feature easier to maintain without changing how users interact with live chat.
Original PR description
Comments applied from the previous PR. 1. Reduce duplicate code in im_livechat; 2. Remove unused code in im_livechat; follow up of https://github.com/odoo/enterprise/pull/89573 Forward-Port-Of: odoo/enterprise#89648
The website sale test suite was updated as part of an internal modernization of comparison and wishlist behavior. This helps keep these shop features aligned with newer frontend technology while preserving expected customer journeys.
Original PR description
task-4873403 Community PR: https://github.com/odoo/odoo/pull/214349 Upgrade PR: https://github.com/odoo/upgrade/pull/7975
This update simplifies how some Odoo web requests access system context behind the scenes. It helps keep the platform codebase cleaner and easier to maintain, with no expected change to day-to-day user workflows.
Original PR description
odoo/odoo#217761
Miscellaneous changes
- Create a sub company from the main company. - On only the sub-company create a new followup level. - While being in both the main company and the sub-company at the same time, try to access the newly created followup level in the followup report view. The following traceback appears: File "/home/odoo/src/odoo/addons/web/models/models.py", line 128, in web_read vals = many2one_data[values[field_name]] KeyError: 9 This commit hide the statusbar for the child company if there is followu
Original PR description
- Create a sub company from the main company. - On only the sub-company create a new followup level. - While being in both the main company and the sub-company at the same time, try to access the newly created followup level in the followup report view. The following traceback appears: File "/home/odoo/src/odoo/addons/web/models/models.py", line 128, in web_read vals = many2one_data[values[field_name]] KeyError: 9 This commit hide the statusbar for the child company if there is followup level in the parent as per the specification of https://github.com/odoo/enterprise/commit/bbcd54519706539d7e2e313118c956200ea70c91 and the implementation of https://github.com/odoo/enterprise/commit/f82ef250560957046be0590f8c2a08039bcc34ca#diff-c502b098cfa2c57bc70c144ae4f0e1fbe1c0116f392ed1a63743f12a51b82084 opw-4669397 Forward-Port-Of: odoo/enterprise#85977 Forward-Port-Of: odoo/enterprise#82324