Thursday, July 24, 2025
22 changes · saas-18.3
Enhancements to existing features
Website searches now avoid an unnecessary extra database check when the initial result set already provides the needed count. This reduces backend work 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
Updates how key security-related Python packages are installed for the IoT box image so they stay compatible with other system-managed packages. It also adds libraries needed for future WebRTC support, helping prepare the platform for upcoming communication features.
Original PR description
This commit contains two changes: - Install `cryptography` and `pyopenssl` using `apt` instead of `pip` - This means the correct versions are used for compatibility with other `python3-*` apt packages. - Install additional libraries for compatibility with WebRTC (19.0) task-4894918 To be merged after: https://github.com/odoo/odoo/pull/218871 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219273 Forward-Port-Of: odoo/odoo#219225
This update adds automated test coverage for a restaurant point-of-sale flow where an unsent order is handled from a popup. It helps ensure staff can send the order to preparation and complete payment smoothly in one flow.
Original PR description
In this commit: ----------------------------- - Add test to ensure clicking order in the popup sends the order to preparation and validate payment in one flow. Task: 4804669 Related PR - https://github.com/odoo/odoo/pull/211642
Resolved issues and error corrections
This fixes a problem where accounting demo data could fail to load in builds that normally exclude demo data. It helps keep automated testing and setup flows reliable without changing business features.
Original PR description
This issue was introduced with [211765](https://github.com/odoo/odoo/pull/211765), which is a FW port of [200420](https://github.com/odoo/odoo/pull/200420). In saas-18.2 no demo build, tests that are using `_install_demo` are failing because `ignore_duplicates=True` is preventing to load demo data correctly. As this change is not forward-ported in saas-18.3+ and was meant to fix demo data while upgrading from 16 to 17, it's probably better to revert it back for saas-18.2. Runbot - [224203](https://runbot.odoo.com/odoo/error/224203) Forward-Port-Of: odoo/odoo#220126
This update gives the automated test user the access needed to see unit of measure information during purchasing stock checks. It prevents a test failure and helps keep reordering rule validation reliable, with no expected impact on day-to-day users.
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
Restaurant point of sale refunds now skip the unnecessary confirmation dialog for sending orders to the preparation display. This keeps refund validation faster and avoids interrupting staff with a prompt that does not apply to refunds.
Original PR description
Before this commit: ---------------------- - The Send Order to Preparation Display confirmation dialog also appeared when validating a refund, which was not necessary and interrupted the expected flow. After this commit: ------------------------ - No dialog shown for refunds. Task-4804669 Related PR - https://github.com/odoo/enterprise/pull/86413
Mass email notifications now show the rendered email subject instead of an unresolved template placeholder in the chatter. This makes sent-mail records clearer for users and also includes a temporary fix to reduce duplicate signatures.
Original PR description
This commit fixes an issue with the notifications sent when the user sends en masse emails with a template. The issue is that the notification logged in the chatter uses the created mailing's display_name, which is computed on the subject of the mailing. This subject is set to a value that is an unrendered inline template. To fix this, the value of the mailing_name in the body of the message is set to the rendered subject if there is a template linked to the composer. The subjects are rendered based on the list of res_ids notified. task-4813503 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change reverses a previous update to an automated test for creating project-related sales order lines. It helps restore test stability in the sales and project workflow, reducing the chance of blocked releases due to test failures.
Original PR description
This reverts commit bde64f4dd19d30f807142fea6f04409de0696c54. runbot-error-226711 Forward-Port-Of: odoo/odoo#216542
A Point of Sale automated test now waits for demo data to finish loading before continuing. This prevents false test failures when larger product demo datasets are involved, improving release validation reliability without changing customer-facing behavior.
Original PR description
The crash occurs due to the test case introduced in PR #219103 because the demo data was not fully loaded before proceeding with the next operations. Since demo data is not loaded by default on saas-18.3, which attempts to load a larger number of product records. This commit uses `expectUnloadPage=true` to ensure the page waits until the demo data is completely loaded completely loaded in the tour. Runbot-229922
This fixes an issue where Cloudflare Turnstile data could be saved into sales order notes when customers completed the extra checkout step. The checkout now treats that step consistently with existing CAPTCHA exclusions, keeping order notes clean and readable.
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 fix adjusts an internal point-of-sale loyalty test so it can be safely retried when it fails intermittently. It helps keep automated checks stable and avoids misleading failures during development and release validation.
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
This fixes point of sale test data so it no longer relies on fields that only exist in the Enterprise edition. It helps ensure automated tests can run reliably in environments where Enterprise modules are not installed.
Original PR description
Remove fields that are declared in enterprise from the Hoot tests in point of sale. This is to ensure that the tests can be run without the enterprise module being installed.
This fix ensures configuration updates on hardware drivers are written safely when multiple processes run at the same time. It prevents one process from accidentally overwriting another recent change, improving reliability during operations such as updates or checkouts.
Original PR description
In the following scenario, changes to the odoo.conf file could be lost: 1. A long-running process enters a `writable()` block (e.g. git checkout) 2. While it is still running, another process wants…
In the following scenario, changes to the odoo.conf file could be lost: 1. A long-running process enters a `writable()` block (e.g. git checkout) 2. While it is still running, another process wants to update the conf file but gets blocked waiting for `writable()`. However it has already loaded the entire `odoo.conf` file into memory ready to write it back. 3. The first long running process now makes a change to the `odoo.conf` file. In the case of the checkout process, it is changing the `server_wide_modules` key. 4. The first process finishes and releases the `writable()` lock. 5. The second process now writes to the conf file, however it is using the now-stale version it held in memory from step 2. 6. The original changes to the conf file are lost. The fundamental issue is that the `update_conf` function is loading the conf file into memory too early. To fix this, we aquire the `writable()` lock first, and then we can load the conf file knowing that it won't change until we are done. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220073 Forward-Port-Of: odoo/odoo#219928
Saving a blog post after all content has been removed now shows a proper validation message instead of causing a server error. This helps website editors recover from an empty-content mistake without disrupting the system.
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
This fixes an issue where Odoo could show an unexpected error while recording that a new company image failed to download. The original image download failure is now logged correctly, avoiding an extra traceback and improving reliability for users creating company records through the mail plugin.
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 fixes an issue in the Vietnam localization where VietQR payment generation could fail if the company address had a state such as Hanoi or Hai Phong but no city. Businesses can now create VietQR codes in these cases without unnecessary address errors.
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
Brazilian point-of-sale orders with a total cost of zero now include the required payment information when sent to Avalara. This prevents invoice submission failures caused by missing payment details, improving reliability for free or fully discounted sales.
Original PR description
Right now, for 0 cost POS orders no `paymentMode` section is sent to Avalara, which leads to an error from them when trying to submit the invoice: Code 899: incorrectly entered payment method field The proper fix is to always send `paymentMode` with a value of 0.00 and mode of `Other`. (Note that there is a payment mode that corresponds to no payment, 90, but it only available for NF-e not NFC-e so we use 99) opw-4874094 Forward-Port-Of: odoo/enterprise#90724
This fixes an error that could appear when users or integrations viewed signature requests that were not in the shared state. Those requests now safely show no share link instead of causing a traceback, improving reliability for document-signing workflows and API access.
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
The AI feature now correctly shows the resources banner when no supporting documents are provided. This prevents unnecessary processing and gives users clearer feedback sooner.
Original PR description
Fixed displaying resources banner if no docs provided to stop before running the computation query.
This update moves Point of Sale configuration tests into the Enterprise POS module where the related functionality belongs. It helps keep automated checks aligned with the correct product area, reducing build issues without changing user-facing behavior.
Original PR description
move tests for POS configuration settings from point_of_sale to pos_enterprise refer to this commit :https://github.com/odoo/odoo/pull/215611/commits/0074d743451834424706608fc76f32b0df9c5f1c build_error-227602 Forward-Port-Of: odoo/enterprise#88742
This update fixes an automated test for Mexican point-of-sale invoicing so it no longer fails because of an irrelevant generated identifier. It helps keep validation reliable without changing how users create or process invoices.
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
This fix prevents regular internal users from seeing an access denied message when entering a Colombian company tax ID on a contact. It allows the tax ID check to read the needed DIAN certificate information in the background, improving the contact creation flow without changing user permissions.
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