Thursday, July 24, 2025
23 changes · saas-18.4
Enhancements to existing features
Website search now avoids an unnecessary database count when the number of results is already known. This reduces extra processing and can make website, blog, and forum search pages respond more efficiently without changing what users see.
Original PR description
Issue ----- Currently, we call `model.search()` and `model.search_count()` back-to-back, the second of which is unnecessary if there is no limit on the query. Solution ----- If we have no limit, directly take the length of the previously returned results to avoid an extra query. opw-4882609 Forward-Port-Of: odoo/odoo#220014 Forward-Port-Of: odoo/odoo#218252
The Point of Sale app now has better internal testing tools, making it easier to validate store services, models, and individual screen components before release. This helps improve reliability for future PoS updates, with a small related asset fix in the HTML editor.
Original PR description
Improved test hoots in PoS to test model and service functions. It is now possible to access the `pos_store` via `getService(“pos”)`. This will automatically load mocked data and information on the various models. Components can also be mounted independently of the rest of the application, so that their functions can be tested. For the moment, only `point_of_sale` models are loaded, but the implementation is designed to be patched from other PoS modules. --- A missing asset has been added to the html_editor module. Forward-Port-Of: odoo/odoo#218854
This update adds newly recognized Peppol participant identifier codes used for electronic invoicing, especially for France, the United Arab Emirates, and Latvia. It helps businesses using Odoo stay aligned with the latest Peppol requirements and improves compatibility when exchanging invoices electronically.
Original PR description
Add new relevant codes from the Peppol code list. In particular new codes for FR, AE and LV. Source: https://docs.peppol.eu/edelivery/codelists/v9.2/Peppol%20Code%20Lists%20-%20Participant%20identifier%20schemes%20v9.2.json opw-4932979 Forward-Port-Of: odoo/odoo#219969 Forward-Port-Of: odoo/odoo#218419
This update improves internal testing tools for Point of Sale-related modules, making it easier to validate store data, services, and individual interface components. It helps development teams catch issues earlier across appointment, restaurant, IoT, payment, and delivery integrations without changing day-to-day user workflows.
Original PR description
Improved test hoots in PoS to test model and service functions. It is now possible to access the `pos_store` via `getService(“pos”)`. This will automatically load mocked data and information on the various models. Components can also be mounted independently of the rest of the application, so that their functions can be tested. For the moment, only `point_of_sale` models are loaded, but the implementation is designed to be patched from other PoS modules. Forward-Port-Of: odoo/enterprise#90234
Resolved issues and error corrections
This change updates an internal purchase inventory test so it has the right access to product unit information. It prevents avoidable test failures and helps keep future purchase and replenishment updates reliable.
Original PR description
The `product_uom_id` field was causing test failures in `test_reordering_rule.py` because it was not present in the `product.supplierinfo` form view . This commit adds the group permission `uom.group_uom` to the user who is running the test, to ensure that the `product_uom_id` field is available and preventing the test failure. build_error-111983 Forward-Port-Of: odoo/odoo#218830 Forward-Port-Of: odoo/odoo#206688
Electronic invoice exports now include product barcode information in the standard item identification field, matching what the system already reads during imports. This helps trading partners and integrations receive more complete product data and reduces mismatches between imported and exported e-invoices.
Original PR description
[FIX] account_edi_ubl_cii: export product barcode too Currently we use the `Item/StandardItemIdentification` as the barcode when importing a product. But we do not export the same information. In 18.0+ the `Item/StandardItemIdentification` was added to the UBL XML (for exporting) in commit 72e312815f372de88388c47c612bb5f44b4d8b4e. But there it is only used in `l10n_co_dian`. After this commit we export and fill the tag "by default". task-4941855 Forward-Port-Of: odoo/odoo#219391 Forward-Port-Of: odoo/odoo#218779
This fix stops content history records from being written to directly and avoids copying history data during duplication. This helps prevent errors when records are copied and keeps editor history managed only through the intended process.
Original PR description
This commit prevent direct write to history, also, removes it from copy_data as it would fail anyway when trying to write the history Forward-Port-Of: odoo/odoo#219182 Forward-Port-Of: odoo/odoo#217167
The IoT Box homepage now points to the correct settings page for configuring remote debugging. This restores the ability to set up ngrok-based remote access from the homepage, avoiding a broken setup path for support and troubleshooting.
Original PR description
During the forward port, the URLs for ngrok in the homepage were not changed from `hw_posbox_homepage` to `iot_drivers`, meaning remote debug could not be configured from the IoT box homepage. This commit fixes the URLs. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where Cloudflare Turnstile verification data could be saved into sales order notes when customers completed the optional extra checkout step. The checkout experience remains the same, but internal order notes stay clean and free of unnecessary captcha data.
Original PR description
Scenario:
- enable extra step in website ecommerce
- enable turnstile
- do the checkout process until after "extra step" step
- go check the sale order
Result: there is a big "turnstile_captcha: {1000 character hash}" that is
logged each time the customer filled the "extra step" step.
Cause:
turnstile if enabled is activated for all website_form and will add a
turnstile_captcha parameter.
For other website.form, the captcha is removed from the params when
calling:
request.env['ir.http']._verify_request_recaptcha_token('website_form')
but the custom route /website/form/shop.sale.order doesn't do that so
the captcha is logged in note.
Fix:
Recaptcha is already disabled on the extra_step with the class:
s_website_form_no_recaptcha, so it makes sense to just have the
same behavior for turnstile.
opw-4934132
Forward-Port-Of: odoo/odoo#219558
Forward-Port-Of: odoo/odoo#219269This update fixes inconsistencies in how Spanish taxes are linked to fiscal positions. It helps ensure the correct tax behavior is applied for Spanish localization scenarios, reducing accounting configuration errors.
Original PR description
In this [commit](https://github.com/odoo/odoo/commit/8b539c1f303f1b49916c29190c11dcf2cab57d2c) taxes were mapped with fiscal positions but some taxes had inconsistencies. This PR aims to fix that mapping inconsistencies for ES. TaskID:4951601 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219578
The Contacts test setup now assigns a default country so automated nightly checks run reliably when only the Contacts app is installed. This prevents false test failures and helps keep release validation stable.
Original PR description
**PROBLEM** `test_vat_label_string` fail on nightly test **CAUSE** `self.env.user.company_id.country_id` is empty because: - we don't load demo data by default starting from 18.3 - we installed only one app, so the module that sets the default company country (there must be one since runbot non-nightly tests passed) isn't installed. **FIX** set the country to US in the test, so we have a country to work with. see https://runbot.odoo.com/odoo/error/229770 Forward-Port-Of: odoo/odoo#218351
This fixes an issue where Odoo could show an additional error while recording a failed company image download in the mail plugin. The original download may still fail, but the system now logs it properly without causing a traceback.
Original PR description
When logging a failed image download for a new company,
A traceback will appear.
[1]- https://github.com/odoo/odoo/blob/2317fec604907280aa89c52cfcaeb9adc30e5d04/addons/mail_plugin/controllers/mail_plugin.py#L360
https://github.com/odoo/odoo/blob/2317fec604907280aa89c52cfcaeb9adc30e5d04/addons/mail_plugin/controllers/mail_plugin.py#L342-L344
here, ``new_company_info`` is dictionary, but at [1] the code incorrectly accesses
``name`` as an attribute.
So, it will lead to the below traceback.
Traceback:
```
File "/home/odoo/src/odoo/addons/mail_plugin/controllers/mail_plugin.py", line 359, in _create_company_from_iap
_logger.warning('Download of image for new company %s failed, error %s', new_company_info.name, e)
AttributeError: 'dict' object has no attribute 'name'
```
sentry-6554480256
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#206771This update fixes an internal test issue in the Point of Sale loyalty area so that a promotion tax test can be safely retried without failing for the wrong reason. It helps maintain confidence in automated checks and reduces noise from misleading test failures, with no direct change for end users.
Original PR description
Tests in this file are all sorts of fucked up in ways which break retrying, but this one is problematic because it *also* fails on the reg, with a misleading error as on retrying the `setUp` fails because it tries to update `product_b`, which this test overrode (so the record is rolled back, and trying to update it fails with a `MissingError`). The error is completely unforced as the test just wants to have two products in the DB with different taxes, we don't even need local variables. runbot-226343 Forward-Port-Of: odoo/odoo#220085
Saving a blog post after removing all content now shows a clear validation message instead of triggering a backend error. This helps users understand that the content is empty and prevents noisy system errors during normal editing.
Original PR description
Currently an error occurs when we try to save a blog post with no content. Steps to replicate: - Install the `website_blog` module. - Navigate to the website, go to the Blogs section, and create a…
Currently an error occurs when we try to save a blog post with no content. Steps to replicate: - Install the `website_blog` module. - Navigate to the website, go to the Blogs section, and create a new blog. - Click to open the newly created blog. - Remove any existing content (e.g., placeholder text like 'Start Typing...'). - Type `/column` and click on the 2-column option. - Click on the columns that appear — you’ll see a delete icon. - Delete all the columns, click Save and check the terminal. Error: `ParserError: Document is empty` The error occurs when all content in the blog is deleted, resulting in empty HTML content. During saving, `html.fromstring(lang_value)` [1] is called with `lang_value` being effectively empty, which leads to a `ParserError`. [1] - https://github.com/odoo/odoo/blob/28c3b9cf10488536dce5a4927fdbe8fcd6e5a839/addons/web_editor/models/ir_ui_view.py#L126 This commit fixes the problem by catching the `ParserError` and raising a `ValidationError` when the HTML content is empty. sentry-5081806749 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216790
Vietnam localization can now generate VietQR codes when the city field is empty but a valid state such as Ha Noi or Hai Phong is provided. This prevents unnecessary payment QR errors for businesses using Vietnamese bank details.
Original PR description
* Problem: Using Vietnam localisation, leave city empty and just input state_id as Hà Nội or Hải Phòng, try to use vietqr code -> Raise error missing city * Solution: Just like https://github.com/odoo/odoo/pull/218984 we should check for state too although according to VietQR document, merchant city is not required see (https://vietqr.net/portal-service/download/documents/QR_Format_T&C_v1.0_VN_092021.pdf and search for term 'Merchant City') 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#219873 Forward-Port-Of: odoo/odoo#219566
This fixes missing partner information on journal items created by the withholding tax on payment process. It helps accounting teams keep payment-related tax entries complete and easier to reconcile or audit.
Original PR description
Fixes an issue where the partner is missing from the journal items generated by the withholding tax on payment system. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218268
This fixes a display issue where subscription product prices could appear twice on the shop page. Customers now see a cleaner, more accurate product listing, reducing confusion during browsing.
Original PR description
This PR fixes an issue where the product price was displayed twice on the `/shop` page of a product with a subscription type. task-4954676 Issue: <img width="618" height="271" alt="image" src="https://github.com/user-attachments/assets/e00adabf-ecfb-4424-8c2a-3b7413cbeee3" />
Odoo Sign now safely handles signature requests that are not in the shared state by leaving their sharing link empty. This prevents error messages when users inspect request data or when integrations retrieve signature requests.
Original PR description
### Issue Commit [58425a0](https://github.com/odoo/enterprise/commit/58425a0022c79f2c45f23fdd5a5476d8c20a887e) introduced a new field `share_link` in `sign.request` that gets computed for requests…
### Issue Commit [58425a0](https://github.com/odoo/enterprise/commit/58425a0022c79f2c45f23fdd5a5476d8c20a887e) introduced a new field `share_link` in `sign.request` that gets computed for requests that are in the 'shared' state. However this compute method fails for requests not in the 'shared' state leading to a traceback error. This commit fixes it by setting the default as False for the sign.request records that do not have state='shared' so the traceback error is handled. This can be reproduced in v17 and above by: 1. Open any sign.request record that isn't in the shared state 2. Enable Developer Mode 3. Using the debug icon, click on view record data The traceback will be visible here which mentions that the compute method failed to assign It can also be re-produced by using an xml-rpc / json-rpc ORM call to search_read the sign.request records that does not have state = 'shared' ### Before https://github.com/user-attachments/assets/24c07f2a-2398-44b4-8969-30abb576876a ### After https://github.com/user-attachments/assets/e92b1212-5405-4b98-ba41-c81b2ac547d7 [opw-4864159](https://www.odoo.com/odoo/project/49/tasks/4864159) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#90576
This fix prevents access errors when users open AI-related views that display tools. It matters because non-system users can use the relevant screens without being blocked by unnecessary permission checks.
Original PR description
The changes are proposed because only systems users have read access to the ai.tool model. Runbot error: 182051
This update fixes an automated test for Mexican point-of-sale invoicing so it matches the expected invoice XML structure. It ignores a variable identifier that is not important to the business scenario, helping prevent false build failures.
Original PR description
Fix the test file for pos order then invoice request to match the expected XML structure, by ignoring the `UUID` attribute in the `TimbreFiscalDigital` element because it is not relevant for the test and can cause issues with the test validation. build_error https://runbot.odoo.com/runbot/build/83409879 Forward-Port-Of: odoo/enterprise#88756
Point of Sale users are now prevented from validating a customer deposit with a zero amount. Instead of an error screen, the system displays a clear warning, helping cashiers avoid disruption during checkout.
Original PR description
Steps to reproduce: =================== - From the POS UI, select a customer - Select Deposit Money - Try to deposit `0` amount by clicking Validate button Issue: ====== A traceback is raised when attempting to validate a deposit with zero amount. Cause: ====== The system does not check for zero-amount orders when creating a deposit payment line. Fix: ==== Add a dialog warning when the deposit amount is zero to prevent further processing. Task: 4862811 Forward-Port-Of: odoo/enterprise#90739 Forward-Port-Of: odoo/enterprise#87709
Internal users can now create or update Colombian contacts with a NIT tax ID without seeing an access denied message. The system can perform the required DIAN certificate check in the background, reducing disruption for everyday contact management.
Original PR description
When entering a Colombian Tax ID (NIT), the onchange checks `company.l10n_co_dian_certificate_ids`, which reads `certificate.certificate` records , resulting in an “Access Denied” popup. This changes Wrap the certificate lookup in `company.sudo()` so that the NIT VAT‐onchange can fetch the DIAN certificate records. Steps to Reproduce: 1. Install the l10n_co_dian module and switch to CO company 2. Create a user with only the “Internal User” (base.group_user) group—do not grant Administration/Settings. 3. Log in as that non-admin user. 4. Go to Contacts -> Create. 5. Set Country = Colombia and Identification Type = NIT. 6. Enter any VAT (NIT) number and leave the field. 7. “Access Denied” error for certificate.certificate. opw-4936604 Forward-Port-Of: odoo/enterprise#90176
Sharing a folder shortcut from the breadcrumb menu no longer causes a server error. This keeps document sharing reliable for users working with shortcut folders.
Original PR description
Reproduce: 1/ Create a shortcut of a folder 2/ Select it in the search panel 3/ Opening "Share" via the breadcrumb's cog menu triggers a server error. In d3e6a8df, we incorrectly changed this one2many reference from `[0]` to `.id`. Task-4762955