Daily updates from Odoo
Wednesday, April 30, 2025
21 changes
6 changes
Resolved issues and error corrections
Fixes an error that occurred when previewing the Calendar Attendee Information email template. Users can now preview this template normally, avoiding a disruptive traceback during email template setup or review.
Original PR description
When a user previews the mail template for Calendar Attendee Information,
A traceback will appear.
Steps to reproduce the error:
- Install ``calendar``
- Now go to Email Templates >
Open email template (Applies to: ``Calendar Attendee Information``)
- Click Preview
Traceback:
```
File "/home/odoo/src/odoo/saas-18.2/addons/mail/models/models.py", line 300, in _message_get_default_recipients
all_emails += defaults['partners'].mapped('email_normalized')
KeyError: 'partners'
```
https://github.com/odoo/odoo/blob/09099ab477bd871c67205388d96172280cd714a5/addons/mail/models/models.py#L300 Here, ``partners`` key is accessed but at [1] key is ``partner_ids``,
So, it will lead to the above traceback.
1-https://github.com/odoo/odoo/blob/09099ab477bd871c67205388d96172280cd714a5/addons/calendar/models/calendar_attendee.py#L116
sentry-6505820998
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix prevents Point of Sale restaurant orders from failing when they are created and paid while offline, then reloaded after reconnecting. It improves reliability for staff using POS in unstable network conditions by correctly handling saved order identifiers.
Original PR description
This error occurs when creating an `order` and `validating payment` in offline mode then reloading the same order. Steps to reproduce: - Install module `pos_restaurant`. - Open `POS Restaurant`. -…
This error occurs when creating an `order` and `validating payment` in offline mode then reloading the same order. Steps to reproduce: - Install module `pos_restaurant`. - Open `POS Restaurant`. - Add some products to the order go to Payments, and select card(Pick any table) - Open Inspect, go to the Network tab and enable Offline Mode. - Click Validate, go to `Orders`, and click `Load Order`. - Add Products to the `Orders` and click on Order. - In the Network tab, enable No Throttling and click on Orders again. - Do the above step one more time on the same table. ValueError Expected singleton: pos.order() This error occurs due to the `missing handling ID` as a string like in saas18.1 at [1], so when the fieldName is a string the type system is unable to fetch the ID This commit resolves the error by ensuring that the ID is correctly processed. If it is a number, it remains unchanged. If it is a string containing an underscore (_), the numeric part after _ is extracted. Link [1] :https://github.com/odoo/odoo/blob/d4e40e4be4233d91db80717891cef73c4fdec06c/addons/point_of_sale/static/src/app/models/related_models.js#L281-L285 Sentry - 6365371665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Spanish companies will now always show the business customer fields needed during checkout and address editing. This prevents customers from getting blocked by a required VAT field that was hidden by website settings.
Original PR description
Versions -------- - saas-18.2+ Steps ----- 1. Enable Spanish localization; 2. assign website to Spanish company; 3. disable B2B fields in checkout via website editor; 4. edit address in eCommerce as a Spanish customer. Issue ----- Impossible to proceed, as VAT is a required field, but isn't displayed. Cause ----- Commit 26df8d31ab94 fixed this issue in earlier versions, but wasn't adapted for changes in 18.2+ where 5a93da8e9220 refactored address management. Solution -------- Override `_prepare_address_form_values` to always render B2B fields when the current company is Spanish. opw-4708230
Creating a new attendee from the eLearning reporting views no longer triggers an error when the new record has not been saved yet. This improves reliability for users managing course attendance and prevents an avoidable interruption in the workflow.
Original PR description
Currently, this exception is raised when a user tries to create a new attendee. Steps to Reproduce: 1. Install `website_slides` module. 2. Go to eLearning ->Reporting -> Attendees 3. Switch to the Pivot view and click on a count integer. 4. Open the List View and click the "New" button. 5. An error Occurs Error: ```SyntaxError syntax error at or near ")" LINE 18: WHERE SCP.id IN () ``` This issue[1] occurs because the system runs a query expecting an existing record with an ID, but since the record isn't saved yet, `self.ids` is empty, causing the query to fail. [1]- https://github.com/odoo/odoo/blob/fbee52705e0332f7134eb5505eac26677e38c168/addons/website_slides/models/slide_channel.py#L91 This fix ensures that if self.ids is empty, the system stops the process early and sets a proper value, preventing the query from failing. sentry-6465821899 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where automated actions creating activities could fail when a record had more than one user in a multi-user field. The system now creates the activity for the first user found, avoiding an error that blocked the action.
Original PR description
Have a server action that creates an activity based on a record's x2m user field. Run that action on a record that has more than one user in this field. Before this commit: display traceback "ValueError: Expected singleton" After this commit: the activity is created for the first user found in the x2m field value. Task id: opw-4745032
This fixes an internal test so it skips folders and items that are not meant to be imported as Python code. It helps developers run checks locally without false failures, improving confidence in routine maintenance.
Original PR description
The test was failing locally due to attempts to import non-Python modules like `.tx`, `.git`, and `odoo.setup`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
5 changes
Resolved issues and error corrections
Non-admin users can now use AI agent chats and close them without running into permission errors. The update also fixes API key access, demo data links, and hides an admin-only progress banner so agent forms open more reliably.
Original PR description
## Purpose This PRs corrects some permission issues for non-admin users. Specifically, it allows non-admin users to delete their chat channel with the agent upon closing the chat window, and corrects the retrieval of API keys in the `llm_api_service` class. It also corrects the demo data to have proper link between the attachment and the agent, and hides the progress banner form the agent form for non-admin users. This solves the permission issues that were faced when the user tried to chat with the agent, or to access its form.
The AI message action now works correctly even when an incoming message cannot be matched to a known contact. This prevents an error from interrupting users when viewing or acting on those messages.
Original PR description
Purpose: -------- A message can have no author (when 'email_from' does not match any partner). When this is the case, the messageActionsInternal patch throws an error because it assumed that a message always has an author. Task-4762361
AI agent attachments are now linked directly to their owning agent so access permissions can be checked reliably. This prevents users from encountering attachment access issues, with the trade-off that duplicated attachments may need their AI embeddings recalculated.
Original PR description
Using a `Many2many` for the `attachment_ids` and `url_attachment_ids` fields was problematic. The `ir.attachment` model is meant to be used as a `Many2one` or `One2Many` since it is linked to its parent record using ressource fields (`res_model` and `res_id`). When using a `Many2many` field, the `res_id` loses its meaning since it should be able to include multiple IDs to be accurate. In practice, this caused an access rights issue because the `ir.attachment` model [1] relies on the `res_id` to check which user is allowed to access the attachment. To fix this, the attachment fields of the agent are replaced with `One2many` fields. This implies that the attachments aren't shared anymore and the embedding will need to be recomputed in case of duplicated attachments across multiple agents. [1] See function `check` of `base/models/ir_attachments.py`
Spreadsheet list autofill now handles spilled value ranges more accurately instead of always copying from the first item in the sequence. This helps users extend lists horizontally with the expected sequence, reducing manual corrections and data entry errors.
Original PR description
When autofilling value in odoo list, we always autofill based on the first value of the spilling sequence. This change not only fill when overflowing from the current spilling range and autofill with the sequence when doing so horizontally. Task: 4700968
Temporarily disables unreliable VoIP test checks that were failing inconsistently due to timing issues. This helps keep the development validation process stable while the underlying test problems are investigated later.
Original PR description
Some tests seem to have race conditions. We don't have time to debug it right now, so let's just disable the problematic tests for the time being.
10 changes
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