Monday, August 4, 2025
69 changes
23 changes
Resolved issues and error corrections
This fix prevents occasional errors when resizing elements in the HTML builder. It makes the resizing process more reliable so users are less likely to encounter interruptions while editing pages.
Original PR description
This commit declares the sizing promise (awaited by the mutex) before calling the mutex, instead of in the mutex, allowing `sizingResolve` to always have a value during the sizing. Indeed, it seems that sometimes, a traceback may appear when resizing, because this resolver is undefined (surely because the sizing was quick enough to end before the mutex was called). task-4367641
Spanish VeriFactu POS now uses the configured simplified invoice limit instead of a fixed €400 threshold. This keeps point-of-sale invoice handling aligned with current Spanish localization settings and reduces the risk of incorrect invoice classification.
Original PR description
In 18.0+ there is a field that determines the amount up to which an invoice can be simplified (`l10n_es_simplified_invoice_limit`). After this commit we use that instead of the hardcoded limit of 400 € that was used in 17.0. task-None Forward-Port-Of: odoo/odoo#221475 Forward-Port-Of: odoo/odoo#221347
Fixed an issue in the website editor where chart data borders in the sidebar could show the wrong color after removing a dataset background color. The sidebar now uses the dataset border color as a fallback, making chart editing previews more accurate and less confusing.
Original PR description
Before this commit, when editing a chart data in the sidebar table, the color of the border only react to the background color of the data and not the border color (which should be the fallback value). This commit fix the issue and the border color of the data is now used in the sidebar table (if no background color is set). task-4367641
Website editors can now apply shapes and other options to images even when the original image link is broken. The system uses a placeholder image instead, preventing editing issues and restoring automated coverage for this case.
Original PR description
The goal of this commit is to remove the `drop_404_ir_attachment_url` test (introduced by [this commit]) from the skipped tests. To do so, this commit introduces a feature that was missing due to the [website refactoring]; when applying a shape (or any other options) on a 404 image, a placeholder image should be used instead of the 404 to apply the option. [this commit]: https://github.com/odoo/odoo/commit/fbc6a697c1adf67ee8a90c49b0150d6ca170e081 [website refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
This fix removes unnecessary pricelist setup from point-of-sale loyalty tests. It helps ensure the loyalty program test suite runs correctly for deployments using only the community apps, improving confidence in ongoing updates.
Original PR description
Since 39b15f1 the pricelists in the loyalty programs creation made them not work if they were only using the community apps. The pricelists were removed from the loyalty program creation so that the tests can be run again. runbot-229672 Forward-Port-Of: odoo/odoo#217665
The website image gallery now keeps images visible and properly sized when large padding is applied in edit mode. This prevents images from disappearing during page design, making the builder more reliable for users creating visual content.
Original PR description
Steps to reproduce: - Open the website builder. - drag and drop the s_image_gallery snippets in the page. - add an image to the carousel. - Add a big padding on the carousel. - The image is not responsive and disapear behind the padding. Cause: Unlike other carousels, the s_image_gallery snippet has a fixed height, while others adapt their height based on the tallest slide. This causes layout issues when extra padding is applied. Solution: This fix removes the height constraint from slides specifically in the s_image_gallery snippet. This ensures that images remain responsive within the fixed-height container and are no longer hidden by excessive padding.
This fix ensures website editing cleanup happens in the right order when saving content. It prevents unwanted invisible characters from appearing around link labels on the published website, keeping edited pages clean for visitors.
Original PR description
The commit b455ea85853dfc19ed01e33986ad270cf80ee5d6 changed which plugin cleans the `contenteditable` attribute. This changed the order in which `contenteditable` is removed compared to the others cleanups The feff plugin depends on the `contenteditable` to clean the correct feffs. With that change of order, it did not cleaned the feff on website anymore. This commit fixes that by explicitely setting the sequence order on the clean up of `contenteditable` so that it is run rather late. Steps to reproduce: - Open website editor - Edit a something that is in the same savable element as a link - Save - Bug: the public website now has feff around the label of the links task-4367641
Restricted website editors can no longer open the snippet selection popup when they do not have permission to add snippets. This prevents avoidable errors in edit mode and makes the editing experience clearer for limited-access users.
Original PR description
[FIX] html_builder: fix restricted editor snippet click Previously, when a user entered the website’s edit mode, they could still open the snippet selection popup. This led to errors, as restricted users don’t have permission to add new snippets. This commit fixes the issue by ensuring the button that opens the snippet popup is not rendered when snippet functionality is disabled for the user.
This fixes a display issue where collaborator avatars could overlap form status buttons while scrolling through long descriptions. The status bar now spans the full form width and only shows its shadow when scrolling, keeping actions visible and the interface cleaner.
Original PR description
User avatars displayed in collaborative mode overlap with buttons when scrolling. This commit extends the statusbar to take the full width, independently of the sheet's one. Also, to avoid an ugly shadow when not scrolling, it only adds it when the scroll is actually performed. Steps to reproduce: - open a task with two users - write in the description in collaborative mode -> user avatars should be displayed - make sure the description is long enough for the sheet to scroll - scroll for one of the avatars to reach the sticky statusbar => overlap between the avatar and the statusbar task-4907797 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221102
The delivery package type dropdown now shows package types in the configured sequence instead of their creation order. This makes pack selection more predictable for warehouse users and aligns the workflow with the order set in Inventory configuration.
Original PR description
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for…
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for the sequence order to differ from the id order. (you can display id with studio) - Go to Inventory > Overview > Delivery Orders - Create a new delivery order - Add a line - In 'Additional Info' add a Carrier - Go to Barcode > Operations > Delivery Orders - Select the delivery order (you might need to remove filters) - With the 'Add Product' button add a product - Click on 'Put in Pack' - A 'Package Details' wizard should have opened. In this wizard there is a field 'Delivery Package Type'. #### Current behavior: - In the delivery package type dropdown list, packages are ordered by id #### Expected behavior: - In the delivery package type dropdown list, packages should be ordered by sequence #### Cause of the issue: As no order was defined, stock.package.type was ordered by id which is the default behavior opw-4824064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220327
This update restores an automated check for image upload progress in the website editor after layout changes had broken it. It helps ensure future website editing changes continue to support image uploads reliably.
Original PR description
TestImageUploadProgress test was previously broken due to DOM structure changes introduced by the new website builder and was consequently disabled. This commit updates the tour steps to align with the new DOM and re-enables the associated test. 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
Underline and strikethrough formatting now remains visible when gradient text colors are used in the website editor. This keeps styled website content looking as intended and avoids confusing formatting issues for users editing pages.
Original PR description
Problem: Using `-webkit-text-fill-color: transparent;` in `.text-gradient` is required for gradient text, but it also causes underline (`<u>`) and strikethrough (`<s>`) styles to become invisible, since those decorations rely on the text fill color. This results in the lines under `u` and `s` elements not being rendered when gradient text is applied. Solution: Render the underline and strikethrough manually using a `background-image` (gradient) applied to `s` and `u` tags. This simulates the missing lines while keeping the gradient text style. Steps to reproduce: 1. Add a text block in the website editor. 2. Apply a text color gradient. 3. Apply underline or strikethrough. → The underline/strikethrough is not visible. opw-4797201 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210390
This update fixes an unreliable automated test for the HTML editor's image cropping feature. It helps ensure development checks run consistently, reducing false failures during quality assurance.
Original PR description
The cropper test fixed in [1] still fails non-diterministically on few runbot instances. This PR aims to fix the test. [1]: https://github.com/odoo/odoo/commit/cd8d2e8e1e58a482e9b2bb151e9233b31ecac393 task-4982084 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A leftover diagnostic message was removed from an automated spreadsheet test. This keeps test runs cleaner and reduces unnecessary noise for developers without changing product behavior.
Original PR description
There was a `console.log` leftover in the test `Domain of simple date filter`. 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 prevents an error when users remove the VAT number from an Indian company and then use the GST warning update action. Since VAT is optional, the system now handles missing VAT values safely, avoiding disruption during company tax setup updates.
Original PR description
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change…
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change the VAT to get the GST warning 4) After getting the GST warning remove the VAT and click the `update it` button Error:- ``` TypeError: 'bool' object is not subscriptable ``` On company, VAT is not a required field, so the user can indeed remove it. When the user removes the vat and clicks on the `update it` button from GST warnings, the `action_update_state_as_per_gstin` method triggers. https://github.com/odoo/odoo/blob/c96d2b1d1ee917b1c665842010c56c23df91ccd3/addons/l10n_in/models/res_partner.py#L99-L101 From the above method we try to access the vat value. Here in our case, the `VAT` value is False. So it leads to the above traceback. We can resolve this issue by adding check, which makes the code more robust. sentry-6151570042 Forward-Port-Of: odoo/odoo#190840
This fix ensures invoice legal document retrieval consistently returns the expected data format, preventing errors when users download invoice documents. It also improves support for downloading documents across multiple file types, making invoice document handling more reliable.
Original PR description
`_get_invoice_legal_documents` should, and is expected to, return a dict. however, if called with `filetype = all`, it returns, because of `_get_invoice_legal_documents_all`, a list which breaks calling code as they expect a dict not a list, and this part of the code is not used anywhere nor tested. - remove the line causing `_get_invoice_legal_documents` to return a list. - make `download_invoice_documents_filetype` work with multiple filetypes no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221358 Forward-Port-Of: odoo/odoo#220170
Accounting error logs now use consistent original wording instead of translated text, making issues easier to investigate across different languages. User-facing error messages remain translated, so the customer experience is unchanged.
Original PR description
Currently, error messages in logs are translated, which can make it difficult to debug issues — especially in multi-language environments or when analyzing logs programmatically. This commit ensures logs use the original, untranslated message templates for clarity and consistency, while keeping translations for user-facing errors. sentry-6763108230 Forward-Port-Of: odoo/odoo#221498
The Website settings now show the Google Search Console option with the correct name instead of the reversed wording. This removes confusion for users configuring search-related website settings.
Original PR description
Before this commit, the Google Search Console label in the settings was wrongly displayed as "Console Google Search". This commit replaces this field label with "Google Search Console". task-3839274 Forward-Port-Of: odoo/odoo#182790
This update fixes a duplicate Spanish domestic fiscal position introduced during earlier version changes. Businesses using Spanish localization will now see a cleaner, consolidated setup, reducing confusion when applying domestic tax rules.
Original PR description
Before this commit: - In version 18.3, due to changes and migrations in fiscal positions, the domestic fiscal position for Spain was duplicated (ES Domestic and Mainland Spain). After this commit: - Merged the duplicated fiscal position 'Mainland Spain' into 'ES Domestic'. task-4972464 Forward-Port-Of: odoo/odoo#220952
This fix updates internal email activity performance tests to match a recent change in how overdue activity counts are calculated. It helps keep automated checks accurate, reducing false test failures without changing day-to-day user workflows.
Original PR description
In [1] we now send the differential in activity count for relevant users when late activities are added or removed for them. This leads to an additional query to read the original count. [1]: odoo/odoo@bc0e1275be40faa919f1b0f70a14e5190c18bd6b Forward-Port-Of: odoo/enterprise#91539
The ESG date range fields now use the correct date-based setup instead of a datetime setup. This removes unnecessary browser console warnings and keeps the ESG interface cleaner without changing user-facing behavior.
Original PR description
The widgets `esgDateRangeField` and `esgListDateRangeField` inherit respectively from `dateTimeField` and `listDateTimeField`. As their name implies, those widgets are made to handle datetime fields, whereas the esg widgets are used on dates. While it does not seem to make a functional difference, it produces a warning in the browser console. This PR makes the esg widgets inherit from the "date" counterpart instead.
This fix prevents an error when users manually enter a tracking reference for a Sendcloud delivery. Instead of crashing, Odoo now handles the missing Sendcloud parcel details gracefully and shows the expected user-facing message.
Original PR description
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3.…
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3. Create a sales order with a deliverable product 4. Confirm the sale order 5. Go to the delivery 6. Manually enter a random tracking reference. 7. Make sure carrier is set to the Sendcloud delivery method 8. Click on "tracking," or get back to the sales order (click "preview"). 9. A traceback occurs. **Issue:** `A TypeError: 'bool' object is not subscriptable` when accessing sendcloud_parcel_ref, which is expected to be a list or JSON but is instead a boolean. **Causes:** The code assumes the presence of valid Sendcloud parcel reference data, but manually entering a tracking reference bypasses the [_send_shipment](https://github.com/odoo/enterprise/blob/6ecf0af6b6874460d300ede6cc7c092927607810/delivery_sendcloud/models/sendcloud_service.py#L102) method that populates this field. As a result, sendcloud_parcel_ref can remain False. https://github.com/odoo/enterprise/blob/df924ef8adffb3e42419a44ecf22fec3059917c4/delivery_sendcloud/models/delivery_carrier.py#L196 **Solution:** Return None if there is no Sendcloud parcel reference, which will raise a UserError from the below line https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L288 Co-Author By - alsh@odoo.com opw-4894677 Forward-Port-Of: odoo/enterprise#89444
When a Belgian salary offer is created, the company car is now selected automatically from the linked contract template when available. If the template has no car, the system uses the employee version's car instead, reducing manual entry and avoiding incorrect empty car fields.
Original PR description
In this PR, we fixed the assignation of the car in the contract when the contract template for the version has company car. When creating an offer, automatically set the transportation car based on the linked contract template. If the contract template has no car, fall back to the car defined on the employee version. If neither has a car, leave the field empty. Related task: 4926053.
13 changes
Resolved issues and error corrections
Spanish VeriFactu POS now checks the configured simplified invoice limit instead of relying on a fixed €400 threshold. This keeps invoice handling aligned with current localization settings and reduces the risk of incorrect simplified invoice decisions.
Original PR description
In 18.0+ there is a field that determines the amount up to which an invoice can be simplified (`l10n_es_simplified_invoice_limit`). After this commit we use that instead of the hardcoded limit of 400 € that was used in 17.0. task-None Forward-Port-Of: odoo/odoo#221347
2 changes
Resolved issues and error corrections
This fixes an error that could appear when users changed settings tied to a module after that module had been uninstalled. Users can now discard or interact with those settings without hitting a crash, improving reliability in system configuration.
Original PR description
When the user uninstalls the module and still tries to access the fields of that module in settings, a KeyError will be generated. Steps to reproduce the error: - Go to settings > enable Use a Gmail…
8 changes
Resolved issues and error corrections
This update keeps several Odoo Enterprise areas working reliably with Python 3.13 and Debian Trixie. It adjusts tests and message checks so routine upgrades of underlying software do not create false failures, helping maintain platform stability.
23 changes
Resolved issues and error corrections
This change splits lengthy editor list tests into smaller checks so they are less likely to fail when test infrastructure is slow. It does not change product behavior, but helps keep automated validation more stable and reduces false failures during releases.
Original PR description
Those tests were too long to be grouped in a single `it` as it would sometime hit the time limit when the runbot was too slow. Putting each of them in separate `it` significantly reduces the likelihood of the issue to occur. runbot-230411 Forward-Port-Of: odoo/odoo#221197
Portal users who follow a project task can now open the task from the “View Task” link in notification emails. This fixes a permissions issue that prevented the link details from being read, improving access for external collaborators.
Original PR description
To reproduce: ============= - on a project task where a portal user is follower send a message - the portal user should receive an email with a link to the task on the button "View Task" -> the link is not working Problem: ======== starting from 18.3, a method to check field access was added to the project task model, `access_token` and `access_url` were not in set of readable fields for portal users, so the link was not working. Solution: ========= add `access_token` and `access_url` to the set of readable fields for portal users. opw-4939913 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The delivery package type list now respects the sequence set by inventory users instead of showing items by creation order. This makes package selection more predictable and aligned with the configured business workflow.
Original PR description
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for…
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for the sequence order to differ from the id order. (you can display id with studio) - Go to Inventory > Overview > Delivery Orders - Create a new delivery order - Add a line - In 'Additional Info' add a Carrier - Go to Barcode > Operations > Delivery Orders - Select the delivery order (you might need to remove filters) - With the 'Add Product' button add a product - Click on 'Put in Pack' - A 'Package Details' wizard should have opened. In this wizard there is a field 'Delivery Package Type'. #### Current behavior: - In the delivery package type dropdown list, packages are ordered by id #### Expected behavior: - In the delivery package type dropdown list, packages should be ordered by sequence #### Cause of the issue: As no order was defined, stock.package.type was ordered by id which is the default behavior opw-4824064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220327
Archived time off types are now hidden from the Employee app, so employee profiles only show active and relevant time off balances. This prevents outdated or inactive leave categories from confusing HR teams and employees.
Original PR description
In this bug, if a time off type is archived, it is still displayed in employee app. Steps to reproduce the bug: 1- Create a database with employee and time off modules installed 2- Allocate a time off to an employee 3- Archive the time off type 4- Open Employee app and go to the employee profile 5- The archived days are still displayed opw-4900060 Forward-Port-Of: odoo/odoo#221335 Forward-Port-Of: odoo/odoo#217517
This fixes a crash in the Indian localization when a company removes its VAT/GST number and then uses the GST warning update action. Users can now leave the VAT field empty without encountering an error, improving stability in company tax setup workflows.
Original PR description
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change…
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change the VAT to get the GST warning 4) After getting the GST warning remove the VAT and click the `update it` button Error:- ``` TypeError: 'bool' object is not subscriptable ``` On company, VAT is not a required field, so the user can indeed remove it. When the user removes the vat and clicks on the `update it` button from GST warnings, the `action_update_state_as_per_gstin` method triggers. https://github.com/odoo/odoo/blob/c96d2b1d1ee917b1c665842010c56c23df91ccd3/addons/l10n_in/models/res_partner.py#L99-L101 From the above method we try to access the vat value. Here in our case, the `VAT` value is False. So it leads to the above traceback. We can resolve this issue by adding check, which makes the code more robust. sentry-6151570042 Forward-Port-Of: odoo/odoo#190840
Updating a blog cover image or filter now avoids saving unintended changes to the underlying website template. This helps prevent duplicated styling information and keeps blog pages stable after editing cover images.
Original PR description
Since summernote was replaced by the editor, the record cover template becomes `o_dirty` and therefore gets saved when a cover image is changed. This commit solves this by marking the record cover components readonly inside the DOM. Steps to reproduce: - install website_blog - set a blog cover image or specify its filter - save => The `record_cover` template was saved with the modifications, thus combining `t-att-style` and `style` attributes. task-jke Forward-Port-Of: odoo/odoo#219013
This fix prevents an error when validating a returned delivery linked to a sales order whose original line was deleted. It helps users complete stock return workflows reliably, even after a sales order has been cancelled and changed.
Original PR description
The error occurs when a SO line is deleted, and a return is processed for the associated delivery using a different product, after which the return is validated. Steps to reproduce: --- - Install the `sale_management` and `stock` modules - Create & Confirm an SO for one product - Now cancel that SO and remove that product - In Stock > Deliveries > Open that delivery(Cancelled) - Click on the `Return` button and add any product > Return > Validate Traceback: --- `ValueError: max() iterable argument is empty` At [1], a ValueError is raised because there are no SO lines, resulting in an empty sequence is being passed to the max() function. [1]- https://github.com/odoo/odoo/blob/deab3cafc8b3cd79dcc52fddd9511a38a7e77afa/addons/sale_stock/models/stock.py#L68 sentry-6709665025 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Accounting system logs now keep error messages in a consistent original language, making issues easier to investigate across different language settings. User-facing error messages remain translated, so day-to-day users continue to see messages in their preferred language.
Original PR description
Currently, error messages in logs are translated, which can make it difficult to debug issues — especially in multi-language environments or when analyzing logs programmatically. This commit ensures logs use the original, untranslated message templates for clarity and consistency, while keeping translations for user-facing errors. sentry-6763108230 Forward-Port-Of: odoo/odoo#221498
The Website settings label for Google Search Console has been corrected from an awkward word order to the proper product name. This makes the setting clearer for users configuring Google Search Console integration.
Original PR description
Before this commit, the Google Search Console label in the settings was wrongly displayed as "Console Google Search". This commit replaces this field label with "Google Search Console". task-3839274 Forward-Port-Of: odoo/odoo#182790
Invoice and sales email subtitles now avoid displaying “False” when sent to invoice-address contacts without a contact name. This keeps customer-facing emails cleaner and more professional in common accounting and sales workflows.
Original PR description
**Steps to reproduce:** 1. Install *Accounting* and *Contacts*. 2. Create a company contact with a name & address. 3. Add a child contact: Type = “Invoice address” **Leave the Contact Name blank** 4. Configure an outgoing mail server. 5. Create & confirm a customer invoice for created invoice‑address contact. 6. Click Send, send the invoice email, and check subtitle — it displays `False`. **Issue:** - When the invoice is emailed to a contact without a name, the email subtitle shows False, for example: `INV/2025/00006 - False` **Note: Same issue for Sales** **Cause:** - The rendering logic only checked that `partner_id` existed, not whether `partner_id.name` was non‑empty - Since name was not mandatory for address-type Invoice Address, this resulted in `False` appearing in the email subtitle. **Solution:** - Add an check for the validity of partner_id.name when generating the email subtitle. **opw-4939158** Forward-Port-Of: odoo/odoo#219881
Fixed an issue where administrators could not preview certain subscription sale orders if no salesperson was assigned in website settings. This prevents an error page and keeps subscription order review working normally after portal purchases.
Original PR description
**Steps to reproduce:** 1. Install sale_subscription, payment_demo and eCommerce 2. Go to Website → Configuration → Settings and clear the Salesperson field 3. Create a subscription product with recurring plan and publish it. 4. Place an order for this product as a portal user and complete payment. 5. Log back in as admin, open the related Sale Order, and click Preview **Issue:** A traceback occurs:- ```"ValueError: Expected singleton: res.users()"``` This happens in _prepare_partner_addresses because user_id is not set on the Sale Order. **Cause:** https://github.com/odoo/enterprise/blob/6b449769d4bf2cdf6517a026706fd6ea55832975/sale_subscription/controllers/portal.py#L233 The code calls has_group on order_sudo.user_id without checking if user_id exists, leading to an empty recordset and singleton error. **Solution:** Add a fallback to handle cases where user_id is not defined, defaulting to False for multiple_addresses_enabled. opw-4947508
This fixes an error that could occur when a user manually entered a tracking reference for a Sendcloud delivery. Instead of crashing, the system now handles missing Sendcloud parcel data cleanly and shows the normal user-facing error flow.
Original PR description
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3.…
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3. Create a sales order with a deliverable product 4. Confirm the sale order 5. Go to the delivery 6. Manually enter a random tracking reference. 7. Make sure carrier is set to the Sendcloud delivery method 8. Click on "tracking," or get back to the sales order (click "preview"). 9. A traceback occurs. **Issue:** `A TypeError: 'bool' object is not subscriptable` when accessing sendcloud_parcel_ref, which is expected to be a list or JSON but is instead a boolean. **Causes:** The code assumes the presence of valid Sendcloud parcel reference data, but manually entering a tracking reference bypasses the [_send_shipment](https://github.com/odoo/enterprise/blob/6ecf0af6b6874460d300ede6cc7c092927607810/delivery_sendcloud/models/sendcloud_service.py#L102) method that populates this field. As a result, sendcloud_parcel_ref can remain False. https://github.com/odoo/enterprise/blob/df924ef8adffb3e42419a44ecf22fec3059917c4/delivery_sendcloud/models/delivery_carrier.py#L196 **Solution:** Return None if there is no Sendcloud parcel reference, which will raise a UserError from the below line https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L288 Co-Author By - alsh@odoo.com opw-4894677 Forward-Port-Of: odoo/enterprise#89444
Fixed an issue that could cause spreadsheet thumbnail updates to fail when several records were processed at the same time. This improves reliability for users working with spreadsheet-linked records, such as sales order spreadsheets.
Original PR description
The `_inverse_display_thumbnail` method raised a `ValueError` when called on multiple records, due to direct access to `self.display_thumbnail` on a multi-record recordset. Traceback: `ValueError: Expected singleton: sale.order.spreadsheet(43, 44, 45, 46)` At [1], the code now correctly iterates over each `spreadsheet` in `self` to ensure accurate processing for each record. [1]- https://github.com/odoo/enterprise/blob/9d51f5171b3c2478599dde1ce991c90fa6fed32b/spreadsheet_edition/models/spreadsheet_mixin.py#L619 sentry-6615551353
When the user uninstalls the module and still tries to access the fields of
that module in settings, a KeyError will be generated.
Steps to reproduce the error:
- Go to settings > enable Use a Gmail Server
- Uninstall google_gmail
- Enter a value for ID > Discard
Traceback:
```
KeyError: 'google_gmail_client_identifier'
File "odoo/http.py", line 2254, in __call__
response = request._serve_db()
File "odoo/http.py", line 1830, in _serve_db
return self._transactioning(_serve_ir_http, readonly=ro)
File "odoo/http.py", line 1850, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1828, in _serve_ir_http
return self._serve_ir_http(rule, args)
File "odoo/http.py", line 1835, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2060, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 220, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 742, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/web/controllers/dataset.py", line 38, in call_kw
return self._call_kw(model, method, args, kwargs)
File "addons/web/controllers/dataset.py", line 34, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "odoo/api.py", line 458, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "addons/web/models/models.py", line 871, in onchange
defaults = self.default_get(missing_names)
File "odoo/addons/base/models/res_config.py", line 464, in default_get
classified = self._get_classified_fields(fields)
File "odoo/addons/base/models/res_config.py", line 424, in _get_classified_fields
field = self._fields[name]
```
sentry-4636111851
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe website editor now safely handles unsupported shape files instead of triggering an error. This prevents a specific editing issue from interrupting users when an unexpected file type is encountered.
Original PR description
The error arises because ``file_open`` is called with a file path that includes a ``.css`` extension, which is not supported in this context where a ``.svg`` file is expected. Error: ``ValueError: Unsupported file: actuator;/static/shapes/env;.css`` This commit adds a try-catch block to handle a ValueError when an unsupported file is added. sentry-5163461799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Original PR description
Forward-Port-Of: odoo/enterprise#91149 Forward-Port-Of: odoo/enterprise#90352
This update prevents an error when users manually enter a tracking reference for a Sendcloud delivery. Instead of showing a technical crash, Odoo now handles the missing Sendcloud parcel data gracefully and can display a proper user-facing error.
Original PR description
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3.…
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3. Create a sales order with a deliverable product 4. Confirm the sale order 5. Go to the delivery 6. Manually enter a random tracking reference. 7. Make sure carrier is set to the Sendcloud delivery method 8. Click on "tracking," or get back to the sales order (click "preview"). 9. A traceback occurs. **Issue:** `A TypeError: 'bool' object is not subscriptable` when accessing sendcloud_parcel_ref, which is expected to be a list or JSON but is instead a boolean. **Causes:** The code assumes the presence of valid Sendcloud parcel reference data, but manually entering a tracking reference bypasses the [_send_shipment](https://github.com/odoo/enterprise/blob/6ecf0af6b6874460d300ede6cc7c092927607810/delivery_sendcloud/models/sendcloud_service.py#L102) method that populates this field. As a result, sendcloud_parcel_ref can remain False. https://github.com/odoo/enterprise/blob/df924ef8adffb3e42419a44ecf22fec3059917c4/delivery_sendcloud/models/delivery_carrier.py#L196 **Solution:** Return None if there is no Sendcloud parcel reference, which will raise a UserError from the below line https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L288 Co-Author By - alsh@odoo.com opw-4894677 Forward-Port-Of: odoo/enterprise#89444
This update corrects missing module dependencies so related live chat and WhatsApp stock features install and reinstall reliably. It helps prevent nightly validation failures and reduces the risk of deployment issues caused by modules loading in the wrong order.
Original PR description
- `ai_website_livechat` hooks on an element added by `ai_website` but does not depend on that module, breaking uninstall/reinstall nightly (https://runbot.odoo.com/runbot/build/86142380) - `whatsapp_stock` hooks on an element added by `stock_enterprise, but does not depend on that module, breaking uninstall/reinstall nightly (https://runbot.odoo.com/runbot/build/86142941)
Installing Payroll on a new Australian database no longer crashes when pay schedule information is missing. The system now safely uses a monthly default so payroll setup can complete reliably.
Original PR description
When installing the payroll app with a new db initialized in Australia, we would get a traceback because the schedule pay is False at some point. This was due to the compute of schedule pay which did not handle the case where the structure type is not set. This fixes the issue by checking if the structure type is set to set the schedule pay and adding a default value to monthly. Ticket: 4974520 Forward-Port-Of: odoo/enterprise#91255
Updated automated tests so they create and manage records only with the permissions they are supposed to have. This improves confidence that business workflows in payroll, accounting, field service, and payments respect access controls and remain reliable.
Original PR description
Tests need to configure their ACLs properly.
The Preparation Display no longer shows a blank screen when using demo data. The fix handles missing customer notes safely so restaurant staff can open and review preparation orders without interruption.
Original PR description
Steps: - Initialize a database with demo data - Open the demo Preparation Display - Blank screen appears due to an error cause: - Preparation lines have false as the customer note value in the demo data. Fix: - Added a fallback to an empty string when the customer note is defined. Task: 4988252
Live chat AI setup now uses a simpler prompt format that works beyond a single AI provider. This helps keep AI live chat compatible with future provider options and avoids format-related issues.
Original PR description
Previously, preprompts were added as objects of the form {'rule': ..., 'content': ...}. However, this format is specific to OpenAI API. The task 4915266, [PR](https://github.com/odoo/enterprise/pull/90124) has changed the format from an object to a string to be extensible and to support providers other than OpenAI.
Thus, this commit adapts the preprompt of livechat channels to the new format.Corrected a small formatting issue in the Sign app's date filter so it displays with the proper spacing. This makes the filter text clearer for users working with signature requests.
This fix corrects the invoicing action used in several localized Point of Sale flows so orders can be marked for invoicing properly. It prevents failures caused by calling a non-existent function, helping affected country-specific POS setups process invoices reliably.
Original PR description
In commit https://github.com/odoo/odoo/commit/bfe2a0aea699439480990bb192bfeea7df2117e2, the method `setToInvoice` was mistakenly called on `pos.order`, but this method does not exist. The correct method name is `set_to_invoice`. opw-4992393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log int
Original PR description
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct…
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log into to one of the demo Argentinean Companies: (AR) Responsable Inscripto 4. Create a customer invoices of type "B" 5. Go to the partner and change the Language to Spanish 6. Return to the invoice and print the PDF 7. Check that the VAT Content section is not translated. ### **Current behavior before PR:** <img width="572" height="407" alt="image" src="https://github.com/user-attachments/assets/e28e609e-2cd2-4ace-9509-f969692ec893" /> ### **Desired behavior after PR is merged:** The "VAT Content section should appear as "IVA Contenido" when printing the report in Spanish. opw-4938520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219912
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log in
Original PR description
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct…
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log into to one of the demo Argentinean Companies: (AR) Responsable Inscripto 4. Create a customer invoices of type "B" 5. Go to the partner and change the Language to Spanish 6. Return to the invoice and print the PDF 8. Check that the VAT Content section is not translated. ### **Current behavior before PR:** <img width="572" height="407" alt="image" src="https://github.com/user-attachments/assets/1f3e7556-2ffc-4cb4-8c61-9bee4248650c" /> ### **Desired behavior after PR is merged:** The "VAT Content section should appear as "IVA Contenido" when printing the report in Spanish. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Sending reports for gamification challenges in Individual Goals mode no longer fails when optional suffix information is missing. This prevents an error from blocking report emails, making challenge reporting more reliable for users.
Original PR description
[FIX] gamification: prevent key error exception
To reproduce:
=============
1. Navigate to Settings > Gamification Tools > Challenges.
2. Create a new challenge or open any existing active challenge.
3. Set the Display Mode to Individual Goals, and then click on Send Report.
Problem:
=========
Accessing line['full_suffix'] directly raised an exception
when the key was missing, causing the template rendering to fail.
https://github.com/odoo/odoo/blob/cd5f29b8b50ef4228be8f58a02bb328548208f77/addons/gamification/data/mail_template_data.xml#L175C1-L175C92
Solution:
=========
Use line.setdefault('full_suffix', '') to ensure the key exists with
a default empty string, preventing errors and allowing the template
to render smoothly.
opw-4909617.Creating a new warehouse could fail if a previously required stock location had been deleted. This fix lets the warehouse creation continue safely instead of blocking users with an error.
Original PR description
Currently, an error occurs when a user tries to create a new warehouse, but the referenced stock location (record: **Physical Locations**) has been deleted. **Steps to reproduce:** - Install the…
Currently, an error occurs when a user tries to create a new warehouse, but the referenced stock location (record: **Physical Locations**) has been deleted. **Steps to reproduce:** - Install the `stock` module without the demo data. - Enable **Multi-Step Routes** in Inventory settings. - Delete all Stock Rules and then the existing warehouses. - Navigate to `Inventory > Reporting > Locations` and delete the **Physical Locations**. - Try to create a new warehouse. **Error:** `ValueError: External ID not found in the system: stock.stock_location_locations` Here, an error occurs when the system tries to fetch `stock.stock_location_locations` during warehouse creation [1], but the record has been deleted, resulting in a parse error. [1] - https://github.com/odoo/odoo/blob/834eff6e770280e911bb99e2abab4ea42d4ca8ff/addons/stock/models/stock_warehouse.py#L123-L125 This commit prevents the error by assigning `False` to `location_id`, if the reference is missing. Sentry - 6577063404
The delivery package type dropdown now respects the sequence set by users instead of defaulting to creation order. This makes package selection more predictable for inventory teams and aligns barcode and delivery workflows with configuration settings.
Original PR description
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for…
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for the sequence order to differ from the id order. (you can display id with studio) - Go to Inventory > Overview > Delivery Orders - Create a new delivery order - Add a line - In 'Additional Info' add a Carrier - Go to Barcode > Operations > Delivery Orders - Select the delivery order (you might need to remove filters) - With the 'Add Product' button add a product - Click on 'Put in Pack' - A 'Package Details' wizard should have opened. In this wizard there is a field 'Delivery Package Type'. #### Current behavior: - In the delivery package type dropdown list, packages are ordered by id #### Expected behavior: - In the delivery package type dropdown list, packages should be ordered by sequence #### Cause of the issue: As no order was defined, stock.package.type was ordered by id which is the default behavior opw-4824064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220327
Loading appraisal sample data no longer fails when a previously deleted employee skill type is referenced. This helps HR users continue setting up sample appraisal content without being blocked by missing skill configuration data.
Original PR description
Currently, an error is produced when loading sample data if a referenced skill type record in the skill level has been deleted by the user. **Steps to Reproduce:** - Install the `hr_appraisal` module…
Currently, an error is produced when loading sample data if a referenced skill type record in the skill level has been deleted by the user.
**Steps to Reproduce:**
- Install the `hr_appraisal` module without demo data.
- Navigate to `Employee > Skills Types` and delete the `Languages` record.
- Load the sample data for appraisal.
- Observe the error.
`ValueError: ParseError('while parsing /home/odoo/src/odoo/saas-18.2/addons/hr_skills/data/scenarios/hr_skills_scenario.xml:19...`
Here, the error occurs because the method at [1] attempts to load the `hr_skills_scenario.xml` file that references a deleted `skill_type_id` [2], leading to a parsing error.
[1] - https://github.com/odoo/odoo/blob/547327f30d2d4bf778b9d358dbea4b133d55188a/addons/hr_skills/models/hr_employee.py#L49
[2] - https://github.com/odoo/odoo/blob/547327f30d2d4bf778b9d358dbea4b133d55188a/addons/hr_skills/data/scenarios/hr_skills_scenario.xml#L23
This commit ensures that all the referenced data is loaded properly, preventing errors due to missing references.
Sentry - 6533879252This fixes an error that could appear when users clicked the Optimize SEO button while viewing a livechat page. Instead of trying to edit SEO settings on pages that do not support them, Odoo now safely disables that option, avoiding disruption for website editors.
Original PR description
Currently, an error occurs when clicking the optimize SEO button for the livechat page. **Steps to reproduce:** - Install the `website_livechat` module. - Add menuitem with url…
Currently, an error occurs when clicking the optimize SEO button for the livechat page. **Steps to reproduce:** - Install the `website_livechat` module. - Add menuitem with url `/livechat/channel/yourwebsite-com-1` as `livechat`. - Go to the **Home** page and publish it using the `Published` button (shows `Optimize SEO` popup). - Change the page to `livechat` and click the `Optimize SEO` button before it disappears. - Observe the error. **Error:** `ValueError: Invalid field 'website_meta_title' on 'im_livechat.channel'` The error occurs because the system attempts to update the default `fields` [1] on the current model at [2] who doesn't have the fields. This commit ensures that if any required SEO fields are missing from the model, the system will return early with `can_edit_seo` set to `False`, thereby preventing the error. [1] - https://github.com/odoo/odoo/blob/c87acdcfa48b1d8aa66bb5d27d58e3edb70a86ba/addons/website/controllers/main.py#L810 [2] - https://github.com/odoo/odoo/blob/c87acdcfa48b1d8aa66bb5d27d58e3edb70a86ba/addons/website/controllers/main.py#L824 Sentry - 6330105753 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents the Mail app from crashing when follower-related data is unexpectedly unavailable. Instead of stopping with an error, the system now skips the affected empty result and continues processing, improving reliability for users.
Original PR description
Currently, an exception is raised when `_read_format`, returned an empty list due to MissingError encountered - [1]. This issue was caused by attempting to access the first element `(data[0])` without checking if the list was empty. error: `IndexError: list index out of range.` This commit resolves the issue by properly handling empty lists and skipping further processing in such cases. [1] - https://github.com/odoo/odoo/blob/2a79d7d06d77d808cab00440bdac3c1e05c7bc1b/odoo/models.py#L4033 [2] - https://github.com/odoo/odoo/blob/2a79d7d06d77d808cab00440bdac3c1e05c7bc1b/addons/mail/models/mail_followers.py#L527 sentry-6021917973
This fixes an error that could occur for Indian companies when a user removed the VAT number and then clicked the GST warning update button. The change prevents the crash and keeps the company record workflow usable even when VAT is left blank.
Original PR description
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change…
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change the VAT to get the GST warning 4) After getting the GST warning remove the VAT and click the `update it` button Error:- ``` TypeError: 'bool' object is not subscriptable ``` On company, VAT is not a required field, so the user can indeed remove it. When the user removes the vat and clicks on the `update it` button from GST warnings, the `action_update_state_as_per_gstin` method triggers. https://github.com/odoo/odoo/blob/c96d2b1d1ee917b1c665842010c56c23df91ccd3/addons/l10n_in/models/res_partner.py#L99-L101 From the above method we try to access the vat value. Here in our case, the `VAT` value is False. So it leads to the above traceback. We can resolve this issue by adding check, which makes the code more robust. sentry-6151570042 Forward-Port-Of: odoo/odoo#190840
This fix prevents an error when users load recruitment sample data after all recruitment stages have been deleted. The sample data import now skips the missing stage reference, allowing the process to complete instead of showing a traceback.
Original PR description
When the user clicks on Load sample data button after deleting the stages, A traceback will appear. Steps to reproduce the error: - Install ``hr_recruitment`` module - Go to Recruitment >…
When the user clicks on Load sample data button after deleting the stages,
A traceback will appear.
Steps to reproduce the error:
- Install ``hr_recruitment`` module
- Go to Recruitment > Configuration > Stages > Delete all stages
- Go to Recruitment > Applications > By Job Positions > Load sample data
Traceback:
```
ValueError: External ID not found in the system: hr_recruitment.stage_job3
ParseError: while parsing /home/odoo/src/odoo/addons/hr_recruitment/data/scenarios/hr_recruitment_scenario.xml:94, somewhere inside <record id="scenario_applicant_macm_enrique" model="hr.applicant">
<field name="candidate_id" ref="scenario_candidate_enrique" />
<field name="priority">2</field>
<field name="linkedin_profile">www.example.linkedin.com/in/enrique.jones</field>
<field name="job_id" ref="job_marketing" />
<field name="user_id" ref="base.user_admin" />
<field name="medium_id" ref="utm.utm_medium_direct" />
<field name="department_id" ref="dep_marketing" />
<field name="salary_expected">2900</field>
<field name="stage_id" eval="ref('stage_job3ob3', raise_if_not_found=False)" />
<field name="create_date" eval="DateTime.today() - relativedelta(months=2)" />
<field name="date_last_stage_update"
eval="DateTime.today() - relativedelta(days=1)" />
</record>
```
This commit resolves the error by ``raise_if_not_found=False`` for the field if the stage is missing.
sentry-6530485438
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prChanging a blog cover image or its visual filter no longer causes the underlying cover template to be saved by mistake. This prevents unwanted page template changes and keeps website content editing more reliable.
Original PR description
Since summernote was replaced by the editor, the record cover template becomes `o_dirty` and therefore gets saved when a cover image is changed. This commit solves this by marking the record cover components readonly inside the DOM. Steps to reproduce: - install website_blog - set a blog cover image or specify its filter - save => The `record_cover` template was saved with the modifications, thus combining `t-att-style` and `style` attributes. task-jke Forward-Port-Of: odoo/odoo#219013
This fix prevents an error when a user removes the company from a new expense form. The expense workflow now checks that a company is present before looking up its currency, avoiding a crash and keeping expense entry usable in multi-company setups.
Original PR description
This error occurs when the user removes the company from the expense form view. Steps to reproduce: - Install ``hr_expense`` modules - Create another Company - Now open a new expense and remove the ``Company`` Traceback: ``ValueError: Expected singleton: res.currency()`` At [1], the company is not set, and we are attempting to retrieve the currency ID from it. This commit resolves the issue by ensuring that the company is present before proceeding. [1]- https://github.com/odoo/odoo/blob/408fbf8efbbfbc47c3171d9ee082e3831016f6db/addons/hr_expense/models/hr_expense.py#L341-L355 sentry-6112771029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error when a user tries to return a stock receipt that was deleted in another browser tab. Instead of crashing, the stock return flow now handles the missing receipt more safely, improving reliability in multi-tab usage.
Original PR description
The error occurs because we are deleting stock picking from one tab and trying to return that picking from another tab. Steps to reproduce: --- - Install ``sale_stock`` module - Go to receipt > open one receipt(state: Draft or Ready) - Now duplicate that tab > delete that receipt from one tab and click on 'Return' button in another tab Traceback: --- ``ValueError: Expected singleton: stock.picking()`` At [1], we are facing an error because we are accessing the ``_can_return`` method but don't have a stock picking ID. [1]- https://github.com/odoo/odoo/blob/f613b87c38d208730ba2470e0a26a110c2089b66/addons/stock/wizard/stock_picking_return.py#L104 sentry-6012377745 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users who reset their Google Calendar account more than once will now see a clear, user-friendly warning instead of a technical crash message. This helps reduce confusion and support effort when the calendar authentication token has already been removed.
Original PR description
This error occurs when a user resets their Google Calendar account. As a result, the authentication token disappears, and if they attempt to reset the account again, an error is triggered. Steps to reproduce: --- - Install `google_calendar` module - Set Google Calendar Credentials in settings. - Go to Calendar and Sync with Google - Users > Mitchell Admin > Calendar - `Reset Account` > `Confirm` (keep the selections as default) - Again `Reset Account` > `User's Existing Events: Delete from Both` Stack Trace: --- AttributeError: An authentication token is required Due to an AttributeError, users are seeing an error message in the stack trace instead of a user-friendly notification. sentry-6311340556 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error that could interrupt notifications when todo activities are created or updated. Users linked to overdue activities will now be notified reliably, reducing disruption in activity follow-up workflows.
Original PR description
An UnboundLocalError was occurring due to referencing the variable `activity` before it was assigned a value. Traceback : --- ``` UnboundLocalError: cannot access local variable 'activity' where it…
An UnboundLocalError was occurring due to referencing the variable `activity` before it was assigned a value.
Traceback :
---
```
UnboundLocalError: cannot access local variable 'activity' where it is not associated with a value
File "odoo/http.py", line 2416, in __call__
response = request._serve_db()
File "odoo/http.py", line 1942, in _serve_db
return self._transactioning(
File "odoo/http.py", line 2006, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 137, in retrying
result = func()
File "odoo/http.py", line 1973, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2224, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 335, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 741, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/rpc/controllers.py", line 177, in jsonrpc
return dispatch_rpc(service, method, args)
File "odoo/http.py", line 397, in dispatch_rpc
return dispatch(method, params)
File "odoo/service/model.py", line 85, in dispatch
res = execute_kw(db, uid, *params[3:])
File "odoo/service/model.py", line 108, in execute_kw
return execute(db, uid, obj, method, *args, **kw or {})
File "odoo/service/model.py", line 115, in execute
res = execute_cr(cr, uid, obj, method, *args, **kw)
File "odoo/service/model.py", line 99, in execute_cr
result = retrying(partial(call_kw, recs, method, args, kw), env)
File "odoo/service/model.py", line 137, in retrying
result = func()
File "odoo/service/model.py", line 62, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "<decorator-gen-44>", line 2, in create
File "odoo/orm/decorators.py", line 317, in _model_create_multi
return create(self, [arg])
File "addons/mail/models/mail_activity.py", line 303, in create
activity.user_id._bus_send("mail.activity/updated", {"activity_created": True})
```
The error occurs at [1] because `activity` is used in the `_bus_send` call without being properly initialized within that scope.
This commit will resolve the above error by passing `todo_activities` instead of `activity`, ensuring that all users linked to overdue activities are properly notified.
[1]- https://github.com/odoo/odoo/blob/f82f768729d897fa54b04789f4e0637ed1bb27f4/addons/mail/models/mail_activity.py#L306-L308
sentry-6273716627
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prFixes an issue where customers could see an error when editing portal information if no invoice sending method was configured. This keeps the portal form usable and avoids a confusing interruption for users.
Original PR description
When there is no invoice sending method and the user tries to edit information in the portal, a traceback will appear. Traceback: ``` QWebException: Error while render the template TypeError: object of type 'NoneType' has no len() Node: <div class="row m-0 p-0" t-if="len(invoice_sending_methods) > 1"/> ``` https://github.com/odoo/odoo/blob/14ddd49c52f0030f7dbad7d4889f4edf1b74ae39/addons/account/views/account_portal_templates.xml#L260 When there is no invoice sending method, ``invoice_sending_methods`` will be None. So, It will lead to the above traceback. sentry-6015474981 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a task is moved to a different project, its attached documents are now moved to the correct project workspace as well. This keeps files organized in the right place and avoids users finding task documents in an old project's workspace; private projects move documents to the internal workspace.
Original PR description
- 16.0 ### Steps to reproduce: - Install document and project. - Create a project and task. - Add a document to the task. - Change the task's project to another project. - Open the attached document from the task. ### Issue: You will observe that the document is not in the new project's workspace. It's still present in the older project's workspace ### Solution: Update the document's folder on the change of the task's project. task-4389443 Forward-Port-Of: odoo/enterprise#91510 Forward-Port-Of: odoo/enterprise#75481
This fix prevents an error when users manually enter a tracking reference for a Sendcloud delivery. Instead of showing a technical crash, the system now handles the missing Sendcloud parcel details gracefully and can display a proper user-facing message.
Original PR description
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3.…
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3. Create a sales order with a deliverable product 4. Confirm the sale order 5. Go to the delivery 6. Manually enter a random tracking reference. 7. Make sure carrier is set to the Sendcloud delivery method 8. Click on "tracking," or get back to the sales order (click "preview"). 9. A traceback occurs. **Issue:** `A TypeError: 'bool' object is not subscriptable` when accessing sendcloud_parcel_ref, which is expected to be a list or JSON but is instead a boolean. **Causes:** The code assumes the presence of valid Sendcloud parcel reference data, but manually entering a tracking reference bypasses the [_send_shipment](https://github.com/odoo/enterprise/blob/6ecf0af6b6874460d300ede6cc7c092927607810/delivery_sendcloud/models/sendcloud_service.py#L102) method that populates this field. As a result, sendcloud_parcel_ref can remain False. https://github.com/odoo/enterprise/blob/df924ef8adffb3e42419a44ecf22fec3059917c4/delivery_sendcloud/models/delivery_carrier.py#L196 **Solution:** Return None if there is no Sendcloud parcel reference, which will raise a UserError from the below line https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L288 Co-Author By - alsh@odoo.com opw-4894677 Forward-Port-Of: odoo/enterprise#89444
Fixes an error that could block recruiters from posting jobs to Monster when the saved username contains non-ASCII or accented characters. This makes the Monster integration more reliable for users with international credentials.
Original PR description
This error occurs when non-ASCII characters are included in the username for the Monster credentials. Steps to reproduce: --- - Install `hr_recruitment_integration_monster` module - In the settings, add the Monster credentials, and enter non-ASCII characters in the Username - Recruitment > Applications > Job Boards Post > Publish on jobs Board > Add required fields > Post Traceback: --- TypeError: comparing strings with non-ASCII characters is not supported This commit resolves the above error by encoding the string to bytes, as consteq does not support non-ASCII characters in string comparison. sentry-6554749046
Fixed an issue where editing a signing template could replace popup titles with placeholder text. This keeps reused signing templates clear and prevents incorrect field labels from appearing in future documents.
Original PR description
### Steps to reproduce:
- Create a document using a sign template.
- Add a new field or modify the placeholder of an existing one.
- Validate the changes.
- Notice title is replaced by the value entered in placeholder.
### Issue:
After editing a template that has already been used in a signed document, the title of each sign item popup is unexpectedly replaced with the value
entered in the placeholder for that item. This corrupts the template and results
in incorrect title of sign itme being shown when the template is reused.
### Cause:
The issue occurs because the title was being updated with the placeholder of that particular sign item.
### Solution:
Added a prop for title of sign item in SignCustomPopover so that we can make the title as name of the sign item or the type like ('Name', 'Text', 'Signature') rather than the placeholder of the sign item.
---
task-4872963
Forward-Port-Of: odoo/enterprise#90348Opening budget line reports for a budget with no lines no longer causes an error when viewing the theoretical percentage measure. Instead, the value is shown as zero, allowing users to continue analyzing budgets without interruption.
Original PR description
When we create a new budget without any budget lines and then attempt to calculate the ``theoretical_percentage`` in the budget lines, an error occurs. Steps to reproduce: - Install the ``account_budget`` module - Create a new budget and make ``Budget Lines`` empty - Now select that newly created budget and click on ``Budget Lines`` button - Go to the ``Pivot`` view and click on the ``Measures`` button - Click on the ``Theoritical Percentage`` Traceback: ``ZeroDivisionError: division by zero`` This error occurred at [1] because no ``records`` were found in the budget lines, as they were left empty when the budget was created. This commit will fix the error by checking the length of the records. If it is zero, will return zero. [1]- https://github.com/odoo/enterprise/blob/e4aec10fc1dd6a40e29f34c3aed71dc17b9ff2c6/account_budget/models/budget_line.py#L185-L186 sentry-5795601874