Wednesday, June 24, 2026
26 changes · saas-19.1
Enhancements to existing features
This update changes the unit of measure for the 'Flour' product in the Point of Sale module to kilograms. This adjustment is necessary to properly configure product weighing, particularly for compliance with the l10n_eu_iot_scale certification, ensuring accurate product tracking and reporting.
Original PR description
This small PR sets the "Flour" product's units of measure to kilograms. This helps to configure the weighing of the product, especially for the l10n_eu_iot_scale cert Forward-Port-Of: odoo/odoo#270508
This update ensures that new analytic plans are correctly reflected in the Odoo system after creation. It mirrors a recent change for companies, streamlining the process and preventing data inconsistencies. The change updates views to include new analytic plan fields, enhancing usability.
Original PR description
The views need to include the newly created field on `account.analytic.line` and other models inheriting `analytic.plan.fields.mixin`. This is based on the same service for `res.company`: `reloadCompany` Forward-Port-Of: odoo/odoo#270789
Resolved issues and error corrections
This update fixes an issue where scanning an unknown barcode in the POS system didn't automatically open the product creation form. The fix removes a redundant check for API keys, ensuring the form opens correctly regardless of whether a barcode lookup key is configured. This improves the user experience by streamlining product creation through barcode scanning.
Original PR description
When scanning an unknown barcode in POS, the product creation form was never opened because `barcode_lookup()` was called with no barcode as an implicit API key check. Commit 0c8019a4aa7 ([FIX] product_barcodelookup: avoid crash on invalid image URLs) standardized `barcode_lookup_request()` to always
return a `requests.Response` object, removing the `{'authenticated': True}` dict it previously returned for HTTP 404 responses. As a result the JS check `response?.authenticated` was always falsy and the form never opened.
Fix: remove the API key check entirely. `allowProductCreation()` already gates on the user having product create rights, which is the only condition that matters. If a Barcode Lookup API key is configured the `_onchange_barcode` on the form will auto-fill product data; if not, the user can fill it in manually. Either way the form is always usable.
opw-6295221
Forward-Port-Of: odoo/enterprise#120256This update resolves a problem where Point of Sale order sequences with dynamic prefixes (like years) weren't generating correctly. The fix ensures that sequence numbers are properly formatted as integers, preventing errors during order processing. This improves the reliability of POS order creation.
Original PR description
**Steps to reproduce:** - Create a database in version 19.0 and install Point of Sale. - Create a sequence with a prefix or suffix using placeholders like %(year)s. - Assign this sequence to a POS…
**Steps to reproduce:** - Create a database in version 19.0 and install Point of Sale. - Create a sequence with a prefix or suffix using placeholders like %(year)s. - Assign this sequence to a POS configuration. - Create a new POS order and confirm payment. **Issue:** - POS order `sequence_number` must be an integer, but when using dynamic prefixes/suffixes (e.g., %(year)s), `_next()` returns values like `POS/2026/` while the configured prefix remains `%(year)s`. - Due to this mismatch, [`_update_sequence_number`](https://github.com/odoo/odoo/blob/ab6cfabf0086afced2d035eb2207a0acab655540/addons/point_of_sale/models/pos_order.py#L561) fails to correctly remove the prefix/suffix. - The root cause is that placeholders such as `%(year)s` are not interpolated before applying prefix/suffix removal logic, causing string mismatch and failure in extracting the numeric part.<img width="1920" height="959" alt="image" src="https://github.com/user-attachments/assets/d331fb7a-3c0f-4e34-a33e-6ec906be77bb" /> **Solution:** - Interpolate prefix and suffix before removing them from the generated sequence. - Convert placeholders like %(year)s into actual values (e.g., 2026). - Then apply prefix/suffix removal logic. opw-6150204 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262427
This update fixes an issue where clicking the 'Documents' button on an employee form would open a new browser tab. The change adds a setting to the button's action, ensuring it opens directly within the existing employee form, improving user experience and workflow efficiency.
Original PR description
Issue: ---------------------------------------- When on an employee form, clicking the "Documents" button opens a new page instead of staying on the same. Steps to reproduce: ---------------------------------------- - Install `documents_hr` - Go on an employee form - Click the "Documents" button - It opens a new page Cause: ---------------------------------------- The `'ir.actions.act_url'` opens a new page by default. Solution: ---------------------------------------- Add `'target': 'self',` to make it open the URL in the same page. opw-6284677 Forward-Port-Of: odoo/enterprise#120285
This update resolves a problem in the SendCloud test suite caused by recent changes to the SendCloud integration. The tests were failing because they continued to use an outdated method for accessing the SendCloud API. This change ensures the tests accurately reflect the current SendCloud implementation.
Original PR description
Issue Before This Commit: ---------------------------- The delivery_sendcloud test suite relied on `delivery.carrier._get_sendcloud()` to access the SendCloud API helper. After recent changes in the SendCloud integration, this method is no longer available, causing multiple tests to fail when invoking SendCloud services during setup and execution. Cause of the issue: ------------------- After PR odoo/enterprise#96749, the SendCloud integration was refactored to require usage through a context manager. As part of this change, _get_sendcloud() was removed, but the existing test cases were still relying on it, causing failures. After this commit: ------------------ All SendCloud-related test cases are updated to explicitly instantiate the SendCloud client and use it within a context manager, mirroring the new lifecycle requirements introduced by the refactor. This aligns the test suite with the current SendCloud implementation and fixes the failing tests.
This update removes an outdated method for retrieving system parameters in the l10n_fr_pdp module. The change utilizes a more reliable approach (get_str) for parameter retrieval, enhancing the module's stability and performance. This is a routine maintenance fix.
Original PR description
This commit will remove the use of the get_param for system parameter and instead use get_str no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where self-invoicing URLs on receipts were incorrectly formatted. Now, the correct URLs are generated and displayed, ensuring accurate invoicing data is sent to the appropriate systems. This improves the reliability of self-ordering transactions.
Original PR description
Before this commit: ------------------------- - The self-invoicing URL on the receipt was displayed as `undefined/pos/ticket`. After this commit: ------------------------- - The self-invoicing URL is now generated correctly and displayed properly on the receipt. Task-6271261 Forward-Port-Of: odoo/odoo#270052
This update fixes a display issue where rental prices weren't correctly formatted with a slash separating the price and duration. The fix ensures rental prices are shown clearly on the website, improving the user experience for customers renting products. This change was triggered by a bug in how the rental duration label was generated.
Original PR description
Steps to produce: --- - Install the `Rental and eCommerce `modules. - Create a rental product and configure a rental price for it. - Add an optional product from the Sales tab. - Publish the product…
Steps to produce: --- - Install the `Rental and eCommerce `modules. - Create a rental product and configure a rental price for it. - Add an optional product from the Sales tab. - Publish the product on the website. - Open the product page on the website and click` Add to Cart`. Issue: --- - In the product configurator, the rental price is displayed without the `/` separator between the price and the rental duration period. Cause: --- - The string used to generate the rental duration label does not include the `/` separator. Fix: --- - Add the missing `/` separator to the rental duration label so that rental prices are displayed correctly. Before: --- <img width="974" height="185" alt="image" src="https://github.com/user-attachments/assets/64a88a60-bcc0-4657-97fd-584da57d0aff" /> After: --- <img width="967" height="188" alt="image" src="https://github.com/user-attachments/assets/b4d50019-1db4-4817-a8ce-446cc3c55df4" /> opw-6293015 Forward-Port-Of: odoo/enterprise#120223
This update simplifies the process of updating the Account EDI UBL Cii reporting module. Previously, a fragile inheritance method caused potential conflicts with other Odoo templates. This change creates a more robust system for identifying the necessary updates, reducing the risk of issues and making future improvements smoother.
Original PR description
**Description of the issue/feature this PR addresses:** As the new `xpath` is expecting a very specific type of `t-if` which is possibly changed in other templates of third parties or even Odoo itself which do not depend on this module, we take a more robust approach to identify the block **Current behavior before PR:** Issues with inherited views outside the dependency tree (because of primary=True) **Desired behavior after PR is merged:** Less friction and smoother identifier of the needed diff Info: @wt-io-it --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270605
This update resolves a stability issue in the point-of-sale tour. Previously, the tour could fail due to asynchronous order processing, leading to duplicate requests. By adding a delay to ensure requests are fully completed, this fix prevents race conditions and improves the reliability of the tour.
Original PR description
The tour could fail because `sendOrderInPreparationUpdateLastChange` is asynchronous when sending the order to the kitchen. The test was continuing to the next steps before the request was fully resolved, which could lead to sending the order again while the previous call was still in progress. This commit updates the tour to explicitly wait for the async call to complete before continuing, by adding a delay step after clicking the order button. This prevents race conditions during the test. --- Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/181846 Forward-Port-Of: odoo/enterprise#121237 Forward-Port-Of: odoo/enterprise#110909
This update addresses a test failure related to database constraints in the email functionality. A recent database upgrade triggered a different error (RESTRICT_VIOLATION) instead of the previous FOREIGN_KEY_VIOLATION. The test has been updated to handle this new error type, ensuring continued stability.
Original PR description
This commit is kind of a follow up of
odoo/odoo@39cd4ea856fe00f5674f8c44b2b66cbf2705426d (in 18.0).
In a nutshell, following a standard-compliance fix (postgres/postgres@086c84b) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted `FOREIGN_KEY_VIOLATION`. One such case is specifically being tested for by `test_alias_domain_setup`, leading to this test failing systematically when running pg18:
psycopg2.errors.RestrictViolation: update or delete on table "mail_alias_domain" violates RESTRICT setting of foreign key constraint "mail_alias_alias_domain_id_fkey" on table "mail_alias"
DETAIL: Key (id)=(191) is referenced from table "mail_alias".
This commit updates the test to use the more generic `IntegrityError` as it's probably more than sufficient for our purposes.
Forward-Port-Of: odoo/odoo#271403
Forward-Port-Of: odoo/odoo#271302This update fixes an issue where emojis, particularly complex ones like family emojis, were being displayed incorrectly due to how they were encoded. The fix backports a previous solution from version 19.4 to ensure all emojis are correctly rendered, improving the overall email experience for users. This resolves a visual inconsistency.
Original PR description
Bug === Some emoji like `👨🚒` are separated, because they are built using `👨 + Emoji_Modifier + 🚒` (`\uFE0F` can also be used to get the variant of the emoji). Adapt the regex to take into account those Unicode variations. Task-5491124 Forward-Port-Of: odoo/odoo#271373 Forward-Port-Of: odoo/odoo#269719
This update removes an unnecessary 'external' tag from a test class within the SendCloud delivery module. Previously, errors were only detected during nightly builds, not by the standard Continuous Integration (CI) process. Fixing this tag requires updating some tests to ensure accurate and consistent error detection.
Original PR description
Test class was tagged as external although calls are mocked. This means errors were only caught in nightly and not by CI. Removing the tag requires fixing some of the tests. For `test_multicollo`, we send the average weight of packages instead of the total since 97f82442c9fee7dcb3e8c5e9bacddcd6bb864e11. Forward-Port-Of: odoo/enterprise#120902 Forward-Port-Of: odoo/enterprise#111660
This update fixes a minor issue where changes to many-to-many tag fields didn't automatically update related data in the main form view. Now, when users edit tags within a form dialog, the system correctly recomputes dependent fields, ensuring data consistency and a smoother user experience. This improves the reliability of form calculations.
Original PR description
Since [1], one can setup many2many_tags fields to allow editing tags in a form view dialog when clicking on them. However, it may happen that the main record/form view contains computed fields that depend on fields of the edited tag, and that must be recomputed when the user saves the dialog. This works fine of many2one fields, as we trigger an onchange after the save. However, before this commit, we did not trigger the onchange in the m2m case. Now we do. [1] https://github.com/odoo/odoo/pull/234280 Issue reported in the Framework JS discord channel. Issue spotted in task~6088824 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
This update corrects a bug in the MZ demo company setup. Previously, the demo company lacked a valid NUIT number, causing issues with testing and compliance. This fix ensures the demo company now adheres to the required NUIT number format, improving the accuracy and reliability of the MZ localization demo.
Original PR description
Newer versions of stdnum (2.2) also test the number for MZ We did not have a valid NUIT number in the MZ demo company. Runbot error: https://runbot.odoo.com/runbot/build/114118067 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#271398 Forward-Port-Of: odoo/odoo#271299
This update resolves an issue where disconnecting and reconnecting serial devices caused temporary disruptions in Odoo's device discovery process. The fix ensures Odoo properly handles device connections and disconnections, preventing 'ghost' processes and improving the reliability of serial device integration. This enhances the overall stability of the system.
Original PR description
Quick disconnects/reconnects of serial devices crash the serial driver thread, leaving "ghost" processes that cause deadlocks. It's way faster than the main 3s discovery loop, leading to the interface not seeing the device left then came back. This fix adds a health check to SerialInterface.get_devices(): if a driver thread is dead, it is excluded from the discovery list. This triggers Odoo's native removal flow to cleanly shut down the stale connection, allowing the device to auto-recover on the next poll cycle. opw-6201161, opw-6122057 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271326
This update resolves an issue where event titles were being saved as "(no title)" when users quickly saved events using the Alt+C shortcut. The fix utilizes a framework mechanism to ensure all field data is committed at save time, preventing the default blank title from being applied.
Original PR description
When creating an event using the quick create form from the calendar view if the user saves the record while the title is still being edited (using alt+c) the record will be saved with the default title: "(no title)" The code currently relies on the record data being up to date by the time onRecordSave is reached. However in the case of a text field, it is only saved when blurred. While there is a mechanism to blur the field when saving using a hotkey, it is completely asynchronous from the save logic of the form. To ensure all fields have comitted their data at save time, the framework has a mechanism to "request changes" which notifies all fields to update the record with their latest value and waits for them to do so. We can simply reuse this mechanism to ensure the data is up to date at recordSave time already, as we don't expect fields to have any changes after it. task-6321702
This update adds a new setting to our spreadsheet tests that allows them to bypass waiting for data to fully load. Previously, tests were blocked if the spreadsheet data wasn't immediately available, which could cause delays. Now, tests can be run faster and more reliably by skipping this data loading check.
Original PR description
Added the parameter `skipWaitForDataLoaded` to `createSpreadsheetWithList` to test what happens when the list is not ready yet. Task: [6289944](https://www.odoo.com/odoo/2328/tasks/6289944) 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#271144 Forward-Port-Of: odoo/odoo#269096
This update resolves an issue where the spreadsheet edition's autofill tooltips displayed error messages instead of the correct information when the list data wasn't immediately available. The fix ensures tooltips show the intended data, improving the user experience and data accuracy within the spreadsheet feature. This was part of a larger effort to improve stability and reliability.
Original PR description
The getter `getTooltipListFormula` would return the result of `getListHeaderValue` as the content of the tooltip, but this returned a loading error instead of a string if the list was not ready yet. Task: [6289944](https://www.odoo.com/web#id=6289944&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#121228 Forward-Port-Of: odoo/enterprise#119876
This update fixes an issue where inserting mentions in the email composer caused text editing to behave unexpectedly. Specifically, it adds a special character to ensure the cursor moves to the correct end of the line when typing, improving the user's ability to format emails. This ensures a smoother and more accurate email composition experience.
Original PR description
### Purpose of this PR: - Inserting a mention in the composer results in a paragraph ending with a bare `<a>` element and no trailing text node. This causes the browser to mishandle the End key, moving the caret to the start of the next paragraph instead of the end of the current line. - Fix by appending a \uFEFF (zero-width no-break space) text node. task-6295924 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271160 Forward-Port-Of: odoo/odoo#269699
This update fixes a minor visual issue where the flag for Mauritania was incorrectly displayed in the system. The change ensures accurate representation of the country flag, maintaining a consistent and professional user experience. This is a simple correction with no impact on core functionality.
Original PR description
[task-6320443](https://www.odoo.com/odoo/project.task/6320443) Forward-Port-Of: odoo/odoo#271488
This update ensures Odoo's server processes efficiently load necessary data, leading to faster response times. Previously, the server wasn't properly preparing data for use, causing delays. This fix optimizes the server's startup and performance.
Original PR description
The code to set the registry size was moved to `preload_registries`. The gevent server does not preload registries and thus does not set the registries size. Instead of moving the code again, we can preload registries in the gevent server. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271640
This update ensures Odoo generates PDF invoices that fully comply with ZUGFeRD standards, a crucial requirement for electronic invoice processing. Specifically, the PDF files now correctly identify the relationship between the underlying XML data and the visual invoice, addressing a technical detail related to invoice formatting. This update also updates the XML filename to align with current ZUGFeRD specifications.
Original PR description
Adapt `add_attachment` to allow setting the "AFRelationship" tag on the PDF filespec object, In compliance with Factur-X/ZUGFeRD specs that require the AFRelationship tag in the PDF filespec object to reflect the relationship between the embedded XML and the visual PDF content: - /Data: the visual PDF contains more invoicing data than the XML. - /Alternative: the XML and the PDF are two equivalent representations of the same invoice. Additionally, update the embedded XML filename from `zugferd-invoice.xml` to `factur-x.xml`. The former is marked as deprecated since ZUGFeRD 2.0 Ref: sections 6.2.2, 6.3.1, 6.3.2 of the ZUGFeRD 2.4 specification: https://www.ferd-net.de/en/downloads/publications/details/zugferd-24-english opw-6252082 Forward-Port-Of: odoo/odoo#271406 Forward-Port-Of: odoo/odoo#269117
This update resolves a potential issue where spreadsheet tests could unexpectedly fail due to unhandled asynchronous operations. By adding `await` to test operations, the system is now more stable and reliable, preventing cascading test failures. This ensures consistent and predictable test results.
Original PR description
Some tests did a `model.exportXLSX()` to verify it didn't crash, but did not `await` so a crash would break another test at random. Task: [6328937](https://www.odoo.com/web#id=6328937&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) 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
This update resolves an issue where switching between models within the website studio's 'More models' feature caused a crash. The fix ensures both the current and newly selected models are retained in the system's memory, preventing errors and improving the overall stability of form switching. This enhances the user experience for managing multiple forms.
Original PR description
Selecting a second model through the Action option's "More models" crashed because the current form model was dropped from the models cache while the new model was being applied. This commit keeps both the current form model and the model being applied in the cache. Steps to reproduce: - Add a form snippet - Click on the form - In the `Action` option, select `More models` - Select one model - Open `More models` again and select another model - Traceback appears: `TypeError: Cannot read properties of undefined (reading 'website_form_key')` task-6321878 Forward-Port-Of: odoo/enterprise#121492