Daily updates from Odoo
Tuesday, July 7, 2026
32 changes · master
Security fixes and vulnerability patches
Appraisal permissions are now enforced in the underlying business logic, not only in the web interface. This helps prevent employees from using APIs to change restricted appraisal information or perform manager-only actions.
Original PR description
A lot of the access restrictions within the appraisal app, such as field visibility, editability and certain actions, were enforce only at the view layer through invisible/read-only. This works great for the usual case when uses the web-ui. However, when using the JSON2 API to interact with the appraisal app, the user could bypass these "security rules" as the usual invisible/read-only restrictions don't apply to the API. So a normal user could for example, modify the private note or mark an appraisal as done through the API which was impossible for them to do through the web-ui. This PR introduces the same security rules and validations to the model layer itself which makes it harder to perform unauthorized actions regardless of the interfaces. Task-5926306
New functionality added to Odoo
Malaysia companies can now use Balance Sheet and Profit & Loss report templates aligned with MPERS standards. This helps businesses produce locally compliant financial statements more easily and consistently in Odoo.
Original PR description
Add Balance Sheet and Profit & Loss reports according to MPERS standards. Community PR: https://github.com/odoo/odoo/pull/271714 task-6159106
Enhancements to existing features
The payroll dashboard now shows a dedicated cancel button when a user starts deleting a to-do item. This makes the choice to back out of deletion more obvious and reduces confusion for users.
Original PR description
Small UX improvement adding a cancel button when deleting todos on the dashboard. While you can simply press the x to cancel, showing a button for it makes it clearer at no extra cost.
Field service users can now see product availability forecasts and expected arrival timing directly in the stock moves list. This saves time by reducing the need to open each record individually when checking supplementary products for planned sales orders.
Original PR description
Previously, when a sales order for a field service product was planned, adding supplementary products only displayed the basic delivery status in the stock moves list view. To view the replenishment forecast or expected arrival date, users had to navigate into the form view. This commit exposes the `forecast_widget` in the list view. Users can now check product availability and arrival timelines at a glance without opening individual records. task-5929015
Printer setup now only shows the OBox IP address setting when it is relevant for ePOS printers. Less useful OBox service details are hidden from the regular view, reducing clutter and making configuration easier for users.
Original PR description
This PR adapts the view to only allow the user to set obox ip if the type of printer used is epos as it doesnt matter otherwise It also moves services installed on the obox to debug view only task-6330864
Project task users can now dismiss time off warning banners once they have been seen or addressed. Dismissed employees are skipped in future time off checks, reducing unnecessary processing and improving performance on tasks with multiple assignees.
Original PR description
Previously, leave warnings were always computed and displayed for all assigned employees, even if the warning was already known or addressed. For tasks with multiple assignees, this led to unnecessary processing. - Add a dismissal mechanism to the leave warning banner on the task form view. - Exclude dismissed users from the time-off calculation pool to avoid redundant fetching and performance degradation. task-5025297
Cell hover tooltips were removed from selected list views because they were hard to discover and often duplicated visible content. This makes day-to-day navigation less intrusive, while still allowing helpful tooltips on clearer elements like buttons or icons when needed.
Original PR description
In this commit, we decided to remove tooltips from the `cell` in the `listview`. The reasons are: - It’s hard to discover that a tooltip exists on a cell. - Default tooltips are annoying because they appear whenever the user parks the mouse over a cell. - Most tooltips are useless because they simply display the cell content If the content is truncated, you should resize/enlarge the cell instead. Note: Tooltip isn't ban but if a tooltip is really needed, it should be attached to a button or an icon rather than appearing on hover with a delay. task-4504910
Belgian payroll now better supports flexi-job contracts, including the required Dimona notifications, shift-hour capture, and payroll calculations. The update helps employers stay compliant by preventing invalid automatic declarations and adjusting wage handling when official notifications are refused.
Original PR description
Modifications include: - Updated the dimona workflow to support flexi-jobs, including capturing shift hours for same-day contracts. - Added restrictions to prevent automatic dimonas beyond 31 days and block contracts overlapping multiple quarters. - Added support for a new "Flexi Wage" and specific payroll computations. - Implemented anomaly code handling (460/510) to fall back to regular wage computations when a dimona is refused. - Updated the DMfA XML templates and schemas to include the `FlexiNotion` tag for relevant employees. Task Id : 6033394
The preparation display used by kitchen and order teams has been refreshed with a cleaner layout and improved visual styling. A new dark mode makes the screen easier to use in low-light environments and gives restaurants more flexibility for their setup.
Original PR description
*: pos_restaurant_preparation_display, pos_self_order_preparation_display, pos_urban_piper In this commit: ----------------------- - Implemented dark mode for the kitchen display. - Updated styling and layout for improved visuals. Task: 6112459 | Brfore | |--------| | <img width="1919" height="896" alt="image" src="https://github.com/user-attachments/assets/082924e6-f442-429f-afb0-6b5c16b7d761" /> | AFTER | Light | Dark | |--------|--------| | <img width="1919" height="898" alt="image" src="https://github.com/user-attachments/assets/225ce5c1-fee2-4ea7-ac80-5ee9c9232d1b" /> | <img width="1920" height="895" alt="image" src="https://github.com/user-attachments/assets/bee6c761-49ea-49b0-b20e-bd7d96904e6d" /> |
AI chats now behave more like standard Discuss conversations, with message search, editable conversation titles, and a visible favorite button in the header. Tools and Skills setup options were moved under Configuration so administrators can find setup-related settings in a more intuitive place.
Original PR description
AI chats were missing several behaviors users expect from any other Discuss conversation: searching within messages, renaming the conversation, and displaying the favorite button in the header (the action was already available but not visible there). The Tools and Skills configuration entries were also moved from the Agent menu to the Configuration menu, as they are setup-time settings rather than something a user interacts with during day-to-day agent use, and grouping them under Configuration is more consistent with where users expect to find them. task-6326376 Related: https://github.com/odoo/odoo/pull/273973
After a user signs a document, the thank you dialog now only suggests documents that are ready for that user to sign. This prevents users from opening or signing documents before their turn, making the signing flow clearer and more reliable.
Original PR description
Before this fix: After signing a document, the thank you dialog would show pending documents regardless of signing order. This allowed users to navigate to and sign documents even when it was not yet their turn. After this fix: The thank you dialog now only shows documents where it is the user's turn to sign, respecting the signing order set on the request. Impact: Improves user experience by ensuring the signing order is respected when navigating to the next document from the thank you dialog. Task ID: 6306061
The subscription sales module has been adjusted to stay aligned with recent platform changes. This helps keep subscription pricing behavior consistent and reduces the risk of disruption after upgrades.
Subscription product pages now show discount badges only when a plan is truly cheaper than the one-time purchase option or the relevant comparison price. Goods product pages also avoid showing misleading recurring price information, helping customers compare options more clearly before buying.
Original PR description
Before: - When "Accept One-Time Sale" was enabled, plans priced higher than the Buy Once price still showed a discount badge incorrectly. - For goods products, the "per period" price column was shown, which is misleading since goods are not sold on a recurring price basis. After: - When "Accept One-Time Sale" is enabled, each plan is compared against the Buy Once price; only cheaper plans show a discount badge. - For consumable products, discount is calculated against the most expensive delivery option so cheaper plans show the saving correctly. - For non-consumable products, plan prices are normalized to the shortest billing period for a fair comparison across all plans. - The "per period" price column is now shown only for service products. Impact: - Customers always see accurate discount badges. - Goods product pages no longer show a misleading per-period price, reducing confusion for customers during purchase. Taskid- 6230474
Rental orders now update key dates and prices automatically, reducing manual work and the risk of pricing mistakes. The sales form is also cleaner by showing subscription and rental fields only when they are relevant.
Original PR description
Before this change: - A delivery date field was manually editable and used to control the rental delivery date. - Changing the rental start or end date showed an 'Update Rental Prices' button to update rental pricing. - The rental period field was displayed below the delivery date. - The recurring plan field was visible even when no subscription product was present. After this change: - The delivery date field is hidden and automatically computed from rental_start_date. - Rental prices are automatically recomputed when the rental start or end date changes, removing the 'Update Rental Prices' button. - The rental period field is moved before the pricelist field for better UI flow. -The recurring plan field is now hidden when the order does not contain any subscription product. task-6031439 Community PR:https://github.com/odoo/odoo/pull/255832 Upgrade PR:https://github.com/odoo/upgrade/pull/9693
Project document workspaces now update their company when all linked projects belong to the same company. This removes an inconsistency where projects created in different ways could leave shared documents without the right company assignment.
Original PR description
Before this PR --- - Projects created from the kanban quick create have no company at creation time, so their workspace is born without one. Changing the company later from the form view was silently…
Before this PR
---
- Projects created from the kanban quick create have no company at creation
time, so their workspace is born without one. Changing the company later
from the form view was silently ignored for the workspace, causing the
workspace and its documents to remain without a company.
- Projects created from the list view had their company set at creation, so
their workspace already had a company, and changes were correctly propagated.
This inconsistency made the behavior depend on how the project was created.
After this PR
---
- When a project's company changes, all projects linked to the same workspace
are checked:
- If all linked projects are now in the same company, the workspace company
is updated accordingly.
- If linked projects are in different companies and the workspace has no
company, the workspace is left untouched (accessible to all companies).
- If linked projects are in different companies and the workspace already has
a company, an error is raised (existing behavior, unchanged).
- This makes the behavior consistent regardless of how the project was created
(kanban quick create or list view).
task-4988098Salary offers based on an existing employee version can now use a different PDF template. This gives HR teams more flexibility to tailor offer documents without changing the underlying employee version.
Original PR description
When the offer is based on an employee version (template is the version of the employee), allow to modify `sign_template_id`. Task-6094733
Route planning now checks the number of locations before contacting the map service, avoiding predictable failed requests. Users receive a clearer warning when too many stops are selected, making route planning feedback faster and easier to understand.
Original PR description
This commit adapts the geolocation `fetchRoutes` code to cancel requests with more than 25 coordinates (12 with optimized routing) instead of waiting for an error response from Mapbox. It also adapts the notification warning message in that usecase. task-6358624
Companies can now explicitly choose whether Stripe Issuing for expense cards runs in demo or production mode. This helps teams test cards safely without creating unnecessary fake Stripe accounts in a live setup.
Original PR description
In this PR: - Added a selection field "Mode" for users to explicitly select demo or production mode. - This avoids unnecessary creation of fake Stripe accounts in production. task-5952661
Resolved issues and error corrections
This fixes a payroll issue that could affect generating payslips from pay runs after recent changes to work entry dates. The update helps ensure payroll batches select the correct work entries, reducing the risk of incomplete or incorrect payslip generation.
Original PR description
Fixes a small issue with the generation to adapt a domain to the new date system on work entries.
The HSBC autopay configuration option is now shown correctly under the Hong Kong payroll settings. This helps Hong Kong payroll administrators access the bank payment setup without workarounds.
Original PR description
A recent change in the parent view made the HSBC setting invisible in most cases. We update the view to add it under HK localization and make sure it is visible.
The AI helpdesk help page now uses the correct main page heading. This improves accessibility for screen reader users and helps search engines better understand the page content.
Original PR description
Problem: On every page, we should have one and only one \<h1>. On /help, the title is set as a heading 2. Having one h1 establishes a clear document hierarchy, allowing search engine crawlers to understand your primary topic and ensuring screen readers can accurately navigate the content. Solution: Change the title's heading of the AI helpdesk page Task-6284703
Code cleanup and technical improvements
Odoo Studio’s form editor now uses the current rendering approach so selected fields and labels are decorated at the right moment. This keeps sidebar updates and drag-and-drop editing behavior reliable while removing an outdated compatibility method.
Original PR description
Replaced `useLayoutEffect` in `InnerGroupItemComponent` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single effect decorated label/field DOM elements with…
Replaced `useLayoutEffect` in `InnerGroupItemComponent` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single effect decorated label/field DOM elements with studio CSS classes immediately after each render. A reactive `useEffect` (OWL3's signal-based scheduler) re-runs asynchronously, so `studio_view.updateActiveNode` — which reads `.o-web-studio-editor--element-clickable` via `el.closest()` right after the view re-renders — found the label without the class, and the `o-web-studio-editor--element-clicked` decoration was never applied. `onMounted` + `onPatched` run synchronously within the patch commit, matching the timing the compat `useLayoutEffect` provided (which is itself implemented via `onMounted`/`onPatched`). `labelRef` and `fieldRef` were converted from OWL2 compat `useRef` wrappers to plain `signal(null)` class fields so the template uses `t-ref="this.labelRef"` / `t-ref="this.fieldRef"` and the refs are read with `this.labelRef()` / `this.fieldRef()` inside `applyStudioClasses`. The unrelated `rootRef` in `OuterGroup`/`InnerGroup` is kept as `useRef` since those classes have not been migrated. 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: - @web_studio/view_editors/form_editor/move a field in form - @web_studio/view_editors/form_editor/correctly display hook below group title - @web_studio/view_editors/interactive_editor_sidebar/update sidebar after edition see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2602198/build/115250548
The VoIP test environment now handles country data requests the same way the live application does. This prevents unnecessary warnings and missing mock responses during softphone testing, making automated tests more reliable without changing user-facing behavior.
Original PR description
The mock server now dispatches /mail/store requests through a store handler registry, mirroring the python controllers. Register voip's res.country store handler in the mock so it matches voip/controllers/webclient.py; otherwise the registry warns (and serves nothing) every time the softphone fetches res.country during tests. https://github.com/odoo/odoo/pull/273720
This update modernizes internal test setup across several enterprise apps to match the newer application-based testing approach. It helps keep automated tests aligned with the current platform architecture without changing end-user functionality.
Original PR description
* documents,iot,obox,pos_enterprise,room,spreadsheet_edition,timer, web_grid,web_studio This commit replaces every occurence of `makeMockEnv` by `makeTestApp`. An app is the minimum test unit since owl3 compared to owl2 where it was the env. The commit also changes a little bit some helpers the multi tab tests (bus, imlivechat, mail) to depend less on the env and more on the helpers.
The spreadsheet-related apps were updated to support Odoo's newer interface framework. This is an internal modernization that helps keep document spreadsheets and spreadsheet dialogs reliable as the platform evolves.
Original PR description
* = [spreadsheet_edition] As part of the migration from `owl 2` to `owl 3`, this commit replaces uses of `t-custom-model` with `t-model` or `t-model.proxy`.
The VoIP softphone was updated to use newer platform mechanisms while preserving the same user experience. This helps ensure the softphone opens correctly, keeps the right tab selected, and focuses the search bar when users reopen it.
Original PR description
Replaced `useLayoutEffect` with `onWillRender` + `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` was tried first but its microtask-deferred re-runs are…
Replaced `useLayoutEffect` with `onWillRender` + `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` was tried first but its microtask-deferred re-runs are decoupled from the render/patch cycle. On softphone reopen (hide → systray click), the batched re-run arrived after the click already set `isDisplayed = true`, so the effect read the already-true flag and called `hide()` a second time — leaving the softphone closed and the search-bar input unfocused. The fix reproduces the original render-coupled timing with three native hooks: `onWillRender` subscribes the component to the reactive proxy so state changes trigger re-renders; `onMounted` applies the initial show/hide/promote logic; `onPatched` applies it on every subsequent render — matching the behaviour of the original `useLayoutEffect` exactly. 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: - @voip/softphone/softphone/Opening the softphone selects the Recent tab. - @voip/softphone/softphone/Search bar is focused after reopen the softphone. - @voip/softphone/activity_tab/Call activities are displayed in the "Activities" tab. see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596849/build/114857981
The payroll resource logic was simplified by replacing an older helper with direct working-period checks. This is an internal cleanup that should make future maintenance easier without changing day-to-day payroll behavior.
The Knowledge app was updated to keep its editor commands working correctly after a framework change. This preserves expected Knowledge and Helpdesk interactions, such as using articles, files, and templates, while reducing reliance on deprecated code.
Original PR description
Replaced `useLayoutEffect` in `FormControllerPatch.setup()` with `onMounted`/`onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` ran post-mount, after the chatter had…
Replaced `useLayoutEffect` in `FormControllerPatch.setup()` with `onMounted`/`onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` ran post-mount, after the chatter had registered its `__knowledgeUpdateCommandsRecordInfo__` callback. `useEffect` ran during `setup`, before the chatter was ready, so chatter access rights were never recorded. `onMounted`/`onPatched` with a `lastResId` guard restores the original post-mount timing and only re-evaluates on record navigation. The `useLayoutEffect` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out, and are now passing: - TestKnowledgeEditorCommands.test_knowledge_article_commands_tour - TestHelpdeskKnowledgeCrossModuleFeatures.test_helpdesk_pick_file_as_attachment_from_knowledge - TestHelpdeskKnowledgeCrossModuleFeatures.test_helpdesk_pick_template_as_description_from_knowledge see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2604778/build/115379873
Several accounting-related screens were updated to use the newer interface framework required by the Owl 3 migration. This is an internal modernization that helps keep bank reconciliation, import guidance, and reporting views compatible and maintainable without changing business workflows.
Original PR description
*account_reports As part of the Owl 3 migration, replace deprecated onWillRender hooks with the appropriate Owl 3 alternatives.
The report editor was updated to use newer supported framework behavior, keeping breadcrumb updates working as before. This reduces technical debt and helps ensure the feature remains compatible with upcoming platform changes without changing the user experience.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `useEffect` because `useLayoutEffect` is deprecated in OWL3. The original effect had an empty dep array (run-once). Its body did two things: (1) pushed the crumb onto the editor breadcrumbs — a one-time side-effect that maps to `onMounted`, matching how `useEditorBreadcrumbs` pushes its own `initialCrumb`; (2) started a reactive `effect()` keeping `crumb.name` in sync with `rem.reportData?.name`, returning the dispose fn as cleanup — this was replaced by `useEffect`, which auto-tracks the reactive read and is auto-disposed on unmount. The use layoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - TestReportEditorUIUnit.test_basic_report_edition - TestReportEditorUIUnit.test_basic_report_edition_discard - TestReportEditorUIUnit.test_xml_and_form_diff see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624594/build/116553758
This update replaces an outdated internal mechanism in the grid view with the newer supported approach. It helps keep the grid reliable and ready for the next version of the underlying interface framework, without changing how users work with it.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single tracked dependency was `component.props.reactive.cell` — a reactive property…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single tracked dependency was `component.props.reactive.cell` — a reactive property holding the cell's HTMLElement (or null). The effect body wrote `component.state.cell` and immediately re-read it (via `state.cell.row.isSection` and `component.isEditable()`). A native OWL3 `useEffect` subscription was tried first but failed: the signal effect runs eagerly during `setup()`, before mount, so `rootRef.el` is null on the first run when `props.reactive.cell` is truthy, crashing with `Cannot read properties of null (reading 'style')`. Since the component already re-renders whenever `reactive.cell` changes (the overlay root is `<div t-if="props.reactive.cell">`), plain `onMounted` + `onPatched` running the same body is sufficient: `rootRef.el` is guaranteed present whenever `cellEl` is truthy, no `untrack` is needed, and the lifecycle callbacks reproduce the original post-render timing exactly. The use of `useLayoutEffect` refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - @web_grid/grid_view/grid_view_desktop/editing a value - @web_grid/grid_cells/float_toggle_grid_cell/FloatToggleGridCell: click to focus - @web_grid/grid_view/grid_view_desktop/Edition navigate with tab/shift+tab and enter key see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624597/build/116553714
This updates the Sign app’s internal upload handling to stay compatible with the next version of Odoo’s web framework. Drag-and-drop document uploads keep working as before, with tests confirming the behavior.
Original PR description
Replaced `useLayoutEffect` with `onMounted`/`onWillUnmount` because `useLayoutEffect` is deprecated in OWL3. `useListener` was considered first but cannot be used here: `.o_content` is an ancestor element owned by the layout component, not by `DocumentUploadMixin` itself, so there is no reactive signal or ref to give it. `onMounted` resolves `.o_content` once the component is in the DOM (guaranteed present), stores it, and attaches the three drag event listeners (dragover, dragleave, drop); `onWillUnmount` removes them — exactly reproducing the original post-mount timing and cleanup semantics. 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: - @sign/sign_kanban/Drop to upload file in kanban see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596830/build/114857573