Daily updates from Odoo
Wednesday, October 29, 2025
5 changes · 17.0
Enhancements to existing features
The IoT device password generation process was updated so it continues to work with newer Python versions. Compatibility links were also added so existing system processes can still find moved setup files, reducing the risk of disruption during updates.
Original PR description
To ensure compatibility with python 3.13+, we updated the method to generate the rpi's password to avoid using the removed `crypt` lib. We also ensure that files moved between `point_of_sale/tools/posbox/`, `addons/iot_box_image/` and `setup/iot_box_builder` can still be found by system processes using symlinks.
Resolved issues and error corrections
Website editors can now undo the deletion of dynamic content blocks, such as products, events, or blog posts, and have them reappear as expected. This prevents lost content during page editing and makes the website editing experience more reliable.
Original PR description
This commit resolves an issue related to loading dynamic snippets that were reinserted into the DOM via the undo action after deletion. **Steps to reproduce the issue:** 1. Add any dynamic snippet (e.g., Products, Events, Blog Posts). 2. Delete the snippet using the tooltip. 3. Perform the UNDO action. Currently, the dynamic snippet does not reappear after the undo action. With this commit, the dynamic snippet will be reinitialised and will be visible again after following the steps above. **Task:** 3601449 --- I confirm that I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr.
Fixed an issue where removing a component in the subcontracting wizard could leave an unwanted pending inventory move in reports. Deleted component lines are now properly removed from the database, keeping subcontracting production and inventory reporting accurate.
Original PR description
Issue ----- Removing a line using the subcontracting wizard does not delete the line in DB, there is a "phantom" ML. Steps to reproduce ----- - Create a subcontracted product with 2 components - Add…
Issue ----- Removing a line using the subcontracting wizard does not delete the line in DB, there is a "phantom" ML. Steps to reproduce ----- - Create a subcontracted product with 2 components - Add one of each component in subcontractor's stock - Create a PO for the finished product and confirm it - Go to the production - Open the "Record components" wizard - Set quantity then remove the second line - Confirm production (don't update consumption) - Go to Inventory > Reporting > Moves History and remove the "Done" filter > There is a pending move in the report Cause ----- When saving the wizard's changes, we call a write on the production's `move_line_raw_ids` field to remove delete the line. The field is a simple compute, so we go through its' inverse method https://github.com/odoo/odoo/blob/be3a4283c383d187570f5a73f337030e6ae9d05c/addons/mrp_subcontracting/models/mrp_production.py#L34-L46 The problem is that we populate `line_by_product` using the values present in `move_line_raw_ids` from which we just removed the line. This means that when we do `move.move_line_ids = line_by_product.pop(move.product_id, self.env['stock.move.line'])` we replace the value of `move_line_ids` with only the remaining ones, which means we unlink the move line (*from the move*). Because the inverse field (`move_id` of the SML) is not set as `ondelete='cascade'`, the link is broken but the line remains in db. https://github.com/odoo/odoo/blob/f173c738b1adcf85a80eb641ad307b7cccf17294/odoo/fields.py#L4311-L4322 We cannot change the field to `ondelete='cascade'` as such a change would not be stable. Solution ----- Keep reference of the lines to be removed in order to delete them once `move_line_ids` has been updated. ----- Ticket: opw-4817397
This fix prevents an extra cent from being added to tax totals when invoices use global rounding with small fixed taxes. It helps ensure Belgian UBL BIS3 electronic invoices validate correctly and match expected VAT totals.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_be - Switch to a Belgian company (e.g. BE Company CoA) - In Accounting settings, configure "Rounding Method" to "Round Globally" - Create a fixed…
**Steps to reproduce:**
- Install Accounting and l10n_be
- Switch to a Belgian company (e.g. BE Company CoA)
- In Accounting settings, configure "Rounding Method" to "Round Globally"
- Create a fixed tax:
* Tax Name: Recupel 5.57
* Tax Computation: Fixed
* Amount: 0.0661
* Tax Group: Recupel
- Create an invoice:
* Customer: [a Belgian customer]
* Invoice Lines:
| Label | Quantity | Price | Taxes |
| ----- | -------- | ------ | -------------------------------- |
| X | 1.00 | 239.25 | [21%] [Recupel 5.57] |
| Y | 1.00 | 62.30 | [21%] [Recupel 5.57] |
| Z | 1.00 | 149.25 | [21%] [Recupel 5.57] |
- Confirm the invoice
- Generate the UBL BIS3 XML via "Send & Print"
- Use a validator to validate the XML
**Issue:**
The validation fails with the following error:
"[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110)."
**Cause:**
The fixed Recupel tax has an amount of 0.0661€, which is rounded to 0.07€.
As it is used 3 times, the total value for that tax is 0.07 * 3 = 0.21€.
However, in round globally mode, when dispatching the delta of the tax rounding, 0.01€ is added to the first tax line because a difference is detected between the unrounded total value of the tax (0.0661 * 3 = 0.1983) and the rounded total of 0.21€.
This leads to an extra cent added to a tax line in the generated XML and therefore to the BIS3 validation error.
**Solution:**
Use "_aggregate_taxes" method before applying the delta dispatching process to base it on the results returned by "_aggregate_taxes" method.
opw-4915551
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix prevents database restores from failing when the built-in Odoo OAuth provider record has been deleted. It makes restore operations more reliable for systems where OAuth settings were previously removed or customized.
Original PR description
**Description of the issue/feature this PR addresses:** When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database. **Current behavior before PR:** You'll get this…
**Description of the issue/feature this PR addresses:**
When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database.
**Current behavior before PR:**
You'll get this error:
```
odoo.service.db.restore_db(dbname, backup, copy, **extra_kwargs)
File "<decorator-gen-27>", line 2, in restore_db
File "/opt/ou/odoo/odoo/service/db.py", line 44, in if_db_mgt_enabled
return method(self, *args, **kwargs)
File "/opt/ou/odoo/odoo/service/db.py", line 360, in restore_db
env['ir.config_parameter'].init(force=True)
File "/opt/ou/odoo/addons/auth_oauth/models/ir_config_parameter.py", line 13, in init
oauth_oe = self.env.ref('auth_oauth.provider_openerp')
File "/opt/ou/odoo/odoo/api.py", line 611, in ref
res_model, res_id = self['ir.model.data']._xmlid_to_res_model_res_id(
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2059, in _xmlid_to_res_model_res_id
return self._xmlid_lookup(xmlid)[1:3]
File "<decorator-gen-43>", line 2, in _xmlid_lookup
File "/opt/ou/odoo/odoo/tools/cache.py", line 90, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2052, in _xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid)
ValueError: External ID not found in the system: auth_oauth.provider_openerp
Error: External ID not found in the system: auth_oauth.provider_openerp
```
**Desired behavior after PR is merged:**
No error will occur
The afflicted versions are AFAIK, **16.0**, **17.0**, **18.0**, and **19.0**
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr