Thursday, July 24, 2025
22 changes · saas-18.2
Enhancements to existing features
Odoo now recognizes the latest relevant Peppol participant identifier codes, including new entries for France, the United Arab Emirates, and Latvia. This helps businesses exchange electronic invoices with partners in those countries using current compliance lists.
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
The IoT Box now keeps logs for longer, making weekend issues easier to investigate after the fact. Log storage has been expanded and routine messages have been reduced so support teams can more easily find important problems.
Original PR description
This commit contains the following small changes: - Change the number of days of logs kept from 2 to 3. The reason for this is so that if a problem occurs on a Friday evening, it is still available to view on a Monday. - Increase the size of the /var ramdisk to 512M, to ensure it will never be filled even if we end up with 3x100MB log files. - Change various INFO logs to DEBUG, to clean-up the log output to be more useful. - Change werkzeug log level to WARNING, to stop showing every HTTP request as a log. - Add a link to the Nginx logs to the 502 error page. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website search now avoids an unnecessary extra database count when the initial results already show the full answer. This reduces overhead and can make searches in website pages, blogs, and forums respond more efficiently without changing user-facing behavior.
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
This update aligns certified IoT scale validation with recent Toledo scale error checks. It helps keep point-of-sale scale integrations compliant and working reliably after related platform changes.
Original PR description
This PR adapts the scale checksum to the PR adding the error checks to Toledo scales: https://github.com/odoo/odoo/pull/217674 Forward-Port-Of: odoo/enterprise#89751 Forward-Port-Of: odoo/enterprise#89602
Resolved issues and error corrections
Payments using withholding tax now keep the partner information on the related journal items. This helps accounting teams maintain clearer records and improves traceability in payment and tax reporting.
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 fix prevents an extra error from appearing when the system cannot download an image while creating a new company through the mail plugin. The original download issue can now be logged properly without interrupting the process with a misleading technical failure.
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#206771Saving a blog post after removing all content no longer causes a technical server error. Instead, Odoo now detects empty HTML content and shows a proper validation message, improving reliability for website editors.
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 change fixes an internal point-of-sale loyalty test so it can be retried without failing for unrelated setup reasons. It helps keep automated validation stable and reduces misleading failures during release checks.
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 a small wording mismatch in website sales emails by using the lowercase word “order” where the email text expects it. The change helps automated checks pass and keeps customer-facing email copy consistent.
Original PR description
in the email body it is 'order' not 'Order' , check the error in the runbot build error log build_error-223173 Forward-Port-Of: odoo/odoo#219477 Forward-Port-Of: odoo/odoo#219388
Fixed a display issue on ecommerce product pages where the review section toggle could show the wrong open or closed indicator after saving edits. This keeps the storefront editor and customer-facing product page controls consistent, reducing confusion for website managers.
Original PR description
Problem:
When the product review section is uncollapsed in the web editor and the page is saved, the content becomes collapsed again, but the toggle button incorrectly shows the uncollapsed ("-") state.
Cause:
The `collapsed` class is removed from `.o_product_page_reviews_title` when it is editable. On saving, it renders without the `collapsed` class, so the content appears collapsed while the toggle button remains in the incorrect state.
Solution:
Ensure the `collapsed` class is applied to
`.o_product_page_reviews_title` when the widget starts, keeping the button and content in sync.
Steps to reproduce:
- Enable product ratings
- Open the web editor
- Click "+" to uncollapse the review section
- Save -> The content is collapsed but the toggle button still shows "-"
opw-4843145
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#218395This fix improves how category labels are displayed in the Point of Sale interface for Chinese text. Category names now remain readable instead of stacking characters vertically or cutting them off, making navigation clearer for users working in Chinese.
Original PR description
**Issue** Using `max-width: min-content `combined with `d-flex` caused Chinese characters to stack vertically, as each character is treated like a word and with a 2-line height, only first two 2 characters were visible **solution:** Switch to grid layout and remove max-width to ensure label width isn't constrained by its content length. opw-4766145 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 self-ordering page no longer shows categories that only contain special internal products that customers cannot order. This prevents confusing empty categories from appearing in restaurant self-order menus, especially for Belgian fiscal configurations.
Original PR description
Steps to reproduce: - Install the pos_black_box_be module. - Configure a Belgian restaurant and enable self-ordering. - Open the self-ordering page. - The category 'Fiscal category' is displayed even though it does not contain any products. This commit ensures that categories containing only special products (which are not displayed) will no longer appear on the self-ordering page. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Companies in Greece and Ireland with valid VAT numbers now correctly show the Intra-Community Valid checkbox. This fixes a mismatch between country codes and VAT prefixes, helping users identify verified EU VAT registrations more reliably.
Original PR description
Current behavior before PR: - Intra-Community Valid checkbox (for vies verification) was not showing for Greece and Ireland companies with valid VAT number. This was because Greece ISO is GR and Ireland ISO in IX, but their VAT start with EL and IE Desired behavior after PR is merged: - Checkbox is shown despite differences between ISO and beginning of VAT Link to task : - https://www.odoo.com/odoo/project/967/tasks/4575784 Forward-Port-Of: odoo/odoo#201630
This change removes an unnecessary test dependency from the live chat discussion test suite. It helps keep automated validation more focused and reduces the chance of unrelated test setup issues blocking releases.
Original PR description
remove the dependency on `TestPortal` from `test_discuss_full`, as it is not needed. [runbot-226366](https://runbot.odoo.com/odoo/error/226366) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213161
This fixes a display issue in the HTML editor where deleting a checked checklist box could leave the checkmark visible without the box. Users now get a cleaner, less confusing editing experience when modifying checklists.
Original PR description
Problem: After commit 02ae5a645a80e6088a596b6273e70b5476e79e88, pressing backspace on a `li` adds the `oe-nested` class. If that `li` is a checked checkbox item, only the checkbox is removed, but the checkmark remains visible. Solution: Always remove the `o_checked` class when converting the list item to `oe-nested`. **After we backspace on checked item:** Before: <img width="975" height="324" alt="image" src="https://github.com/user-attachments/assets/374bf407-25d7-45fa-a84e-0aef72aa3690" /> After: <img width="972" height="366" alt="image" src="https://github.com/user-attachments/assets/33575d7c-ea1c-432c-b4b6-4ce248e2fc78" /> Steps to reproduce: - Add a checklist - Check an item - Press backspace to remove the checkbox -> The checkmark remains visible, even though the box is gone opw-4953981 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change restores reliable loading of accounting demo data in builds that normally exclude demo data. It prevents related automated tests from failing, improving confidence in release validation for this version.
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)
This update adjusts an internal Point of Sale sales test so it uses the correct test startup flow. It helps keep automated checks reliable and reduces the risk of false failures during release validation.
Original PR description
Replace `start_tour` by `start_pos_tour`. Trying to fix runbot error 230078. opw-4819708 Forward-Port-Of: odoo/odoo#219940
Brazilian point-of-sale orders with no amount due will now still include the required payment information when sent for electronic invoicing. This prevents invoice submission errors from Avalara for free or fully discounted POS orders.
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 fix ensures website and company fields on documents are shown only to internal users when there is more than one website or company to choose from. It avoids exposing unnecessary fields to portal users while keeping the interface clearer for employees.
Original PR description
Fixes the visibility of the `website_id` and `company_id` fields. These fields other than hidden from non internal users, they should be visible to internal users only when multiple websites or multiple companies are available, respectively. Partial revert of: ddf102e5 task-4505668 Forward-Port-Of: odoo/enterprise#90323 Forward-Port-Of: odoo/enterprise#86181
The Partner Commission module can now be installed even if the default Services product category was deleted. This prevents an installation error and lets businesses continue setup without restoring that category first.
Original PR description
Currently, a ParseError is arising when the user installs the `partner_commission` module after deleting the `Services` in Product Categories/Configuration. Steps to reproduce: --- - Install…
Currently, a ParseError is arising when the user installs the `partner_commission` module after deleting the `Services` in Product Categories/Configuration.
Steps to reproduce:
---
- Install `Invoicing` application (without demo data).
- Invoicing > Configuration > Product Categories > Delete `Services`
- Now install `partner_commission` module
Traceback:
---
```py
ValueError: External ID not found in the system: product.product_category_services
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/partner_commission/data/data.xml:3, somewhere inside <record id="product_commission" model="product.product">
<field name="name">Commission</field>
<field name="purchase_ok" eval="True"/>
<field name="categ_id" ref="product.product_category_services"/>
<field name="type">service</field>
</record>
```
The error occurs because the user deleted `Services` in Product Categories, and then tried to install the other module.
This commit resolves the error by providing a False value for the field if the product category is missing.
sentry-6754387015This update adjusts an automated test for Mexican point-of-sale invoicing so it no longer fails because of a variable identifier that is not meaningful to the business flow. It helps keep quality checks reliable without changing customer-facing behavior.
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
The Belgian certified POS setup now shows the correct cash rounding requirement of 0.05 and HALF-UP instead of 0.5. This helps businesses configure compliant cash rounding settings without confusion and ensures the message is available for translation.
Original PR description
The message `"The rounding method must be set to 0.5 and HALF-UP"` was wrong in `pos_blackbox_be/models/pos_config.py`
```py
def _check_cash_rounding(self):
if not self.cash_rounding:
raise ValidationError(_("Cash rounding must be enabled"))
if (
self.rounding_method.rounding != 0.05
or self.rounding_method.rounding_method != "HALF-UP"
):
raise ValidationError(
_("The rounding method must be set to 0.05 and HALF-UP")
)
```
It should be `"The rounding method must be set to 0.05 and HALF-UP"` as indicated in that documentation :
https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/belgium.html?highlight=blackbox#certified-pos-system
It's the same for 18.0
I also added the field for translation into `pos_blackbox_be.pot`
opw-4862967
Forward-Port-Of: odoo/enterprise#89789
Forward-Port-Of: odoo/enterprise#87496