Daily updates from Odoo
Friday, June 5, 2026
20 changes · 18.0
New functionality added to Odoo
This update enhances the Arabic localization (l10n_ar) module to seamlessly integrate with wsmtxca encryption. Previously, there were limitations in handling encrypted transactions within the Arabic accounting system. This change ensures proper processing and reporting of encrypted financial data, improving compliance and security.
Original PR description
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
Enhancements to existing features
This update introduces a new button to streamline the reregistration process for French users, particularly those transitioning between Peppol and PDP systems. It addresses a previous testing issue where changes to the demo company's Peppol settings caused problems during the reregistration flow. This enhancement improves usability and simplifies a key business operation.
Original PR description
#### [IMP] l10n_fr_pdp: fix visibility for peppol (non-PDP) #### [IMP] account_peppol,l10n_fr_pdp: reregister This commit adds a button so that users can reregister more easily. This is i.e. useful to switch from Peppol to PDP for French users. #### meta task-6265603
This update enhances the synchronization of point-of-sale (POS) transactions with Fiskaly, a key partner for German businesses. It separates retail and restaurant order flows, optimizing data transmission and ensuring accurate reporting by only sending updated product quantities during restaurant kitchen synchronization. This improves the reliability of financial data.
Original PR description
In this commit: ------------------ - Maintain separate Fiskaly transaction flows for retail (short tx) and restaurant (long tx) orders as discussed with the Fiskaly team. - `Initialize order transactions` with an empty payload when the `first product` is added. - Start `receipt transactions` with an empty payload when the `first payment line` is added. - For retail flows, no intermediate order updates are sent to Fiskaly before finalization. - For restaurant flows, create additional transaction updates during kitchen synchronization. Ensure already synchronized products are not resent, and only newly added or updated quantities are included in the payload. - `Finalize order and receipt transactions` with complete order lines and payment details when we validate the order. task: 6208963 Reference: <img width="1863" height="1285" alt="de_tss_flow" src="https://github.com/user-attachments/assets/9140788e-7948-4a08-9f11-27197b22ca8b" />
Resolved issues and error corrections
This update addresses a frustrating user experience when previewing large files in Odoo. Previously, users experienced long delays while the file preview loaded without any visual feedback. This fix now displays a loading indicator during file preview, providing a smoother and more responsive experience for users.
Original PR description
When previewing a big file, the download might take long and the rendering might take even more time. The UI is blocked until the iframe is ready, but there is no feedback for the user. This commit adds some loading feedback until the iframe is rendered. Steps to reproduce: - Go to a Knowledge article - Upload a file with `/file` - Add a huge JSON file (~30MB) - Save - Click on the file icon => The preview opened but took ages to be displayed without giving any feedback to the user task-6014223
This update resolves an issue preventing invoicing users from accessing necessary data within the PDP (Point of Departure) reporting flows. Previously, Odoo was blocking access, which prevented users from correctly evaluating e-reporting fields on invoices. This change ensures invoicing users can fully utilize the PDP reporting functionality.
Original PR description
Allow invoicing users to read PDP reporting flows. Invoice views can read PDP flow relations to evaluate e-reporting-related fields or buttons. Users with invoicing access could open the invoice but were blocked when Odoo tried to read the linked PDP flow. runbot.build.error-939457
This update significantly speeds up the process of deleting website-related fields in Odoo. Previously, this check could take minutes, blocking user actions. Now, it completes in milliseconds by focusing only on fields that actually contain website form markup, improving overall system responsiveness.
Original PR description
Summary ======= `_check_if_used_in_website_form`, the ondelete hook on `ir.model.fields` that guards against deleting a field referenced by a website form, performs poorly on realistic databases. It…
Summary
=======
`_check_if_used_in_website_form`, the ondelete hook on
`ir.model.fields` that guards against deleting a field referenced by
a website form, performs poorly on realistic databases. It can take
multiple minutes to validate a single field deletion, blocking user
actions such as removing a Studio field.
This commit restricts the scan to columns that can actually contain
website form markup, bringing the hook from multi-minute to
sub-second without any loss of coverage.
The Problem
===========
Deleting any `ir.model.fields` record triggers this validation hook,
which must ensure the field is not referenced inside any website
form. The implementation iterates every stored HTML column returned
by `website._get_html_fields()` and runs one case-insensitive
`ILIKE '%data-model_name="<model>"%'` search per column against
`<model>.<html_field>`, then parses each match with `lxml` and
validates it with XPath.
Two root issues cause the multi-minute cost:
- **Unbounded scan surface**: all stored HTML columns are scanned
(~95 on realistic databases), even though the vast majority of them
declare `sanitize=True` and `sanitize_form=True` (the defaults).
When both flags are True, `<form>` tags are stripped on write and
the column can never physically contain website form markup.
- **Per-column `ILIKE` cost**: `ILIKE` on large TEXT/JSONB columns
performs a sequential scan. A single large HTML column is enough
to make the hook run for several minutes on its own.
Improvements
============
- Scan only columns that can actually contain forms:
- `ir.ui.view.arch_db` , primary target; all website forms are
stored there.
- HTML fields whose sanitization either is disabled
(`sanitize=False`, e.g. `blog.post.content`,
`website.custom_code_head`) or explicitly allows forms
(`sanitize_form=False`, e.g.
`product.template.website_description`, `hr.job.description`,
`event.event.description`). Any other HTML field strips `<form>`
on write and will never contain a form.
- Batch searches: group the deleted fields by model once and emit a
single `OR`-domain search per candidate column, instead of one
search per (field, column) pair.
- Parse each returned record with `lxml` and validate with XPath
directly. The `ILIKE` domain already filters out non-matching rows
DB-side.
Benchmarks
==========
Profiled on a database containing ~95 stored HTML columns and ~5.2k
views. The hook was invoked read-only via
`field._check_if_used_in_website_form()` on a custom field.
| Metric | Before | After |
| :----------------------------- | ---------: | ---------: |
| Hook wall time | ~444 s | ~173 ms |
| HTML columns scanned | 95 | 5 |
| SQL queries issued | 96 | 6 |
Key results:
- Hook wall time reduced from multi-minute to sub-second
(~2,570× faster on the profiled database).
- Scan surface reduced from ~95 columns to a handful (1 +
the form-capable HTML fields installed on the database, typically
under 10).
opw-6086536This update fixes a bug preventing users from searching for products in the webshop using their 'Ecommerce Description'. Previously, this field wasn't included in the search functionality. This change ensures customers can find products more effectively based on their descriptions, improving the shopping experience.
Original PR description
Steps to produce: --- - Install `website_sale` module. - Create a product and set an `Ecommerce Description` in the Sales tab. - Go to the webshop and search using a term from the ecommerce description. Issue: --- - Products cannot be found when searching by their ecommerce description. The `description_ecommerce` field is not included in the website search fields. In saas-19.3, this issue has already been resolved in [commit], where the same approach was used. [commit]: https://github.com/odoo/odoo/commit/9394e17a07cb125914fba137405c152bee2d7618 Before: --- <img width="558" height="116" alt="image" src="https://github.com/user-attachments/assets/87730a2e-e326-49a6-be4f-04a167b07d53" /> After: --- <img width="560" height="157" alt="image" src="https://github.com/user-attachments/assets/17ed4abe-6abe-4981-aa1e-6069754ca479" /> opw-6260876 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where duplicating a database related to German Point of Sale certification (l10n_de_pos_cert) would cause errors. The change removes specific identifiers during duplication, allowing for proper testing in neutralized databases. This ensures the module functions correctly when creating test environments.
Original PR description
In this commit: -------------------- - On a duplicate database `client_id` and `tss_id` are removed so it works as test in neutralized dbs without throwing errors. task- 5457231
This update fixes an issue where invitation to follow notifications weren't appearing in user inboxes. The change ensures that the notification subject is always displayed, regardless of whether additional comments are added to the invitation. This improves the visibility of important follow requests.
Original PR description
Steps to reproduce: - Configure user A to receive inbox notifications. - As user B, invite user A to follow a record with Notify recipients enabled. - Open the inbox of user A. The Invitation to follow notification is not displayed in the inbox when no additional comment is provided. This happens because the notification body is empty unless extra comments are added. This commit fixes the issue by displaying only the subject when the body is empty. Task-[5485727](https://www.odoo.com/odoo/project/1519/tasks/5485727) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where Android 14 users couldn't access their device's camera when using file input fields. The fix ensures users can now select photos directly from their camera, improving usability on this platform. This change addresses a compatibility problem with recent Android versions.
Original PR description
Since Android 14 we don't have option to take a photo on clicking on file input in Chrome.
This for example will allow only images but no option "Camera"
```html
<input type="file" accept="image/*/>
```
A workaround is to use a dummy mimetype (`*/*`), example `dummy/allowAndroidCamera` The fix will be applied on image widget in addition to the original `acceptedFileExtensions` to not override the existing `accept` attribute
Linked url
- https://blog.addpipe.com/html-file-input-accept-video-camera-option-is-missing-android-14-15/
- https://stackoverflow.com/questions/77876374/html-input-type-file-not-working-to-pull-up-camera-for-pixel-android-14-comb/79163998#79163998
- https://issues.chromium.org/issues/40937303
opw-6040375
backport of https://github.com/odoo/odoo/pull/265750
Forward-Port-Of: odoo/odoo#266850This update resolves inconsistencies in Odoo's lot valuation system when products are valued without assigned lots. Previously, discrepancies arose with negative lot quantities, but this fix now allows for negative lot valuations, enabling more flexible stock management. It ensures accurate valuation even when physical lot quantities don't perfectly match the valued amounts.
Original PR description
There have been multiple issues that happened when enabling/disabling lot valuation. Odoo is flexible with the reservation/consumption of lots on StockQuant without lots. This means that while your…
There have been multiple issues that happened when enabling/disabling lot valuation. Odoo is flexible with the reservation/consumption of lots on StockQuant without lots. This means that while your product is valued by lot/SN, you can still end up with a discrepancy between your lot quantity on hand and your lot quantity valued. You can be in a situation where you don't have any negative lots on hand, but the valuation shows the negative amount. If you tried to fix the discrepancy by setting the StockQuant to zero, you are blocked because a lot/SN is required. If you tried to disable the valuation by lot configuration, it was allowed (because no negative quants on hand), but the valuation remaining data would be broken. This PR aims to fix the methods '_svl_empty_stock' and '_svl_replenish_stock' by supporting negative lots. OPW-4888289 --- One way to break the lot valuation: https://github.com/user-attachments/assets/b5f0d8c5-d798-4110-9564-951d0be9dcc6 --- After this PR: - `_svl_empty_stock` simply set the valuation for the lot/product to 0, it's not an OUT/IN svl, and no need to call `_run_fifo` or `_run_fifo_vacuum` (perf++). - The user can enable/disable lot valuation with negative lots - When enabling the lot valuation, the lot valuation will be replenished even if the global quantity is 0. - The user can disable lot valuation when they have a quant without lot. - The user can NOT enable lot valuation when they have a quant without lot. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update strengthens the process for obtaining SIREN numbers used for KYC compliance in France. Previously, the system relied on a simple first nine digits of the company ID, which was unreliable for some users. Now, a validation helper method is implemented to ensure accurate SIREN data capture, improving the integrity of the French KYC process.
Original PR description
Currently we just take the first 9 numbers of the `company_id` and say it is the SIREN. On IAP we have some people who just seem to have put their company name. After this commit we use a helper method that does some simple validation at least. task-None
This update fixes a potential problem where users could accidentally trigger mass email campaigns without proper targeting, leading to unwanted spam. The change restricts the 'Retry' button's functionality when a mailing is linked to a marketing automation campaign, ensuring emails are sent according to campaign filters. A new test has been added to prevent future issues.
Original PR description
When a mailing is managed by a marketing automation campaign, its target domain is dynamically handled by the campaign's activities. If a user clicks the "Retry" button directly on the mailing…
When a mailing is managed by a marketing automation campaign, its target domain is dynamically handled by the campaign's activities. If a user clicks the "Retry" button directly on the mailing template, it bypasses the campaign filters and queues the mailing for the entire target model, causing unintended mass spam. This commit fixes the issue by: 1. Raising a UserError in `action_retry_failed` if the mailing is linked to marketing automation (`use_in_marketing_automation`). 2. Hiding the "Retry" button in the frontend view to prevent confusion. 3. Adding a unit test to ensure this edge case is caught in the future. Steps to reproduce: 1. Create a marketing campaign with a filter and an email activity. 2. Run the activity and ensure at least one email trace fails. 3. Open the mailing template via the "Templates" smart button. 4. Click the "Retry" button on the template form. 5. The mailing is placed in the standard queue, bypassing the domain and targeting all records of the underlying model. OPW-6220106 Forward-Port-Of: odoo/enterprise#119391 Forward-Port-Of: odoo/enterprise#118759
This update resolves a technical issue preventing the French Payroll (l10n_fr_pdp) module from functioning correctly. The fix involved adding a missing import statement, ensuring the module integrates properly with Odoo. This ensures accurate French tax reporting.
Original PR description
task-None
This update fixes an issue where DATEV exports incorrectly populated EU-specific fields for customers outside the European Union. The change ensures that the correct country information (`Land` field) is used for non-EU customers, aligning with DATEV's requirements and improving data accuracy. This ensures compliance and accurate reporting.
Original PR description
### Issue: In DATEV customer and supplier exports, partners outside the European Union still had the `EU-Land` and `EU-UStID` fields filled However, these fields must only be used for EU countries…
### Issue: In DATEV customer and supplier exports, partners outside the European Union still had the `EU-Land` and `EU-UStID` fields filled However, these fields must only be used for EU countries For non-EU countries, the `Land` field should be filled instead, and is required whenever the country is not Germany https://developer.datev.de/en/file-format/details/datev-format/format-description/debitorskreditors ### Cause: `_l10n_de_datev_get_partner_list` did not distinguish between EU and non-EU countries As a result, any partner with a VAT number could populate `EU-Land` and `EU-UStID`, even if the country was outside the EU Greece also requires a special case: its VAT prefix is `EL` so the `EU-Land` too, while the country code used in `Land` must remain `GR` ### Steps to reproduce: - Install `l10n_de_reports` and switch to the DE company - Create a customer in Switzerland with a valid VAT number - Create and confirm an invoice for that customer - Go to Accounting → Audit Reports → General Ledger - Select the full year - From the gear menu, export DATEV DATA (zip) - Open the `EXTF_customer_accounts` file ### Before the fix: `EU-Land` and `EU-UStID` are filled for the Swiss customer, while `Land` is empty ### After the fix: `EU-Land` and `EU-UStID` are empty for non-EU countries such as Switzerland, while `Land` is correctly filled `Land` is filled using the following priority: 1. Partner country_code 2. Country extracted from the VAT number 3. Empty opw-5902565
This update resolves an issue where the website's menu system would unexpectedly close. By closing the extra menu before opening the main site menu, the system now operates more reliably, preventing errors and ensuring a consistent user experience. This improves the overall stability of the website.
Original PR description
[FIX] website: close the extra menu before opening site menu Update of the extra menu item is done multiple times (cfr `afterFontsloading`). If the extra menu item and the site menu were already open before an update of the extra menu item, the result is a close of the site menu. This can lead to undeterministic error. To solve the problem, the extra menu dropdown is closed before opening the site menu. runbot-240955 Forward-Port-Of: odoo/odoo#266376
This update enhances the accuracy of Afip invoice data transmission by automatically calculating default unit of measure values when product information is missing. This resolves a previous issue where invoices without products would fail Afip web service validation, ensuring compliance and smoother financial reporting. The changes also include a fix for handling UOM codes.
This update resolves an issue in the French VAT reporting module (l10n_fr_pdp) where data was incorrectly structured within XML files. The fix ensures that data is properly nested as a child node, preventing errors in VAT calculations and reporting. This ensures accurate VAT reporting for French businesses using the Odoo system.
Original PR description
'Content' was set as an attribute of 'IncludedNote' instead of a child node. See ppf messages 164, 166 & 168
This update resolves an issue where reloading the Point of Sale (POS) system could cause data loss and errors. The fix prevents a race condition between sending a beacon and initiating a new web request, ensuring a smoother and more reliable POS reload experience. This improves overall system stability and user experience.
Original PR description
When the user reloads the POS while the session is in opening_control, the beforeunload sendBeacon and the new pos_web request race. If the beacon is processed first it deletes the session and load_data fails. task-6259527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents the KSeF vendor bill cron job from failing when encountering a single invalid XML file. Instead, errors are logged, and the process continues to successfully create valid invoices from the batch, improving reliability and preventing data loss.
Original PR description
Description of the issue/feature this PR addresses: Issue: When downloading vendor bills from KSeF via the cron, the system attempts to parse the XML files sequentially. If a single XML file is…
Description of the issue/feature this PR addresses: Issue: When downloading vendor bills from KSeF via the cron, the system attempts to parse the XML files sequentially. If a single XML file is missing something that is expected, the parser raises a UserError. This unhandled exception halts the entire cron job and rolls back the database transaction, clogging up the rest of the queue. Solution: This PR wraps the l10n_pl_edi_get_ksef_bill_vals_from_xml parsing step inside a try/except block within the batch download loop. If a UserError is encountered for a specific invoice, the error is logged as a warning, and the cron proceeds. Current behavior before PR: A single malformed XML file causes the cron to fail completely. Valid invoices in the same batch are not created due to the halted queue. Desired behavior after PR is merged: The cron successfully processes the batch of downloaded XMLs even if one or more files are invalid. Errors on specific invoices are logged for the user to investigate, while the rest of the valid vendor bills in the batch are succesfully created. opw-6218288 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr