Wednesday, July 9, 2025
18 changes · saas-18.2
Resolved issues and error corrections
This fix ensures MyInvois point-of-sale documents correctly link to their related orders across all affected records. It helps avoid missing order connections that could cause incomplete invoice or compliance document information.
Original PR description
Otherwise, it causes it fails to assign value to certain records, which is unadvised. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217713
Stock report PDFs now display table headers in bold as intended, matching the on-screen report formatting. This improves readability and keeps printed inventory reports visually consistent for users.
Original PR description
Problem: When printing the stock report, table headers are not bold in the generated PDF despite being styled that way in the HTML template. Cause: The bold styling is applied via CSS on the `thead` element, which doesn't render properly in the PDF output. Solution: Use `<strong>` tags inside table headers to apply bold formatting, as done in version 17.0. Also remove `font-weight` rules from CSS for `thead` to avoid conflicts and ensure consistent output. Steps to reproduce: 1. Go to Inventory > Inventory Overview. 2. Select any inventory record. 3. Print the report. → Table headers are not bold as expected, despite formatting. opw-4840380 enterprise PR: https://github.com/odoo/enterprise/pull/87852 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214545
This fix makes an internal mail presence test more stable when Odoo's automated test systems are under heavy load. It helps reduce false test failures, improving confidence in releases without changing the product experience for users.
Original PR description
Since [1], https://github.com/odoo/odoo/pull/207974 websocket timeout has been increased during test. Fetching notification only returns the notifications of the last 50 seconds initially. When runbot is under high load, this can lead to non deterministic failures. This commit patches the cursor date to bypass this issue. [1]: https://github.com/odoo/odoo/pull/207974 fixes rubot-223126,223758 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 fixes a mismatch in formulas used by the POS HR spreadsheet dashboard. Business users should see more reliable dashboard figures, reducing confusion when reviewing point-of-sale and employee-related performance data.
Original PR description
Task: 4930419 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217908
Confirmed purchase orders now allow users to edit product descriptions by hiding the product column when needed. This restores flexibility for correcting or clarifying supplier order details after confirmation without changing the ordered product.
Original PR description
<b>Steps to Reproduce:</b> - Navigate to Purchase → Create a new Purchase Order. - Add a Vendor → Add a Product with description or enter one using the ☰ widget. - Save and Confirm the order, Try to…
<b>Steps to Reproduce:</b>
- Navigate to Purchase → Create a new Purchase Order.
- Add a Vendor → Add a Product with description or enter one using the ☰ widget.
- Save and Confirm the order, Try to edit the description.
<b>Issue:</b>
- The product description becomes non-editable after confirming the PO.
- Previously, the description was separated in view.
<b>Cause:</b>
- Since `product_id` is readonly, the `name` (description) field also does not allow to edit.
- e.g. In SO, the description is editable if the product_id is hidden and only name (description) field is visible.
<b>Since the product_id field is read-only in the states ('purchase', 'to approve', 'done', 'cancel'), the description field
also becomes read-only, as they are combined. By hiding the product_id, we can edit the description, as it is not.</b>
<b>Solution:</b>
- Added `optional="show"` to `product_id` in the XML view to allow toggling discription editability.
- When `product_id` is hidden, the `name` field becomes editable.
<b>Steps to Verify:</b>
- Open same confirmed PO and hide the `product_id` column.
- Make sure `name` (description) field is visible and now it is editable.
<b>opw-4892063</b>
Forward-Port-Of: odoo/odoo#215997Fixes an issue where rotating large images in the HTML editor could cause the editing area to scroll and make the rotation control lose focus. Users can now continue rotating images smoothly without the control resetting during the action.
Original PR description
Problem: When a user rotates an image, certain image sizes can cause the editable area to become scrollable. This triggers `resetHandlers` from `usePositionHook`, resulting in loss of focus on the rotate controller. Solution: Add a flag to detect when the user is actively transforming (`mousedown`). Delay the reset until interaction ends (`mouseup`), preventing premature handler reset. Steps to reproduce: - Add a long image - Transform > Rotate until a scrollbar appears - You lose focus on the rotate controller opw-4890029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215401
Fixes an issue in the website editor where the background positioning overlay could appear with the wrong size on some content blocks. This makes it easier for users to adjust background images accurately and keeps related tooltips positioned correctly.
Original PR description
Before this commit in some snippets background overlay wouldn't have
proper height and/or width because of the snippets `h-{}, w-{}` classes.
This commit overrides it with `!important`.
To reproduce the issue:
- open website and start editing
- drop columns snippet, add background image to one of the cards, click
on it
- Click on the background position option to change it(the one with
a crosshair icon)
- the overlay isn't shown properly, which also breaks the tooltip
position
This should be forward-ported up to 18.3 inclusive, and from 18.4 on, `background_position_overlay.js L135` should be changed because of the [html_builder refactoring].
task-4930050
[html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
Forward-Port-Of: odoo/odoo#215377Changing a company's country VAT label now reliably updates the label shown on contact forms. This prevents users from seeing outdated form labels after configuration changes, reducing confusion when managing contact tax information.
Original PR description
**PROBLEM** When changing the vat label associated to the country of the user's company, it should change the label of the `vat` field. The cached partners views are not invalidated as they should…
**PROBLEM** When changing the vat label associated to the country of the user's company, it should change the label of the `vat` field. The cached partners views are not invalidated as they should and the old views with the old label are presented to the user instead of the new ones. This can be confusing to the user, because while their change had an effect on the database, it doesn't reflect on the views showed to them. **STEP TO REPRODUCE** 1. On a fresh database, install the contact app. 2. From the contact app, Configuration->Countries, select United States which should be the country of the demo company. 3. Change the Vat Label field value. 4. Go on any contact form view, and notice the label of the `vat` field wasn't updated. 5. You can refresh the pages, and sometimes the new value will be there, sometimes not. **CAUSE** https://github.com/odoo/odoo/blob/ac106704f3c2d3e3fa94415134b9d5522b325378/odoo/addons/base/models/res_partner.py#L41C1-L55C1 In the mixin `FormatVATLabelMixin` we modify the form view, changing the label of the vat field accordingly. However, the `_get_view_cache_key` override that would add the field used to make the change (`self.env.company.country_id.vat_label`) to the cache key is missing. Which means the cache isn't invalidated when it should. **FIX** Invalidating cache when writing on `vat_label` opw-4825749 Forward-Port-Of: odoo/odoo#213101
The donation widget now handles cases where no custom amount is configured. Instead of showing a technical error, visitors are prompted to select an amount, keeping the donation flow usable.
Original PR description
Since [1], a crash occurs when the Custom Amount option for the `s_donation` snippet is `None` and you use it. Steps to reproduce: - Drop `s_donation` snippet - Set Custom Amount option as `None` - Save and exit edit mode - Click on `Donate Now` button - A traceback occurs instead of showing an error to select an amount [1]: https://github.com/odoo/odoo/commit/22e777c046521f3f89b62caa5876680beb7f5aba
Invoice export now skips incomplete tax details that previously caused errors when creating UBL e-invoice line tax information. This helps ensure affected invoices can be generated reliably without manual intervention.
Original PR description
Before this commit: If a tax detail of an invoice line has the None tax grouping key, there is a traceback when generating the UBL InvoiceLine/ClassifiedTaxCategory After this commit: We exclude tax details that have the None grouping key when generating the InvoiceLine/ClassifiedTaxCategory. task-none Forward-Port-Of: odoo/odoo#217731
This fixes an intermittent automated test failure in the Mail app by ensuring the form is fully saved before the test finishes. It helps keep Odoo's test pipeline reliable and prevents false alarms during release validation.
Original PR description
Before this commit, tour "test_mail_composer_autosave_tour" could fail at end with the following error: ``` Tour finished with a dirty form view being open. Dirty form views are automatically saved when the page is closed, which leads to stray network requests and inconsistencies. ``` This happens because test creates a new record and posts a message in full composer. It checks that message is present in chatter and then leave the form view. When posting the message, the form view is saved, but this can happen with a small delay after message is visible on chatter like after tour has ended. This commit fixes the issue by awaiting form view is saved, so that tour doesn't panic at end there's a form view with unsaved changes, as the form view is properly saved with sending a message. Fixes runbot error 198583 Fixes runbot error 222676 Fixes runbot error 226772 Fixes runbot error 222676
This fixes a timing issue in Discuss tests where a newly posted message could be acted on before it was fully saved, causing reaction actions to fail. The change helps keep automated checks stable and reduces false failures in the messaging area.
Original PR description
Before this commit, tour "test_discuss_channel_public_page_as_guest" would crash in test after posting a message in which we attempt to add a reaction. This happens because the step is a `hover &&…
Before this commit, tour "test_discuss_channel_public_page_as_guest" would crash in test after posting a message in which we attempt to add a reaction. This happens because the step is a `hover && click 'Add a reaction'`, so it hovers on selector `o-mail-Message:contains(cheese)` then clicks on the 'Add a reaction' action. In discuss channels, when sending a message, the message is immediately shown on UI before there's a genuine message that is created in DB. This optimistic behavior gives impression the app is fast, but some actions require a genuine message like 'Add a reaction'. The problem of test is that selector `.o-mail-Message:contains(cheese)` passes with temporary / transient message of optimistic behavior, so the `hover` step would be triggered on the temporary / transient message and 'Add a reaction' action is awaited for click. Problem is that when genuine message data is received, implementation detail deletes the temporary / transient message and then shows the genuine message. Because the genuine message is different, component identity is different (it uses message.localId in `t-key`), thus it awaits `Add a reaction` on UI but it's not visible because we need to hover again, this time on genuine message. This commit fixes the issue by awaiting message is shown on UI is the persistent, i.e. non-temporary and non-transient, so that hover and click on the 'Add a reaction' action works without issue. fixes runbot errors 181660 fixes runbot errors 222093 fixes runbot errors 227756 Forward-Port-Of: odoo/odoo#217982
Out-of-stock reminder emails now omit the product price to avoid showing an amount that may not include taxes. This prevents customers from receiving misleading pricing information when a product becomes available again.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Configure website to display prices tax-included; 2. disable selling out-of-stock products; 3. go to an out-of-stock product page; 4. request a reminder email; 5. replenish product stock; 6. run the `_send_availability_email` action; 7. check email that was sent. Issue ----- The price display in the email does not include taxes. Cause ----- The email only checks the `list_price` defined on the product. Solution -------- Don't include the price in the email: - On stable: hide the element to avoid breaking xpaths - On master: remove the price element from the email template opw-4712613 Forward-Port-Of: odoo/odoo#215292
Helpdesk tickets created directly in a closed stage are now correctly marked as closed. This prevents portal customers from seeing resolved tickets when they use the Open Tickets filter, improving ticket list accuracy.
Original PR description
**Steps to reproduce:** 1. Install the Helpdesk module. 2. Create a ticket directly in a closed stage (e.g., 'Solved') and add the portal user as a customer. 3. Log in as the portal user. 4. Apply the Open filter. **Issue:** - The ticket appears under Open Tickets, even though it was created in a closed stage. **Cause:** - Currently we consider a stage as closed if 'floded in kanban' is True and When a ticket is created directly in a closed stage, the close_date field is not set. Since the portal filter relies on close_date to distinguish open from closed tickets, this shows closed tickets in open filter. https://github.com/odoo/enterprise/blob/c34256932e593ac2774fa65af813d64edb70ec43/helpdesk/controllers/portal.py#L63 **Solution:** - During ticket creation, if the specified stage is a closing stage, set the close_date field to the current time. opw-4847097 Forward-Port-Of: odoo/enterprise#88983 Forward-Port-Of: odoo/enterprise#87293
Uruguay electronic invoicing now handles invoice lines with a deleted description without crashing. This helps users successfully generate the required tax authority XML even when they intentionally leave a journal item description blank.
Original PR description
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description…
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description automatically populates with the product name upon line creation. However, users can intentionally clear this field. If the description field becomes empty, its value is interpreted as `False`. This leads to an `AttributeError: 'bool' object has no attribute 'replace'` traceback when the `_l10n_uy_edi_get_line_nom_and_desc` method attempts to process this boolean value, as it expects a string. This issue specifically affects the generation of the "DscItem" tag in the XML file sent to DGI. ### Solution: To prevent this error, an additional validation has been implemented for the line description. This validation ensures that if the field's value is `False`, it is not processed by the `_l10n_uy_edi_get_line_nom_and_desc` method, thus avoiding the traceback. Forward-Port-Of: odoo/enterprise#89407
This fix ensures the India GSTR-1 report output always includes the expected document issue section, even when there are no entries. It prevents automated validation and test failures, improving reliability for tax reporting workflows without changing user-facing behavior.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705 Forward-Port-Of: odoo/enterprise#89635
Printed inventory reports now keep table header text bold in the generated PDF, matching the intended report layout. This improves readability and ensures printed documents look consistent with the on-screen template.
Original PR description
Problem: When printing the stock report, table headers are not bold in the generated PDF despite being styled that way in the HTML template. Cause: The bold styling is applied via CSS on the `thead` element, which doesn't render properly in the PDF output. Solution: Use `<strong>` tags inside table headers to apply bold formatting, as done in version 17.0. Also remove `font-weight` rules from CSS for `thead` to avoid conflicts and ensure consistent output. Steps to reproduce: 1. Go to Inventory > Inventory Overview. 2. Select any inventory record. 3. Print the report. → Table headers are not bold as expected, despite formatting. opw-4840380 Forward-Port-Of: odoo/enterprise#87852
Miscellaneous changes
Step to reproduce; - install documents - upload a parasolid file, it has extension `x_t` - download it Observation: if a file is uploaded with file named as `file.x_t`, it will be downloaded as `file.x_t.txt` Issue: currently, the `get_extension` method only allow alphanumeric values for extension, which do not consider extension having '_' https://github.com/odoo/odoo/blob/15fd3f62769b137cb9a0625f47b333424b851a27/odoo/tools/mimetypes.py#L212-L218 when such file is downloaded,
Original PR description
Step to reproduce; - install documents - upload a parasolid file, it has extension `x_t` - download it Observation: if a file is uploaded with file named as `file.x_t`, it will be downloaded as `file.x_t.txt` Issue: currently, the `get_extension` method only allow alphanumeric values for extension, which do not consider extension having '_' https://github.com/odoo/odoo/blob/15fd3f62769b137cb9a0625f47b333424b851a27/odoo/tools/mimetypes.py#L212-L218 when such file is downloaded, `_get_stream_from` appends extra extension to the filename, depending upon its mimetype. https://github.com/odoo/odoo/blob/15fd3f62769b137cb9a0625f47b333424b851a27/odoo/addons/base/models/ir_binary.py#L148-L150 Fix: instead of `isalnum()`, use a regex that allows alphanumeric and underscore in extension. opw-4801263 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212197