Daily updates from Odoo
Thursday, September 18, 2025
8 changes · saas-18.3
Resolved issues and error corrections
Follow-up PDF reports now correctly include attachments stored as remote links or in cloud storage. This prevents report generation failures and helps users reliably produce customer follow-up documents regardless of where files are stored.
Original PR description
### Issue PDF reports fail when attachments are remote URLs or cloud storage resources. The to_pdf_stream() method expects local file data but receives boolean values from remote attachments, causing a TypeError. ### Solution Download remote resources before processing them in PDF reports. This ensures all attachments have accessible data regardless of storage type. ### Affected Reports (enterprise): - account_followup.report_followup_print_all [Community PR](https://github.com/odoo/odoo/pull/226094) OPW-5036638 Forward-Port-Of: odoo/enterprise#94975 Forward-Port-Of: odoo/enterprise#94477
PDF report generation now downloads remote or cloud-stored attachments before including them. This prevents errors when printing vendor bills or expense sheets that reference files stored outside Odoo, improving reliability for businesses using cloud storage links.
Original PR description
### Issue PDF reports fail when attachments are remote URLs or cloud storage resources. The `to_pdf_stream()` method expects local file data but receives boolean values from remote attachments,…
### Issue PDF reports fail when attachments are remote URLs or cloud storage resources. The `to_pdf_stream()` method expects local file data but receives boolean values from remote attachments, causing a TypeError. ### Solution Download remote resources before processing them in PDF reports. This ensures all attachments have accessible data regardless of storage type. ### Affected Reports - `account.report_original_vendor_bill` - Vendor bill reports - `hr_expense.report_expense_sheet` - Expense sheet reports ### Affected Versions - 18.0+ (17.0 theoretical; cloud_storage wasn't implemented, so doesn't make sense) ### Reproduction Steps #### Option A: HR Expense Report 1. Create HR expense record 2. Add attachment with type=url/cloud_storage pointing to valid PDF URL 3. Link attachment to hr.expense record 4. Generate expense report → TypeError occurs #### Option B: Vendor Bill Report 1. Create vendor bill (account.move) 2. Add attachment with type=url/cloud_storage pointing to valid PDF URL 3. Link attachment to account.move record 4. Print Original Vendor Bill → TypeError occurs ### Error Details ```python TypeError: a bytes-like object is required, not 'bool' at /odoo/tools/pdf/__init__.py:220 in to_pdf_stream from /odoo/addons/hr_expense/models/ir_actions_report.py:29 ``` #### Reference Client demo: https://drive.google.com/file/d/1HUvZqZ21NiX34T2IQhuVNbLP41xSV7jq/view OPW-5036638 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227571 Forward-Port-Of: odoo/odoo#226094
Fixes an issue where tables pasted from sources like ChatGPT could cause the editor to crash or fail to select rows correctly. The editor now normalizes pasted table headers so users can edit and delete table rows reliably.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Copy a table from chatGPT's response containing first row wrapped in `<thead>`. - Paste it in editor. - Select last row. - Pressing backspace leads to traceback. This issue happens because the copied table is pasted with first row wrapped in a thead element. Due to this, rows are wrongly calculated leading to traceback in removeRow method. **Desired behavior after PR is merged:** - This commit ensures that if a table has first row wrapped inside a `thead`, the row is moved from `thead` to the start of `tbody` ensuring that rows are calculated correctly. - This commit also replaces all the `<th>` elements with `<td>`. task-5048339 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226990 Forward-Port-Of: odoo/odoo#224784
This update prevents certain internal performance tests from failing when timing results vary unpredictably. It helps keep development and release checks stable without affecting customer-facing Odoo features.
Original PR description
These tests are non-deterministic, we should not fail when running them. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227515 Forward-Port-Of: odoo/odoo#226278
This fix prevents an error when a customer has open carts on multiple eCommerce sites and their country change triggers different tax settings. Loyalty rewards are now recalculated separately for each cart, so customers can continue shopping without interruption.
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Have 2 eCommerce sites; 2. have a user with an open cart in both sites; 3. have a reward applied in one or both of carts; 4. have a fiscal position applicable…
Versions -------- - 16.0+ Steps ----- 1. Have 2 eCommerce sites; 2. have a user with an open cart in both sites; 3. have a reward applied in one or both of carts; 4. have a fiscal position applicable to the user's address; 5. change the user's country to one with a different fiscal position. Issue ----- > ValueError: Expected singleton: sale.order(1, 2) Cause ----- As of commit ede8846987a98, fiscal positions get recomputed on address changes. When a fiscal position changes, the `_recompute_prices` method gets called on all open carts. This method does not include an `ensure_one` check, so it should be able to handle multiple sales orders. However, the `sale_loyalty` override will call `_update_programs_and_rewards` on `self` if any reward line is encountered. This method does have an `ensure_one` check, leading to the error. Solution -------- Rewrite the override as a loop, so it can handle multiple records in `self`. opw-5017669 Forward-Port-Of: odoo/odoo#224225
When creating a mass mailing, favorite templates now refresh correctly after users change the target audience or related model. This helps users see the right reusable templates at the right time, reducing confusion and manual work.
Original PR description
In mass_mailing, when creating a new mailing, the theme selector allows users to select base templates for their mailings. Users can also add their own model-specific templates by marking mailings as "Favorite"s, which will cause them to show up in model selectors if the template's target model matches the new mailing's target model. However, in some circumstances, changing the target model does not cause the available template mailings to update. This is due to the callback responsible for updating the templates not reading the model variable correctly, causing useRecordObserver to not being called every time it is updated. This commit fixes this issue, therefore causing favorite templates to be updated more reliably. task-5054968 Forward-Port-Of: odoo/odoo#227424
Creating a new attendee record from reporting views no longer triggers an error in the eLearning app. This prevents an unexpected crash and keeps attendee management workflows usable for staff.
Original PR description
Currently an error occurs when creating the attendee records. Steps to Reproduce: - Install the `website_slide` module. - Go to `Reporting` > `Attendees`. - Go to either the `Graph or Pivot View` and…
Currently an error occurs when creating the attendee records. Steps to Reproduce: - Install the `website_slide` module. - Go to `Reporting` > `Attendees`. - Go to either the `Graph or Pivot View` and click on any `count` value. - Open any attendee record and click on `New`. `SyntaxError: syntax error at or near ")" LINE 18: WHERE SCP.id IN () ^` This error occurs when creating an Attendee record. The _compute_next_slide_id method runs every time the record is accessed, which causes the error [1]. As clearly mentioned in [this commit](https://github.com/odoo/odoo/commit/fd2fb88bb155b680147313433d22a2b7388c902c#diff-1ee3fce434db0c4e897973eebf5c1be501196cbd413e6c250ecc973238f939b9L292-R326), when a compute method is declared without the @api.depends(...) decorator or with no actual dependencies, the computed field will still be initialized when creating a new record from a form view. This commit ensures that when the compute method runs and the record has not been created yet, the next_slide_id is set to False. [1]:- https://github.com/odoo/odoo/blob/9f18013bc05e6657f5d41c05931fcdafad827d54/addons/website_slides/models/slide_channel.py#L91 sentry-6465821899 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217104
The calendar year view now updates properly when the browser window is resized. This prevents display issues for users viewing yearly calendars and keeps the layout responsive without extra processing.
Original PR description
FullCalendar already applies a debounce on the `windowResize` handler. Thus, doing it again in our renderer is a duplicated effort. Also, in the Year calendar renderer, the debounced version of the handler is initialized after the FullCalendar instances (one for each month) are created... which prevents it from being run at all. This commit fixes and cleans this up by directly passing our handler to FullCalendar, letting him do the rest. task-4809668 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#227505 Forward-Port-Of: odoo/odoo#227458