Daily updates from Odoo
Wednesday, August 5, 2026
22 changes · master
Enhancements to existing features
This draft improves the reliability of Knowledge article comments by adding tests for creating comments, handling large selections, deleting commented text, undo/redo behavior, keyboard navigation, and invalid comment placement. It helps ensure comment markers behave consistently before the feature is finalized, though the work is still described as needing cleanup.
Original PR description
This commit creates a test environment for article comments; it mounts a limited version of the Knowledge form view and mocks the necessary services and routes to allow for comment creation. It still needs to be heavily cleaned up, as many artifacts of earlier versions still linger, or have yet to be used. Many tests have also yet to be written; and the current version keeps them all in the same file. task-4235306
This update adds richer demo data for Belgian payroll testing, including employees, contracts, work schedules, attendance records, and a vehicle. It helps teams manually test payroll scenarios that better reflect real customer situations, and employee search now also works with external codes.
Original PR description
Add demo data records to match more realistic real world scenarios of employees, contracts, resource calendars and attendances. task-6364398
A new assistant rule was added for Timesheet Grid to help track runbot testing and the related branch. This improves internal testing visibility with minimal direct impact on end users.
Original PR description
Add an assistant rule to track runbot testing and which branch. --- task-6410639
The Sign app now only retrieves the single role record it needs instead of loading every role and all related details. This reduces unnecessary data fetching and should improve performance when opening sign template actions, especially in databases with many roles.
Original PR description
This `search_read` is done - without `domain` which means it fetches the entire table - without `fields` which means it fetches all fields And the business code only actually needs the id of the very first record which is returned. See `SignTemplateIframe`'s constuctor: `this.props.signRoles[0].id;` AFAICS, that's the only place where it's used. This will be better refactored in master. Forward-Port-Of: odoo/enterprise#126835
Resolved issues and error corrections
Automatic bank transaction matching now ignores archived bank accounts when identifying the related customer or vendor. This prevents old or inactive bank details from assigning transactions to the wrong partner, improving reconciliation accuracy.
Original PR description
Steps to reproduce: - Have a partner with a bank account, then archive the res.partner.bank record (keep the partner active). - Import or create a bank transaction (e.g. via bank sync) whose account number matches that archived bank account, and whose label/payment_ref would otherwise match a reconciliation model for a different partner. - Let the transaction go through automatic partner retrieval. => The archived bank account's partner is assigned, even though a normal manual entry (which skips the account-number match) would have used the label instead. Cause of the issue: `AccountBankStatementLine._retrieve_partner()` matches statement lines to partners in batch using raw SQL joining `res_partner_bank`. The query's WHERE clause filters out archived partners (`AND partner.active`) but never filters `res_partner_bank.active`. opw-6340479 Forward-Port-Of: odoo/enterprise#124748 Forward-Port-Of: odoo/enterprise#124537
This fixes an issue in Studio approval requests where a reference field could be created without a valid related model. Ensuring the reference always points to a defined record type helps prevent approval setup errors and improves reliability for users configuring workflows.
Original PR description
studio.approval.request Many2oneReference must have a valid model field.
The Helpdesk unanswered filter no longer treats automatic acknowledgement emails as customer replies needing attention. This keeps support queues cleaner by showing only tickets that genuinely require a response from the team.
Original PR description
Steps to reproduce: --------- - install website_helpdesk - set an email address on the company partner if it is empty ( it is empty in a database without demo data). - generate a ticket from the website. - apply the Unanswered filter. Issue: ------ system generated acknowledgement message is considered an unanswered customer reply. Fix: -------- system generated acknowledgement messages are now considered answered. task-5138678 Forward-Port-Of: odoo/enterprise#125977
This fix prevents an error that could occur when appraisal survey settings were missing or empty. It helps ensure appraisal survey functionality continues working reliably during setup or upgrade scenarios.
Original PR description
Avoid a TypeError in _compute_allowed_survey_types when allowed_survey_types is False by falling back to an empty list before unpacking and appending the appraisal survey type.
```py
File "/home/odoo/src/enterprise/saas-19.3/hr_appraisal_survey/models/survey_survey.py", line 33, in _compute_allowed_survey_types
survey.allowed_survey_types = [*survey.allowed_survey_types, 'appraisal']
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: Value after * must be an iterable, not bool
```
Ref: https://github.com/odoo/odoo/pull/268125
Bug introduced in: https://github.com/odoo/enterprise/commit/896f54532338b07265722cb4a4161131d408f58c
upg-[4458975](https://upgrade.odoo.com/odoo/request/4458975?debug=1)
Forward-Port-Of: odoo/enterprise#124417The Time Off Gantt view now only shows time off types that are currently available for selection. This prevents managers from accidentally choosing outdated or disabled leave types when planning time off.
Original PR description
Steps to reproduce: - In Time Off, create a leave with any selectable time off type - Modify this time off type so that it is not selectable anymore - Go to "Management" -> "Time Off" and select the gantt view - When clicking on a day, the now non selectable time off type still shows in the list of available time off types Reason: When fetching time off types to display, the code did not check if the time off type was selectable, leading to this issue. How it was fixed: Added a condition when fetching time off types to only get those that are selectable. Task ID: 6314831
Planning filters for employees and materials now apply the open-shift rule only to shifts without an assigned resource. This prevents assigned shifts from being incorrectly included or excluded, helping teams view the right planning data.
Original PR description
Before this commit, the domain wrongly assumes that we always search on shifts having no role or a role containing resources of types 'user' or 'material' (1). Additionally to the basic domain which searches on the shifts having resources of types 'user' or 'material' (2). After this commit, we add a condition on domain (1) to only apply it for open shifts (shifts having no resource_id). no-task Forward-Port-Of: odoo/enterprise#126616 Forward-Port-Of: odoo/enterprise#126247
Users can now duplicate several maintenance requests at the same time without the system showing an error. This makes bulk work in the maintenance app smoother and avoids interruptions for teams managing equipment requests.
Original PR description
Currently, when a user attempts to duplicate multiple maintenance requests simultaneously, the system throws a ValueError (Expected singleton). This PR fixes that. ### How to reproduce the issue: - Install `mrp_maintenance` module; - Open maintenance request list view; - Select multiple records and try to duplicate them using the Action button; - It will throw a traceback stating a singleton error. ### Expected behavior after PR is merged: Now multiple maintenance requests will be copied without raising any errors. Forward-Port-Of: odoo/enterprise#124255
A small issue in the accounting journal report was fixed by cleaning up unused date information in the report line actions. This helps keep the report interface consistent and reduces the chance of confusing or incorrect behavior for users.
Original PR description
Forward-Port-Of: odoo/enterprise#126603 Forward-Port-Of: odoo/enterprise#125266
The manufacturing planning tests were adjusted to match the corrected handling of demand for the current day. This helps ensure replenishment suggestions include same-day activity scheduled later in the day, reducing the risk of misleading planning checks.
Original PR description
Updated the forecast suggestion test expectations after monthly demand was updated to count the full current day, so same-day orderpoint replenishment moves scheduled later in the day are also included Community PR: odoo/odoo#262435 TaskID-5490137 Forward-Port-Of: odoo/enterprise#126732 Forward-Port-Of: odoo/enterprise#115944
Updated the Italian Balance Sheet report labels to use the correct Italian wording. This helps Italian-speaking accounting users read and interpret the report more accurately without changing the report's calculations or workflow.
Original PR description
### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Install and switch to italian language 3. Go to Balance Sheets and select Balance Sheet (IT) 4. Some words are not correct [Here]( https://docs.google.com/spreadsheets/d/1-w83oAHTxDRIi-W_VSJiscNclw-yijzQUHOgMnTq7jE/edit?gid=0#gid=0) the wrong fields with their correct translations. opw-6424609 Forward-Port-Of: odoo/enterprise#126253
Users opening a bank statement line from an in-app notification will now see the related conversation and activity panel. This ensures tagged users can view the comment context immediately, reducing confusion during bank reconciliation work.
Original PR description
Problem: When navigating to a bank statement line through a notification, the chatter doesn't appear. Steps to reproduce: 1. Set in app notifications for one of the users 2. Open Accounting > Bank > To Reconcile 3. Select any bank statement line 4. Tag the user from step 1 in a comment 5. Log in as that user 6. Check notifications and click the new notification 7. Notice how the chatter does not appear on the bank statement line after navigating there Cause: The chatter was not enabled on the bank statement line form view. opw-6410186 Forward-Port-Of: odoo/enterprise#125777
Dropdown fields in account reports now show the text cursor aligned to the right instead of appearing in the middle. This improves the visual polish and usability of report filters without changing any business logic or report data.
Original PR description
Dropdown inputs inside of an account report show the cursor in the center of the input field. The cursor has been changed to be right-aligned. task-6247454 Forward-Port-Of: odoo/enterprise#120728
Code cleanup and technical improvements
This update modernizes part of the Documents app so it remains compatible with the next version of the underlying interface framework. It preserves existing behavior for document selection and topbar actions, reducing the risk of stale or incorrect action buttons for users.
Original PR description
Replaced `useLayoutEffect` (from `@web/owl2/utils`) with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect`'s shim is literally `onMounted + onPatched` with…
Replaced `useLayoutEffect` (from `@web/owl2/utils`) with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect`'s shim is literally `onMounted + onPatched` with a deps-diff guard; a native reactive `useEffect` does NOT work here — it runs outside OWL's patch lifecycle and stops re-running once the first selection settles, leaving topbar actions stale. A manual diff of `[this.props.targetRecords, this.ui.isSmall]` inside `onPatched` reproduces the post-patch, gated recompute the original shim performed. The useLayoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - @documents/kanban_view/Check actions with preview - @documents/kanban_view/Download button availability - @documents/list_view/only show common available actions see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2593680/build/114734104 `useEffect` from `@odoo/owl` is NOT an equivalent replacement — despite both `this.props.targetRecords` and `this.ui.isSmall` being reactive signals, the effect stops firing after the first selection settles. Only patch-tied lifecycle hooks sustain the subscription.
The Documents module was updated to use a newer internal approach that aligns with the next version of Odoo's interface framework. This reduces maintenance risk and adds test coverage to help ensure document selection actions continue working correctly.
Original PR description
Replaced `useLayoutEffect` with `computed()` signals because `useLayoutEffect` is deprecated in OWL3. Both `recordsToDelete` and `recordsToArchive` are pure derived values from `this.selection`. Using `computed()` removes the effect entirely, making the reactive dependency explicit with no layout-effect overhead. When commenting out the useLayoutEffect there was no error, the code we refactored had NO TEST coverage. A test was written to ensure our fix was correct, and it was tested against the previous useLayoutEffect: - Passed with previous useLayoutEffect. - Failed with previous useLayoutEffect commented. - Passed with our OWL3 replacement.
Manufacturing work orders and VoIP calling screens were updated to use Odoo's newer overlay framework. This is an internal modernization that helps keep these interfaces compatible with the latest platform changes, with no expected functional change for users.
Original PR description
`overylayService` has been converted to an OWL3 Plugin, so existing useService("overlay") call sites need to be rewritten.
This commit is the result of the owl3-migration script.The Documents app’s drag-and-drop area was updated to use the current supported framework approach, reducing future maintenance risk. A new automated test was added to confirm the drop zone still reacts correctly while scrolling and dragging files.
Original PR description
Replaced the `useLayoutEffect` in `DocumentsDropZone` that registered dragover, dragleave, and scroll listeners on `props.parentRoot()` and tracked `scrollTop` for overlay positioning. Used…
Replaced the `useLayoutEffect` in `DocumentsDropZone` that registered dragover, dragleave, and scroll listeners on `props.parentRoot()` and tracked `scrollTop` for overlay positioning. Used `useListener` from `@odoo/owl` and a class-level `signal(0)` for the scroll offset. `useLayoutEffect` is deprecated in OWL3. `useListener` is the idiomatic OWL3 API for external listeners: it accepts the ref getter directly as its target, subscribes to it reactively, and handles add/remove lifecycle automatically — no manual cleanup or `onMounted`/`onUnmounted` pairing required. The `proxy` state property for `topOffset` was replaced with a `signal(0)` so the template reads `this.topOffset()` with fine-grained reactivity. When commenting out the useLayoutEffect there was no error, the code we refactored had NO TEST coverage. A test was written to ensure our fix was correct, and it was tested against the previous useLayoutEffect: - Passed with previous useLayoutEffect. - Failed with previous useLayoutEffect commented. - Passed with our OWL3 replacement.
Point of Sale orders now receive their required references before the order is created. This helps prevent initialization issues in localized invoicing, payment settlement, and connected POS flows, making order processing more reliable.
Original PR description
Before this commit: ==== - In the createNewOrder method, the pos.order was created first, and the references were set afterward using getNextOrderRefs. After this commit: ==== - References are now set before creating the pos.order instance, ensuring proper initialization. task-4677391 Community PR - https://github.com/odoo/odoo/pull/205859
The Luxembourg reporting test data has been moved into separate XML files, making the test suite easier to navigate and maintain. This is an internal cleanup that does not change product behavior for users.
Original PR description
Each expected FAIA content is around 700 lines long. It is cumbersome to navigate the file. This commit moves the expected FAIA content to their own files. This has the added bonus of adding xml syntax highlighting to the file if one uses VSCode or a similar program.