Daily updates from Odoo
Friday, January 30, 2026
98 changes
37 changes
Resolved issues and error corrections
This update resolves an issue where the scrollbar wasn't visible in the time off Kanban view, preventing users from easily seeing their vacation time requests. The fix adds a scrollbar to the view, ensuring users can now access and manage their time off requests effectively.
Original PR description
Before: the scrollbar of the kanban view in timeoff was not showing coz of which users were not able to see their timeoffs easily After: Fixed the scrollbar of the kanban view so that the user can be able to see their timeoffs which they were not able to do that easily Fix: Added the `overflow-x` as auto so that the scrollbar is visible. Task:5502863 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245443
This update fixes an issue with how Saudi social insurance contributions are recorded in Odoo. The change ensures that employer payments are accurately assigned to the correct accounting accounts, improving financial reporting for Saudi businesses using this module. This resolves a discrepancy in the posting of social insurance contributions.
Original PR description
Fix the account configuration used by Saudi social insurance contribution salary rules for the company. This ensures employer contributions are posted to the correct accounting accounts. Task-5468575 Forward-Port-Of: odoo/enterprise#105182
This update resolves a test failure related to the audit trail functionality within the account module. Specifically, a change was made to ensure data flushing occurs during certain tests, improving the reliability of the audit trail reporting. This ensures accurate tracking of account transactions.
Original PR description
Since this commit https://github.com/odoo/odoo/pull/242248/changes flushing inside `test_cant_unlink_message1`, `test_cant_unown_message` is now required. https://runbot.odoo.com/odoo/runbot.build.error/237803 runbot/error-237803 Forward-Port-Of: odoo/odoo#246353
This update corrects a minor issue in the website product pricing calculation. An unnecessary 'target_currency' parameter was being passed, causing confusion. The change simplifies the process by removing this parameter, ensuring accurate pricing without impacting functionality.
Original PR description
In website_sale product price computation in [_to_markup_data](https://github.com/odoo/odoo/blob/saas-18.2/addons/website_sale/models/product_product.py#L163) and…
In website_sale product price computation in [_to_markup_data](https://github.com/odoo/odoo/blob/saas-18.2/addons/website_sale/models/product_product.py#L163) and [_get_additionnal_combination_info](https://github.com/odoo/odoo/blob/saas-18.2/addons/website_sale/models/product_template.py#L490), the target_currency is passed but it is unused parameter.
The product_pricelist price computation logic relies on the [currency](https://github.com/odoo/odoo/blob/saas-18.2/addons/product/models/product_pricelist.py#L162) and target_currency is not used anywhere in the pricing flow. As a result, passing target_currency adds confusion without affecting the outcome.
The target_currency parameter was unused in the method call flow and, due to this, it was always being passed as NULL. This made the parameter ineffective and confusing, while the actual logic expects a valid currency value.
This commit replaces target_currency with currency to avoid unused / misleading parameter.
Traceback
```py
2026-01-22 12:50:48,564 48232 ERROR currency_19 odoo.addons.website_sale.tests.test_website_sale_product_template: ERROR: TestWebsiteSaleProductTemplate.test_markup_data_uses_taxes_included_price_when_configured_on_website
Traceback (most recent call last):
File "/home/odoo/odoo/odoo/addons/website_sale/tests/test_website_sale_product_template.py", line 81, in test_markup_data_uses_taxes_included_price_when_configured_on_website
markup_data = self.product._to_markup_data(self.website)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/website_sale/models/product_product.py", line 162, in _to_markup_data
product_price = request.pricelist._get_product_price(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/product/models/product_pricelist.py", line 121, in _get_product_price
return self._compute_price_rule(product, *args, **kwargs)[product.id][0]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/product/models/product_pricelist.py", line 220, in _compute_price_rule
price = suitable_rule._compute_price(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: ProductPricelistItem._compute_price() got an unexpected keyword argument 'target_currency'
```
Before fix,
```py
(Pdb) > /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(166)_compute_price_rule()
(Pdb) args
self = product.pricelist(2,)
products = product.product(4,)
quantity = 1
currency = None
uom = None
date = False
compute_price = True
kwargs = {'target_currency': res.currency(20,)}
> /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(186)_compute_price_rule()
(Pdb) currency
(Pdb) self.currency_id
res.currency(20,)
(Pdb) self.env.company.currency_id
res.currency(1,)
(Pdb)
```
After fix,
```py
(Pdb) > /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(166)_compute_price_rule()
(Pdb) args
self = product.pricelist(2,)
products = product.product(4,)
quantity = 1
currency = res.currency(20,)
uom = None
date = False
compute_price = True
kwargs = {}
> /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(186)_compute_price_rule()
(Pdb) currency
res.currency(20,)
(Pdb) self.currency_id
res.currency(20,)
(Pdb) self.env.company.currency_id
res.currency(1,)
```
- opw - [5447980](https://www.odoo.com/odoo/project/70/tasks/5447980)
- upg - [3782135](https://upgrade.odoo.com/odoo/upgrade.request/3782135)
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#246180
Forward-Port-Of: odoo/odoo#242998This update ensures that WebGL testing continues to function correctly in Chrome's headless mode (version 144+). Chrome's default settings now disable WebGL, so this change re-enables it for testing purposes, specifically to maintain functionality for features like image filters in the website builder. While SwiftShader is less secure, it's deemed acceptable for controlled test environments.
Original PR description
Since Chrome 144 disabled [^1] by default the WebGL fallback to the software renderer SwiftShader, this commit reenables [^2][^3] it when running in headless mode to allow to keep testing WebGL features (i.e. image filters in website builder). Note: the SwiftShader implementation is considered deprecated and less safe than proper hardware based ones, hence not recommended for a regular usage with untrusted content. However, as tests are run in a more controlled environment, it looks reasonnable to opt-in to keep actually testing WebGL features. [^1]: https://chromium-review.googlesource.com/c/chromium/src/+/7128438 [^2]: https://issues.chromium.org/issues/476172421 [^3]: https://chromestatus.com/feature/5166674414927872 Forward-Port-Of: odoo/odoo#246289
This update resolves an issue in the Peppol demo mode where a branch company with the same VAT number as the parent company would receive an 'id_client already in use' error. The fix ensures each company receives a unique id_client, preventing data conflicts and improving demo stability. This ensures the demo accurately reflects the intended Peppol functionality.
Original PR description
Steps to reproduce in demo: 1. Activate Peppol in the main company for both sending and receiving; 2. Create a branch company (with same VAT number as the main company); 3. Activate Peppol in the branch and select "Send from parent company"; 4. Error message: "This id_client is already used on another user.". In demo edi_mode, when trying to connect a branch company with the same VAT than the parent company, the demo function took the same id_client for every company, which violates the unique constraint on id_client. task-5888203 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246287
This update ensures that the current day location field is consistently included when retrieving data for the homeworking feature. Previously, this data was sometimes missing, causing issues when the feature was used in different parts of the system, such as the studio. This fix guarantees accurate location information is always available.
Original PR description
Before this commit, the feature at commit odoo/odoo@b3be3af61cc08d0dea84969425d24957f215b26f worked by chance, because in most cases ALL fields where returned in the get views, since most of the time the search view is asked for as well, hence yielding all fields in the model There were issues when triggering get_views from another place, namely studio when creating a many2many. After this commit, we make sure the current day location field's description is sent opw-5484321 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#246096 Forward-Port-Of: odoo/odoo#245740
This update resolves a user experience inconsistency within the account_peppol module. Previously, the system used 'demo' for user neutralization, while the edi_mode was set to 'test'. This change ensures a clear and consistent approach, simplifying the setup and operation for users.
Original PR description
Currently, the proxy_client_user is neutralized as demo. But the edi_mode is set to test. It's confusing for the users, and we should be consistent. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246181
This update resolves an issue where a technical error during bill import could lead to duplicate entries in the PEPPOL system. The fix ensures that the import process doesn't block confirmation and allows for unlinked bills, preventing potential data inconsistencies. It also handles unexpected errors after move creation to maintain data integrity.
Original PR description
A UserError there can cause duplicates in peppol fetching. It should never block an ack. We can leave them unlinked We also do the same for any unexpected error that occurs after we've created the move. opw-5492092 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246233 Forward-Port-Of: odoo/odoo#246133
This update resolves a small technical issue where a missing space in a route caused a problem with the account online synchronization process. This fix ensures the synchronization feature functions correctly, preventing potential disruptions to data synchronization.
Original PR description
During this forward port: https://github.com/odoo/enterprise/commit/a5b9372ca0b23151046c14c9a8ead0ed9cd46b80 there was a missing space in the route. no task id Forward-Port-Of: odoo/enterprise#105849
This update addresses a potential error in Odoo that could occur when attempting to access related records through 'res_id' fields. Specifically, the system would fail if a 'res_id' was set to 0. This change ensures the system handles this scenario gracefully, preventing errors and improving data reliability.
Original PR description
`browse(x.mapped('res_id'))` may fail if there are res_ids that are equal to 0. Update existing code.
odoo/enterprise#105767
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update addresses a potential issue where incorrect IDs were being used within Odoo's core modules. The fix ensures that all IDs are properly validated, enhancing data accuracy and reliability across various business processes. This improves the overall stability and trustworthiness of the system.
Original PR description
https://github.com/odoo/odoo/pull/246097
A recent issue preventing users from switching to superuser mode has been resolved. The problem stemmed from a simple typo – 'sesssion' instead of 'session' – in the code. This fix ensures a smoother and more reliable experience for all users.
Original PR description
Currently an error occurs when user tries to switch to superuser. Steps to replicate: - Make a DB and turn on debug mode. - Click on the bug icon and click `Become Superuser`. Error: `AttributeError: 'Request' object has no attribute 'sesssion'` Cause: - Session incorrectly spelled as `sesssion`. Fix: - Corrected `request.sesssion` to `request.session`. No Id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that tests for KPI reporting in the email system run consistently. Previously, demo data could create mail activities that interfered with test results. Now, the tests are run with a clean slate, guaranteeing accurate and reliable reporting.
Original PR description
Commit ff941e6555c12918803db4a72511c9381cc58c31 introduced a test that counts the amount of mail activities grouped by type. However, the test doesn't take into consideration that the demo data might have created some activities. With this commit, we ensure the tests run with a clean state by removing any pre-existing mail activities so that we have consistent and expected results. Runbot-build-error-id: [234966](https://runbot.odoo.com/odoo/runbot.build.error/234966)
This update corrects a bug where 'todo' and 'none' audit statuses on accounts were incorrectly grouped together in reports. Previously, sorting or filtering by 'todo' status didn't accurately reflect the actual status of accounts. This change ensures accurate reporting and filtering based on account status.
Original PR description
When going on the balance view of a working file, when trying to sort by the status or filtering on 'todo', the audit status with no value would still be here.
To Reproduce:
- Install the demo data
- Create a working file _ Click on Status
- The To Review and nothing are not sorted
- Add a domain ("audit_status", "=", "todo")
- THe audit status with no value are still hereThis update resolves a technical issue preventing users from correctly viewing product pages on the website. The problem stemmed from a missing button within the product display, triggered by the 'real_estate' module. This change ensures a smoother user experience when browsing products.
Original PR description
Steps to reproduce: - Install `real_estate` module(industry) - Website > Properties > Open any product Traceback: `ValueError: Expected singleton: product.template()` This error occurs when the [addToCart] value is `null`. We get `null` because the code is trying to find a button with the name `add_to_cart` inside the `parent`, but that button does not exist in the [template]. [addToCart]: https://github.com/odoo/odoo/blob/61bdc119bca73a7e9ee946d0695c6acc1453adbd/addons/website_sale/static/src/interactions/product_page.js#L329 [template]: https://github.com/odoo/industry/blob/92ff34e33cd166479449dae7ce37e37c9e409db2/real_estate/data/website_view.xml#L336-L344 sentry-7212605657
This update clarifies the name of a recruitment stage from "Initial Qualification" to "Qualification" within the Odoo HR recruitment module. This change improves the user experience and ensures consistency in stage labeling, making the recruitment process easier to understand and manage. This is a minor fix related to a previous enhancement.
Original PR description
This is a small follow-up PR to the original PR to simply rename a stage label. See https://github.com/odoo/enterprise/pull/105278 Task-ID: 5454691 Forward-Port-Of: odoo/odoo#246278
This update clarifies the terminology used in the recruitment process by renaming the "Initial Qualification" stage label to "Qualification". This change improves clarity and consistency for users managing recruitment workflows within Odoo Enterprise. It's a minor adjustment to enhance the user experience.
Original PR description
This is a small follow-up PR to the original PR to simply rename a stage label. See https://github.com/odoo/enterprise/pull/105278 Task-ID: 5454691 Forward-Port-Of: odoo/enterprise#105854
This update resolves a bug causing website tests to fail due to delayed loading of interactions within iframes. The fix intelligently waits for the interaction service to be ready, ensuring tests execute correctly. The removal of unnecessary timeouts further stabilizes the testing process.
Original PR description
__Before commit__ Hoot tests using interactions inside the iframe may fail because we do not wait for the interaction service to be ready before executing the tests. In particular, the `SharedPopup` interaction is sometimes started after we trigger a click to display it in the test. Since it has not had time to register the proper listener, the `d-none` class is never removed from the popup, so the test is stuck waiting for it to appear. __Fix__ When the JavaScript assets are included inside the iframe, the attribute `is-ready` is added to the iframe body. In this case, we wait for it to appear instead of uselessly adding it artificially. Waiting for all interactions to load may take a bit of time, so a large timeout is set to wait for the `is-ready` attribute. The timeouts inside the tests are now removed since they were there to fix this bug without success. runbot-237554 Forward-Port-Of: odoo/odoo#246327
A bug was causing the input field for campaign testing to disappear when cleared. This meant users had to close and reopen the dialog to use it again. This fix adds a simple adjustment to ensure the input field remains visible and functional, improving the user experience for campaign setup.
Original PR description
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: -…
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: - The input area has disappeared. Now, the only way to get it back is by closing the dialog and reopening it Cause: - Field `resource_ref` uses `hide_model: True`, and when cleared, the widget has no value and no model selector to determine the target model because of the function `getRelation` that now returns `undefined`, by this XML fails to render the `<Many2OneField/>` https://github.com/odoo/odoo/blob/7680b83501cef18362be38f90715d824f2bf9cd6/addons/web/static/src/views/fields/reference/reference_field.js#L107-L119 Solution: - Add `model_field: model_id` option to the view so the widget can resolve the model from the `model_id` field even when input is empty Note: - This behavior also occurs in other places. After discussion with the framework team, we agreed to keep the scope of this PR limited to marketing_automation, as this is not a priority issue. A broader fix can be addressed in the master if needed. opw-5473320 Forward-Port-Of: odoo/enterprise#104547
This update resolves a technical problem on odoo.com where very large order IDs would cause errors in achievement reports. The change uses a more efficient calculation to ensure all IDs remain within the standard BIGINT limit, preventing report generation issues.
Original PR description
Before this commit, we had issues on odoo.com when the ids of the account move, account move line, sale order or sle order line were too high. We would end up with ids bigger than BIGINT limit. This commit ensure it does not happen anymore by using bitwise operation on ids istead of multiplying the values. task-5423978 Forward-Port-Of: odoo/enterprise#103264
This update resolves an issue where the sign-up tour could behave inconsistently, sometimes running within a webpage frame and other times directly. The fix ensures the tour runs reliably regardless of the user's interaction method, providing a smoother and more predictable experience for new users.
Original PR description
This commit fixes an indeterministic sign tour that could run either inside an iframe or directly in the main page. Since the execution context was unpredictable, both selectors were added to handle both cases reliably. runbot error-238443 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246393 Forward-Port-Of: odoo/odoo#246032
This update resolves an issue where switching product variants caused a technical error when product images were intentionally hidden (set to 'none'). The fix ensures a smoother user experience by correctly handling scenarios where images aren't displayed, preventing tracebacks and improving product browsing.
Original PR description
When product images are hidden (image_width='none' or missing), switching between product variants caused a traceback. Steps to reproduce: =================== - Go to a product page with variants -…
When product images are hidden (image_width='none' or missing), switching
between product variants caused a traceback.
Steps to reproduce:
===================
- Go to a product page with variants
- Edit mode & change the image to hidden
- Change variant
-> Traceback
Cause:
======
- The server doesn't send `carousel` data when images are hidden
(product_page_image_width='none')
- However, `_getProductImageContainerSelector()` still returned a valid
selector ("#o-carousel-product" or "#o-grid-product")
- `querySelector` found the existing (but empty) image container in the DOM
- `_updateProductImage()` was called with `undefined` as newImages parameter
- the re-queried images element crashed
Solution:
=========
In old version it was jquery and it was only checking for the existance
of the Old images (See [1]).
Now it will check both old and new images.
[1]: https://github.com/odoo/odoo/blob/77bfe416d08eefc720f12899490d3d39efacb74a/addons/website_sale/static/src/js/website_sale.js#L294
opw-5499004
Forward-Port-Of: odoo/odoo#246081This update resolves a visual issue in the website builder where gaps appeared between related options, particularly when using nested settings. The fix ensures that connector lines are consistently displayed, improving the overall usability and appearance of the builder. This enhancement contributes to a more polished and professional website design.
Original PR description
Steps to reproduce: - Open the website builder and drop a "Cover" snippet on the page. - In "Background > Image", choose "Position: Repeat pattern" to reveal the "Width/Height" sub-options. - Issue: the vertical connector line between the "Filter" and "Position" options is broken. After this commit, the gap is removed. Options at the same level are now properly connected, even when one of them contains sub-options. task-5155955 | Before | After | | ------------- | ------------- | | <img width="286" height="424" alt="image" src="https://github.com/user-attachments/assets/db035598-5094-4ec3-a42b-dc86bd871b9b" /> | <img width="285" height="422" alt="image" src="https://github.com/user-attachments/assets/d0229c5b-d3ea-41a2-9ed7-6155fc34d280" /> | Forward-Port-Of: odoo/odoo#246090 Forward-Port-Of: odoo/odoo#241092
This update fixes an issue where automatic reconciliation was blocked when an invoice's reference matched its payment reference. The change allows the system to correctly identify and match invoices, streamlining the reconciliation process and eliminating manual intervention. This resolves a reported problem on odoo.com.
Original PR description
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also…
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also modify a docstring of a test because it was lying about what it was really testing. The usecase it says it forbid is actually enforced by `test_matching_algorithm_for_multiple_invoices`. Before this commit: - functionally: The obvious matching was denied and the accountant had to manually make the match. - technically: The `aml.ref` and the `move.payment_reference` were the exact same and thus postgres regrouped the invoice (through aml) with itself as if there were 2 invoices matching the same word. After this commit: - functionally: The obvious match is made. - technically: The initial intend was to avoid having several invoices (proxy by amls) reported for a specific matching word preventing the system to take a difficult and arbitrary functional decision which might be wrong. In order to comply with that and to not block the match of an invoice that would be matched through several matching words, we don't gather twice the same aml for the same word. task-id: None (The issue arose on odoo.com and was brought by APFA) Forward-Port-Of: odoo/enterprise#105878 Forward-Port-Of: odoo/enterprise#105648
This update resolves a technical issue that was preventing the Account Status Badge from displaying correctly in some instances. The fix ensures the system handles missing configuration data gracefully, preventing a traceback and improving the user experience. This ensures accurate reporting and a more reliable application.
Original PR description
If this.env is not present, the config will be undefined and when accessing the viewType it will raise a traceback. task-5417418 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A recent issue prevented users from printing bank statements through the list view. This fix resolves a technical error related to how the system handles statement IDs during printing, ensuring statements can now be printed correctly. This improves the user experience for generating financial reports.
Original PR description
When trying to print a statement via the list view, we get a traceback. This is because the module `account_bank_statement_import` inherits the `view_bank_statement_tree` and use `accountMoveUploadListView` which use `AccountMoveListController`. Therefore, when calling `get_extra_print_items` from the controller, we call it with model `account.move` but with a statement id, which leads to either wrong behavior or access error. Steps: - Make sure account_bank_statement_import is installed - Have 2 companies - Create a bank statement for company B, make sure it has the same id as any account move from company A - From the bank statement list view, select the statement - Click on the print button -> Traceback opw-5427019 Forward-Port-Of: odoo/odoo#245207
This update resolves an issue causing errors when adding transcription snippets to new, unsaved records. The fix ensures proper record identification and saving, preventing errors and improving the stability of the AI transcription component. It also corrects a localization issue in the test environment.
Original PR description
This PR fixes an issues where an exception would be thrown when inserting a transcription snippet on an unsaved record. It does so by removing the resId, resModel props and only retrieving them when actually needed (when opening the full composer to send the summary). Also whennever opening the full composer, we force a save on the record to ensure proper resId. The PR also adapts `voice_transcription_plugin.test.js` to add the locale to the date that is inserted when starting a transcription, avoiding local test fails. task-5788331 Forward-Port-Of: odoo/enterprise#105026
This update resolves an issue where duplicate "Applicant created" messages were appearing in the applicant's chatter log. The fix prevents the system from posting the applicant creation subtype multiple times, ensuring a cleaner and more accurate record of applicant activity. This improves the user experience and data consistency.
Original PR description
Steps to reproduce: 1. Create a new applicant in recruitment. 2. Open the applicant’s chatter. 3. See multiple “Applicant created” messages for the same creation. Bug cause: The applicant creation flow posts the `mt_applicant_new` subtype more than once (create + extra write/track), and the frontend renders the subtype description, so each duplicate post shows “Applicant created” again. Solution: - Post the `mt_applicant_new` subtype only once during applicant creation. - Avoid re-posting it in subsequent writes/tracking so chatter shows a single creation log. Task Id: 5454691
This update fixes a potential issue with how Odoo handles deleting records linked through inherited fields. Previously, the system assumed inherited records were always single records, which could cause problems when deleting related records. Now, the system correctly handles RecordLists, ensuring data integrity during cascade deletions.
Original PR description
Usually (always?) the "inverse" for an inherited field will be a one2many. Even if in practice it is a one2one. The cascade deletion of the inverse should thus handle RecordList instead of assuming they're always single records. related: 478647c4526f42a2455a599555748c844a6f20cf task-5013894
This update resolves an issue where blockquote content was being lost when emails were sent. The fix adds a Bootstrap column class to the blockquote structure, ensuring it's correctly processed and included in the final email. This ensures all email content, including blockquotes, is delivered as intended.
Original PR description
Problem: When sending an email containing a blockquote, its content is missing in the received email. Cause: The `bootstrapToTable` conversion logic strictly filters the children of `.row` elements and only keeps nodes that have valid Bootstrap column classes. In the `s_blockquote` snippet, the content was wrapped in a plain `<div>` placed directly inside a `.row`, so it was ignored during conversion. Solution: Add the `col-12` class to the inner `<div>` of the blockquote snippet so it is recognized as a valid Bootstrap column and preserved during conversion. Steps to reproduce: - Create a new email marketing. - Add the "Blockquote" snippet. - Send the email. - Observe that the received email loses the blockquote content. opw-5883624 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246263
This update fixes an issue where highlight effects weren't consistently applied to multi-line text on websites, particularly in smaller viewports. The change adds a vertical position check to the text detection process, ensuring highlights are correctly applied regardless of text layout. This improves the overall user experience and consistency of website highlighting.
Original PR description
Steps to reproduce: 1. Go to Website (Edit mode) and drop a title block. 2. Select the title, set a highlight effect, and save the page. 3. Load the page in a reduced viewport in a way that makes the highlighted text split into multiple lines. 4. The highlight won't be applied correctly (only the last line will be detected). The current line detection mechanism relies on the horizontal comparison of rects (see `rectToBatch()`), which returns wrong results when applied to centered text content. The goal of this commit is to add a y-coordinate (vertical) check to detect new lines more reliably in `rectToBatch()`. This improves robustness for multi-line selections with unusual layouts. related to opw-4865891 Forward-Port-Of: odoo/odoo#245142 Forward-Port-Of: odoo/odoo#219234
This update addresses a potential issue where deleted records in Odoo could still be accessed, leading to errors. The fix ensures that related records are properly handled during cascade deletions, preventing data access attempts after records are removed. This improves data integrity and stability.
Original PR description
In order to be defensive we have to check records linked to messages, notifications or activities exist before checking related information like display_name, or even to skip them in various flows. This happens notably due to DB-level cascade deletion that does not remove side records linked through (model, res_id) pairs. It implies some additional exist queries. Task-5138556 Forward-Port-Of: odoo/enterprise#104589 Forward-Port-Of: odoo/enterprise#101185
This update adjusts the color used to highlight the 'Looking for Help' live chat description in the user interface. The previous bright yellow color was found to be distracting. This change ensures a more professional and less visually jarring experience for users.
Original PR description
Text was using `.text-warning`, which is too distracting. Part of Task-5867464 Before / After <img width="960" height="387" alt="Screenshot 2026-01-30 at 16 27 00" src="https://github.com/user-attachments/assets/9cc1129c-5169-4ef0-a84e-dfbb866ddcea" /> <img width="961" height="384" alt="Screenshot 2026-01-30 at 16 26 31" src="https://github.com/user-attachments/assets/e858cc16-14cd-4149-98bd-cbbb44ee5cb1" />
This update resolves an issue where the Datev export process incorrectly accessed parent tax groups when dealing with tax groups that had child tax groups. The fix ensures that the export accurately reflects the child tax groups, improving the reliability of financial data sent to Datev. This was identified and corrected as part of a broader effort to ensure data integrity.
Original PR description
Issue: Before this commit, when a tax type is group and has children, we access the parent, even though the dict has only the children Fix: as a solution, we map through the originated tax list received from the compute all function opw-5480918 opw-5874567 Forward-Port-Of: odoo/enterprise#105638
This update removes unnecessary timezone information from avatar cards when the user's local time zone matches their own. Previously, displaying the timezone added visual clutter. This change ensures a cleaner and more user-friendly experience on the avatar card.
Original PR description
Before this commit, the local time zone was shown on avatar card even when this is the same as current user. The intent of showing of local timezone is to see when it differs. When this is the same, this just adds noise to the card. This commit hides the showing of local timezone when this is the same as current user. Part of Task-5867464 Before / After <img width="310" height="206" alt="Screenshot 2026-01-30 at 17 24 04" src="https://github.com/user-attachments/assets/c47f885d-fb98-48f8-91fb-24d6a33e4c9a" /> <img width="311" height="193" alt="Screenshot 2026-01-30 at 17 23 50" src="https://github.com/user-attachments/assets/26fe6cf8-f2b1-40a3-b478-065ea88e01af" />
This update resolves an issue where editing a bank statement line caused unnecessary recalculations of all related lines, including reconciled ones. The change now ensures that only the edited line is recomputed, significantly improving performance and stability when managing bank statements. This prevents slowdowns and ensures accurate reconciliation processes.
Original PR description
When we edit a bank statement line, it triggers the recompute of all other lines, even the reconciled ones. This commit changes this behavior so reconciled lines are not recomputed task-5882885 Forward-Port-Of: odoo/enterprise#106017 Forward-Port-Of: odoo/enterprise#105754
4 changes
Resolved issues and error corrections
This update addresses a small technical issue where a missing space in a route caused a problem with the account online synchronization process. This correction ensures the synchronization feature functions correctly, preventing potential disruptions to data synchronization. It's a routine fix to maintain system stability.
Original PR description
During this forward port: https://github.com/odoo/enterprise/commit/a5b9372ca0b23151046c14c9a8ead0ed9cd46b80 there was a missing space in the route. no task id Forward-Port-Of: odoo/enterprise#105849
A bug was causing the input field for campaign testing to disappear, requiring users to close and reopen the dialog to use it. This fix addresses a technical issue with how the system handles empty input fields, ensuring the field remains visible and functional. The scope was limited to marketing automation to prioritize this specific problem.
Original PR description
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: -…
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: - The input area has disappeared. Now, the only way to get it back is by closing the dialog and reopening it Cause: - Field `resource_ref` uses `hide_model: True`, and when cleared, the widget has no value and no model selector to determine the target model because of the function `getRelation` that now returns `undefined`, by this XML fails to render the `<Many2OneField/>` https://github.com/odoo/odoo/blob/7680b83501cef18362be38f90715d824f2bf9cd6/addons/web/static/src/views/fields/reference/reference_field.js#L107-L119 Solution: - Add `model_field: model_id` option to the view so the widget can resolve the model from the `model_id` field even when input is empty Note: - This behavior also occurs in other places. After discussion with the framework team, we agreed to keep the scope of this PR limited to marketing_automation, as this is not a priority issue. A broader fix can be addressed in the master if needed. opw-5473320 Forward-Port-Of: odoo/enterprise#104547
This update fixes an issue where users wouldn't receive a warning when entering invalid email addresses during shared sign request declines. Now, the system validates email formats and displays a clear warning message, preventing incorrect data entry and improving the overall user experience. This ensures data integrity and reduces potential errors.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Create a shared sign request. - Try to decline the sign request. - Enter an email address in an invalid format. Issue: - No warning is shown to the user for an invalid email and An RPC_ERROR appears in the console. - This happens because the _check_signer_email_validity constraint fails when signer_email is not valid. Solution: - Validate the email format when the user submits the refusal request. - Show a warning message if the email format is invalid. task-5454929
This update resolves an issue where editing a bank statement line would incorrectly trigger recalculations for all related lines, including those that were already reconciled. The fix ensures that changes to individual bank statement lines only impact those lines, improving the stability and accuracy of bank reconciliation processes. This prevents unnecessary recalculations and potential data inconsistencies.
Original PR description
When we edit a bank statement line, it triggers the recompute of all other lines, even the reconciled ones. This commit changes this behavior so reconciled lines are not recomputed task-5882885 Forward-Port-Of: odoo/enterprise#105754
19 changes
Resolved issues and error corrections
This update resolves an issue where dynamic product snippets would cause horizontal scrolling when the content width was set to 'max'. The fix repositions the navigation buttons to prevent this, ensuring a consistent and user-friendly experience across larger devices. This improves the visual presentation of product listings.
Original PR description
Steps to reproduce: 1. Drag and drop the dynamic products snippet. 2. Select it and change the content width to **max**. Issue: When the content width is set to **max**, an unnecessary horizontal scroll appears. Reason: The issue occurs because the `previous` and `next` navigation buttons were not properly positioned. Fix: For devices larger than "mobile", the `previous` and `next` buttons are re-positioned, horizontally inward by "**50%**" of their own width with the help of `transform` property. This keeps the controls within the visible area and prevents horizontal scrolling. task-5090468 Before: <img width="1915" height="966" alt="image" src="https://github.com/user-attachments/assets/0c20d0b6-32cc-477b-8403-55bb0d372d8d" /> After: <img width="1920" height="963" alt="image" src="https://github.com/user-attachments/assets/4194b0f1-f3ad-4818-aa6f-2fda4561d2c7" /> Forward-Port-Of: odoo/odoo#237876
This update corrects a bug that prevented new partner records from being created when attempting to add them to an existing recordset. The issue stemmed from a mismanaged 'self' variable within the partner creation process. This fix ensures correct record handling during partner creation, improving data integrity.
Original PR description
**Issue:** `ValueError: Expected singleton` when creating new partners on a non empty (no singleton) recordset due to the `_add_missing_default_values` call. The default create method uses `self = self.browse()` to remove the records, but the `res.partner` override was still using its original `self`. **Fix:** Properly call the method on an empty recordset. related: https://github.com/odoo/odoo/commit/79486ec3fc553845cac14fb135c16fe0b093e3b4 opw-4932114
This update fixes an error in the French Profit and Loss report (`l10n_fr_reports`) where account 649 was incorrectly placed. The change aligns with French accounting standards (PCG 2025 & 2026) by correctly categorizing this account within 'Wages and Salaries' and 'Social Security Charges'.
Original PR description
## Issue In the *Profit and Loss* report for the French localization (`l10n_fr_reports`), the account 649 was mentioned in the *"Reversals of provisions (and depreciation), expense transfers"*…
## Issue
In the *Profit and Loss* report for the French localization (`l10n_fr_reports`), the account 649 was mentioned in the *"Reversals of provisions (and depreciation), expense transfers"* section, instead of *"Wages and salaries"* and *"Social security charges"*. This classification is described in the *"Recueil des normes comptables françaises"* (Versions [2025](https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/Reglements/Recueils/PCG_Janvier2025/Recueil-NF-Janvier-2025.pdf) and [2026](https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/recueil/RECEUIL-PCG-2026-AVEC-COUVERTURE.pdf)).
## Steps to reproduce
1. Install *France - Accounting Reports* (`l10n_fr_reports`)
2. Go to the *Profit and Loss* report
3. In debug mode, click the information buttons on the following rows:
- *Reversals of provisions (and depreciation), expense tranfers*: **649 is mentioned**
- *Wages and salaries*: **649 is not mentioned**
- *Social security charges*: **649 is not mentioned**
## Note
The account 649 was added at the beginning of the formula for the *"Wages and salaries"* section in order to respect a logical order. In the *"Social security charges"* formula, since no logical order appears to be used, the account was added at the end.
opw-5724559
Forward-Port-Of: odoo/enterprise#105856
Forward-Port-Of: odoo/enterprise#105474This update ensures that WebGL testing continues to function correctly in Odoo's automated tests, even with recent changes in Chrome. Because SwiftShader (a software renderer) is now the default fallback for Chrome 144 in headless mode, this change re-enables WebGL to maintain testing of features like image filters. While SwiftShader is less secure, it's deemed acceptable for controlled test environments.
Original PR description
Since Chrome 144 disabled [^1] by default the WebGL fallback to the software renderer SwiftShader, this commit reenables [^2][^3] it when running in headless mode to allow to keep testing WebGL features (i.e. image filters in website builder). Note: the SwiftShader implementation is considered deprecated and less safe than proper hardware based ones, hence not recommended for a regular usage with untrusted content. However, as tests are run in a more controlled environment, it looks reasonnable to opt-in to keep actually testing WebGL features. [^1]: https://chromium-review.googlesource.com/c/chromium/src/+/7128438 [^2]: https://issues.chromium.org/issues/476172421 [^3]: https://chromestatus.com/feature/5166674414927872 Forward-Port-Of: odoo/odoo#246289
This update resolves an issue where editing a bank statement line caused unnecessary recalculations of all related lines, including reconciled ones. The change now ensures that only the edited line is recomputed, improving performance and stability when working with bank statement data. This optimization enhances the user experience and reduces processing time.
Original PR description
When we edit a bank statement line, it triggers the recompute of all other lines, even the reconciled ones. This commit changes this behavior so reconciled lines are not recomputed task-5882885
This update ensures that the current day location field is consistently included when retrieving data for the homeworking feature, particularly in scenarios like creating many-to-many relationships in Studio. Previously, this data was sometimes missing, causing issues. This fix guarantees accurate location information is provided, improving the functionality of the homeworking workflow.
Original PR description
Before this commit, the feature at commit odoo/odoo@b3be3af61cc08d0dea84969425d24957f215b26f worked by chance, because in most cases ALL fields where returned in the get views, since most of the time the search view is asked for as well, hence yielding all fields in the model There were issues when triggering get_views from another place, namely studio when creating a many2many. After this commit, we make sure the current day location field's description is sent opw-5484321 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#246096 Forward-Port-Of: odoo/odoo#245740
This update resolves a confusion for users of the account_peppol module. Previously, a setting was configured as 'demo' while another related setting was 'test'. This change ensures a consistent and clear setup process, improving usability and reducing potential errors.
Original PR description
Currently, the proxy_client_user is neutralized as demo. But the edi_mode is set to test. It's confusing for the users, and we should be consistent. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246181
This update resolves a bug where the serial number assigned to products on 'ready' pickings was incorrectly updated during delivery order creation. The fix prevents unnecessary serial number changes, ensuring accurate tracking of stock and serial numbers. This improves data integrity and reduces potential errors in inventory management.
Original PR description
Steps to reproduce: - Create a storable product tracked by serial number (e.g. "P1") - Set the quantity on hand to 2 with serial numbers SN1 and SN2 - Create a delivery order - Add any product with available quantity - Mark the delivery as "To Do" -> The picking is in the `ready` state - Add a new move line with product "P1" and assign serial number SN2 -> Before saving, the quantity is correctlyupdated to 1 - Save the delivery Problem The assigned lot/serial number is unexpectedly replaced with 'SN1'. Fix: Do not update or recompute the serial/lot number when creating a move on pickings that are already in the `ready` state. opw-5385993 Forward-Port-Of: odoo/enterprise#105420 Forward-Port-Of: odoo/enterprise#105338
This update resolves a technical issue where a missing space in a route caused a problem with the account online synchronization process. This fix ensures the synchronization functionality operates correctly, preventing potential disruptions to data synchronization. It's a routine maintenance update.
Original PR description
During this forward port: https://github.com/odoo/enterprise/commit/a5b9372ca0b23151046c14c9a8ead0ed9cd46b80 there was a missing space in the route. no task id Forward-Port-Of: odoo/enterprise#105849
This update fixes an issue where some Odoo records wouldn't open correctly in their default form view. The change ensures that other views are enabled when opening records, providing a smoother and more reliable user experience. This resolves a technical glitch that impacted record access.
Original PR description
Records of some models may not want to be shown in their form view by default. See related ENT PR for documents. We re-export to avoid patching order issues. In particular, this makes sure that if we are in the webclient, the chat window is opened before executing the "real" open. Task-5386466 Forward-Port-Of: odoo/odoo#246173 Forward-Port-Of: odoo/odoo#244289
This update prevents documents from automatically opening in a form view when accessed through various channels like links or notifications. Previously, users were unexpectedly directed to the document's form, which has now been corrected to align with how documents are accessed in other views. This improves the user experience and ensures consistent document access.
Original PR description
Users do not want to access the form view of the document by default. This PR solves three cases for accessing documents.document records that were not covered before: * From the basic path pattern `odoo/x/documents.document/<id>` * From a systray notification "Open Form View" * when we are not yet in Documents * when we already are in Documents * From the Discuss app, on the record's thread Tests for most of these are included. Additionally, make sure the document is selected on accessing from `_get_access_action`. Task-5386466 Forward-Port-Of: odoo/enterprise#105809 Forward-Port-Of: odoo/enterprise#104622
This update resolves a test failure caused by a recent change to the payment method processing logic in the l10n_uy_edi module. The commit simply adds the necessary update to the test suite to account for the new method extension, ensuring the system continues to function correctly.
Original PR description
The PR odoo/odoo#244443 introduces a new extension to the method _is_downpayment hence the test fails since it is not patched. This commit adds the new extension to the patched list. task-5135918
A bug was causing the input field in the campaign test dialog to disappear, requiring users to close and reopen the dialog to use it. This fix addresses a technical issue related to how the system handles empty input fields, ensuring the field remains visible and functional. The scope was limited to the marketing automation module for efficiency.
Original PR description
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: -…
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: - The input area has disappeared. Now, the only way to get it back is by closing the dialog and reopening it Cause: - Field `resource_ref` uses `hide_model: True`, and when cleared, the widget has no value and no model selector to determine the target model because of the function `getRelation` that now returns `undefined`, by this XML fails to render the `<Many2OneField/>` https://github.com/odoo/odoo/blob/7680b83501cef18362be38f90715d824f2bf9cd6/addons/web/static/src/views/fields/reference/reference_field.js#L107-L119 Solution: - Add `model_field: model_id` option to the view so the widget can resolve the model from the `model_id` field even when input is empty Note: - This behavior also occurs in other places. After discussion with the framework team, we agreed to keep the scope of this PR limited to marketing_automation, as this is not a priority issue. A broader fix can be addressed in the master if needed. opw-5473320 Forward-Port-Of: odoo/enterprise#104547
This update corrects a warning message appearing in the sales module. The previous code incorrectly processed multiple sales leads at once, leading to an error. This change ensures that each sales lead is handled individually, resolving the warning and improving system stability.
Original PR description
### Issue: In #244061 changes, the expired so leads to warning message. However, the batch `res_id` is used instead of single record which is an error. opw-5478691 Forward-Port-Of: odoo/odoo#246369
This update fixes a technical error that could occur when changing the timesheet invoicing policy after a sales order was created and then the user who created it was deleted. The change ensures the system correctly handles scenarios where the original user's information is no longer available, preventing a traceback and maintaining proper policy application.
Original PR description
Steps to reproduce: 1. Create a new user in the database 2. Create a new sales order as the new user 3. Add an order line where the product is of type "Service" and has an invoicing policy of "Based on Timesheets" 4. Confirm the sales order 5. Sign out of the new users account and sign in as admin 6. Delete the newly created user 7. Go into Settings > Timesheets > Invoicing Policy 8. Attempt to change the policy to "Validated timesheets only" 9. Save your changes 10. Observe the traceback The `if` statement would trigger if any record in the recordset had a `create_uid`, which would cause a traceback if the first record in the recordset happened to not have a `create_uid`. This can occur if the user who created a given sale order is deleted from the database. This change will ensure that the function correctly falls back to the currently signed in user if the sale order create_uid doesn't exist. opw-5868538 Forward-Port-Of: odoo/enterprise#105687
This update corrects an issue where text within Odoo views was unexpectedly removed when a field was restricted through access controls. Previously, this created inconsistent and confusing view layouts. This fix ensures that all text remains visible after a field is removed, maintaining a consistent user experience.
Original PR description
In a view, if a field is removed due to security access restrictions, the text that follows it is not preserved. This leads to inconsistencies in the view. opw-5798852 Forward-Port-Of: odoo/odoo#246238 Forward-Port-Of: odoo/odoo#245855
This update fixes an issue where product names weren't consistently displayed in the correct language based on the user's selected language setting. Previously, repeated access to the product name within a method would default back to the initial language. Now, the system always uses the current language context when generating product names, ensuring accurate display for all users.
Original PR description
Description of the issue/feature this PR addresses: Compute of display_name in different languages that can be returned incorrect Current behavior before PR: When accessing two times in the same method the display_name of a configured product but the second time having a .with_context(lang=lang) other than the previous language, the returned display name will not be in the specified language as the cached value will be returned. Desired behavior after PR is merged: _compute_display_name should always take into account a change of language in context when the value is accessed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242829
This update resolves an issue where a technical error during bill import could cause duplicate entries in our PEPPOL integration. The change ensures that these errors don't block the import process and allows bills to be left unlinked, improving the reliability of our data synchronization.
Original PR description
Backport of https://github.com/odoo/odoo/commit/71de6902d73bec32f93e3be8f4de4ec89e9dc987 A UserError there can cause duplicates in peppol fetching. It should never block an ack. We can leave them unlinked We also do the same for any unexpected error that occurs after we've created the move. opw-5492092 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246475
This update resolves an issue where a 100% discount combined with shipping costs caused a technical error in the Express Stripe checkout form. The fix adjusts how zero minor amounts are handled, ensuring the checkout process functions correctly when discounts are applied. This prevents errors and allows for accurate order processing with significant discounts.
Original PR description
### Issue: Due to this issue, there is a traceback, in express stripe checkout when there is a 100% discount and shipping cost. Steps to reproduce: 1- Setup `Stripe` as the only payment provider in the db. 2- Create a discount code with 100% discount on order. 3- Set a fixed price on the delivery method. 4- On shop, add a product to cart, and then enter the discount code. 5- Refresh the page. There is a traceback. #### Cause: This issue is introduced after #209103, which set `minor_amount` to amount excluding delivery. In the case it's 0, it's not going to be rendered on express_checkout view as it is false. Which cause a traceback here: https://github.com/odoo/odoo/blob/8f7e3d588c6c1189e64442a33037666d5d70aae7/addons/payment_stripe/static/src/js/express_checkout_form.js#L73-L81 opw-5482646 Forward-Port-Of: odoo/odoo#246355
4 changes
Resolved issues and error corrections
This update addresses a small technical issue that prevented the online accounting synchronization feature from functioning correctly. A missing space in a route definition was corrected, ensuring the synchronization process operates as intended. This ensures seamless data updates between our cloud-based accounting system and local versions.
Original PR description
During this forward port: https://github.com/odoo/enterprise/commit/a5b9372ca0b23151046c14c9a8ead0ed9cd46b80 there was a missing space in the route. no task id Forward-Port-Of: odoo/enterprise#105849
This update resolves a bug where the input field for campaign tests would disappear when cleared. The fix adds a configuration to ensure the field always displays correctly, preventing users from needing to close and reopen the dialog to re-enter information. This improves the user experience for campaign testing.
Original PR description
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: -…
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: - The input area has disappeared. Now, the only way to get it back is by closing the dialog and reopening it Cause: - Field `resource_ref` uses `hide_model: True`, and when cleared, the widget has no value and no model selector to determine the target model because of the function `getRelation` that now returns `undefined`, by this XML fails to render the `<Many2OneField/>` https://github.com/odoo/odoo/blob/7680b83501cef18362be38f90715d824f2bf9cd6/addons/web/static/src/views/fields/reference/reference_field.js#L107-L119 Solution: - Add `model_field: model_id` option to the view so the widget can resolve the model from the `model_id` field even when input is empty Note: - This behavior also occurs in other places. After discussion with the framework team, we agreed to keep the scope of this PR limited to marketing_automation, as this is not a priority issue. A broader fix can be addressed in the master if needed. opw-5473320 Forward-Port-Of: odoo/enterprise#104547
This update fixes a technical error that could occur when changing the timesheet invoicing policy after a sales order was created and then the user who created it was deleted. The change ensures the system correctly handles scenarios where the original user's information is no longer available, preventing a traceback and maintaining proper invoicing calculations.
Original PR description
Steps to reproduce: 1. Create a new user in the database 2. Create a new sales order as the new user 3. Add an order line where the product is of type "Service" and has an invoicing policy of "Based on Timesheets" 4. Confirm the sales order 5. Sign out of the new users account and sign in as admin 6. Delete the newly created user 7. Go into Settings > Timesheets > Invoicing Policy 8. Attempt to change the policy to "Validated timesheets only" 9. Save your changes 10. Observe the traceback The `if` statement would trigger if any record in the recordset had a `create_uid`, which would cause a traceback if the first record in the recordset happened to not have a `create_uid`. This can occur if the user who created a given sale order is deleted from the database. This change will ensure that the function correctly falls back to the currently signed in user if the sale order create_uid doesn't exist. opw-5868538 Forward-Port-Of: odoo/enterprise#105687
This update adjusts the way product prices are stored within Odoo Enterprise to ensure greater accuracy and consistency. The change addresses a technical issue identified in previous testing, improving data reliability. This update primarily impacts financial reporting and inventory management.
Original PR description
Fix tests, related to https://github.com/odoo/odoo/pull/243987 task-4895014 Forward-Port-Of: odoo/enterprise#104728
8 changes
Resolved issues and error corrections
This update resolves an issue where the default appointment view wasn't consistently displayed. The previous code prioritized a Gantt view, overriding the intended list view. The fix removes unnecessary code calls to ensure the list view is used by default, while still allowing customization through Odoo's studio interface.
Original PR description
Steps to reproduce ================== - Install web_studio,appointment - Go to Appointment > Schedule > Staff Bookings - Open studio - Click on Views > List > Set As Default - Exit studio - Refresh the page => The list view is not used by default Cause of the issue ================== The action is overriden in python in order the have the gantt view first. Solution ======== insert_reorder_action_views is called for three actions and all of them already contains the inserted views in the correct position. We can thus remove calls to it. By default, it will be as intended, and if someone wants to change the order with studio, it will be possible. opw-4969903
A recent update to WhatsApp functionality within the Odoo Enterprise platform has been fixed. Specifically, an error occurred when users without WhatsApp access attempted to view conversations, preventing them from seeing messages. This fix ensures all users can access and view WhatsApp conversations correctly.
Original PR description
As we refactored the scale driver, we need to update the checksum. see odoo/odoo#239695
This update ensures compatibility with standard CSS by requiring custom property values to use interpolation. Previously, older versions of the Sass compiler allowed full SassScript expressions, which created inconsistencies with CSS. This change aligns with industry best practices and improves the overall stability of our design tools.
Original PR description
Older versions of LibSass and Ruby Sass parsed custom property declarations just like any other property declaration, allowing the full range of SassScript expressions as values. But this wasn’t compatible with CSS. To provide maximum compatibility with plain CSS, since version 3.5.0, LibSass requires SassScript expressions in custom property values to be written within interpolation. Reference: https://sass-lang.com/documentation/breaking-changes/css-vars/
This update fixes an issue with the IoT Box's driver download process. Previously, enabling a setting allowed it to download standard drivers, leading to potential conflicts and duplicated files. Now, the system avoids downloading standard drivers from standard modules to prevent these issues and ensure stability.
Original PR description
The stable IoT Box uses drivers from git repository: it doesn't download them from the database as it used to do. However, sh/on premise clients might want to develop custom drivers that the IoT Box would download. For that, they have to enable a checkbox on the IoT homepage, making the IoT Box download handlers as before. The issue is it will also download standard drivers that are already present on the IoT Box: on newer databases it would simply overwrite them, but on older ones, it would duplicate as names might have changed. Also, it would introduce issues back that were already fixed. To avoid this, we avoid adding drivers from standard modules to the downloaded archive, to prevent issues with the main ones. Forward-Port-Of: odoo/enterprise#105770 Forward-Port-Of: odoo/enterprise#105531
This update fixes an issue where the Follow-Up Report displayed incorrect amounts for reconciled entries. Now, the report accurately shows the remaining balance (residual amount) for each entry, ensuring accurate reporting and financial analysis. This improves the reliability of financial data presented to users.
Original PR description
Currently, when viewing the followup report with reconciled entries, we display full amounts instead of the residual amounts. task-5868881 Forward-Port-Of: odoo/enterprise#105507
This update corrects a technical issue where order documents weren't being properly updated in the l10n_mx_edi module. By forcing a write-date update, the system now accurately reflects the document's status, ensuring data consistency and compliance. This resolves a previous limitation in how documents were identified for updates.
Original PR description
Before the commit 8b118a7, the search of the documents to update has been limited and ordered. With the actual domain the records to update will be most of the time the same because is not being updated. To fix this issue we force to update it. OPW-5368047 Forward-Port-Of: odoo/enterprise#105282 Forward-Port-Of: odoo/enterprise#103272
This update ensures document discoverability settings (like public or private access) are consistently maintained when moving documents within the system. Previously, moving a document could unintentionally change its visibility based on the destination folder's settings. The move confirmation dialog now clearly reflects this change, providing users with accurate information.
Original PR description
This commit improves the handling of a document's discoverability setting (`is_access_via_link_hidden`) when it is moved between folders. Previously, when a document was moved, it would inherit the…
This commit improves the handling of a document's discoverability setting (`is_access_via_link_hidden`) when it is moved between folders. Previously, when a document was moved, it would inherit the discoverability setting from the destination folder. This could lead to unintended changes in a document's visibility. For example, a publicly discoverable document could become private (requiring a direct link) simply by being reorganized into a different folder. This behavior was inconsistent with a previous improvement that prevented discoverability from propagating downwards from a parent folder to its children. See PR-93697. With this change, a document's discoverability is now treated as an intrinsic property that is fully preserved when the document is moved. It is no longer affected by the settings of its destination folder. To ensure clarity for the user, the move confirmation dialog has been updated to reflect this new logic. It now correctly informs the user that the document's original discoverability setting will be maintained. Task-5159832 Forward-Port-Of: odoo/enterprise#105877 Forward-Port-Of: odoo/enterprise#97045
This update fixes an issue with how employer social insurance contributions are recorded in the Odoo Enterprise system for Saudi Arabia. The change ensures that these payments are accurately assigned to the correct accounting accounts, improving financial reporting and compliance. This resolves a previous error impacting payroll processing.
Original PR description
Fix the account configuration used by Saudi social insurance contribution salary rules for the company. This ensures employer contributions are posted to the correct accounting accounts. Task-5468575 Forward-Port-Of: odoo/enterprise#105182
10 changes
Resolved issues and error corrections
This update corrects a technical issue preventing invoices from successfully validating with DIAN, Colombia's tax authority. The fix involved updating a specific tag format within the invoice XML files to match DIAN's requirements. This ensures invoices are properly processed and avoids validation errors.
Original PR description
Problem: When validating invoices with DIAN, an error is received. Cause: Incorrect tags are being used in the invoices. These tags are checked when invoices are validated with DIAN. Solution: Use the correct tags in the invoices. schemeName should be used instead of scheme_name. Steps to reproduce: - Install l10n_co_dian module - Choose a Colombian company - Activate DIAN service in Settings - Create an invoice and send it while making sure the DIAN checkbox is ticked - Download the generated zip file and uncompress - Open the XML file and check for scheme_name. It should be replaced by schemeName. opw-5829958 Forward-Port-Of: odoo/enterprise#105659
This update addresses a small technical issue where a missing space in a route caused a problem with the account online synchronization process. This fix ensures the synchronization feature functions correctly, preventing potential disruptions to data synchronization.
Original PR description
During this forward port: https://github.com/odoo/enterprise/commit/a5b9372ca0b23151046c14c9a8ead0ed9cd46b80 there was a missing space in the route. no task id Forward-Port-Of: odoo/enterprise#105849
This update hides potentially confusing channel commands (like `/help`) from website visitors and guests. Previously, these commands were visible even though they didn't function for non-users. This change enhances the user experience and prevents accidental actions by guests, improving overall website security.
Original PR description
**Before PR:** channel commands like `/help ` or `/leave` and more are visible to visitors or guest even it is not functional for them. **After PR:** all commands are now hidden from visitors/guests. task-4548666 Forward-Port-Of: odoo/enterprise#105380 Forward-Port-Of: odoo/enterprise#82963
This update fixes an issue where changing the Payment Partner in the accounting system didn't consistently save the new selection. The fix removes a restriction that prevented the system from properly updating the Payment Partner record, ensuring changes are saved and reflected after refreshing the record.
Original PR description
**Steps to reproduce:** 1. Install Accounting. 2. Go to Return Type. 3. Create a record and set a Payment Partner Bank. 4. Change the Payment Partner. **Issue:** Changing the Payment Partner creates a log entry but does not update partner on the selected Payment Partner Bank. After refreshing the record the value is reverted to the previous partner. **Cause:** The field payment_partner_id is defined as `readonly` at the model level. As a result, when the ORM attempts to update this field, the write operation is silently ignored. Although the field appears editable in the view due to `readonly="0"`, model-level `readonly=True` still prevents the value from being saved. **Fix:** Make the field writable at the model level so that ORM updates are persisted, This ensures that changes to Payment Partner are properly saved and no longer reverted after refresh. **opw-5423029**
This update corrects a technical issue in the Datev export functionality for tax groups with children. Previously, the system incorrectly accessed the parent tax group instead of the child groups, leading to inaccurate data. This fix ensures that Datev exports correctly represent tax groups and their associated children.
Original PR description
Issue: Before this commit, when a tax type is group and has children, we access the parent, even though the dict has only the children Fix: as a solution, we map through the originated tax list received from the compute all function opw-5480918 opw-5874567
This update resolves an issue where the input field within the campaign test dialog would disappear when cleared. The fix adds a configuration to ensure the field correctly displays, preventing users from needing to close and reopen the dialog to use it. This improves the user experience for campaign testing.
Original PR description
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: -…
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: - The input area has disappeared. Now, the only way to get it back is by closing the dialog and reopening it Cause: - Field `resource_ref` uses `hide_model: True`, and when cleared, the widget has no value and no model selector to determine the target model because of the function `getRelation` that now returns `undefined`, by this XML fails to render the `<Many2OneField/>` https://github.com/odoo/odoo/blob/7680b83501cef18362be38f90715d824f2bf9cd6/addons/web/static/src/views/fields/reference/reference_field.js#L107-L119 Solution: - Add `model_field: model_id` option to the view so the widget can resolve the model from the `model_id` field even when input is empty Note: - This behavior also occurs in other places. After discussion with the framework team, we agreed to keep the scope of this PR limited to marketing_automation, as this is not a priority issue. A broader fix can be addressed in the master if needed. opw-5473320 Forward-Port-Of: odoo/enterprise#104547
This update corrects a bug where duplicate default appointment slots were being created. The fix ensures that slots are only generated once, preventing confusion and ensuring accurate appointment scheduling. This improves the user experience and data integrity.
Original PR description
Steps to reproduce: - Install website_appointment - Go to the frontend and create a new appointment from there - The appointment created has its default slots duplicated When creating an appointment type, it's possible that we end up creating the default slots two times by passing in the compute of the category and then the onchange linked to category_slot_scheduling. Technically, when we were in the onchange after the compute, slot_ids was populated by NewId records. So when assigning and creating a second time the default slots, the NewId would at the end become real records and the new one were added on top. Now we add a check on the previous category to create the default slot only when we came from a custom appointment and reset them if it is now a custom one. task-5499200
This update fixes a technical issue related to how account reports process data. By adding filters to the underlying data tables, the system now ensures more accurate reporting, particularly for cash basis accounting. This improves the reliability of financial reports.
Original PR description
In addition to: - [x] #104936 And other PRs in Odoo core: - [x] odoo/odoo#243833 - [x] odoo/odoo#243967 - [x] odoo/odoo#246440
This update corrects a technical issue where the Point of Sale (POS) system incorrectly reported the scale as disconnected. The change, previously addressed in odoo/enterprise#90842, ensures accurate scale status reporting, improving the reliability of the certified scale service. This resolves a potential disruption to sales transactions.
Original PR description
This commit ports the change from odoo/enterprise#90842 to the certfied scale service, which fixes an issue where the POS claims the scale is disconnected even though it isn't. opw-5880286
This update resolves an issue where editing a bank statement line would incorrectly trigger a recomputation of all related lines, including reconciled ones. The change prevents this behavior, improving the stability and efficiency of bank statement management. This ensures edits to bank statements don't unexpectedly affect reconciliation processes.
Original PR description
When we edit a bank statement line, it triggers the recompute of all other lines, even the reconciled ones. This commit changes this behavior so reconciled lines are not recomputed task-5882885 Forward-Port-Of: odoo/enterprise#105754
10 changes
Resolved issues and error corrections
This update fixes a technical error that could occur when changing invoicing policies after a sales order was created and the user who created it was deleted. The change ensures the system correctly handles scenarios where the original user's information is no longer available, preventing a traceback and maintaining proper functionality.
Original PR description
Steps to reproduce: 1. Create a new user in the database 2. Create a new sales order as the new user 3. Add an order line where the product is of type "Service" and has an invoicing policy of "Based on Timesheets" 4. Confirm the sales order 5. Sign out of the new users account and sign in as admin 6. Delete the newly created user 7. Go into Settings > Timesheets > Invoicing Policy 8. Attempt to change the policy to "Validated timesheets only" 9. Save your changes 10. Observe the traceback The `if` statement would trigger if any record in the recordset had a `create_uid`, which would cause a traceback if the first record in the recordset happened to not have a `create_uid`. This can occur if the user who created a given sale order is deleted from the database. This change will ensure that the function correctly falls back to the currently signed in user if the sale order create_uid doesn't exist. opw-5868538
This update ensures that WebGL testing continues to function correctly in Chrome's headless mode (version 144+). Chrome's default settings now disable WebGL, so this change re-enables it for testing purposes, specifically to maintain functionality for features like image filters in the website builder. While SwiftShader is less secure, it's deemed acceptable for controlled test environments.
Original PR description
Since Chrome 144 disabled [^1] by default the WebGL fallback to the software renderer SwiftShader, this commit reenables [^2][^3] it when running in headless mode to allow to keep testing WebGL features (i.e. image filters in website builder). Note: the SwiftShader implementation is considered deprecated and less safe than proper hardware based ones, hence not recommended for a regular usage with untrusted content. However, as tests are run in a more controlled environment, it looks reasonnable to opt-in to keep actually testing WebGL features. [^1]: https://chromium-review.googlesource.com/c/chromium/src/+/7128438 [^2]: https://issues.chromium.org/issues/476172421 [^3]: https://chromestatus.com/feature/5166674414927872 Forward-Port-Of: odoo/odoo#246289
This update resolves a confusion for users of the Odoo PEPPOL integration. Previously, the system used 'demo' for one setting and 'test' for another, creating inconsistency. This change ensures both settings are aligned, providing a clearer and more reliable experience for users.
Original PR description
Currently, the proxy_client_user is neutralized as demo. But the edi_mode is set to test. It's confusing for the users, and we should be consistent. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246181
This update fixes an issue where the UrbanPiper store identifier field was visually overflowing its container. The changes include wrapping the field and button in a container with appropriate styling for a cleaner and more user-friendly display within the settings interface.
Original PR description
Before this commit: --- - The UrbanPiper store identifier field could overflow its container. After this commit: --- - Wrap the store identifier field and action button in a container. - Apply `overflow-hidden` and flexible width to the store identifier field. task-5472992
This update resolves an issue where vendor partner creation from XML vendor bills would fail if the 'Departamento' tag was missing. The fix ensures the system correctly handles cases where this tag is empty, preventing incorrect state detection and successful partner creation. This improves data accuracy and streamlines the process of importing vendor information.
Original PR description
If the xml file has a tag "Departamento" without a value, the vendor partner creation fails because the state is searched with an empty string and detects a state that is not correct because the xml has no state value. Task Adhoc side: 109004
This update resolves a bug preventing the correct Open Graph description from being generated for card campaigns. The issue stemmed from a mismatch in variable names between the controller and the template, resulting in an empty meta tag. The fix ensures the campaign's suggestion text is correctly passed, enabling proper social sharing functionality.
Original PR description
**Current Behavior:** description is not available for the Crowler <img width="1159" height="802" alt="image" src="https://github.com/user-attachments/assets/2979f413-6487-4f44-993c-b9a806e0d0ef" />…
**Current Behavior:** description is not available for the Crowler <img width="1159" height="802" alt="image" src="https://github.com/user-attachments/assets/2979f413-6487-4f44-993c-b9a806e0d0ef" /> **Steps to reproduce:** 1. Install `marketing_card` 2. Create a card campaign 3. Set Recipient, Post Link and Post Suggestion 4. Save and Preview 5. Copy the URL and replace `preview` with `redirect` 6. To reproduce in locale, in the `contoller` make the marketing_card.card_campaign_crawler template the only return 7. Now paste that URL in the browser **Issue** - The `<meta property="og:description">` tag is empty in inspect. It does not contain any content **Cause:** - The controller `card_campaign_redirect` passes the campaign's suggestion text to the view using the key `post_text`. However, the template `card_campaign_crawler` attempts to access `post_suggestion`, which is not present in the rendering context. **Solution:** - Update the controller to pass `post_suggestion` opw-5351041
This update fixes an issue where the rental report was displaying incorrect dates. The fix ensures that each row in the report accurately reflects the start and return dates of the rental order, providing more reliable reporting data. This improves the accuracy of rental tracking and analysis.
Original PR description
The rental report is a daily report with x rows by rental order, with x the days between the start and return dates. With generate_series inside the select, the query was creating x rows with the same id, resulting in the date field not being correctly displayed (one unique date, the start date). This fix corrects the generation of the report to display the real date on each row. opw-5266525
This update corrects a warning message appearing when dealing with expired sales leads. The previous system incorrectly processed multiple records instead of a single one, leading to the error. This fix ensures accurate processing and eliminates the warning.
Original PR description
### Issue: In #244061 changes, the expired so leads to warning message. However, the batch `res_id` is used instead of single record which is an error. opw-5478691 Forward-Port-Of: odoo/odoo#246369
This update resolves an issue that prevented users from completely removing company-dependent settings (like invoice sending methods) after disabling related modules. The fix ensures accurate data comparisons, preventing errors that occurred when the system tried to compare JSONB values with string values. This ensures a smoother module installation and uninstallation process.
Original PR description
Currently, an error occurs when a company-dependent selection field (e.g. invoice sending method) keeps a value after the related module is uninstalled. **Steps to Reproduce:** 1. Install the…
Currently, an error occurs when a company-dependent selection field (e.g. invoice sending method) keeps a value after the related module is uninstalled. **Steps to Reproduce:** 1. Install the Accounting app. 2. Disable 'Snailmail' from settings. 3. Send any invoice, make sure wizard Print & Send has selected "by Post" option. 4. Click on the Send button. **Error:** `AssertionError` **Cause:** Fields defined with `company_dependent=True` are stored as property fields rather than regular values. In PostgreSQL, these fields are stored as **JSONB** values keyed by company id. When a selection value is removed (e.g. during module uninstallation), it attempts to compare the JSONB column directly with a string value, resulting in an invalid comparison and triggering the error. - [1] **Fix:** Update the SQL query to extract the value for the active company using JSON operators (->>), ensuring correct comparison with the expected selection value. [1] - https://github.com/odoo/odoo/blob/92a9f6b19670685dfe9fb1714bf01449768e5f62/odoo/addons/base/models/ir_model.py#L1812-L1815 sentry-6970900918
This update resolves an issue where actions in Odoo Enterprise were incorrectly displayed for disabled languages, causing errors. The change ensures that actions are now only available for languages that are actively selected, improving stability and preventing errors when switching languages.
Original PR description
Filter Embedded Actions Based on Active Languages ### Impacted versions: 18.0 and later ### Steps to reproduce: - Install at least 2 languages - Install documents and accounting or other app to have actions on select - Uninstall one language - You will get an error when trying to activate again actions on select (also appears on network interface) ### Current behavior: When a language is deactivated, its corresponding translations may still appear in server actions, leading to errors when trying to add them to the context. This issue is now resolved by filtering actions to only include those linked to active languages. Task: [5420820](https://www.odoo.com/odoo/project/49/tasks/5420820)
6 changes
Resolved issues and error corrections
This update corrects a printing issue where DIN5008 expense reports displayed a duplicate title. The change adds a required field to the expense report data, ensuring the report title matches the standard 'Expenses Report' format, resolving the duplication and improving report consistency.
Original PR description
Issue: Expense title is duplicated when printing an expense report for localizations using the DIN5008 standard. Steps to reproduce: - Install German localization - Create a new expense report - Print the expense report PDF -> Title is duplicated Cause: DIN5008 reports tries to load a specific field `l10n_din5008_document_title` in their header and fallbacks to report's name With this commit, we add a bridge module to add the field `l10n_din5008_document_title` to `hr.expense.sheet` and set it to 'Expenses Report`, therefore the header will have 'Expenses Report' as title, like in the standard expense report. opw-4314414
This update enhances the Odoo editor's table functionality by allowing users to select rectangular ranges of cells when using Shift + arrow keys. Previously, selections were made one cell at a time. Now, the editor behaves more like Google Docs, providing a more intuitive and efficient way to select and edit data within tables.
Original PR description
Current behaviour before commit: -In table, when pressing shift + any arrow key, cells are selected one by one, not rectangularly. Desired behaviour after commit: -If no cell is selected then pressing shift + any arrow key selects current cell. -When there is one or more cells are selected, pressing shift + any arrow key expends cells rectangularly relative to the arrow key directions just like gdoc. task-3442805 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a technical issue (a 'runbot' bug) that was preventing the checkout tour from running correctly. The fix includes adjustments to the selection of Latin American identification types and a pause to ensure the checkout page loads fully, improving the tour's reliability.
Original PR description
This PR fixes a runbot bug happening in the tour test of `test_checkout.js`, by: 1. fixing selection of latam identification and obligation types. 2. adding a step waiting for the checkout page. runbot-233703
This update resolves an issue where work centers remained blocked after a work order was deleted. The fix ensures that the timer and associated productivity data are stopped when a work order is removed, preventing incorrect work center availability. This improves the reliability of our manufacturing scheduling.
Original PR description
Steps to reproduce: - Start the timer on the work order - Delete the work order - Try to block the work center Current behavior: - The work center is not blocked because the latest mrp.workcenter.productivity is still active Expected behavior: - The work center is blocked - mrp.workcenter.productivity is stopped opw-5475227
This update corrects a technical error in the Odoo Enterprise software related to service product packaging. The previous packaging type reference was invalid, preventing proper EDI processing. This fix ensures service products are correctly packaged for tax and regulatory compliance.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129
This update fixes a test issue related to how demo data was used, ensuring consistent test results across environments. The change makes the test independent of demo data, improving reliability and streamlining the continuous integration process. This ensures tests run predictably and accurately.
Original PR description
As part of the forward part for [1] the shop mail tour was updated because the new demo partner was earlier alphabetically than the partner generated for the test, and tests run with demo data for CI in this version. The test should create a partner that will appear first in the m2o selection regardless of whether demo data is installed. [1]: 549708965924b17403ef7c8e6a6d5bc43af460c3 runbot-238406