Wednesday, March 25, 2026
32 changes · 19.0
Enhancements to existing features
Invoice attachment updates are now saved together with the related accounting move updates. This reduces the risk of mismatched records if one part of the process fails, improving reliability for electronic invoicing workflows.
Original PR description
Was committing the move fields update, then updating the attachment. This might create an issue were the move update commits successfully, but setting the attachment fails and we end up with an inconsistency. Set attachment in the same transaction as the move update. task-6035727 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255440 Forward-Port-Of: odoo/odoo#255262
This update enables users to efficiently manage database tags by allowing them to apply one or multiple tags to several databases simultaneously. This streamlines the process of organizing and categorizing databases, improving operational efficiency. It simplifies a previously manual and time-consuming task.
Original PR description
The aim of this commit is to allow users to mass edit the list of database to add one or several tag on several dbs at once. task-id: 6046088
Resolved issues and error corrections
Quick search dialogs opened from record selection fields now use the related model name when no custom title is set. This prevents confusing blank or “Undefined” titles and gives users clearer context while searching.
Original PR description
When clicking **"Search more..."** from **RecordAutocomplete** or **Many2XAutocomplete**, the quick search dialog could open with titles like **"Search: Undefined"** or **"Search: "** when no explicit title was provided. This change falls back to the model display name to ensure the dialog always shows a meaningful title. task-5932652 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Warehouse settings now correctly respect when a user turns off Buy to Resupply. This prevents the option from turning itself back on due to related route settings, reducing confusion and keeping purchasing flows aligned with the warehouse configuration.
Original PR description
Steps to produce: --- - Install `purchase_stock` module. - Inventory > Configuration > Settings > Warehouse > enable `Multi-Step Routes`. - Go to Configuration > Warehouse Management > Warehouses. -…
Steps to produce: --- - Install `purchase_stock` module. - Inventory > Configuration > Settings > Warehouse > enable `Multi-Step Routes`. - Go to Configuration > Warehouse Management > Warehouses. - Open `YourCompany` record. - Click on Routes > open `Buy` > enable `Products`. - Return to `YourCompany` and disable `Buy to Resupply`. Issue: --- - After disabling `Buy to Resupply`, the option is automatically re-enabled. Root cause: --- - In [1], `buy_to_resupply` is set to true if either buy route is product selectable OR the current warehouse is included in buy route warehouses. - In the `_inverse_buy_to_resupply` method, unchecking the flag only unlinks the warehouse from the route. However, if `product_selectable` is still enabled, the compute logic will continue to set the field back to true. Solution: --- - `warehouse.buy_to_resupply` is now set to True only when the warehouse ID is present in the buy route’s warehouse_ids. [1] https://github.com/odoo/odoo/blob/aeaace7c70b7ac3db68f188c9c517f1ff849e55d/addons/purchase_stock/models/stock.py#L57 opw-5476302 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Batch transfer creation now works when the configured numbering prefix contains slashes, such as location or year-based labels. This prevents an error that could block users from saving new batch transfers in affected inventory setups.
Original PR description
next_by_code() can return a sequence with multiple '/' in the prefix (e.g. "BATCH/test/00002" or "batch/test/2026/00002"). Using split('/') causes a ValueError: too many values to unpack.
Use rsplit('/', 1) to always split on the last '/' and correctly extract the sequence prefix and number.
Steps to reproduce the bug:
- Go to settings > technical > sequences & identifiers > sequence:
- batch transfer: - prefix: BATCH/test/
- Create a new batch:
- operation type: delivery orders
- Try to save
Problem:
a traceback is triggered:
```ValueError: too many values to unpack (expected 2)```
opw-6043880This update adjusts the required cbor2 library version to one that better matches common Linux distributions and has a ready-to-install package available. This helps reduce installation problems and keeps deployments smoother without changing business features.
Original PR description
This commit sets the cbor2 library's version to match more closely the Debian Bookworm/Ubuntu Jammy packaged versions and to match the ones with a prebuild wheel. Note: while the 5.4.2 already matched the one from Jammy, it didn't provided a corresponding wheel, which the 5.4.2.post1 did fix (cf. https://github.com/agronholm/cbor2/releases/tag/5.4.2.post1). runbot-238903 Forward-Port-Of: odoo/odoo#254638
Point of Sale orders created without a preset will now automatically use the shop's configured default preset. This prevents orders from missing expected settings when they are synced before all front-end choices finish loading, while still respecting any preset explicitly selected.
Original PR description
When a pos.order was created without a preset_id (e.g. frontend order synced before the async preset dialog resolved, or any other path that omits the field), _complete_values_from_session did not fall back to the config's default_preset_id. Apply it the same way pricelist and fiscal position are defaulted, without overriding an explicitly passed value. opw-5997872 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Closing the online payment popup in Point of Sale no longer triggers an error. This makes the checkout flow smoother and avoids confusion for staff using online payments.
Original PR description
Before this commit, when the user closed the online payment popup, an error was raised because the currentOrder was not valid and instead order must be used. opw-6034405 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Search dialogs opened from record selectors or relational fields now show a clear default title when no field label is provided. This avoids confusing text such as "Search: undefined" and gives users a more polished experience.
Original PR description
…e title When opening a selectCreateDialog from a record selector or a relational field, when no (or empty) fieldString was passed to form the dialog's title , an ugly `Search: undefined` was set as the title After this commit, if we don't receive the right props, we simply set the title to `Search` part-of-task-5932652 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 fix ensures the website page editor interface is released properly when a reloadable action fails. Users will no longer be left with a blocked screen after certain errors, reducing disruption while editing content.
Original PR description
Since commit [1], the UI is blocked during a reloadable operation, but an early exit on error prevented unblock() from being called. This commit fixes it by wrapping it in a try/finally to ensure the UI is always unblocked. [1]: https://github.com/odoo/odoo/commit/453b7eb8e038ee8e8a54de16fc1a45fb2fab573a Forward-Port-Of: odoo/odoo#255477
Point of Sale now skips sales order note and subsection lines that do not contain products when settling an order. This prevents checkout errors and helps staff complete sales orders reliably from the POS.
Original PR description
`line_subsection` lines have no product, so calling `addLineToCurrentOrder` on them raised a TypeError trying to read `taxes_id` of undefined. Skip them early, the same way `line_section` is handled. opw-5949585 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that occurred when users tried to add a reaction to certain Discuss history messages. The reaction option is now hidden for message types that do not support it, preventing a confusing crash and improving reliability.
Original PR description
*= im_livechat, portal, test_discuss_full **Steps to reproduce:** • Install the mail_group module • Open Discuss • Go to the History tab • Add a reaction on a message that has model `mail.group` •…
*= im_livechat, portal, test_discuss_full **Steps to reproduce:** • Install the mail_group module • Open Discuss • Go to the History tab • Add a reaction on a message that has model `mail.group` • Throws an error The error occurs because the `mail.group` model does not implement the `_get_allowed_access_params()` method, which is invoked during the process here. Actually, the "add reaction" button should not be shown on messages whose model does not inherit from mail.thread. https://github.com/odoo/odoo/blob/d12c1e07727f9b04cd2be2e7dac1ec3af49cb637/addons/mail/models/mail_message.py#L579 Desired behavior after PR is merged: This PR fixes the issue by hiding the "add reaction" button on messages with models that don’t inherit from mail.thread, such as mail.group. enterprise: https://github.com/odoo/enterprise/pull/111271 Task-5098050 [Reference](https://github.com/user-attachments/assets/aa2c4251-fd1f-4734-a62c-9fc80dd5f587) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255587 Forward-Port-Of: odoo/odoo#218615
Odoo now identifies bundles that are loaded later and prepares them before tests start. This avoids last-minute generation during test runs, making test execution more predictable and reducing avoidable delays or failures.
Original PR description
tl;dr: look for lazy loaded bundles and add them to the bundles' list to pregenerate before running tests to avoid generation on the fly. Forward-Port-Of: odoo/odoo#248256
Italian electronic invoices with an incorrect ENASARCO withholding reason can now still be imported when the withholding type matches. This reduces failed or incorrect invoice imports caused by supplier data inconsistencies.
Original PR description
Some invoice come in with a wrong ENASARCO withholding reason. We now broaden the search to allow taxes with the same withholding type to be used during import even if the withholding reason doesn't match. In the test, I change the Enasarco tax to reason Q to check that it gets correctly assigned. Ticket [link](https://www.odoo.com/odoo/project.task/5175587), [link](https://www.odoo.com/odoo/project.task/5933699) opw-5175587 opw-5933699 Forward-Port-Of: odoo/odoo#251734 Forward-Port-Of: odoo/odoo#236251
This update improves internal test checks for Google Calendar and email notifications so they better match real email handling. It reduces false test failures and helps maintain confidence in calendar sync and mail notification behavior without changing day-to-day user features.
Original PR description
No need to always check the timeout email_to always contains formatted emails. task-5152917 Forward-Port-Of: odoo/odoo#254702 Forward-Port-Of: odoo/odoo#230766
This update fixes a minor issue where the Direct Deposit module's documentation link was incorrectly pointing to SEPA documentation. Now, the link accurately directs users to the correct documentation for US Direct Deposit setup. Future versions (19.1+) will have the documentation adjusted as well.
Original PR description
When the Direct Deposit module was merged there were no docs created yet, as such we linked to the SEPA documentation temporarily. Now that it has been merged, we update the link to point to the right documentation. Note that in 19.1+ there is no documentation linked in `l10n_us_account` and as such that will be adjusted in the forward port. task-none
This update resolves an issue where documents uploaded to the 'All' folder in the Documents app were inaccessible through the bridge interface. The fix ensures that 'All' folder uploads now correctly default to the standard bridge folder, restoring full accessibility for users.
Original PR description
Problem: When a user uploads a document through a bridge to the Documents app, if the destination is set to the `All` folder, the file becomes unviewable from the bridge. It can only be accessed directly via the Documents app. Cause: This occurs because `All` is not an actual folder. Uploads directed to it default to the `My Drive` folder instead. Because `My Drive` is restricted and inaccessible via the bridge, the uploaded documents remain hidden. Solution: To solve this problem, this PR ensures that uploads directed to the `All` folder default to the specific bridge folder rather than to `My Drive`.
This update addresses a compatibility error related to Python version 3.10 on Ubuntu Jammy. The change prevents a type-checking error that would have occurred when running the GoFood order platform. The fix ensures the system continues to function correctly without requiring a newer Python version.
Original PR description
NotRequired is only available starting with Python 3.11. While not blocking, this generates an error when running on Ubuntu Jammy, which provides Python 3.10. This commit gates the types import only during type checking. runbot-241253
This update fixes an issue where fields weren't being created correctly when new records were being generated. The change ensures that all fields are properly populated during the creation process, leading to more reliable data and reduced errors. This primarily impacts the creation of new records within various Odoo modules.
Original PR description
See https://github.com/odoo/odoo/pull/199647. Forward-Port-Of: odoo/enterprise#109725
This update fixes a bug that prevented users from successfully updating timesheet entries while a timer was running. The issue stemmed from an error when the system attempted to process updates after a 'My Timesheet' navigation. The fix adds a simple check to ensure the timer state is valid before attempting updates, improving timesheet functionality.
Original PR description
Steps to reproduce: 1. Install `timesheet_grid` 2. Open timesheet and start timer 3. Update any cell by clicking on seach icon. 4. Now after updating go back by clicking "My Timesheet" breadcrumb Issue: - Tracback: `Uncaught Promise > Cannot convert undefined or null to object` Cause: : - The error was occurring because the updateTimerState function in timesheet_timer_service.js was trying to iterate over timerState.data when it was undefined or null. This happens when the list view's urgent save is triggered. Solution: - added a safeguard to updateTimerState so that it simply returns early if timerState.data is empty opw-6018970
This update resolves a technical error that prevented users from printing VSME and CSRD ESG reports. The issue stemmed from an outdated search filter in the report generation process. By removing a redundant check, the report now functions correctly, ensuring accurate data reporting.
Original PR description
Steps to reproduce:
1. From Accounting, create a Vendor bill with today's date, and containing a line
2. Confirm (post) it
3. Make the Payment ('Pay' stat button)
4. Create a VSME or CSRD report from the ESG App, for the current year
5. Try to print it
=> A traceback occurs (in _get_payment_terms_data()) as we are trying to search on the 'active' field of account.move, which does not exist. => Solution: remove this uneeded check
version-19.0This update resolves an issue where equity transactions couldn't be created in currencies other than the company's default (USD). Now, users can set the equity currency for the first transaction, ensuring flexibility in recording equity values. Subsequent transactions automatically use this selected currency.
Original PR description
### Issue: When a company is set in USD, it was not possible to create equity transactions in another currency (e.g., EUR) ### Cause: The equity_currency_id is initialized with the company currency at partner creation (or module installation) However, there was no way to override this value when creating transactions ### Fix: It is now possible to set the equity currency on the first transaction Subsequent transactions reuse this currency and the field becomes read-only ### Steps to reproduce: - Install `equity` with demo data (currency and equity_currency default to USD) - Enable the EUR currency - Create an equity transaction for a company - You can now choose EUR on this transaction - Create another transaction for the same company, the selector is hidden and the currency remains EUR opw-5382255
This update addresses a privacy concern by removing the display of total due amounts for minimal cashiers in the partner list. This change prevents potential leakage of sensitive financial information to cashiers, enhancing security and compliance. The fix was driven by a need to protect cashier data.
Original PR description
Before this commit, the total due amount was visible for minimal cashier in the partner list. This could leak sensitive information to the cashier, which is not desirable. opw-6039529
A recent update to Odoo Enterprise prevented newly created approval rules in the Studio module from being correctly saved to the database. This issue arose during an upgrade from version 18.0 to 19.0 and resulted in these rules being unexpectedly deleted. This fix ensures that updates to Studio approval rules are properly recorded, preventing data loss and maintaining the integrity of user permissions.
Original PR description
Server and automated actions created by the ORM for the purpose of revoking approval rights are created without `noupdate=True` which leads to said records being removed by the ORM becuase of not being found in the source. Such records created on the fly should have `noupdate=True` to prevent that from happening. This bug can be reproduced by going to Settings > Technical > User Interface > Studio Approval Rules and creating a new record from there and updating `web_studio`. The update will drop the record from the database. Issue originally detected in the upgrade process from 18.0 to 19.0. This fix will be complemented by an upgrade script that fixes erronous records. Forward-Port-Of: odoo/enterprise#110065
This update fixes a minor issue within the Web Studio interface where many search dialogs lacked clear titles. Now, most 'selectCreateDialog' instances display meaningful titles, improving usability and clarity for users creating and editing web applications. This ensures a more intuitive experience when working with the design tools.
Original PR description
Before this commit, a lot of search More dialogs did not have a meaningful title because one parameter was usually not set. After this, most or all the selectCreateDialog have a meaningful title task-5932652
This update ensures that document creation times are displayed accurately for users, regardless of their location. Previously, times were inconsistent due to a failure to convert dates from UTC to the user's local timezone. This fix provides a more reliable and user-friendly experience for managing document versions.
Original PR description
Step to reproduce: 1. Install `documents` 2. Upload a document and open the tree view 3. Compare the field `Created On` and the time from the `Manage Versions` action Issue: - The displayed time is inconsistent between the tree view and the dialog Cause: - The datetime used in Manage Versions is formatted without converting it from UTC to the user’s timezone Solution: - Use timezone-aware datetime helpers so values are converted from UTC to the user’s timezone. Before: <img width="1328" height="81" alt="image" src="https://github.com/user-attachments/assets/2a02f03c-714d-417d-a805-fd0dd7c52753" /> <img width="636" height="297" alt="image" src="https://github.com/user-attachments/assets/c4514469-2f51-493f-8991-32371fb7f338" /> After: <img width="641" height="312" alt="image" src="https://github.com/user-attachments/assets/3979ece8-635a-4b54-9b53-d8b28b3336ec" /> opw-5467782 Forward-Port-Of: odoo/enterprise#104443
This update prevents the entire reports cron job from stopping if an error occurs during report generation. Previously, a single error would halt the entire process. Now, the cron will continue to attempt sending other reports, improving reliability and ensuring all reports are eventually processed.
Original PR description
If an error is raised during the export of reports cron execution, the whole cron stops due to the fact that the error is never catched This commit will ensure that even if there is an error with one of the report export, the cron won't top and will try to send to other documents task-5469038 Forward-Port-Of: odoo/enterprise#111602 Forward-Port-Of: odoo/enterprise#105191
This update resolves a bug preventing users from adding reactions to messages within the Discuss module when those messages are associated with the mail_group model. The fix ensures the 'add reaction' button isn't displayed for message types that don't inherit from the standard mail.thread model, improving stability and usability.
Original PR description
Steps to reproduce: - Install the mail_group module - Open Discuss - Go to the History tab - Add a reaction on a message that has model mail.group - Throws an error The error occurs because the mail.group model does not implement the `_get_allowed_access_params()` method, which is invoked during the process here. Actually, the "add reaction" button should not be shown on messages whose model does not inherit from mail.thread. This commit fixes the issue by hiding the "add reaction" button on messages with models that don’t inherit from mail.thread, such as `mail.group`. community: https://github.com/odoo/odoo/pull/218615 Task-5098050 Forward-Port-Of: odoo/enterprise#111830 Forward-Port-Of: odoo/enterprise#111271
This update ensures that all attendees of an appointment, including internal users, receive booking notifications regardless of whether the booking syncs with external calendars. Previously, notifications were limited, leading to some users not receiving updates. This change improves communication and ensures everyone is informed about appointment details.
Original PR description
In [1] we prevented cancelation emails from being sent when the booking was synced via google or outlook calendar. However this means even followers who would not be notified by the mail provider (not assisting to the meeting) would not be notified. As well as the organizer who is doing to booking/cancelling from the perspective of the mail provider, as the meeting is created from their account. Instead we should keep sending the "appointment booked" template in all cases as it is only followed by internal users to whom it is always relevant. As for cancelation templates, it should stil be sent to internal users. Partners of the meeting however need not be notified and may be unsubscribed if syncing is enabled, as cancellation typically only happens once. task-5152917 [1]: https://github.com/odoo/enterprise/pull/60913 Forward-Port-Of: odoo/enterprise#111174 Forward-Port-Of: odoo/enterprise#96638
This update resolves an issue in Odoo's Web Studio where invisible fields were sometimes lost when users toggled the 'Show Invisible Elements' option. The fix ensures that invisible field settings are correctly retained and applied within the studio editor, improving the consistency of view customization for users.
Original PR description
Steps to reproduce ================== - Install contacts,web_studio - Login as admin - Go to contacts - Open any record - Open studio - Click on any field - Add the "Role / Portal" group - Toggle the…
Steps to reproduce ================== - Install contacts,web_studio - Login as admin - Go to contacts - Open any record - Open studio - Click on any field - Add the "Role / Portal" group - Toggle the "Show invisible Elements" checkbox - Click on the same field => The field is marked as invisible - Add an invisible condition => The invisible condition is lost (but still applied on the view) Cause of the issue ================== In studio, when fetching the view, the invisible attribute is set to True when the user does not have access to the field (when he is not part of the groups). The goal is to make the field invisible in studio unless the "Show invisible Elements" is toggled. But this causes the actual value of the invisible attribute to be lost. Note that this also applies to the column_invisible attribute. Solution ======== If an invisible/column_invisible attribute is present on the nodes with missing access, we copy the actual value to the `actual_invisible` attribute. We then use that value in the editor, when present. opw-6026971 Forward-Port-Of: odoo/enterprise#111751 Forward-Port-Of: odoo/enterprise#111299
This update fixes a potential issue where automated email systems (Mail Defender) could inadvertently cancel or reschedule appointments. The system now uses a form instead of a direct link, preventing these automated actions. This ensures appointments are handled correctly and reliably.
Original PR description
…ointments Mail defender services may click URLs in emails to verify their contents. Additionally they may sometimes interact with the page and visit related pages. For this reason URLs sent in emails should not trigger any action directly nor contain any simple link that could trigger an action. The "cancel/reschedule" anchor URL is replaced with a form which bots should not click. We also port the fix done in appointment to the view in appointment as it replaces the original view in this module. task-4555579 Forward-Port-Of: odoo/enterprise#111879 Forward-Port-Of: odoo/enterprise#79831
This update resolves a problem where translations were not appearing correctly in the Chilean e-invoicing module, specifically on Ubuntu Jammy and Debian Bookworm operating systems. The change converts a list comprehension to a standard for loop, ensuring translations are properly loaded and displayed.
Original PR description
This commit transforms the list comprehension into a regular for loop to avoid the translation missing context when looking up for lang. Note: the issue appeared more specifically on Ubuntu Jammy and Debian Bookworm. runbot-240951 Forward-Port-Of: odoo/enterprise#111147