Thursday, November 27, 2025
16 changes · 19.0
Enhancements to existing features
This update simplifies the link editing process by consolidating actions into a single, wider popover. The redesign removes a copy button and streamlines the user interface for easier link creation and management. These changes enhance the overall user experience and improve consistency within the Odoo website builder.
Original PR description
The link popover previously had multiple buttons, making the link editing experience less intuitive. This commit unifies actions into a single wider popover and refactors some logic to improve…
The link popover previously had multiple buttons, making the link editing experience less intuitive. This commit unifies actions into a single wider popover and refactors some logic to improve consistency. ## UI/UX changes: - Replaced three buttons (copy, edit, remove) with one "Edit" button, which opens the link editing view. | Before | After | | ------------- | ------------- | |  |  | - Widened the popover for better readability. - Removed the copy link feature. <br/> ## Changes in link editing view: - Moved the "remove link" button in this view. <kbd></kbd> - Updated URL input placeholder to: "Enter URL, /page, or #anchor". - Auto-focus the URL input when creating a link for selected text. - Auto-focus the label input when creating new links or editing existing links. task-[4862671](https://www.odoo.com/odoo/project/974/tasks/4862671) Co-authored-by: adch-odoo \<adch@odoo.com\> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update resolves an issue where alerts added to field descriptions during the checkout process couldn't be edited. The fix utilizes the editor's built-in insert command to ensure alerts are correctly placed within editable text fields, improving the user experience for adding feedback.
Original PR description
Problem: When adding an alert inside a field description in the Extra Step page of the checkout process, the inner content of the alert cannot be modified. Cause: In…
Problem:
When adding an alert inside a field description in the Extra Step page of the checkout process, the inner content of the alert cannot be modified.
Cause:
In
https://github.com/odoo/odoo/blob/1e96a3d127e8f521d3027f7110026ae84e11ed5e/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L784-L789 the logic determines the block using:
`this.closestElement(range.endContainer, 'p, div, ol, ul, cl, h1, h2, h3, h4, h5, h6');` Since the field description template is:
```html
<div class="s_website_form_field_description small form-text text-muted"
contenteditable="true">
text
</div>
```
and the selection occurs within the text (direct child of the editable `div`), the computed `block` becomes the editable area itself. As a result, the cloned alert is inserted *after* the editable area: `block.after($clonedBody[0]);`, making it non-editable.
Solution:
Use the editor’s built-in `insert` command instead of manually inserting clones. This ensures the alert is correctly inserted within the editable region.
Steps to reproduce:
1. Enable "Extra Step During Checkout" in Settings.
2. Open Website → add a product to the cart → proceed to checkout.
3. In the "Extra info" step, open the editor.
4. Select the "Give us your feedback" field.
5. Enable "Field" → "Description".
6. Run the "/alert" command in the description. → The alert content cannot be edited.
opw-5184309
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#234905
Forward-Port-Of: odoo/odoo#232910This update resolves an issue where the OSS Tax mapping feature would fail if a tax group was missing. The fix ensures the system correctly handles scenarios where tax group information is incomplete, preventing errors and improving the reliability of the tax calculation process. It updates the system to account for both payable and receivable tax accounts when searching for tax groups.
Original PR description
**Steps to Reproduce:** 1. Install the "**Belgium - Accounting**" (`l10n_be`) module with demo data. 2. Switch to the company - **BE Company CoA**. 3. Remove the "**Tax Payable Account**" from all…
**Steps to Reproduce:** 1. Install the "**Belgium - Accounting**" (`l10n_be`) module with demo data. 2. Switch to the company - **BE Company CoA**. 3. Remove the "**Tax Payable Account**" from all the tax groups. 4. In setting, under _EU Intra-community Distance Selling_ section, click on "**OSS Tax mapping**". **Error:** `ValueError - External ID not found in the system: account.1_oss_tax_group_20_0_SK` **Note:** If only the "**Tax Receivable Account**" is removed from all tax groups. The following error occurs; `TypeError: expected string or bytes-like object` **Cause:** At [1], the system searches for a tax group with a defined `tax_payable_account_id`. Also, at [2], the `oss_tax_group_local_xml_id` is created only when the tax group (tg) exists. However, when no tax group is found, the code tries to fetch the missing xml id at [3], resulting in a ValueError. Similarly, when the receivable account is missing, the execution also fails, leading to a TypeError. **Fix:** This commit updated the tax group search condition to include both `tax_payable_account_id` and `tax_receivable_account_id`. Also, added skipping further processing if the related tax group is not found. [1] - https://github.com/odoo/odoo/blob/fb30a9b12667f6b1195e6bd6f8db69f44ad5ca2a/addons/l10n_eu_oss/models/res_company.py#L47-L49 [2] - https://github.com/odoo/odoo/blob/fb30a9b12667f6b1195e6bd6f8db69f44ad5ca2a/addons/l10n_eu_oss/models/res_company.py#L115-L146 [3] - https://github.com/odoo/odoo/blob/fb30a9b12667f6b1195e6bd6f8db69f44ad5ca2a/addons/l10n_eu_oss/models/res_company.py#L164 sentry-6932155430
This update ensures that signature fields added to views within Odoo's Studio correctly display the signature widget. Previously, Studio incorrectly defaulted to a standard binary widget for signature fields. This fix allows users to properly configure signature fields within Studio, improving usability and functionality.
Original PR description
Before this commit: ------------------- When a user added an existing signature field to a view, Studio automatically assigned the default binary widget. The expected signature widget did not appear…
Before this commit: ------------------- When a user added an existing signature field to a view, Studio automatically assigned the default binary widget. The expected signature widget did not appear in the widget selection list. As a result, users could not configure the field as a signature input. <img width="1920" height="938" alt="image" src="https://github.com/user-attachments/assets/35893235-2541-4bd5-a7a5-4feab562acb2" /> Cause: ----- Studio builds the dropdown of available widgets by computing a [widgetKey](https://github.com/odoo/enterprise/blob/17.0/web_studio/static/src/client_action/view_editor/editors/utils.js#L132) based on the field type. Because the signature widget did not declare binary as a supported field type, it was always filtered out for fields of type binary. Thus Studio treated the field like any normal binary field and excluded the signature option. After this commit: ------------------ The signature widget is correctly exposed as a supported widget for fields of type binary. When adding an existing signature field to the view (with developer mode enabled), Studio now shows signature in the widget list. <img width="1917" height="934" alt="image" src="https://github.com/user-attachments/assets/079e0a17-ff5a-4dc6-a12d-e02b9cad013e" /> Why this fix is needed: ---------------------- Signature fields are stored as binary, but they require the dedicated signature widget to render correctly. By marking binary as a supported field type for the signature widget, Studio can properly detect and offer the widget during field configuration. Given that this widget is very domain-specific and not intended for general binary fields, it was not added to [web_studio/static/src/client_action/view_editor/editors/sidebar_safe_fields.js](https://github.com/odoo/enterprise/blob/17.0/web_studio/static/src/client_action/view_editor/editors/sidebar_safe_fields.js) though this may be reconsidered after this fix the option is accessible only when the debugger mode is on, if want to show this widget to all the binary type fields even when the debugger mode is off the we'll have to add it to this file. OPW : 5260188 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237287
This update fixes a reporting issue on the Purchase Dashboard where completed receipts were incorrectly included in 'Not Acknowledged' and 'Late Receipt' counters. The fix ensures the dashboard accurately reflects only pending acknowledgments and genuinely late receipts, providing more reliable purchase tracking.
Original PR description
Before this commit: ------------------------- - On the Purchase Dashboard, the 'Not Acknowledged' and 'Late Receipt' counters also included purchase orders whose receipts had already been done. - For…
Before this commit:
-------------------------
- On the Purchase Dashboard, the 'Not Acknowledged' and 'Late Receipt' counters
also included purchase orders whose receipts had already been done.
- For Not Acknowledged:
- Such POs should be implicitly considered acknowledged once their receipts
are done, but they were still shown at the counter.
- Additionally, unacknowledged POs that were locked were incorrectly excluded
from the counter.
- For Late Receipt:
- POs with received products were incorrectly counted as late, even
though their receipts were already done.
- Locked POs with late receipts were also excluded from the counter, which was
an incorrect behavior.
Steps to reproduce:
-------------------------
1. Install the 'purchase_stock' module.
2. Open Purchase module.
3. On the Purchase Dashboard, click on the 'Not Acknowledged' or 'Late
Receipt' card.
4. Notice that POs whose receipts are already completed still appear in the
counters and some locked POs that are unacknowledged or have late receipts
are missing from the counters
Cause of the issue
-------------------------
- The domains for both Not Acknowledged and Late Receipt counters only relied on
the purchase order state without checking whether the receipts were done.
- As a result, POs with done receipts were still included in the counters, while
some locked POs were incorrectly excluded.
After this commit:
-----------------------
- Updated the search domains for both counters to properly exclude POs whose
receipts are done.
- The action_done method now triggers action_acknowledged, ensuring that any
unacknowledged POs with completed receipts are automatically marked as
acknowledged and excluded from the Not Acknowledged counter. Locked POs that
remain unacknowledged will still correctly appear in the counter.
- Now the POs with received products are no longer shown as late once their
receipts are completed and Locked POs with late receipts will now correctly
continue to appear in the counter.
- This ensures that the dashboard accurately reflects only pending
acknowledgments and genuinely late receipts, helping users track POs in
the correct state.
Task ID: 4874116
Forward-Port-Of: odoo/odoo#237305
Forward-Port-Of: odoo/odoo#224180This update automatically determines the sales order's VAT rate based on the warehouse location, ensuring accurate VAT calculations and compliance with VAT regulations. This eliminates manual configuration and reduces the risk of errors, improving invoicing accuracy and efficiency.
Original PR description
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 update ensures that the status of a sale order is correctly updated to 'Sales Order' in the Sales module after a payment is processed through the Point of Sale (PoS) system. Previously, the status remained as 'Quotation,' leading to potential confusion and errors. This fix maintains the accurate tracking of sales orders regardless of payment method.
Original PR description
**Steps to reproduce:** - Make a quotation in the Sales module - Go to PoS, click Quotation/Order and select your quotation - Select Settle the order - Go through with the payment - Go back to the…
**Steps to reproduce:** - Make a quotation in the Sales module - Go to PoS, click Quotation/Order and select your quotation - Select Settle the order - Go through with the payment - Go back to the Quotation in the Sales module The Status widget still shows Quotation instead of Sales Order **Why the fix:** Since 18.3, the sale_order.state was not updated anymore when the state changed through the PoS. This happened because we would only change the sale_order state if there was a downpayment involved. In 18.2, we always recomputed the sale_order that was linked to the order we are currently settling. The way it is done now is part of the same way it was done in 18.2 and before, meaning we add the linked sale_order regardless of downpayments. In 18.2, we did an action_confirm on the selected sale_orders, but doing that in 18.3 will create another picking for this sale_order. This is not what we want as the picking is now handled and created by the PoS. This fix will just put the related sale orders in the "sale" state, so that users can no longer confirm it in the sales modules, which would create a second picking and create duplicates. opw-5033979 Forward-Port-Of: odoo/odoo#237213 Forward-Port-Of: odoo/odoo#226008
This update resolves issues with Viva wallet integrations across multiple terminals by streamlining data transmission. Previously, concurrent database writes caused errors, but now information is sent directly via websocket, reducing message size and improving reliability. Additionally, the system now handles payment status polling and webhook events more efficiently.
Original PR description
When using many Viva terminals linked to the same DB, there could be many serialization errors due to concurrent writes to the DB. This is because the webhook controller writes to the…
When using many Viva terminals linked to the same DB, there could be many serialization errors due to concurrent writes to the DB. This is because the webhook controller writes to the `viva_wallet_latest_response` field of the payment method. The webhook request would be automatically retried later, but this could result in duplicate notifications being sent to the POS, or notifications being handled too late. This commit stops using the `viva_wallet_latest_response` field, instead sending the information directly via the websocket to the POS. Only the required information is sent to reduce the size of the message. In addition, there are two other minor fixes: - In the event that the initial payment request to Viva failed, the POS will no longer poll the payment status (this resulted in a Session ID not found error). - The webhook controller will now check the event type it receives, and only process the 'Transaction Payment Created' events. This should prevent any unintended behaviour if other webhooks are set up in Viva. opw-5226966 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237411 Forward-Port-Of: odoo/odoo#236454
This update fixes a bug where time logs were incorrectly assigned to the user marking work orders as done, instead of the assigned employee. Now, time logs accurately reflect the employee who actually worked on the order, improving data accuracy and reducing user confusion. This ensures proper tracking of labor costs.
Original PR description
## **Issue Before This Commit:** When a work order is assigned to an employee (not linked to the current user), and the current user marks it as done, the time log is wrongly created under the…
## **Issue Before This Commit:** When a work order is assigned to an employee (not linked to the current user), and the current user marks it as done, the time log is wrongly created under the current user’s employee instead of the assigned one. This behavior caused confusion for the user as the wrong person was shown as working on the order. ## **Steps to Reproduce:** - Create an MO with work orders and confirm it. - Assign another employee to a work order. - Mark the work order as done with the current user from the work order line. - Open the workorder and notice that the time log is created for the current user’s employee. ## **Cause of the Issue:** The bug was introduced in PR (https://github.com/odoo/enterprise/pull/84790), where the logic for assigning the main employee was overridden, ignoring the case of an already assigned employee. ## **With This Commit:** The time log is now created for the assigned employee, This resolves the confusion by ensuring the right person is tracked on the work order. TaskID: 4983514 Forward-Port-Of: odoo/enterprise#100467 Forward-Port-Of: odoo/enterprise#93378
This update enhances the portal experience for subcontractors by granting them the necessary permissions to create and manage serial numbers, view related stock movements, and register components for multiple manufacturing orders. The changes include security enhancements and database optimizations to ensure seamless operation for this user group. This improves efficiency and accuracy in subcontracting workflows.
Original PR description
Make sure that portal subcontractors can do what they need to: - create new serial numbers and assign them to SMLs -> new ACL for sequences (READ and WRITE) -> new ACL for mrp.production.serials to open the wizard - see SML serials in the Detailed Operations popup -> add context to portal view - open the MO list view for registering components for multiple MOs -> add the missing js file in the manifest - save the changes on the DB -> call `_has_workorders` before doing some workorder operations -> add sudo for MO unlink because a portal user doesn't have DELETE ACL -> add sudo for MO assign when using lots/serials -> skip writing the state field if there's no record to write - correctly increment sequence -> added the changes from https://github.com/odoo/odoo/pull/227095 to the subcontracting serial wizard task 5107873 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures the change line (difference between paid and total) is correctly displayed on the receipt when using languages other than English in Point of Sale. Previously, the system incorrectly skipped this line when the payment line was translated, leading to inaccurate receipts. This fix guarantees accurate receipt totals regardless of the POS user's language setting.
Original PR description
When using another language than english, the change line wasn't displayed on the receipt. Steps to reproduce: ------------------- * Set the POS user language to fr_BE (or any none english) * Pay an order in cash with an amount greater than the total. > Observation: Change line was not visible on the receipt Why the fix: ------------ The frontend was checking `paymentLine.name !== "return"`, so once the backend translated the name to “Retour”, the change line was skipped. By checking `is_change` we get the correct amount and we ensure `order.showChange` still returns true even when the “return” payment line is translated (e.g. in fr_BE). opw-5247079
This update corrects a calculation error related to PFA (Pension Funds Account) computations within the Belgian payroll module. The fix ensures accurate tax deductions are applied, improving the reliability of payroll processing for Belgian employees. This change addresses a previously identified issue and enhances compliance.
Original PR description
This commit refactors and fixes the PFA computation. task-5103485
This update resolves an error that occurred when setting a partner on a bank statement line, specifically when dealing with draft invoices lacking an invoice date. The fix ensures the system correctly compares invoice and statement dates, preventing a 'TypeError' and allowing for accurate reconciliation. This improves the stability of bank statement processing.
Original PR description
Currently, an error occurs when a user sets the partner on a statement line. **Steps to Reproduce**([video](https://drive.google.com/file/d/1ZQBBh4yjSljeqqL_jT8dh_QJ6LtFZdPb/view)): - Install the…
Currently, an error occurs when a user sets the partner on a statement line.
**Steps to Reproduce**([video](https://drive.google.com/file/d/1ZQBBh4yjSljeqqL_jT8dh_QJ6LtFZdPb/view)):
- Install the `account_accountant` module.
- Go to `Invoices` and create `two invoices` with the `same partner` and the `same total amount` by adding
an `invoice line`.
- Go to the `Dashboard` and click `Last Statement` under the `Bank journal`.
- Create a `new statement line` with the `same amount` as the `invoice amount`.
- Click `Set Partner` and select the `same partner` used in the invoices.
`TypeError: '<=' not supported between instances of 'bool' and 'datetime.date'`
After [this commit], when a user sets the partner on the statement line, the system attempts to automatically reconcile the line. It then searches for a single invoice matching the statement line amount [1] and tries to select the one with the closest prior or equal date. However, draft invoices have not an invoice_date, and when the system attempts to filter on this field, and the error is raised [2].
This commit ensures that the comparison between invoice date and statement date occurs only when the invoice date is present.
[this commit]: https://github.com/odoo/enterprise/pull/98269
[1]- https://github.com/odoo/enterprise/blob/84ccb807852ab6b118466d12c8f02ea4da7fa3db/account_accountant/models/account_bank_statement.py#L585
[2]- https://github.com/odoo/enterprise/blob/84ccb807852ab6b118466d12c8f02ea4da7fa3db/account_accountant/models/account_bank_statement.py#L249
sentry-7063516380This update resolves a bug where Google Calendar events weren't syncing correctly when created by a user with Google sync disabled, even if another user had it enabled. Previously, events created by one user wouldn't appear in the organizer's Google Calendar. The fix ensures the event sync is triggered based on the organizer's Google sync status, improving event visibility.
Original PR description
**Issue** Events were not synchonized if created by a user with google synchronization stopped, for a user with an active google synchronization. To reproduce: - Have user A with google synchronization stopped and user B with google synchronization enabled. - With user A, create an event with user B as the organizer. - Open the Google calendar of user B and notice the event is not present. In our own database, it was causing issues for meetings booked from website and created by the public user. **Change** The user returned by `_get_event_user` is the one who needs to perform the sync to google, so we check the status of its google sync. opw-4795476
This update resolves a bug that prevented POS orders with products using different units of measure from being correctly settled. Previously, the system would encounter errors. Now, POS orders with mixed units of measure can be settled successfully, ensuring accurate order processing and preventing disruptions to the sales process.
Original PR description
When a POS order contains products with different units of measure, the system was unable to settle the order properly, leading to errors. opw-5357109 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where inserting a form snippet (like a 'Contact us' form) into an existing form created a broken HTML structure. The fix prevents this nesting, ensuring valid HTML and preventing errors when editing fields within the inserted form. This improves the stability and usability of the website builder.
Original PR description
When a snippet containing a `<form>` (e.g. “Contact us” form) is dropped inside an existing form element, the inner form is invalid HTML (see [1]). Steps to reproduce: =================== 1- Go to a…
When a snippet containing a `<form>` (e.g. “Contact us” form) is dropped inside an existing form element, the inner form is invalid HTML (see [1]). Steps to reproduce: =================== 1- Go to a Shop page and open a Product page. 2- Drag and drop a “Contact us” form snippet inside the existing product form (e.g. in description_ecommerce, which is an HTML field with `sanitize_form=False`). 3- Save the page, re-enter edit mode. 4- Click on any field of the inserted “Contact us” form. → traceback. Cause: ====== HTML does not support nested `<form>` elements. As soon as the browser parses the dropped snippet inside an existing `<form>`, it normalizes the DOM and strips or moves the inner `<form>` tag, keeping only its contents. The inner form therefore loses its attributes (action, method, data-model_name, etc.). When editing a field, `fetchAuthorizedFields` needs the form’s model it used to rely directly on `formEl.dataset.model_name`, which is missing in this broken structure, causing a crash. Solution: ======== Prevent dropping the snippets that contain a form inside another form, by filtering out the `selectorSiblings/Children` (which are used to make the dropzones appear) that are in forms, when they are dragged. This commit also uses the `getModelName(formEl)` helper wherever we need the form model instead of accessing `dataset.model_name` directly. [1]: https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/How_to_structure_a_web_form opw-5256576