Monday, August 4, 2025
13 changes · saas-18.2
Resolved issues and error corrections
Email subtitles for invoices and sales orders now handle contacts without a name correctly. This prevents customers from seeing the word “False” in email notifications, making communications look cleaner and more professional.
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
Accounting error logs now keep their original message wording instead of being translated. This makes troubleshooting more consistent across languages while keeping translated messages for users.
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
Fixes an issue where changing a blog cover image or filter could unintentionally save changes into the underlying website template. This helps keep website templates clean and prevents unexpected styling conflicts after editing covers.
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
The website settings now show the correct label, "Google Search Console," instead of the reversed wording. This avoids confusion for users configuring their Google search 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
This fixes an error that could appear for Indian companies when a user removed the VAT number and then clicked the GST warning update button. The system now handles missing VAT information safely, allowing users to continue without a traceback.
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
The stock accounting report now treats tiny rounding leftovers as zero when calculating average cost. This prevents extremely large, incorrect unit costs from appearing and makes inventory valuation reports more reliable for users.
Original PR description
## Before this commit: Opening the stock report displays gigantic unit cost in some cases, when the sum of the valuation's quantity is near zero but not exactly, due to float arithmetics. For example, if the total quantity is 1e-15 and the total value is $0.01, the average cost will display $10000000000000 instead of $0. ## After this commit: Use `float_is_zero` to correctly detect zero-ish quantity. opw-4869588 Forward-Port-Of: odoo/odoo#221062 Forward-Port-Of: odoo/odoo#218671
Large product images shared through the purchase portal are now shown at a controlled size instead of overwhelming the page. This keeps shared purchase documents cleaner and easier for vendors or customers to review, especially when products use high-resolution images.
Original PR description
Issue ----- Images on the purchase portal are displayed in their original size instead, making it a visual mess. Steps to reproduce ----- - Create a product with a large image - Create a purchase for…
Issue ----- Images on the purchase portal are displayed in their original size instead, making it a visual mess. Steps to reproduce ----- - Create a product with a large image - Create a purchase for the product - Click the cog wheel > Share - Open the link in a new tab (with no active session, eg private window) --> The image is way too big Cause ----- Images are now converted to Webp: https://github.com/odoo/odoo/commit/1a978183001e0503104285f4bd5bed983beb0efb The problem is that Webp images cannot be resized through the Python backend: https://github.com/odoo/odoo/blob/0c6622294b7117ec5eb1cbf8a9270636b2dd807f/odoo/tools/image.py#L81-L83 However, the product model has multiple sizes for the image: https://github.com/odoo/odoo/blob/3ddf2bcdf16b5b43db4c4abe2cdbc4384cf683cc/addons/product/models/product_product.py#L91-L94 What we can do is load the smallest possible image and then use styling to limit the display size. The 48px comes from the hardcoded values in https://github.com/odoo/odoo/blob/0c6622294b7117ec5eb1cbf8a9270636b2dd807f/addons/purchase/controllers/portal.py#L99 This fix will no longer be needed when (if) Webp images get resized in backend. Comparison ----- Left is before, right is after fix.  Image used -----  ----- Ticket: opw-4625113 Forward-Port-Of: odoo/odoo#217990
Package type choices in delivery package details now appear in the sequence set by inventory users instead of an internal creation order. This makes the dropdown match the business-defined package priority and reduces selection mistakes during packing.
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
Live chat messages now consistently show the sender's display name instead of sometimes appearing blank to visitors. This improves clarity in customer conversations and avoids confusion when agents or visitors exchange messages.
Original PR description
Before this commit, using author.name directly could lead to not showing anything to livechat visitors. This is because the information is not send to the visitor. By using the authorName getter, we leverable the override in livechat and correctly use the livechat_username. task-4965911
In shared editing, another user's avatar is now positioned so it does not hide the toggle list button. This keeps document controls visible and makes collaboration smoother when multiple people edit the same content.
Original PR description
Problem: In collaboration mode, if another user's selection is on a toggle list, their avatar may overlap and hide the toggle button. Solution: When handling toggle lists, calculate the avatar position based on the toggle block itself rather than the nearest block. Before: <img width="743" height="368" alt="image" src="https://github.com/user-attachments/assets/72363e2b-184c-40ad-aff9-848b6c784783" /> After: <img width="601" height="386" alt="image" src="https://github.com/user-attachments/assets/4eb5549e-cbf0-45c3-8b7a-c78b6dd6ce3c" /> Steps to reproduce: - Add a toggle list - Open the same document in a second tab - In one tab, select content inside the toggle list - In the other tab, observe the avatar position - The avatar overlaps the toggle button opw-4921845 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Jordanian e-invoices now automatically remove spaces, plus signs, and other non-numeric characters from customer phone numbers before submission. This helps invoices pass JoFotara validation and reduces failed submissions caused by common phone number formatting.
Original PR description
Strip all non-digit characters from the partner phone so that the UBL XML complies with JoFotara’s XSD which requires `^[0-9]{1,15}$`. This prevents validation errors when submitting e‑invoices.
Steps to reproduce:
- Install l10n_jo_edi
- Set partner phone to “+962 79 123 4567”
- Create & post an invoice
- Send to JoFotara
OPW-[4945688](https://www.odoo.com/odoo/my-tasks/4945688)
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#221271
Forward-Port-Of: odoo/odoo#220357The change prevents Luxembourg and Romania reporting features from automatically installing the Accountant app when users select a different free app. This keeps app selection aligned with customer intent and avoids adding accounting functionality unless Accountant is already installed.
Original PR description
When choosing one app free in these countries, Accountant is automatically installed. This should only be the case when Accountant is the one app free. Fix: Change the auto-install dependencies to ensure that these modules are only installed when Accountant is already installed.
This fix prevents an error when users manually enter a tracking reference for a Sendcloud delivery. Instead of crashing, the system now handles the missing Sendcloud parcel data 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