Tuesday, September 16, 2025
24 changes · saas-18.4
Resolved issues and error corrections
Studio exports now work correctly for binary fields that are not stored as attachments. This prevents export failures and helps users retrieve their Studio-managed data reliably.
Original PR description
**Before:** Attempting to export non-attachment binary fields using the `Studio Export` would cause a traceback. **After:** Non-attachment binary fields can now be successfully exported from `Studio` without error. task-4888937 Forward-Port-Of: odoo/enterprise#94230 Forward-Port-Of: odoo/enterprise#93781
DIN5008 report layouts now stop showing the customer's phone number in the address block, and the customer's VAT number is moved out of that section. This keeps printed customer addresses cleaner and aligned with the intended DIN5008 layout.
Original PR description
This commit removes the phone number from the DIN5008 report layout. The customer's VAT is also no longer displayed in the customer's address section. The VAT is moved to another section. Description of the issue/feature this PR addresses: Current behavior before PR: The customer's phone number and VAT are displayed in the customer's address in the DIN5008 report layout. Desired behavior after PR is merged: The customer's phone number is no longer displayed and VAT moved to another section in the DIN5008 report layout. opw-5049074 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226967 Forward-Port-Of: odoo/odoo#226630
PDF documents now display tiny negative amounts that round to zero as "0.00" instead of "-0.00". This avoids confusing or misleading totals on printed reports and customer-facing documents.
Original PR description
Previously, when an amount value that is passed to `value_to_html` is a really small negative number (e.g. -0.000000001), the rounded result will have the negative sign in front of it (e.g. "-0.00").
This commit fixes it so that they will be rendered without the negatives ("0.00").
opw-4685953
Forward-Port-Of: odoo/odoo#224292This fix prevents the Time Off app from showing an error when a user clears the end date while creating a leave request. The system now safely skips date comparison until valid dates are entered, keeping the form usable and relying on existing validation to guide the user.
Original PR description
Currently, an error occurs when user removes value from `request_date_to` field. **Steps to replicate:** - Install Time Off app and open it. - Click new and remove values from the `request_date_to` field (the second date field in the row) and click somewhere else. **Error:** `TypeError: '<=' not supported between instances of 'datetime.date' and 'bool'` **Cause:** - The field `leave.request_date_to` is received as `False` in the line [1] as the user deleted it. **Solution:** - Added a check for date values, if the date values are false, the further code execution is skipped because the validation is already present. [1]: https://github.com/odoo/odoo/blob/b6c4c190331a7dc826df1b2ef399c0f6be32f657/addons/hr_holidays/models/hr_leave.py#L363 sentry-6830356042 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Lists marked to appear without indentation now keep their intended spacing in the website editor. This prevents footer and other unstyled lists from looking incorrectly indented while editing pages.
Original PR description
Problem: The default Bootstrap padding is being forced on all lists inside the editor, including those with the `list-unstyled` class. This class is supposed to enforce `0px` padding, but the current rule overrides it. Solution: Remove the style as `2rem` is already the Bootstrap default list padding. Done here: https://github.com/odoo/odoo/commit/1593f25b0160a68d356dd5bba3887ff5a6298c60 Steps to reproduce: 1. Open website. 2. Open the editor. 3. Notice the footer list (with `list-unstyled`) is incorrectly indented. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227204
This fixes an internal test setup issue where the self-order payment route was generated before its access token was available. The change helps keep kiosk QR code and IoT payment-related testing reliable, reducing the risk of regressions reaching users.
Original PR description
A call to `_get_self_order_route` in the `test_online_payment_kiosk_qr_code` test was happening too early, resulting on getting the self order url missing the `access_token`. This resulted in making the test fail due to the override of the `iot_http` service in `pos_self_order_iot`, relying on this token to get the IoT WebSocket channel. Enterprise PR: odoo/enterprise#93895
Mobile users now see the template name as the main information when browsing signing templates, instead of seeing the creation date first. This makes it easier to choose the correct template and keeps the mobile view aligned with the desktop experience.
Original PR description
### Issue: - In mobile view, the template list was showing the creation date instead of the template name. - This made it hard to know which template you were selecting. --- ### Fix: - Changed the mobile view to show the template name as the main info. - The creation date is still shown, but as extra information. --- ### Impact: - Easier to find the right template on mobile. - Mobile and desktop views now look consistent. --- Task: 5038933 Forward-Port-Of: odoo/enterprise#93072
Mexican electronic invoice PDFs now use the same customer fiscal regime as the official XML file. This prevents mismatches between the human-readable invoice and the legally submitted CFDI document, reducing confusion for users and customers.
Original PR description
In l10n_mx: - Create a child contact under a company contact. - Set the fiscal regime of the child contact to one different from the company’s fiscal regime. - Create an invoice with the child contact and send it to the CFDI. In the XML, the fiscal regime used is the company’s, whereas in the PDF it is the child contact’s. This commit applies the same logic from _add_customer_cfdi_values to the PDF generation. After this change, the fiscal regime shown in the PDF will be the company’s, consistent with the XML. opw-4989605 Forward-Port-Of: odoo/enterprise#94259 Forward-Port-Of: odoo/enterprise#92482
Users can now open the duplicate transactions wizard even when no bank journal is linked. This avoids an unexpected error in Accounting and makes the view safer to access directly.
Original PR description
Currently, an error occurs when users try to open the view directly. Steps to reproduce: --- - Install `Accounting` module - Using Open View, Open `account.duplicate.transaction.wizard` view Traceback: --- `ValueError: Expected singleton: account.journal()` This error occurs because no account journal is linked to the wizard at [1], resulting in an empty `account.journal`. [1]- https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_online_synchronization/wizard/account_journal_duplicate_transactions.py#L32 sentry-6812500330 Forward-Port-Of: odoo/enterprise#94538
The portal signature form now checks whether a pop-up window is present before trying to use it. This prevents errors when the form is embedded directly on a page, making customer signature flows more reliable.
Original PR description
Description of the issue/feature this PR addresses: Be able to use the portal signature form outside of a modal. Current behavior before PR: If the signature form (```<t t-call=“portal.signature_form”>```) is used outside of a modal, an error occurs: ```TypeError: Cannot read properties of null (reading 'addEventListener')``` Desired behavior after PR is merged: The signature form can be used outside of a modal. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224564
When users create a new partner during bank reconciliation, the system now chooses the receivable or payable action based on the transaction amount instead of missing customer or supplier history. This prevents the wrong payment button from appearing for brand-new partners, reducing confusion during reconciliation.
Original PR description
When creating a new partner from the set partner button, the partner doesn't have any rank (supplier or customer), this lead to have the payable button to be displayed since the condition to have it is to have a partner and not (customer_rank > supplier_rank). Since supplier rank and customer rank are 0 it will be False which lead to the button to be displayed. no task id Forward-Port-Of: odoo/enterprise#90435
Website sitemaps now avoid listing the same page more than once when website controllers are customized. This helps search engines receive cleaner sitemap data without changing which pages are available on the site.
Original PR description
When extending controllers (e.g. `WebsiteSale.shop`), sitemap entries were duplicated because deduplication relied on the endpoint function object. Overridden methods result in different function objects but identical sitemap URLs, leading to duplicates. This commit fixes the issue by deduplicating on the generated sitemap location (`loc['loc']`) instead of the function object, ensuring unique URLs in the sitemap even when controllers are extended. Fixes #224193 Forward-Port-Of: odoo/odoo#226810 Forward-Port-Of: odoo/odoo#224406
The website SEO dialog now clears old image status changes when it is opened. This prevents image alt descriptions added in the editor from being accidentally erased when users reopen and save the SEO dialog without making changes.
Original PR description
Steps to reproduce: 1. Open Optimize SEO. 2. Mark an image as decorative. 3. Save it. 3. Give a description(ALT) to that image from editor. 4. Open Optimize SEO again and save without doing anything. Issue: The description(ALT) on the image being set is lost. Cause: When reopening the **Optimize SEO** dialog, `seoContext.updatedAlts` still contained entries from previous edits. As a result, saving without making any change triggered an call to `update_alt_images` which reset the `alt` attribute to empty, eventually discarding the description. This PR ensures `seoContext.updatedAlts` is reset when opening the dialog. Forward-Port-Of: odoo/odoo#226913
Odoo Studio now requires users to choose a related record type when creating AI-powered Many2one or Tags fields. This prevents crashes caused by incomplete field setup and gives users a clear visual warning before they confirm.
Original PR description
When adding an AI field of type Many2one or Tags, the Relation field was optional. If left empty, it caused a crash. This commit enforces that a Relation must be selected before confirming the dialog: - Add a red highlight if Relation is missing - Prevent field creation by returning early Task-5055796 Forward-Port-Of: odoo/enterprise#93873
This fix prevents a demo data installation error when Italian Riba and Stripe expense features are used together. It ensures the sample company bank setup can handle the extra bank journal created by Stripe expenses, so demo environments install reliably.
Original PR description
Steps: 1. Install `hr_expense_stripe` and activate demo data 2. Install `l10n_it_riba` 3. `l10n_it_riba` demo data install fails with an error Since [this commit](https://github.com/odoo/enterprise/commit/752ffcbcd0c33e2886aa7bcec469e16d3704d7a9), an additional bank journal is created on every company by `hr_expense_stripe`, and `l10n_it_riba` demo data only expects one. task-none
Fixed an issue in Odoo Sign where completed signature emails could include multiple attachments with duplicate names and an extra .pdf extension. Recipients now receive clearly named signed documents, reducing confusion when downloading or filing multiple completed documents.
Original PR description
Steps to reproduce: 1. Install Sign. 2. Configure an outgoing email server. 3. Send a sign request for 2 or more documents to the admin (use your own email) 4. Open the email, sign and validate the documents. 5. You will receive an email. **Issue:** - You observe there are attachments in the email with same name and an extra `.pdf` as file extensions (e.g. `abc.pdf.pdf`). **Cause**: https://github.com/odoo/enterprise/blob/a1cd174c65fa181701cc3c5883fb5ab43b2803d8/sign/models/sign_request.py#L588-L594 - The code used `record` instead of the current `document` to determine the attachment name, causing the wrong generated name. **Solution:** - Use the `document` name when generating the attachment filename. opw-4965405 Forward-Port-Of: odoo/enterprise#92183
Product pages now make it easier for shoppers to see which image is currently selected in the image carousel. The active thumbnail has a stronger highlight, while inactive thumbnails are dimmed unless hovered, reducing confusion when browsing product photos.
Original PR description
Steps ----- 1. Have a published product with multiple images; 2. go to its website page; 3. open website editor; 4. set Images Ratio to Wide; 5. enable pop-up on click; 6. save; 7. browse through the images. Issue ----- - While there is a border around the active thumbnail in the bottom row, it is barely visible, making it difficult to see which image is currently being shown. Cause ----- - The border is only 1 pixel wide. Solution -------- - Increase the width of the border to 4 pixels, change the color to `$primary`, and hide the border for inactive images. - Set opacity of thumbnails that aren't selected or hovered over to 0.5. opw-4908881 Forward-Port-Of: odoo/odoo#224644
This fixes a race condition in Mail tests where message content and attachment updates could arrive in the wrong order, causing inconsistent test results. The change makes the test flow wait for messages and update attachments through the user interface, improving reliability without changing business functionality.
Original PR description
Before this commit, the test could experience a race condition where the load of the message and the update of the content of that message happen at the same time, if that happens and the update of the content is received by bus before the load of the message (which therefore does not contain any attachment), then the store was overriding the attachment. This commit should solve the problem in the test by waiting for the messages at the beginning of the test as well as updating the attachments in the ui and not by rpc directly. The race conditions should be fixed globally and are not only linked to this issue. fixes-runbot-66304 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226922
This update fixes an internal automated test that could occasionally fail because a randomly generated database identifier happened to contain a specific test value. It narrows the check to the relevant AI prompt and conversation data, improving test reliability without changing user-facing behavior.
Original PR description
The database_id is an uuid. It can happen that it contains the substring "1337". The test only needs to check if the value is not in the "prompt" or "conversation_history" keys. Thus we can remove the "database_id" key runbot-198561 Forward-Port-Of: odoo/enterprise#94807
When a TicketBAI submission fails for a Spanish POS order, the receipt will no longer print an invalid QR code. This avoids confusing customers and helps ensure receipts only include QR codes when the tax reporting submission has been accepted.
Original PR description
Currently if the TicketBAI upload fails, a QR code is printed with the value `true`. Steps to reproduce ----- 1. Validate a POS order 2. Have a request exception occur during the TicketBAI post 3. Receipt is printed with an incorrect QR code Issue ----- `get_l10n_es_pos_tbai_qrurl()` returns None if the edi document is not accepted. This is then interpreted as `true` by the client and a QR code is printed. Solution ----- Explicitly return an empty string if the edi document is not accepted. Forward-Port-Of: odoo/odoo#227293
Fixed an issue where editing product properties could show an empty notification when the product had no category. Users now see the intended warning message, reducing confusion during product setup.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Create a new product without a category; 2. try to edit properties. Issue ----- An empty notification appears. Cause ----- The `_getPropertyEditWarning` override in `account_asset` introduced by PR odoo/enterprise#87807 doesn't return the value of the `super` call. This was introduced in a forward port as the logic to display the warning was changed in `web` in saas-18.3, and not requiring a return value in previous versions. Solution -------- Return the `super` call. opw-4980006 Forward-Port-Of: odoo/enterprise#94583
This update prevents an error in the Mail app when empty values are included while looking up email records. It improves reliability by safely ignoring invalid empty entries before processing them.
Original PR description
Browse breaks when given a bool, so the solution is to filter the list from false values before browsing --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225916
Italian split payment taxes now show the correct label in the Taxes column on PDF documents instead of appearing like standard taxes. This helps businesses produce clearer, more accurate tax documents for customers and compliance review.
Original PR description
Split payment taxes were not labelled correctly in the PDF's "Taxes" column, they were labelled as standard taxes. <img width="1214" height="598" alt="image" src="https://github.com/user-attachments/assets/f1ea57bd-9a7f-460f-8c81-6a89585ba6d8" /> Forward-Port-Of: odoo/odoo#227284 Forward-Port-Of: odoo/odoo#226366
Renamed spreadsheets now keep their updated name when users create another spreadsheet and navigate back through the breadcrumb. This prevents confusion from previously renamed spreadsheets appearing as untitled.
Original PR description
Steps to reproduce: - Create a spreadsheet - Rename it to "My awesome spreadsheet" - Click on File -> New - Go back to "My awesome spreadsheet" from the breadcrumb => The spreadsheet is untitled. This was caused by the fact that the name was not saved in the local state of the action. Task: 4942117 Forward-Port-Of: odoo/enterprise#93163