Wednesday, November 12, 2025
14 changes · 19.0
Enhancements to existing features
The POS no longer checks blackbox driver updates during session opening. If the drivers are outdated, users will now see the error only when they try to use a blackbox feature, which removes an unnecessary step at startup and keeps opening faster.
Original PR description
When introducing the blackbox queue service, we added a check at the opening of the POS to ensure that the blackbox drivers were up to date. This check is done at the start of session opening. It is now not necessary anymore, if the drivers are not up to date, an error will also be shown to the user when they try to use a blackbox functionality. Forward-Port-Of: odoo/enterprise#99014
Resolved issues and error corrections
This update adjusts an automated purchase test so it works correctly with PostgreSQL 18. It prevents the test suite from failing due to a database error type change, keeping development and validation runs stable.
Original PR description
Apparently in pg18 a standard-compliance fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted…
Apparently in pg18 a standard-compliance
fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted `FOREIGN_KEY_VIOLATION`. One such case is specifically being tested for by `test_purchase_order_line_without_uom`, leading to this test failing systematically when running pg18:
psycopg2.errors.RestrictViolation: update or delete on table "uom_uom" violates RESTRICT setting of foreign key constraint "purchase_order_line_product_uom_id_fkey" on table "purchase_order_line"
DETAIL: Key (id)=(29) is referenced from table "purchase_order_line".
Update the test to use the more generic `IntegrityError` as it's probably more than sufficient for our purposes. Technically we could pass a tuple of `(ForeignKeyViolation, RestrictViolation)` but it doesn't really seem necessary. And it would require fixing the `_raisesContext` override as currently it is very much *not* compatible with that.
Forward-Port-Of: odoo/odoo#235119The dashboard upload button could accidentally be dragged out of place, which made the interface behave unpredictably. This update keeps the button fixed in position so it stays where users expect it to be.
Original PR description
Issue: - In the dashboard, the upload button (purchase journal and others) could be dragged. - This caused unintended movement of the upload UI element. Fix: - Added `draggable=false` to the upload button element. - Ensures the button remains fixed and cannot be dragged around. TaskID-5114617 Forward-Port-Of: odoo/odoo#235086 Forward-Port-Of: odoo/odoo#229013
Selecting the same date filter again no longer triggers extra updates or chart redraws. This also fixes an issue in Custom Range where clicking inside the date fields could accidentally reapply the filter.
Original PR description
## Description - Re-clicking the current date filter (relative/month/quarter/year/range) triggered redundant RPCs and chart re-animations. In Custom Range, clicks inside inputs also bubbled to the dropdown item, causing unwanted updates. ##### This PR: - Stop event bubbling inside Custom Range inputs to avoid spurious updates. - In GlobalFiltersCoreViewPlugin.allowDispatch(), return NoChanges when the incoming value equals the current filter value (currentFilterValue). Task: [5187275](https://www.odoo.com/odoo/project/2328/tasks/5187275) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a warning caused by newer Python versions in the IoT webRTC client. It helps keep the system cleaner and more compatible without changing how users work.
Original PR description
In Python 3.12 the `asyncio.get_event_loop()` function was deprecated, and now logs a warning when it is used. To fix this we replace it with `asyncio.new_event_loop()`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The pivot field selector popover now keeps a normal light appearance in dark mode instead of switching to a dark theme. This makes the spreadsheet experience more consistent, since dark mode is not yet supported in the spreadsheet editor.
Original PR description
Spreadsheet does not support dark mode yet, but the pivot field selector popover was dark-themed in dark mode. Task: [5163919](https://www.odoo.com/web#id=5163919&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
When users remove formatting from text inside lists, any applied text color is now also removed correctly. This makes the editor behave as expected and helps keep pasted or edited content visually consistent.
Original PR description
### Steps to reproduce: - Open the Todo and create a new list. - Type some text and press `Ctrl + A` to select all. - Apply a text color class using the color picker. - Remove formatting from the selected content. ### Description of the issue/feature this PR addresses: - When color was applied through classes inside list items and removeFormat was triggered, color classes were not removed. ### Desired behavior after PR is merged: - All text color styles and classes are removed when using `removeFormat`. task-5166472 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects the cursor behavior when adding an image caption so it stays in the expected place instead of jumping unexpectedly. It also makes the image description popover place the cursor directly in the description field, making image editing smoother and more reliable for users.
Original PR description
### Description of the issue/feature this PR addresses: - Commit [1](https://github.com/odoo/odoo/commit/9a3abd5f9e5658b72b8a5d2fa0384bdbb580873f) changed `selectionchange` listener to `addGlobalDomListener`. As result, calling this.captionInput.el.focus() in caption.js triggered `selectionchange` event. Since `<figure>` is contenteditable="false", the `fixSelectionOnEditableRootGeneric` method moved the selection to sibling `<div>`, causing the cursor to jump unexpectedly. ### Desired behavior after PR is merged: - The selection is explicitly set at the end of the `<figure>` when adding caption, preventing the cursor from moving to a sibling editable `<div>`. - When the image description popover opens, the cursor automatically focuses on the description input field by default. task-5122745 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects the helper logic behind the Documents sharing panel so the "Access through link" option no longer depends on the internal access setting by mistake. It helps ensure the sharing choices shown to users are accurate and behave as expected when setting up shared links.
Original PR description
This commit fix the helpers for the 'Access through link' option where a condition was mistakenly depending on internal access option. Task-5222910
This update fixes a display issue in the accounting reports control panel on mobile devices. It helps the page fit properly on smaller screens, improving readability and making it easier to use reports on the go.
Original PR description
Before this PR, the control panel had an overflow in mobile view. task-4768525 backport of https://github.com/odoo/enterprise/pull/84742
This fix ensures the customer document fields appear or disappear correctly when an invoice is moved between journals that do or do not use documents. It prevents users from seeing the wrong fields after changing the journal, which helps avoid confusion and saving errors.
Original PR description
**Steps to reproduce:** 1. Install `l10n_ar` localization. 2. Create two sales journals with the `Use documents` option enabled and disabled. 3. Create an invoice and add a customer and change the…
**Steps to reproduce:**
1. Install `l10n_ar` localization.
2. Create two sales journals with the `Use documents` option enabled and disabled.
3. Create an invoice and add a customer and change the journal to with `use documents` and save the record
4. Now change the jornal to without `use documents` and try to save it
**Observed behavior:**
The `Document Type` and `Document Number` fields fail to show or hide properly when switching between journals with different `Use documents` configurations.
**Cause:**
The `_compute_l10n_latam_use_documents` method lacked the `@api.depends` decorator with appropriate dependencies. As a result, when the journal is changed on an invoice, the
`l10n_latam_use_documents` field was not recomputed, leading to incorrect visibility of related fields.
**Fix:**
Add the missing `@api.depends('journal_id.l10n_latam_use_documents', 'move_type')` decorator to ensure the field recomputes whenever the journal or its `Use documents` setting changes.
opw-5220202This fix makes sure POS invoice lines are properly included in the HSN validation used for the GSTR-1 report. As a result, items missing an HSN code are more reliably flagged, while older POS lines that lack unit details stay out of the check.
Original PR description
Previously, POS move lines from the original POS entries were not considered during the HSN validation in the GSTR-1 report. As a result, lines without an HSN code were incorrectly skipped from the warning check. This commit updates the domain logic to ensure that: - POS move lines with a Unit of Measure (UoM) but without an HSN code are now included in the check. - Older POS lines without a UoM remain excluded from validation. opw-5252620
This update fixes a test issue in the HR module that could cause build failures when some employee fields were not available on a record. It now safely skips fields that cannot be accessed, preventing unnecessary crashes during automated checks.
Original PR description
This test had a bug: `self.env['hr.employee']._fields.keys()` may contain fields that do not exist in an `hr.employee` record. Now, employee fields that cannot be accessed are filtered out using `hasattr()`. To avoid further crashes. Runbot build error: https://runbot.odoo.com/odoo/runbot.build.error/233942 Bug has been introduced by task-5103739 task-5254322 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235158
This change makes an automated live chat test more reliable by checking that the background service was actually triggered, instead of waiting a fixed amount of time. It reduces false failures in slow or busy environments without changing how live chat works for users.
Original PR description
The `test_bus_not_started` test ensures the live chat only starts the bus/worker service when needed (i.e. when the customer starts to chat). This is done to ensure we do not waste any server…
The `test_bus_not_started` test ensures the live chat only starts the bus/worker service when needed (i.e. when the customer starts to chat). This is done to ensure we do not waste any server resources. However, this test waits 1 second to see if the worker/bus has started, which is not always enough: the shared worker script needs to be fetched, the worker service proceeds to an initial handshake to ensure the worker is properly started, and the bus ervice initializes by sending an initial request to the worker as well. All those steps can take time, especially when the CPU is bloated and/or the network is slow. This worker/bus service only has one entry method: `bus_service@start`, `worker_service.ensureWorkerStarted`. Instead of waiting for those async operations to complete, the test now checks whether those methods were called. fixes runbot-233814 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