Tuesday, April 15, 2025
19 changes · 18.0
Enhancements to existing features
Customers using self-ordering can now see the information button while configuring combo products. This makes it easier to view product details during selection, improving clarity before placing an order.
Original PR description
Before this commit: - No `I` button was displayed on configuring combo products Following this commit: - The `I` button is made visible when configuring combo products. task-4654063
This update adds a required version of the Paramiko software dependency used for secure remote connections. It helps keep the system environment consistent and reduces setup differences across installations.
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
Resolved issues and error corrections
The portal rating comment box now clears saved draft content when a comment is posted or cancelled. It also prevents crashes caused by users saving the same comment twice, improving reliability for portal discussions.
Original PR description
Fix some issues related to the comment composer in portal chatter. task-4715576
Miscellaneous changes
__Current behavior before commit:__ The Cloudflare Turnstile token expires every 300 seconds (see [Cloudflare doc][1]) which makes the widget reload. There was currently no callback handling this event. If the check had already succeeded, the spinner of the button would have been removed. Thus the second time `turnstileSuccess` would be called, `spinner` would be `null` and it would throw an error when reading `spinner.parentElement`. __Description of the fix:__ Hid the spinner in `
Original PR description
__Current behavior before commit:__ The Cloudflare Turnstile token expires every 300 seconds (see [Cloudflare doc][1]) which makes the widget reload. There was currently no callback handling this…
__Current behavior before commit:__ The Cloudflare Turnstile token expires every 300 seconds (see [Cloudflare doc][1]) which makes the widget reload. There was currently no callback handling this event. If the check had already succeeded, the spinner of the button would have been removed. Thus the second time `turnstileSuccess` would be called, `spinner` would be `null` and it would throw an error when reading `spinner.parentElement`. __Description of the fix:__ Hid the spinner in `turnstileSuccess` instead of removing it. Added an `expired-callback` to show the spinner back on the button. __Steps to reproduce the issue on runbot:__ 1. Enable and configure Cloudflare Turnstile 2. Go to the `/contactus` page 3. Check the box, wait 5 minutes and check the box again [1]: https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#:~:text=the%20next%20300%20seconds opw-4629962 opw-4681945 opw-4620019 opw-4615863 opw-4640032 Forward-Port-Of: odoo/odoo#202893
Chat messages no longer briefly change width while they are being sent. This removes a small visual flicker, making conversations feel more stable and polished for users.
Original PR description
Before this commit, when posting a message in chat window, the new message being posted had its size flicker momentarily. This happens because when posting a new message, the message list contains a temporary message with the content momentarily and soon replaced by the genuine message from server data. The genuine message shows quick actions like "Add a reaction", which the temporary message has not. Since these quick actions take some horizontal place, the temporary message was bigger on width than an actual message, which results to this flickering when the message takes more than 1 line. This commit fixes the issue by allocating some space when a message has less (or no) available quick actions, so that their size matches with genuine message that have quick actions. Before / After  
This fix prevents the website menu from crashing when an expected mobile mega menu element is missing. It helps keep edited or older website pages working reliably instead of breaking the visitor experience.
Original PR description
This commit ensures that the mega menu toggles are only accessed if they exist in the DOM. This prevents a crash when the mega menu toggles are not present. The PR that added this code can be found here: 5be1280 This first appeared in an 18.1 ticket where a customer had a view created by the web editor that was missing the expected mega menu mobile version. This view had been edited and not upgraded properly, leading to a case where the mobile mega menu toggle element was not present. opw-4670537
This fix prevents accidental selection of a hovered @mention suggestion when users press Enter in Discuss or chatter. Keyboard selection now stays predictable, reducing mistakes when quickly mentioning someone.
Original PR description
Before this commit, when typing a `@mention` in a discuss or chatter composer, pressing ENTER was selecting the item hovered on cursor rather than the 1st item. This happens because by default the…
Before this commit, when typing a `@mention` in a discuss or chatter composer, pressing ENTER was selecting the item hovered on cursor rather than the 1st item. This happens because by default the active suggestion is the 1st one in list, and keyboard navigation changes the active item. However mouse-enter was also selecting the active item. When the suggestion opens initially, if the cursor happens to be on the list, it is being considered as a `mouseenter` this it sets the active suggestion. This is a problem because this is very prone to mistakes. The feature to set the active item for following keyboard navigation is very niche and not necessarily much intuitive than just typing more specific search and rely solely on keyboard navigation or mouse-click. One solution could be to only take mouse hover into account if it moves after the suggestion list is rendered, but this is still prone to mistakes like people typing on a laptop keyboard while accidentally touching the trackpad. This commit fixes the issue by making mouse-hover on suggestion list only trigger the visual style but it doesn't change the internal state of the active suggestion. Task-4724275 Cursor in middle of suggestion list, quickly `@` + `ENTER` Before (selects suggestion in middle of list, at cursor position)  After (selects 1st suggestion in list, independently of cursor position in list) 
This update documents why certain hidden fields are still needed in Swiss localization screens and removes hidden fields that are no longer necessary. It helps keep the module compliant with Odoo view guidelines without changing day-to-day user workflows.
Original PR description
Before this commit, several invisible fields were present in the views in `l10n_ch`, whereas after https://github.com/odoo/odoo/pull/162009 these fields need to be either justified or removed. This commit adds comment for the fields that are needed, and removes the unnecessary ones. opw-4629332 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Guided tours now wait correctly when dropdown options are still loading, preventing the flow from jumping back to the previous input step. This makes automated walkthroughs and onboarding checks more reliable for users and testers.
Original PR description
Before this commit, if the tour steps was "edit input" then "click second element dropdown", the tour was stuck and was backwarding to the "edit input" because during a moment the dropdown had only one element (the loading). Now, the loading will be taken in account to wait for the next mutation observer for the case of a dropdown TASK-ID: 4623449 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Sales app’s sample quotation button now points to a valid PDF link. This prevents users from seeing a blank 404 error page when exploring the feature without demo data installed.
Original PR description
Currently, a 404 error is occurring when the user clicks on the Check the sample button. <b>Steps to reproduce this issue:</b> 1) Install sales without demo data 2) Click on the `Check a sample. Its clean!` button <b>Issue:- </b> A 404 error occurs with a blank page <b>Cause:-</b> This issue is occurring because the link to open the sample quotation was changed in the Odoo documentation. <b>Solution:-</b> Give a valid link to open the sample quotation pdf opw-4708039
There is an issue in the line template, where the 'vals' of the line are reassigned to the 'price_vals' when building the 'cac:Price'. This means that any extension done to add values after the price no longer have access to the line vals but only the price ones. This is unwanted, and the template is adapted to avoid reassigning 'vals'. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205827
Original PR description
There is an issue in the line template, where the 'vals' of the line are reassigned to the 'price_vals' when building the 'cac:Price'. This means that any extension done to add values after the price no longer have access to the line vals but only the price ones. This is unwanted, and the template is adapted to avoid reassigning 'vals'. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205827
Steps to reproduce: - Have a pricelist with rules. - Add this pricelist as the default one for a POS (kiosk). - Open the kiosk and add the products to trigger the price rule Issue: The price rule is not taken into account. This occurs because the kiosk currently does not set the order pricelist in kiosk mode. Also, pricelist rules are not loaded as it occurs in normal POS session [1] [1] https://github.com/odoo/odoo/blob/c8d7452063a4712b03b6d23e944ff283bdcea857/addons/point_of_sale
Original PR description
Steps to reproduce: - Have a pricelist with rules. - Add this pricelist as the default one for a POS (kiosk). - Open the kiosk and add the products to trigger the price rule Issue: The price rule is not taken into account. This occurs because the kiosk currently does not set the order pricelist in kiosk mode. Also, pricelist rules are not loaded as it occurs in normal POS session [1] [1] https://github.com/odoo/odoo/blob/c8d7452063a4712b03b6d23e944ff283bdcea857/addons/point_of_sale/static/src/app/store/pos_store.js#L417 This commit aim to restore the pricelist functionality by loading the pricelist rules at startup like `computeProductPricelistCache` does opw-4553345 Forward-Port-Of: odoo/odoo#199942
### Steps to reproduce: - Install "l10n_hu" and switch to Hungarian company - In Settings set NAV credentials to "demo" - Make sure accounts are set on the company & customer - Create an invoice, confirm, Sent & Print - Create a Credit Note for this invoice, Send & Print - On the Credit Note PDF the account of the customer is displayed under the "Supplier" ### Cause: The account always shows under the supplier `if 'out' in o.move_type` so also for credit notes ('out_refund'). ### So
Original PR description
### Steps to reproduce:
- Install "l10n_hu" and switch to Hungarian company
- In Settings set NAV credentials to "demo"
- Make sure accounts are set on the company & customer
- Create an invoice, confirm, Sent & Print
- Create a Credit Note for this invoice, Send & Print
- On the Credit Note PDF the account of the customer is displayed under the "Supplier"
### Cause:
The account always shows under the supplier `if 'out' in o.move_type` so also for credit notes ('out_refund').
### Solution:
Change the condition of the display and add the bank account in a xpath.
opw-4710449
Forward-Port-Of: odoo/odoo#205724[REF] web: move default dates to a function - getAllDayDates function was added to be able to inherit it in other modules and change default dates if needed. task-4164485 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205456 Forward-Port-Of: odoo/odoo#189917
Original PR description
[REF] web: move default dates to a function - getAllDayDates function was added to be able to inherit it in other modules and change default dates if needed. task-4164485 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205456 Forward-Port-Of: odoo/odoo#189917
**Current behavior:** Using auto valuation and anglo saxon accounting, when a project has some profitability report items for auto valued product, the COGS invoice lines will appear under the revenue section rather than the cost section of the project's profitability report. **Expected behavior:** COGS lines are shown as costs. **Steps to reproduce:** 1. Create a service product that generates a project on sale, on the project template set a specific analytic account 2. Create anothe
Original PR description
**Current behavior:** Using auto valuation and anglo saxon accounting, when a project has some profitability report items for auto valued product, the COGS invoice lines will appear under the revenue…
**Current behavior:** Using auto valuation and anglo saxon accounting, when a project has some profitability report items for auto valued product, the COGS invoice lines will appear under the revenue section rather than the cost section of the project's profitability report. **Expected behavior:** COGS lines are shown as costs. **Steps to reproduce:** 1. Create a service product that generates a project on sale, on the project template set a specific analytic account 2. Create another product with real time valuation and assign the COGS account on the product category's expense account 3. Sell some of the service product and the auto val product in the same order, deliver it -> generate invoice & post it 4. In the project's settings, open the profitability report observe that the invoice line for the cost of goods sold account entry is displayed as a negative revenue, rather than a cost **Cause of the issue:** In `sale_project` there is no logic to separate the COGS AMLs from the rest of an invoice's line ids. **Fix:** Transform the loop in `_get_revenues_items_from_invoices` https://github.com/odoo/odoo/blob/bb6a4fbb92b1a1a1e13e32b27c4c9f2813570fda/addons/sale_project/models/project.py#L656 into two loops such that the existing one iterates twice. First iteration collects the `revenues` items data (exactly as it currently does) Second iteration collects the `costs` items (cogs lines) And the method will now return a dict of data for both `revenues` report items and `costs` report items (and should be renamed/refactored in master) opw-4652472 Forward-Port-Of: odoo/odoo#205457 Forward-Port-Of: odoo/odoo#203936
Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM.
Original PR description
Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM. - In the Gantt view on the weekly scale, creating a planning slot defaults to 8 AM to 5 PM. - These default hours do not align with the working calendar, leading to inconsistencies. - This fix adjusts the default hour settings in both views to ensure they align with the working calendar and account for unavailability. task-4164485 Forward-Port-Of: odoo/enterprise#83191 Forward-Port-Of: odoo/enterprise#69888
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least one of the EDI documents falls under one of the domains in `_get_update_sat_status_domains`. In particular, the 'Update SAT' status is visible if there is an EDI document with the 'invoice_sent' status and whose SAT status is not 'cancelled' or 'skip'. If the user requests the cancellation of th
Original PR description
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least…
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least one of the EDI documents falls under one of the domains in `_get_update_sat_status_domains`. In particular, the 'Update SAT' status is visible if there is an EDI document with the 'invoice_sent' status and whose SAT status is not 'cancelled' or 'skip'. If the user requests the cancellation of the CFDI before the SAT status is fetched for the first EDI document (which represents the sending of the invoice), its SAT status will be set to 'skip'. As a result, the 'Update SAT' button will no longer be visible, meaning that the user can not update the invoice's state from fetching the SAT status.  Fix: The Update SAT button should also be visible if there is a document in 'invoice_cancel_requested' whose SAT state is valid. opw-4375788 Forward-Port-Of: odoo/enterprise#83289
Before this commit, the `/iot/get_handlers` endpoint was using the `text/html` mime type, even though it was sending a binary zip response. This was mostly harmless, however it could potentially cause issues if there was some service between the IoT box and DB that assumed it was safe to modify the "text" response in some way. opw-4718821 Forward-Port-Of: odoo/enterprise#83315
Original PR description
Before this commit, the `/iot/get_handlers` endpoint was using the `text/html` mime type, even though it was sending a binary zip response. This was mostly harmless, however it could potentially cause issues if there was some service between the IoT box and DB that assumed it was safe to modify the "text" response in some way. opw-4718821 Forward-Port-Of: odoo/enterprise#83315
Previously, POL did not have a `discount` field which meant that the `discount` of a SOL was transferred in the `price_unit` of the POL. For example, the following SO: Product | Unit Price | Discount | Tax Excl. ------------|------------|----------|---------- Product A | $1000.0 | 10.0% | $900.0 Would be converted into the following PO Product | Unit Price | Tax Excl. ------------|------------|---------- Product A | $900.0 | $900.0 However, as of V17, it
Original PR description
Previously, POL did not have a `discount` field which meant that the `discount` of a SOL was transferred in the `price_unit` of the POL. For example, the following SO: Product | Unit Price | Discount | Tax Excl. ------------|------------|----------|---------- Product A | $1000.0 | 10.0% | $900.0 Would be converted into the following PO Product | Unit Price | Tax Excl. ------------|------------|---------- Product A | $900.0 | $900.0 However, as of V17, it is possible to add discount on POL, but are not taken into account when converting into SOL. With this commit, the discounts are now synchronized when going from SOL->POL and inversely. opw-4446288 Forward-Port-Of: odoo/enterprise#82346 Forward-Port-Of: odoo/enterprise#82079