Daily updates from Odoo
Wednesday, September 10, 2025
12 changes · master
Resolved issues and error corrections
The WhatsApp integration now uses the latest supported Meta Graph API version. This helps prevent service disruptions caused by older API versions being retired and reduces the need for frequent future updates.
Original PR description
As outlines in the version [changelog] v17 of the API which we are currently using will be converted to the next oldest supported version of the API as per [policy] We can migrate directly to the latest version and avoid any issue in the next few years instead of having to worry about potentially breaking changes every few months. [changelog]: https://developers.facebook.com/docs/graph-api/changelog/versions/ [policy]: https://developers.facebook.com/docs/graph-api/guides/versioning task-4971841 Forward-Port-Of: odoo/enterprise#94110 Forward-Port-Of: odoo/enterprise#93170
The German tax report XML export now keeps periods as decimal separators, matching Elster's current requirements. This prevents submitted VAT return amounts from being ignored because of an unsupported comma format.
Original PR description
**Steps to reproduce:** 1. Install `l10n_de_reports` module. 2. Configure a company with a valid SteuerNummer. 3. Post some vendor bills with `19% I` VAT. 4. Go to *Accounting → Reporting → Tax…
**Steps to reproduce:** 1. Install `l10n_de_reports` module. 2. Configure a company with a valid SteuerNummer. 3. Post some vendor bills with `19% I` VAT. 4. Go to *Accounting → Reporting → Tax Report*. 5. Export the report to XML from gear icon. **Observed behavior:** - The generated XML contains amounts with a comma `,` as the decimal separator. - Elster ignores values with commas, so amounts are missing from the submitted VAT return. **Root cause:** - The QWeb XML export replaced the decimal point `.` with a comma `,`. - Elster launched a new tax return application (*einfachELSTERplus*), which enforces `.` as the decimal separator. **Solution:** - Stop replacing `.` with `,` when exporting values to XML. - Keep amounts as floats with period separators, while still rounding or inverting values as required for specific Kz fields. **ref:** https://www.elster.de/eportal/helpGlobal?themaGlobal=osseust_import opw-4935738 Forward-Port-Of: odoo/enterprise#94130 Forward-Port-Of: odoo/enterprise#93623
This fix prevents subscription invoices from being generated or sent twice when customers pay through the portal and automatic invoicing is enabled. It helps avoid duplicate invoice documents, reducing confusion for customers and extra follow-up work for accounting teams.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Use a localization that uses EDI-signed invoices; 2. enable `sale.automatic_invoice` via `ir.config_parameter`; 3. pay for a subscription via the portal. Issue ----- Invoice is generated twice. Cause ----- Commit 7c5fd63729c1 added automatic EDI invoice signing for subscriptions paid via portal. This assumed that the `sale.automatic_invoice` parameter remained unset. If this parameter is set, the invoice is already generated when post-processing a transaction in `sale`. Solution -------- Don't send invoices whose `is_move_sent` field is set to `True`. Also, don't set `from_cron` to `True` on automatic payments, as this is only intended for moves that have `sending_data` filled by `account.move.send.batch.wizard`. opw-4648189 Forward-Port-Of: odoo/enterprise#93881
Portal users can no longer see controls that would let them try to change article sharing settings or other members' access rights. This prevents confusing errors and redirects users safely if leaving an article removes their own access.
Original PR description
Steps to reproduce =============== As an admin ---------------- 1. Go to knowledge 2. Open any article. 3. Add a portal user as a member with write access. As a portal user -------------------- 1. Open the shared article. 2. On the top right corner, click on members button --> List of members along with their rights will be shown. The portal user can open the dropdown to alter the rights of other members. Though doing so will raise an AccessError (in the logs). After this commit, the portal user will *no* longer see the 1. Toggle to share article to the web. 2. Dropdown to modify members' rights. Task-4863456 Forward-Port-Of: odoo/enterprise#89394
Fixed an issue where opening an embedded list view from a Knowledge article could unintentionally save internal view settings and later cause an error when editing the article. Users can now return to and edit Knowledge articles with embedded list views without hitting a traceback.
Original PR description
Steps to reproduce =================== 1. Insert any list view in the knowledge article. 2. Click on open view from the article. 3. Come back and click edit. -> Traceback occurs Technical…
Steps to reproduce =================== 1. Insert any list view in the knowledge article. 2. Click on open view from the article. 3. Come back and click edit. -> Traceback occurs Technical ============= When we open a view from an embedded view in the article, we add `orderBy` from the action context to the action props if it exists. As the action prop is initialized and assigned directly from `embeddedState.additionalViewProps` without copying, it mutates the original object, changing the `data-embedded-props` attribute in the DOM and marking the body of the article as unsaved from `StateManager.changeState`. The action continues, and the action service commits those unsaved changes to the article. Once it is saved and the action is executed, when we get back to the article and click on edit, we check for `additionalViewProps` to be undefined/empty for all other views except calendar. As the DOM already has saved data in attributes, we get `orderBy` in `additionalViewProps`, and thus a manual error is thrown in the `editView` function. After this commit =============== Clone `additionalViewProps` when preparing the view action props. Task-4921282 Forward-Port-Of: odoo/enterprise#91113
The Peru electronic invoicing module now installs more reliably on large databases by reducing memory use during setup. It also avoids an installation error when updating tax group information, helping customers complete deployments without failures.
Original PR description
### [PERF] l10n_pe_edi: Avoid OOM during installation ### Description: Installing `l10n_pe_edi` on large databases with many moves and move lines could cause out-of-memory (OOM) errors. This happens…
### [PERF] l10n_pe_edi: Avoid OOM during installation ### Description: Installing `l10n_pe_edi` on large databases with many moves and move lines could cause out-of-memory (OOM) errors. This happens because several stored fields need to be computed at installation. ### Fix: This fix adds the columns via SQL, preventing Odoo from computing and populating the field for all existing records. This reduces memory usage and avoids installation failures. ____ ### [FIX] l10n_pe_edi: Fix error during post-init hook ### Description: During installation, the `l10n_pe_edi` module's post-init hook attempts to update tax groups, setting the new `l10n_pe_edi_code` field. This can cause an error if a tax group doesn't exist and needs to be created, because the name field is missing in the list of values given to the `_load_records` function. ### Fix: This fix filters the tax groups to only update existing ones. This prevents `_load_records` from trying to create new groups, which avoids the installation error. ___ ### Reference: opw-4982181 Forward-Port-Of: odoo/enterprise#91997
This fix ensures that delivery providers disabled in UrbanPiper remain disabled when a point of sale session is resumed. It prevents providers from being automatically re-enabled and avoids unnecessary background update requests, helping staff keep delivery availability accurate.
Original PR description
Steps to reproduce: - Configure urban piper in pos.config - Open Register - You could see a notification that providers are online on your config - Disable any one provider. - Go to backend. - Click Continue Selling Issue: - Despite disabling the provider, all providers get enabled as soon as we resume the pos.config Cause: - Not updating togglestate properly while going to the backend. - Unnecessary api request when resuming session. Fix: - Not removing the toggleState from local storage as the user go to the backend - When the user resumes the session, restrict api request for location update. - Remove dependency from local storage and handling all through backend only. task- 4962969 Forward-Port-Of: odoo/enterprise#93691 Forward-Port-Of: odoo/enterprise#90987
The analytic account filter in accounting reports is now initialized after the options it depends on. This restores the missing filter so users can correctly narrow report results by analytic account.
Original PR description
The origin of the bug comes from this https://github.com/odoo/enterprise/pull/86716 It added a `_init_options_filters` function which was called with a default sequence of 200. The `_init_options_analytic_groupby` has a sequence of 995. The _init_options_filters basically ran before the analytic account options which it depends on. Th fix was to set a sequence large enough to `_init_options_filters` so that it would always run after everything.
Public users can now open shared signing links and copy sign requests without running into access errors. The change keeps permissions protected while allowing the system to handle the required recipient information in the background.
Original PR description
Issue: * When a sign request was copied via a public share link, the process failed with an `AccessError`. * This happened because the computed field `cc_partner_ids` (partners in CC) was read as the…
Issue:
* When a sign request was copied via a public share link, the process failed
with an `AccessError`.
* This happened because the computed field `cc_partner_ids` (partners in CC) was
read as the *Public user*, who does not have read rights on `res.partner`.
* With recent core changes, many2many writes now enforce read access on linked
records, making the error unavoidable.
Steps to reproduce:
1. Open the master on Runbot.
2. Upload a PDF to Sign.
3. Press the `Share` button.
4. Log out of the account.
5. Open the copied share link.
6. A traceback appears in the log with an access error on `res.partner`.
Fix:
* Compute the `cc_partner_ids` under `sudo()` in the copy.
* This ensures the system can read the CC partners with elevated rights and only
passes their IDs (safe to use) to `message_subscribe`.
Impact:
* Public users can now open and copy sign requests from share links without
triggering access errors.
* Preserves security: only the system uses `sudo()` for computing, while the
actual subscription still writes the partner IDs as normal.
task- 4067945
---
```yml
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/odoo/odoo/community/odoo/http.py", line 2740, in __call__
response = request._serve_db()
File "/home/odoo/odoo/community/odoo/http.py", line 2281, in _serve_db
raise self._update_served_exception(exc)
File "/home/odoo/odoo/community/odoo/http.py", line 2279, in _serve_db
return service_model.retrying(serve_func, env=self.env)
File "/home/odoo/odoo/community/odoo/service/model.py", line 184, in retrying
result = func()
File "/home/odoo/odoo/community/odoo/http.py", line 2326, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/odoo/community/odoo/http.py", line 2541, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/odoo/community/odoo/addons/base/models/ir_http.py", line 357, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/odoo/community/odoo/http.py", line 788, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/odoo/enterprise/sign/controllers/main.py", line 498, in make_public_user
new_sign_request = sign_request.with_user(sign_request.create_uid).with_context(no_sign_mail=True, sign_request=sign_request).copy({
File "/home/odoo/odoo/enterprise/sign/models/sign_request.py", line 243, in copy
new_request.message_subscribe(partner_ids=old_request.with_user(old_request.create_uid).cc_partner_ids.ids)
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 45, in __get__
return super().__get__(records, owner)
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 1738, in __get__
self.compute_value(record)
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 1904, in compute_value
records._compute_field_value(self)
File "/home/odoo/odoo/community/addons/mail/models/mail_thread.py", line 468, in _compute_field_value
return super()._compute_field_value(field)
File "/home/odoo/odoo/community/odoo/orm/models.py", line 4913, in _compute_field_value
determine(field.compute, self)
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 81, in determine
return needle(*args)
File "/home/odoo/odoo/enterprise/sign/models/sign_request.py", line 157, in _compute_cc_partners
sign_request.cc_partner_ids = sign_request.message_follower_ids.partner_id - sign_request.request_item_ids.partner_id
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 1812, in __set__
self.write(protected_records, value)
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 727, in write
self.write_batch([(records, value)])
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 748, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 1475, in write_real
raise AccessError(model.env._("Failed to write field %s", self) + "\n" + str(e))
odoo.exceptions.AccessError: Failed to write field sign.request.cc_partner_ids
Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Public user (id=3) doesn't have 'read' access to:
- Contact (res.partner)
If you really, really need access, perhaps you can win over your friendly administrator with a batch of freshly baked cookies.
```After sending a document for signature from a record's chatter, users are now taken back to the original business record instead of staying on the signature document page. This keeps work flowing smoothly and reduces navigation friction after requesting a signature.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Open the chatter of any app record. - Open PDF uploaded in chatter. - Click on sign button for signing. - Send document for signing by keeping signer other than yourself. Before: - After sending for sign, the user stays on the document view instead of returning to the originating record. After: - After sending for sign, the user is redirected back to the originating record linked to the signature request. impact: - Improves user workflow by keeping them on the record they were working on. - Provides a smoother navigation experience. task-5059410 Forward-Port-Of: odoo/enterprise#93717
The AI app now checks for the correct PDF extraction library and handles missing or poor-quality PDF text more safely. This helps prevent background errors and avoids creating unusable AI content from invalid attachments.
Original PR description
## Issue Running the AI app locally without the pdfminer.six library results in cron errors while extracting the pdf text and creating the chunks. Since `pdfminer.six` is required for PDF text extraction, it must be installed. Only `pdfminer` installed doesn't work well with the majority of the attachments. ## Solution Check for `pdfminer.six` to be used for the PDFs' content extraction. If not there, then show a warning and fallback to the content extracted by the outdated pdfminer if there. If it is valid content, create the chunks and embed them, otherwise mark the source as failed. task-19060
This fixes an error that could prevent sales orders from being validated in the Point of Sale when the Belgium Blackbox module was installed. Businesses using this setup can now complete POS transactions without encountering the validation crash.
Original PR description
Since this PR (https://github.com/odoo/odoo/pull/216523) there is a traceback when the module `pos_blackbox_be` is installed and the order is validated. Steps to reproduce: - Install the module `pos_blackbox_be` - Go to the POS (no need to configure the blackbox for the POS) - Create a new order and validate it - See the traceback