Daily updates from Odoo
Wednesday, April 30, 2025
27 changes · 18.0
Enhancements to existing features
The Ecuadorian accounting setup has been updated to better organize expense and cost of revenue accounts. This helps companies using the Ecuador localization classify financial transactions more accurately for reporting and day-to-day accounting.
Original PR description
We improved the distribution of expense and cost of revenue accounts in Ecuadorian localization
Resolved issues and error corrections
Long blog post titles now stay within their display area in the Website blog kanban view. This prevents titles from overlapping nearby elements, making the page list easier to read and use.
Original PR description
<b>Steps to reproduce:</b> 1. Install website_blog. 2. Go to Website > Site > Blog Posts > Kanban View. <b>Issue:</b> The titles in the Blog Post Pages are not displaying correctly. When the titles had long text, they overflowed their container boundaries and visually overlapped adjacent UI elements. The text-truncate class was not solving the problem, causing the titles to still overlap. <b>Solution:</b> Fixed the text overflow by applying the d-block class directly to the field element, ensuring proper containment and preventing overlap. opw-4635231
This fix stops Odoo from increasing a purchase order again when only part of a make-to-order delivery is completed and the rest is backordered. Businesses using make-to-order purchasing will avoid inflated supplier demand and accidental over-ordering.
Original PR description
### Steps to reproduce: - In the settings enable Multi-Step routes - Unarchive the MTO route - Create a storable product using the MTO and buy route - Create and confirm a sale order for 100 units of…
### Steps to reproduce: - In the settings enable Multi-Step routes - Unarchive the MTO route - Create a storable product using the MTO and buy route - Create and confirm a sale order for 100 units of that product - Validate the delivery for only 30 units and backorder the rest #### > The purchase order demand was updated to 170 units ### Cause of the issue: Since the refactoring a72382063ee662010729d983fbf6fb6305b8adf2 the rule of the MTO route is purely MTO. Furthermore, the moves creating and running a procurement are added depending solely on their `procure_method` during the `_action_confirm`: https://github.com/odoo/odoo/blob/1dd360658222c0afeb268a5c8cf435defddf55d1/addons/stock/models/stock_move.py#L1485-L1496 https://github.com/odoo/odoo/blob/1dd360658222c0afeb268a5c8cf435defddf55d1/addons/stock/models/stock_move.py#L1503-L1513 In our use case, the delivery move is therefore created as `mto` and then creates and run a procurments creating the PO during its confirmation. However, when it is backordered, the backorder move is also created and confirmed as `mto` by the `_create_backorder` call: https://github.com/odoo/odoo/blob/02a370a7a34a42f2bc9f668eee756fb466db8722/addons/stock/models/stock_move.py#L2071-L2075 It will therefore also automatically create and run a procurment that will in turn modify the current PO. opw-4633920 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Admin users now have the needed stock lot permission during picking tour tests, ensuring the lot field appears as expected. This prevents an automated stock workflow test from failing and helps keep inventory processes stable.
Original PR description
lot_id was column that needs stock.group_production_lot group to be visible to admin user, so it was not visible in the list view of stock.picking.tour and the tour depends on it visibility build_error-111685
The CRM onboarding tour now keeps its guidance bubble visible until an opportunity is dropped into the correct stage. This helps users complete the guided workflow reliably and avoids confusion when dragging records in the CRM pipeline.
Original PR description
Fix drag and drop in CRM tour because the tour bubble disappear if the record has not been dropped in the correct column. Now the tour bubble will stay visible until the opportunity is dropped in the correct stage. Still taking the last record of first column first, then last of second column, etc ... Task-4624497 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Attendance kiosk link now opens using the company’s preferred language by default, rather than being affected by the current user’s language after the page route is chosen. This gives employees a more consistent kiosk experience while still allowing approved language changes through the URL when needed.
Original PR description
**Steps to reproduce:** - Enable multiple languages - Set Company contact language to the language you want by default in the kiosk - Set another language for the user - Go to Attendance app then…
**Steps to reproduce:** - Enable multiple languages - Set Company contact language to the language you want by default in the kiosk - Set another language for the user - Go to Attendance app then Kiosk Mode - Kiosk will be displayed using the company language - There is no way to change the language for the user (but the URL still accept `.../LANG_CODE/hr_attendance/...`) **Issue:** Kiosk language is computed after url routing, this means the user has no way to change it manually if needed. Changing the URL directly results in inconsistent behaviour (valid /fr/ URL with arabic content for example). **Fix:** Updated the kiosk URL computation to default to the company's (or user's) language before the URL routing is done. This ensures that the kiosk button directs users to the company's default language page while allowing manual URL modification to switch to other allowed languages. opw-4659403 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an error that could prevent users from opening hierarchy and subtotal details in the Profit and Loss report when a financial budget is selected. This ensures accounting users can review budget-related report breakdowns without interruption.
Original PR description
A traceback occurs when attempting to view the 'Hierarchy and Subtotals' of an
Account Group with a Financial Budget set in the 'Profit and Loss' report.
Steps to reproduce:
-------------------
* Open Accounting in debug mode
* In Configuration > Accounting > Financial Budgets create a new budget
* In Configuration > Accounting > Account Groups create a new group
* Open Reporting > Statement Report > Profit and Loss
* Select the budget and Hierarchy and Subtotals
* Click on Revenues
* Traceback
> Observation:
File '/home/odoo/src/enterprise/18.0/account_reports/models/account_report.py', line 1035, in compute_group_totals
hierarchy_total + (column.get('no_format') or 0.0) if isinstance(hierarchy_total, float) else hierarchy_total
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for +: 'float' and 'str'
Why the fix:
------------
Add float verification to ensure valid operation in the hierarchy.
opw-4628498This update ensures the Monster recruitment integration depends on the module that provides a required recruitment settings option. It prevents configuration screens from failing when related recruitment extraction services are not installed.
Original PR description
`hr_recruitment_integration_monster` bases one of its view overrides on `<setting id="job_board">`. This element is added by the `hr_recruitment_extract` module, but there is no dependency between the two. `hr_recruitment_integration_monster` only depends on `hr_recruitment_integration_base` which only depends on `hr_recruitment`. `hr_recruitment_extract` depends on `hr_recruitment` but also `iap`, `iap_mail`, and `mail_enterprise`. If any of these last 3 modules is uninstalled, `hr_recruitment_extract` will be uninstalled and the `res_config_settings_view_form` view will explode the first time it gets resolved / validated.
Users can now insert Planning pivot data into spreadsheets without hitting an error when project planning is enabled. This prevents a workflow interruption for teams using planning and timesheet features together.
Original PR description
Currently, an error is raised when users attempt to insert data into a spreadsheet under the following conditions: - Install the modules `timesheet_grid` and `planning`. - Navigate to Planning > Configuration > Settings and enable the `Project Planning` option. - Navigate to Schedule > By Resource > Open Pivot View. - Click on Insert in Spreadsheet. `KeyError: 'effective_hours'` The error occurs because the system attempts to access a missing key `effective_hours` directly with `r[f]` [1], resulting in a KeyError. Link[1]: https://github.com/odoo/enterprise/blob/6d0ee2d7a8141ada362726279bfee77cee937aae/planning/models/planning.py#L723 To resolve this issue, we use `get()` to retrieve the value of the key, ensuring that if the key is missing an error will not occur. sentry-6220456284
The customer statement total now correctly includes both customer invoices and vendor bills for the same partner. This prevents understated or misleading balances when a partner has payable amounts, including on older deprecated accounts.
Original PR description
Steps: - Create a partner P - Create an invoice for 200 and a bill for 100 with P as partner - Go to P form view -> The 'Customer Statement' smart button show 200 instead of 100 This is because the total due does not take into account the accounts of type `liability_payable` in the unreconciled aml domain. With this commit, we adapt the domain to include the good accounts. We also include deprecated accounts. Although it is unlikely to have unreconciled aml from these accounts, it is reflected in the customer statement, so it needs to be computed in the total due. opw-4664402
WhatsApp messages that take longer to process now have more time to complete before timing out. This helps complex messages send successfully instead of failing too quickly when the external service responds slowly.
Original PR description
### Before this PR the timeout is 10 for both connect and read timeout ### After this PR I you send complex messages , the graph endpoint will not answer in 10 seconds. With this PR it is increased the read timeout to 60 seconds
Miscellaneous changes
odoo/odoo#203874 broke compatibility with Python 3.8 and Python 3.9 due to the typing annotations, leading `test_pylint` to fail on Focal and Bullseye: - `list[int]` requires Python 3.9 (PEP 585) - type-wise `a | b` requires Python 3.10 (PEP 604) Making annotations lazy works around the issue (and changes less stuff than removing the annotations). Forward-Port-Of: odoo/odoo#208110
Original PR description
odoo/odoo#203874 broke compatibility with Python 3.8 and Python 3.9 due to the typing annotations, leading `test_pylint` to fail on Focal and Bullseye: - `list[int]` requires Python 3.9 (PEP 585) - type-wise `a | b` requires Python 3.10 (PEP 604) Making annotations lazy works around the issue (and changes less stuff than removing the annotations). Forward-Port-Of: odoo/odoo#208110
Versions -------- - 16.0+ Steps ----- 1. Enable Paypal as payment provider; 2. have a US-based partner; 3. sent them a payment link; 4. pay using Paypal; 5. open transaction on Paypal backend. Issue ----- No delivery address is registered, making the merchant ineligible for seller protection. Cause ----- Commit 00259dc44a981 added the `no_shipping: '1'` value to the form sent to Paypal to prevent buyers from changing their shipping address on Paypal's end. A side-effect is t
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Enable Paypal as payment provider; 2. have a US-based partner; 3. sent them a payment link; 4. pay using Paypal; 5. open transaction on Paypal backend. Issue…
Versions -------- - 16.0+ Steps ----- 1. Enable Paypal as payment provider; 2. have a US-based partner; 3. sent them a payment link; 4. pay using Paypal; 5. open transaction on Paypal backend. Issue ----- No delivery address is registered, making the merchant ineligible for seller protection. Cause ----- Commit 00259dc44a981 added the `no_shipping: '1'` value to the form sent to Paypal to prevent buyers from changing their shipping address on Paypal's end. A side-effect is that it doesn't even register the address provided with the transaction. Solution (16.0 up to saas-17.4) ------------------------------- Use the `address_override: '1'` value instead, which prevents buyers from changing the address while still registering the address on the transaction. In stable, keep the `no_shipping: '1'` value in the rendering values so that user's cannot suddenly change the address again if template hasn't been updated yet. Solution (18.0+) ---------------- Change the `shipping_preference` value from `NO_SHIPPING` to `SET_PROVIDED_ADDRESS`[^1]. opw-4681336 [^1]: https://developer.paypal.com/docs/checkout/standard/customize/shipping-module/#:~:text=Configuring%20shipping%20preferences Forward-Port-Of: odoo/odoo#205751 Forward-Port-Of: odoo/odoo#205686
Versions -------- - 17.0+ Steps ----- 1. Create a product with 3 attributes; 2. add a never-create multi-select attribute; 3. archive the first two variants; 4. publish the product to eCommerce; 5. open /shop. Issue ----- > 500: Internal Server Error Cause ----- Commit 30994723e9ee5 updated the `_cartesian_product` method to handle `multi`-type attributes. When these are on the last attribute line, the method will yield the current partial combination. Issue is when conti
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Create a product with 3 attributes; 2. add a never-create multi-select attribute; 3. archive the first two variants; 4. publish the product to eCommerce; 5.…
Versions -------- - 17.0+ Steps ----- 1. Create a product with 3 attributes; 2. add a never-create multi-select attribute; 3. archive the first two variants; 4. publish the product to eCommerce; 5. open /shop. Issue ----- > 500: Internal Server Error Cause ----- Commit 30994723e9ee5 updated the `_cartesian_product` method to handle `multi`-type attributes. When these are on the last attribute line, the method will yield the current partial combination. Issue is when continuing after the `yield`, it attempts to get the `current_ptav_index` from the `current_line_values` recordset, which is empty for `multi`-type attributes. This causes an `IndexError`. Solution -------- Only assign the `current_ptav` variable if `current_line_values` is not falsey, i.e. isn't on a `multi` attribute line. Because `current_ptav_index` will always be `-1` in this scenario, it will skip over the conditional branches where `current_ptav` gets used, and instead go to either `continue` or `break`. opw-4653696 Forward-Port-Of: odoo/odoo#203093
**Problem:** Newly created users on the portal can click the 'verify email' button multiple times quickly, leading to the generation of multiple verification emails without refreshing the page. **Steps to Reproduce:** 1. Create a new user on the website. 2. Sign in as the new user and navigate to the 'Forum' page. 3. Click the 'verify email' button multiple times quickly. 4. Check Mailhog / Network requests for multiple verification emails. opw-4122195 Forward-Port-Of: odoo/odoo#2073
Original PR description
**Problem:** Newly created users on the portal can click the 'verify email' button multiple times quickly, leading to the generation of multiple verification emails without refreshing the page. **Steps to Reproduce:** 1. Create a new user on the website. 2. Sign in as the new user and navigate to the 'Forum' page. 3. Click the 'verify email' button multiple times quickly. 4. Check Mailhog / Network requests for multiple verification emails. opw-4122195 Forward-Port-Of: odoo/odoo#207342 Forward-Port-Of: odoo/odoo#181628
Forward-Port-Of: odoo/odoo#208076
Original PR description
Forward-Port-Of: odoo/odoo#208076
When we reflect inherit models in the database, we walk through the MRO to have access to the module that added the info. This mean that we skipped the inherits created by delegate fields (the info is in the `_inherits` of the final model in the registry, but we don't process it as we don't know the origin module). 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 th
Original PR description
When we reflect inherit models in the database, we walk through the MRO to have access to the module that added the info. This mean that we skipped the inherits created by delegate fields (the info is in the `_inherits` of the final model in the registry, but we don't process it as we don't know the origin module). Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#199109
…taxes are included in price Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205925
Original PR description
…taxes are included in price Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205925
When the user changes the language in My Profile and tries to save, a traceback will appear. Steps to reproduce the error: - Install ``sign`` and ``hr`` module. - Activate multi languages - Go to Sign > Reports > Green Savings - Click on the profile icon > My Profile > Change language > Save Traceback: ``` File "/home/odoo/src/odoo/saas-18.2/addons/web/controllers/action.py", line 90, in load_breadcrumbs if act['res_model'] and act['type'] != 'ir.actions.client': KeyError: 're
Original PR description
When the user changes the language in My Profile and tries to save,
a traceback will appear.
Steps to reproduce the error:
- Install ``sign`` and ``hr`` module.
- Activate multi languages
- Go to Sign > Reports > Green Savings
- Click on the profile icon > My Profile > Change language > Save
Traceback:
```
File "/home/odoo/src/odoo/saas-18.2/addons/web/controllers/action.py", line 90, in load_breadcrumbs
if act['res_model'] and act['type'] != 'ir.actions.client':
KeyError: 'res_model'
```
https://github.com/odoo/odoo/blob/e901707961cca623acf646f5272c156928125f43/addons/web/controllers/action.py#L89
Here, ``ir.actions.report`` action does not have ``res_model``.
So, it will lead to the above traceback.
sentry-6556212172
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#206787When `<attribute name="string" add="something more"` is used to add onto a string in another view, the `"something more"` string isn't translatable. Therefore since there isn't anything else adding onto this string, let's completely replace it with the original string + the "something more" string. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207896
Original PR description
When `<attribute name="string" add="something more"` is used to add onto a string in another view, the `"something more"` string isn't translatable. Therefore since there isn't anything else adding onto this string, let's completely replace it with the original string + the "something more" string. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207896
### Steps to reproduce: - Go to Expenses > Expense Reports - Make sure that no expenses are present to make the sample data display - Try clicking on the left panel to change the filter on the status - It doesn't work ### Cause: The display of sample data adds the class "o_view_sample_data" to the `Layout` component containing the control panel, the search panel and the list ([see](https://github.com/odoo/odoo/blob/e1b6f55840c9d5e2c0f6705add8d82a311fb04a7/addons/web/static/src/views/list
Original PR description
### Steps to reproduce: - Go to Expenses > Expense Reports - Make sure that no expenses are present to make the sample data display - Try clicking on the left panel to change the filter on the status…
### Steps to reproduce: - Go to Expenses > Expense Reports - Make sure that no expenses are present to make the sample data display - Try clicking on the left panel to change the filter on the status - It doesn't work ### Cause: The display of sample data adds the class "o_view_sample_data" to the `Layout` component containing the control panel, the search panel and the list ([see](https://github.com/odoo/odoo/blob/e1b6f55840c9d5e2c0f6705add8d82a311fb04a7/addons/web/static/src/views/list/list_controller.xml#L6)). When this class is added, the events are ignored for div with `form-check` ([see](https://github.com/odoo/odoo/blob/e1b6f55840c9d5e2c0f6705add8d82a311fb04a7/addons/web/static/src/views/view.scss#L7-L10)) As the `SearchPanel` component is inside the `Layout` component and contains form-check for the filters on Selection fields (state for example), this filter also gets deactivated. ### Solution: Add the class `o_view_sample_data` in the Renderer and not the Controller component, this way we make sure that only the interactions with the sample data get deactivated. Doing this implies adding a prop in the Renderer to pass the value of `useSampleModel` to the renderer. Fix done for the list and kanban view which are problematic with the Expense Reports page. opw-4707016 Forward-Port-Of: odoo/odoo#207879 Forward-Port-Of: odoo/odoo#206060
When checking out `saas-18.3`, IoT Box images until `25.01` are missing `iot_base`, resulting in odoo not being able to start. Forward-Port-Of: odoo/odoo#207947
Original PR description
When checking out `saas-18.3`, IoT Box images until `25.01` are missing `iot_base`, resulting in odoo not being able to start. Forward-Port-Of: odoo/odoo#207947
Before this commit, searching for a customer in the PoS using a phone number without spaces (e.g. "0612345678") would return no results if the number was stored with spaces (e.g. "06 12 34 56 78"). opw-4683209 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#206276
Original PR description
Before this commit, searching for a customer in the PoS using a phone number without spaces (e.g. "0612345678") would return no results if the number was stored with spaces (e.g. "06 12 34 56 78"). opw-4683209 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#206276
**Problem:** When having multiple quants for a product with the same lot but different packages in the same location. Not all quants are visible in the barcode app inventory. **Steps to reproduce:** - In settings activate the following settings : Packages, Storage Locations, Count Entire Locations - Open Inventory/Products - Create a new product - Check the "track inventory" field and select "By Lot" - Go to Inventory/Operations/Physical Inventory and create a new line for your product
Original PR description
**Problem:** When having multiple quants for a product with the same lot but different packages in the same location. Not all quants are visible in the barcode app inventory. **Steps to reproduce:**…
**Problem:** When having multiple quants for a product with the same lot but different packages in the same location. Not all quants are visible in the barcode app inventory. **Steps to reproduce:** - In settings activate the following settings : Packages, Storage Locations, Count Entire Locations - Open Inventory/Products - Create a new product - Check the "track inventory" field and select "By Lot" - Go to Inventory/Operations/Physical Inventory and create a new line for your product - As Location put WH/Stock/Shelf 1 - Write Lot1 for the Lot and Pack1 for the Package - Set a quantity of 5 - Save and Apply - Do the same for another line put but Pack2 for the Package - Open the barcode app and select inventory adjustments - Click on the barcode icon on the top right of the screen - Write SHELF1 and click on apply **Current behavior:** Only 5 unit of your product are displayed (those for Pack1) **Expected behavior:** 10 units should be displayed. The 5 from Pack1 and the 5 from Pack2 **Cause of the issue:** When checking if the line already exists, the package is not taken into account https://github.com/odoo/enterprise/blob/7a132639d6c05ef96d43a48ea34ff11711539fc7/stock_barcode/static/src/models/barcode_quant_model.js#L563-L564 so if a line already exists for the same lot "!currentLine" will be false and the code inside the if statement will not be run https://github.com/odoo/enterprise/blob/7a132639d6c05ef96d43a48ea34ff11711539fc7/stock_barcode/static/src/models/barcode_quant_model.js#L565 resulting in the new line not being added in the barcode app opw-4640303 Forward-Port-Of: odoo/enterprise#83384
When tryin to sell a combo product in a PoS using blackbox you get an error saying that the product has no tax. Steps to reproduce: * Install the module pos_blackbox_be * Create a combo product * Open PoS and try to sell it opw-4347147 Forward-Port-Of: odoo/enterprise#83928 Forward-Port-Of: odoo/enterprise#77595
Original PR description
When tryin to sell a combo product in a PoS using blackbox you get an error saying that the product has no tax. Steps to reproduce: * Install the module pos_blackbox_be * Create a combo product * Open PoS and try to sell it opw-4347147 Forward-Port-Of: odoo/enterprise#83928 Forward-Port-Of: odoo/enterprise#77595
- Change the termination report note date to mention the departure date instead of the notice period end Task: 4718395 Forward-Port-Of: odoo/enterprise#83824
Original PR description
- Change the termination report note date to mention the departure date instead of the notice period end Task: 4718395 Forward-Port-Of: odoo/enterprise#83824
When `<attribute name="string" add="something more"` is used to add onto a string in another view, the `"something more"` string isn't translatable. Therefore since there isn't anything else adding onto this string, let's completely replace it with the original string + the "something more" string. Forward-Port-Of: odoo/enterprise#84388
Original PR description
When `<attribute name="string" add="something more"` is used to add onto a string in another view, the `"something more"` string isn't translatable. Therefore since there isn't anything else adding onto this string, let's completely replace it with the original string + the "something more" string. Forward-Port-Of: odoo/enterprise#84388