Wednesday, March 4, 2026
25 changes · 19.0
New functionality added to Odoo
This update incorporates the Central Bank of Uzbekistan as a source for live currency rates. This change ensures Odoo can accurately reflect the current exchange rates for transactions involving the Uzbekistani currency, complying with local regulations and improving financial reporting accuracy.
Original PR description
## Description of the issue/feature this PR addresses: This PR adds the Central Bank of Uzbekistan as a provider for currency update task-id - 5917344 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Enhancements to existing features
This update speeds up testing for the Stock Barcode module by optimizing the initial setup process. The previous setup, which created a company, was a significant bottleneck. Moving this creation to a setup class will reduce test execution times, improving developer efficiency.
Original PR description
TestBarcodeClientAction [setup is quite slow](https://runbot229.odoo.com/runbot/static/build/102958171-master/tests/profile/profile_2.html#localProfilePath=1), especially because it creates a company. In addition in all classes extending this one, we spend at least 6 minutes on this line. (when testing sale_timesheet -> !stock_barcode_mrp_subcontracting) This commit proposes to move at least the company creation in a setupclass. It would be great to move all the setup in the setupclass but the tests are failling when doing so and could be achieved by a member of the stock_barcode owner team. Tests based on this setup should be a few minutes faster with this change.
Resolved issues and error corrections
This change prevents XML-RPC requests from failing when an Odoo action returns no value. It converts empty internal responses into a standard false response, keeping integrations and automated calls running smoothly while preserving developer warnings.
Original PR description
## Summary - When a model method returns `None` (e.g. `toggle_active`), calling it via XML-RPC raises a `TypeError: cannot marshal None unless allow_none is enabled` because the XML-RPC serializer uses `allow_none=False`. - This fix converts `None` return values to `False` in `execute_cr`, which is consistent with the XML-RPC protocol where `False` is the conventional "no value" response and avoids marshaling errors. - The existing log warning is preserved so developers are still informed when methods return `None`. Fixes #29768 --- *This PR was auto-generated by Gittensor bot using Claude AI to fix a reported issue.*
Documentation and clarification updates
This pull request adds a corporate Contributor License Agreement confirmation document. It is an administrative legal update that supports contribution compliance and does not affect product functionality.
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
The website configurator now opens directly in the correct full-screen state, preventing a brief navigation bar flash during setup. This makes the first-time website configuration experience smoother and less confusing for users.
Original PR description
Before this PR: Users were facing an issue of flickering when trying to configure a newly created website. The reason behind this was that the target was decided after the web client was mounted. When the action target is evaluated (i.e., new, current, or fullscreen), the navbar was hidden based on the target. In this commit, the state of the web client is now set based on the current action, specifically setting the fullscreen state for the website configurator to address the flickering issue. task-3050040
The point of sale customer list now keeps long email addresses on one line and shows the full address on hover. This makes the list easier to scan and keeps rows aligned consistently with action buttons.
Original PR description
Before this commit, long email addresses in the POS partner list would wrap awkwardly or expand the row height excessively, making the list difficult to read. Additionally, the vertical alignment between the text and the action buttons was inconsistent. This commit improves the Partner List UI by: - Truncating long email addresses - Adding a `title` attribute so the full email is visible on hover - Vertically centering all cell content to match the buttons. opw-5919153 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Installing a new language now updates the available language choices right away in user preferences. This avoids confusion and removes the need for users to manually reload the page after adding a language.
Original PR description
Before this commit, after installing a new language, that language wasn't directly available in the selection field of the user preference form view. An extra reload was necessary to see the new language, which could confuse the user. This was due to the cache. As installing a language isn't a frequent operation, we simply clear all caches when this happens. task~5895416 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
The Danish localization demo company now includes a street number in its address. This small correction helps ensure demo data works properly with Nemhandel requirements for Danish electronic invoicing.
Original PR description
This commit adds the street number to the DK demo company, because we need it for nemhandel. no-task Forward-Port-Of: odoo/odoo#250970
This fix makes arrow-key navigation work correctly inside table cells when a long, unbroken text wraps across multiple visible lines. Users can now move between the visual lines of text before jumping to another table cell, making editing tables smoother and less frustrating.
Original PR description
When navigating inside a table cell, if a single text node is rendered over several lines, the cursor up and down key go directly to the next cell instead of navigating to the (visually) previous or next line of text. This commit determines if the cursor position is within such positions inside a multi-line text node and prevents the table navigation if needed. Steps to reproduce: - Add a table with `/table` - Put a very long text (without paragraph splits) in the center cell, so that the text spans over several lines - Navigate with the up and down arrows => The cursor could not reach distinct lines within the text task-5417834
Creating a new contact with Studio-customized forms could trigger an error when selecting an autocomplete suggestion because a related company/contact field was still empty. This fix ensures the Peppol status check only runs once the required contact relationship is available, making contact creation smoother for affected users.
Original PR description
Before this commit, when commercial_partner_id is on the view (possible with web_studio), the value by default is False. When the autocomplete widget is used, many fields could be autofilled and raise _onchange_verify_peppol_status, that requires this field. To avoid this issue we review that the value has been filled. Steps to Reproduce: 1. Open the Contacts app 2. Open Studio on the contact form view 3. Add the field commercial_partner_id to the form view (make it visible) 4. Create a new contact 5. Type a name 6. Select a suggestion from the IAP autocomplete 7. An error is raised immediately OPW-[5896847](https://www.odoo.com/odoo/action-4043/5896847) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249961 Forward-Port-Of: odoo/odoo#248895
Spreadsheet chart types that use Odoo data now include placeholder names in the data source menu. This makes it easier for users to tell chart data sources apart when working with spreadsheets.
Original PR description
We recently added a lot of chart types that handle Odoo data but we failed to add a placeholder name (which is handy to differentiate them in the datasource menu). Task-5979722 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 fixes an issue where removing a product from a variant-specific pricelist rule could leave inconsistent rule data behind. After the change, the rule is reset to apply globally, helping prevent corrupted pricing rules and unexpected pricing behavior.
Original PR description
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to…
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to pricelist listing, select the pricelist - Edit price list rule - Remove the product - Save and check the data (applied_on, product_id, product_tmpl_id) (applied_on still 0_product_variant, product_id, and NO product_tmpl_id) Related ticket: opw-5411034 (Video: https://drive.google.com/file/d/1xmg9A9NgavFQkIFkUZrzuAxVF-PNqdnL/view) Description of the issue/feature this PR addresses: Fix corrupted data <img width="583" height="108" alt="image" src="https://github.com/user-attachments/assets/961e75f8-b2a6-4812-a0b4-d73e02d52b08" /> Current behavior before PR: product_tmpl_id set to None product_id / applied_on data stays the same Desired behavior after PR is merged: When product_tmpl_id is removed, reset the applied_on type back to 3_global --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250531 Forward-Port-Of: odoo/odoo#249417
This fix makes the self-order checkout tests select a specific time slot instead of relying on whichever slot appears first. It helps ensure time slot availability is checked consistently, reducing false failures in automated validation.
Original PR description
The selected time slot was not the right one as the time of the execution influed on the first choice available. We now specify which time slot to take, and check that this specific timeslot is not available anymore afterwards. runbot-233381 Forward-Port-Of: odoo/odoo#233469
This fix ensures that when Odoo is launched through the module command, a platform-provided data directory setting is correctly honored. It helps hosting platforms enforce where system data is stored, even when users can edit their own configuration files.
Original PR description
The prefered way is to use the odoorc config file, but some plateforms let their users configure their config file, but --data-dir should be enforced by the plateform.
This fixes a small issue in the mass mailing email editor where the system could incorrectly decide whether the current selection was in an editable area. The change helps prevent editing behavior from being blocked or applied incorrectly when working with mailing content.
Original PR description
Description of the issue/feature this PR addresses: This PR makes sure `isSelectionInEditable` is correctly checked in `EmptyNotEditableElementsPlugin`. `isSelectionInEditable` is a shared method previous code interpreted it as property. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue where the guided tour pointer could disappear when the highlighted element changed, such as inside pop-up windows. This keeps onboarding and in-app guidance visible and easier to follow for users.
Original PR description
Before this commit, the pointer disappeared when the active element change before the anchor of the tour pointer. So, it was not visible in modals for example. Now, the check is done when the active element change and when the isVisisble is read. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change stabilizes an internal stock inventory test that could fail unpredictably even when the system behavior was correct. It ensures the latest inventory data is saved before the cleanup check runs, reducing false failures in automated validation and improving release confidence.
Original PR description
In Signal app, the test `test_set_inventory_quant_to_zero` was failing randomly when asserting that the quant no longer exists after calling `_unlink_zero_quants()`. All required conditions for deletion were met: - inventory_quantity == 0 - user_id is False - quantity == 0 - reserved_quantity == 0 The method `_unlink_zero_quants()` performs a raw SQL query to select zero quants. Since raw SQL does not trigger an automatic ORM flush, the quant state could be out-of-sync with the database at the time of the query, making the deletion non-deterministic. Add an explicit `flush_all()` before calling `_unlink_zero_quants()` in the test to ensure the database reflects the latest ORM state and avoid random failures. Runbot-241210
The mail app now ignores inactive blacklist records when checking whether a user or email address is blocked. This prevents outdated or disabled blacklist entries from incorrectly stopping legitimate mail communication.
Original PR description
Same as https://github.com/odoo/odoo/pull/249466, but for v17 and with tests. > When computing wether the user is blacklisted, disabled records must be ignored. > > https://www.loom.com/share/41ea437477f8416f8b50f9ef979d82bf > > > --- > I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr > > @moduon MT-13153 OPW-5952301 Forward-Port-Of: odoo/odoo#250361
This update resolves a test failure related to holiday attestations in the Belgian payroll module. Adding a 'freeze_time' setting to the test ensures accurate calculations and prevents errors during automated testing. This ensures the correct processing of holiday pay calculations.
Original PR description
Addind freeze_time to Fix holiday attest test that failed on the runbot
This update resolves an issue where approval rules for account moves incorrectly linked actions to the list view. The change ensures that when an approval rule is applied, the associated list view action is automatically deactivated, streamlining the approval process and preventing unintended actions. This improves the reliability and usability of the approval workflow.
Original PR description
Following commit odoo/odoo@c442f72479b50855f40ba079800ee9e5a5690753 When putting an approval rule action_post (account.move) the action bound to the list view must be deactivated. opw-5921128
This update fixes an issue where payslips weren't being generated correctly for employees with flexible working hours. The system now automatically creates work entries for these employees when a payslip is created, ensuring accurate payroll calculations. This improves the reliability of payroll processing for a wider range of employee types.
Original PR description
**Version:** - 19.0 **Steps to reproduce:** - Create an employee. - Leave the Working Hours field empty. - Set the contract dates and a wage. - Create a payslip using the smart button. **Issue:** - Worked day lines are empty for flexible employees when the payslip is created from the smart button. **Cause:** - Flexible employees were being skipped because their working hours were empty, which results in work entries not being generated. **Solution:** - Updated the condition to also generate work entries for flexible employees. Task-5431870
This update corrects an issue where shift durations weren't accurately displayed in the Planning app when shifts spanned across multiple days. The fix removes outdated logic that previously truncated pill names based on hour spans, ensuring correct duration information is shown regardless of the shift's length. This improves the accuracy of shift scheduling and reporting.
Original PR description
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an…
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an employee from 3pm to 2am (over two days) - The hours of the shift are displayed - Modify the shift end to 3am - The hours of the shift aren't displayed ### Cause: Before the refactor adapting the gantt view to OWL, when a shift spanned over two days less than three hours, then the gantt view truncated the pill to display it in only one day. (see [`_snapToGrid()`](https://github.com/odoo/enterprise/blame/a16b2ef569903c0ae5803c169dbd68acd0141fe1/web_gantt/static/src/js/gantt_row.js#L1044-L1072)) The same logic was done for the computation of the pill's name in [this commit](https://github.com/odoo/enterprise/commit/98a86cbacf484646f486e4648788cfa53cc9648c). But as the pills are no longer truncated since 17.0, the computation of pill names is faulty. ### Solution: We remove the checks of the 3-hour margin. This also makes the variable `spanMoreThanOneDay` useless, so we delete it. opw-5881532 Forward-Port-Of: odoo/enterprise#109314 Forward-Port-Of: odoo/enterprise#107233
This update resolves a problem preventing the correct generation of CSV reports for Peru-specific financial reports. The issue stemmed from incompatible CSV formatting settings within the Odoo system, specifically related to Python 3.13. The fix ensures reports are generated correctly, maintaining data accuracy for Peruvian accounting.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#109081This update fixes a restriction preventing all managers from viewing their subordinates' voip call records. The change updates a security rule to grant access through the standard 'group_user' group, ensuring consistent access for all managers. This simplifies access management and improves usability.
Original PR description
voip_hr defines a record rule that gives managers access to their subordinates' voip.call records. However, this rule is linked to the group 'hr.group_hr_user', which is not granted to all managers. This commit links the rule to the base.group_user group instead, so that all managers can access their subordinates' records without the need for an additional group. [Task-5363640](https://www.odoo.com/odoo/project/5778/tasks/5363640).
This change corrects a display issue where upsell sale orders created from subscriptions incorrectly showed as "Quotation" instead of a standard sale order. The fix ensures that upsell orders now match the naming convention of other sale orders, improving clarity and consistency within the system. This prevents confusion for users managing subscription and upsell transactions.
Original PR description
## Issue When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate. <img width="1330" height="296" alt="5489970"…
## Issue
When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate.
<img width="1330" height="296" alt="5489970" src="https://github.com/user-attachments/assets/cfff4c7a-fff7-4859-861b-c190dab9097d" />
## Steps to reproduce
1. Install *Subscription* (`sale_subscription`)
2. Create a Subscription S00001
- Any Customer
- Any Recurring Plan
- Any Product
3. Create and confirm the invoice for the subscription S00001
4. On the subscription S, click Upsell and confirm the resulting Sale Order S00002
5. On the Sale Order S00002, click Preview
6. **The title of the Sale Order is "Quotation - S000002". In the sale.order list view, the Sale Order is shown as a Sales order, just like the initial Subscription.**
## Cause
The title shown in the preview is defined here:
https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/sale_subscription/views/sale_subscription_portal_templates.xml#L187-L195
The initial subscription falls into the `if` condition, which only shows the name of the SO. The upsell sale order is not considered as a subscription, as explained and showed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L193-L201
The word *"Quotation"* shown in the preview is the `sale_order.type_name`", computed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L227-L237
The term "Quotation" was chosen in https://github.com/odoo/enterprise/commit/14e5cff65affa888f33d4008d10a32e6992d3a39.
## Fix
Before this commit, an upsell would always be named *"Quotation"*. With this commit, upsells are now added to the `other_orders` variable in `_compute_type_name` and follow the same logic as other SO:
https://github.com/odoo/odoo/blob/a3bf9264ca25ec11b0c9742e142d2404cac6d261/addons/sale/models/sale_order.py#L797-L803
<img width="1316" height="308" alt="5479900_2" src="https://github.com/user-attachments/assets/7cfeb578-2870-43a6-a48b-ba0898718641" />
## Alternative
An alternative to this fix would be to update the condition used to display the name of the subscription in the preview (cf. first code snippet). This would probably result in removing the `sale_order.is_subscription` from the condition, as it is the part of the condition that upsell SOs do not meet.
opw-5489970
Forward-Port-Of: odoo/enterprise#109268
Forward-Port-Of: odoo/enterprise#106767