Tuesday, September 1, 2026
69 changes · master
Enhancements to existing features
A new automated test verifies that image previews refresh correctly after a user uploads a new image. This helps protect the image upload experience from future regressions in Odoo's web interface.
Original PR description
Purpose ======= Add a test that check that the preview of the `ImageField` is updated after uploading a file when the option `preview_image` is used. Task-6509975
Shift template suggestions now include generic templates even when a shift has a specific project or worksheet. This makes reusable templates easier to find and keeps scheduling behavior consistent with role-based template suggestions.
Original PR description
*_ = planning_field_service_worksheet - When a shift has a project or a worksheet, only templates matching that exact value were suggested. Roles already also include templates with an empty value. - Do the same for project and worksheet so generic templates remain available. task-6364228 Forward-Port-Of: odoo/enterprise#129004
This update refreshes demo data for purchasing, stock-related purchasing, and online store stock scenarios. It helps business users and evaluators see more representative examples when testing or demonstrating these Odoo apps.
Original PR description
Task: 6486305 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update refreshes and expands demo content across purchasing, inventory barcode, manufacturing work orders, and quality control. It helps teams evaluate these workflows with more realistic sample data and clearer barcode examples, making demos and training easier.
Original PR description
Task: 6486305
Users can now delete removable circular nodes, such as Hang Up, directly from the VoIP flow editor with the mouse. The delete option also stays visible when focused, improving keyboard accessibility while keeping protected nodes like Start unchanged.
Original PR description
Circular flow nodes did not display the delete button available on rectangular nodes. As a result, Hang Up nodes could not be removed directly with the mouse. Display the delete button when hovering a removable circular node and keep it visible when focused for keyboard accessibility. Non-removable nodes, such as Start, remain unaffected.
The project to-do screens have been tidied up to make searching and list browsing clearer. This should help users find and review their to-do items with less visual clutter and a smoother day-to-day experience.
Original PR description
task-6516822
The Timesheets section on project tasks now places the option to add a new line at the top of the list. This makes entering timesheet records quicker and more visible for users working on task details.
Original PR description
Recently, the framework merged a task allowing to configure the position of the "Add a line" in the list view. We build on this to change the position of the "Add a line" button to the top of the "Timesheets" notebook of Project tasks. task-6499912
Helpdesk users can now add a new timesheet line from the top of the Timesheets section on a ticket. This small usability improvement makes time entry easier to find and faster to use when working on support tickets.
Original PR description
Recently, the framework merged a task allowing to configure the position of the "Add a line" in the list view. We build on this to change the position of the "Add a line" button to the top of the "Timesheets" notebook of Helpdesk tickets. task-6499912
Date pickers can now show the day of the week alongside dates when enabled. This helps users quickly understand what weekday a selected date falls on, which is especially useful for appointment booking and scheduling flows.
Original PR description
It is sometimes relevant when showing the date to also quickly let the user know what day of the week it corresponds to. task-5072614
The Indian payroll contract template now hides the Tax Deductions section when Professional Tax is not enabled. This keeps payroll settings screens cleaner and prevents users from seeing empty or irrelevant sections.
Original PR description
Prior to this commit, the "Tax Deductions" group caption on the contract template view remained visible even when Professional Tax (PT) was not enabled in the Payroll settings. This commit updates the visibility condition of the "Tax Deductions" group on the contract template view to be hidden when PT is disabled (`not l10n_in_pt`), preventing empty settings sections from displaying to users. Task: 6514274 Forward-Port-Of: odoo/enterprise#129836 Forward-Port-Of: odoo/enterprise#129703
Mobile users searching for projects will now consistently see the simpler project card designed for selection dialogs. This avoids occasionally showing the fuller Projects app card in the wrong place, making project selection clearer without changing the main Projects screens.
Original PR description
The many2one "Search More" dialog on mobile requests a kanban view for `project.project` without an explicit `view_id`, falling back to whichever primary kanban view resolves first. This accidentally depended on record id ordering, sometimes serving the rich Projects app card instead of the minimal one meant for this case. This commit sets an explicit lower priority on `project_view_kanban` so it is deterministically chosen for this fallback, leaving the Projects app and Configuration > Projects menus (which pin their own view_id) untouched. task-6131412
Frontdesk automated checks were updated to match the newer visitor creation process, where notifications are sent as soon as a visitor is created. This helps ensure the visitor reception experience and related SMS notification behavior continue to work reliably.
Original PR description
Update frontdesk tests to follow the new visitor creation flow, where notifications are triggered when creating a visitor. Task-6388574
Job listings now only allow working schedules that match the job's company. This helps keep recruitment records consistent and reduces the risk of publishing or managing jobs with invalid schedule settings.
Original PR description
In order to maintain proper job listings and make sure all working schedules are valid, working schedule domain is now depeding on the job listing company. Task: 6408914 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#285407 Forward-Port-Of: odoo/odoo#282993
Job listings now only allow working schedules that are valid for the company linked to the job. This helps keep recruitment postings consistent and reduces the risk of choosing an incompatible schedule.
Original PR description
In order to maintain proper job listings and make sure all working schedules are valid, working schedule domain is now depeding on the job listing company. Task: 6408914 Forward-Port-Of: odoo/enterprise#129748 Forward-Port-Of: odoo/enterprise#128241
Several apps were updated to stay aligned with recent attachment handling changes in Odoo. This keeps opening and deleting attachments working consistently in areas such as Approvals, Documents, Recruitment, Spreadsheets, and Social Marketing.
Original PR description
Community `mail` reshaped AttachmentList's click handlers to the uniform `(ev, { attachment })` object form. These modules patch `AttachmentList.onClickAttachment` / `onConfirmUnlink`, so their overrides adopt the same signature and forward via `super(...arguments)` to keep matching the base.
https://github.com/odoo/odoo/pull/273646This update improves how several mail and calendar interface elements react to changes, especially in chatter, scheduled messages, attachments, polls, previews, and chat bubbles. It should make these areas more efficient and reliable by avoiding unnecessary refreshes and ensuring actions apply to the item the user actually selected.
Original PR description
Continue reading props as signals (`this.x()`) across more mail components via `propComputed`/`propSignal`: the chatter scheduled message and follower list, polls, link previews, the chat bubble and…
Continue reading props as signals (`this.x()`) across more mail components via `propComputed`/`propSignal`: the chatter scheduled message and follower list, polls, link previews, the chat bubble and the small leaf components (country flag, date section, priority, message link preview list).
A callback handed to a slotless list child is made `props.static` and bound once in the caller: a fresh closure every render makes the prop compare unequal and forces every item to re-render, whereas a stable reference lets unchanged items skip it. Done for `AttachmentList.unlinkAttachment` and
`ScheduledMessage.onScheduledMessageChanged`.
`ChatBubblePreview.chatWindow` is chained down as a `propSignal`: the parent already holds the value as a signal and now passes the signal itself, so the preview reacts to it directly.
Click handlers take the record they act on as a parameter, captured at render right before the handler (a scoped `recordAtRender` local) and passed as `(ev, { recordAtRender })`. A signal read inside a handler resolves at call time, so if the value changed since the render the user saw, the handler would act on a record different from the one displayed; the captured record keeps the action tied to what was clicked. A callback that runs later, such as a dialog confirmation, receives the same captured record instead of re-reading the signal.
A callback prop type shared between a child and the parents that pass it is defined once as an exported `(store) => t.function(...)` factory and reused rather than duplicated at each declaration.
https://github.com/odoo/enterprise/pull/122615The Belgian payroll module description now directs users to the official documentation for Dimona. This helps users find the most accurate guidance without changing payroll features or workflows.
Original PR description
Change the module description to refer to the official documentation. Task-6485101
Resolved issues and error corrections
Mobile invoice line cards now display the line description when no product is selected. This prevents blank cards and makes invoices easier to review on mobile devices.
Original PR description
Invoice lines can be created without a product. However, the mobile kanban view does not handle such lines properly and displays an empty card without a name or image. This commit adapts mobile kanban view to show invoice line's name when `product_id` is not set. Before | After -- | -- <img width="469" height="277" alt="image" src="https://github.com/user-attachments/assets/3b367581-b73d-4b12-a487-1a54c3b88470" /> | <img width="406" height="300" alt="image" src="https://github.com/user-attachments/assets/107d7294-90e8-49c6-826a-9be75c6b799f" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285608 Forward-Port-Of: odoo/odoo#284755
Features or functions removed from Odoo
This change removes obsolete project portal rating code that has not been used since the related website template was removed years ago. It reduces maintenance overhead without changing the visible project portal experience for users.
Original PR description
The `ProjectRatingImage` interaction targets `.o_portal_project_rating .o_rating_image`, but nothing renders those classes anymore: the only template setting them,…
The `ProjectRatingImage` interaction targets `.o_portal_project_rating .o_rating_image`, but nothing renders those classes anymore: the only template setting them, `website_project/views/project_rating_templates.xml`, was dropped in 14.0 by a256602915cc ([REM] website_project). The widget survived that removal because it lived in `project`, and it was even later converted to an Interaction by 22e777c04652, without anyone noticing it had already been dead for four years. Remove the interaction, the now empty `interactions/*` assets entry and the `.o_portal_project_rating` styles, whose inner classes came from that same deleted template and are unused as well. `.o_status` is kept as it is still needed on the frontend by `project_portal_project_task_templates.xml`, and the only other definition of it lives in `web/static/src/views/view.scss`, which is not part of `web.assets_frontend`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Code cleanup and technical improvements
This internal cleanup simplifies how several chat and messaging values are calculated, keeping the same behavior while reducing unnecessary processing steps. Users should not see functional changes, but the affected mail and live chat areas become easier to maintain and potentially more efficient.
Original PR description
Before this commit, eighteen fields derive their value from a compute option: the model runs it, stores the result in the field and settles it at the end of the update cycle. None of them is written from outside, observed through an onUpdate hook or patched by an addon, so the field exists only to hold what the compute returns. This commit declares them with this.computed(), which keeps the value in an owl computed of its own: same laziness, same memoisation, without a field and an update cycle around it. Two of them do explicitly what their field type did for them: editedDate deserializes the datetime it reads from the message body, and offline_since spreads the user dates into DateTime.max, which the compute handed an array.
The QFPay point-of-sale refund flow now waits for the order process to complete before starting a refund, preventing incorrect refund links and related test failures. This helps keep payment refund checks stable and avoids errors in automated validation environments.
Original PR description
Due to the tour not waiting to click next order on the feedback screen, the refund was initiated too early causing the refunded line to not link properly. This resulted in multiple runbot errors depending on the installed modules. This commit fixes both the traceback by adding a conditional access, and the tour logic by adding a `clickNextOrder` step. runbot-939616, runbot-237992 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285887
The web test system now stops immediately when required test dependencies cannot be fetched, instead of waiting until a long timeout. This makes build failures clearer and faster to diagnose, reducing wasted CI time and improving reliability for development teams.
Original PR description
Before this commit, a unit test suite could go silent between two test files, and `browser_js` then waited out its whole timeout before failing with: [ERROR] TypeError: Failed to fetch at orm…
Before this commit, a unit test suite could go silent between two test files, and `browser_js` then waited out its whole timeout before failing with:
[ERROR] TypeError: Failed to fetch
at orm (web.assets_unit_tests.min.js)
FAIL: WebSuite.test_unit_desktop
AssertionError: Script timeout exceeded
This happens because `fetchDependencies` gives every addon a `Deferred` that only the success handler of the batched `all_dependencies` call resolves, and a loaded runbot host answers that call with `RuntimeError: can't start new thread`. Nothing then settles those deferreds, so the `Promise.all` waiting on them never returns, `stop()` is never called, and the browser holds the build until the timeout.
This commit rejects the deferreds of a failed batch and reports an error escaping `runTests` on the console, so the build fails on the fetch error instead of running out its timeout.
https://runbot.odoo.com/odoo/error/243504
Forward-Port-Of: odoo/odoo#285834
Forward-Port-Of: odoo/odoo#284980This fix prevents installation errors when the Ecuador electronic invoicing module is installed without optional automatic dependencies. It also keeps withholding pages displaying correctly by hiding an irrelevant paid badge only when that badge is present.
Original PR description
When installing l10n_ec_edi with --skip-auto-install we receive an error on Runbot. Anchored on the sidebar title (always present on account.portal_invoice_page) rather than div[name='invoice_paid_badge'], which only exists when account_payment (not a dependency of this module) is installed and inherits this view to add it. Hides the account_payment "Paid" badge, if present, without requiring it to exist. runbot-237864 Forward-Port-Of: odoo/enterprise#129291 Forward-Port-Of: odoo/enterprise#126918
The self-order kiosk confirmation page now correctly shows the company logo after an order is placed. This improves brand visibility and makes the final order confirmation screen look complete and professional for customers.
Original PR description
Steps to reproduce: -- - Open the kiosk. - Place an order and go to the confirmation page. Issue: -- - The company logo is not displayed on the confirmation page. Fix: -- - Use the logo content to correctly set the company logo image source. task-6511327 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The point of sale invoice search test now waits for order syncing to finish before closing the session. This reduces occasional automated test failures and helps keep development validation more reliable without changing customer-facing behavior.
Original PR description
In the tour `TestUi.test_order_invoice_search`, the POS was closed without waiting for the order syncing to finish, causing an occasional failure. This commit fixes the issue by explicitly waiting for orders to sync before closing the POS. runbot-946625 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates spreadsheet and dashboard interface elements to match the newer Frost visual style. It also corrects a search bar display issue so the bar keeps a properly rounded end when no search menu is available, improving visual consistency for users creating spreadsheets from Documents.
Original PR description
- removed the rounded borders of the spreadsheet component - adapted the icons to the `<div class="o-icon><i class="oi"/></div>` structure to match o-spreadsheet expected rules Task-6511787 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
Spreadsheet dialogs and selectors now display with more consistent rounded borders, cleaner search bars, and top navigation styling aligned with the rest of the interface. This fixes visual layout issues after recent design updates, making spreadsheet creation and selection feel more polished and easier to use.
Original PR description
- merge the topbar menu style with the navbar - fix spreadsheet dialogs searchbars - align spreadsheet selector design with kanban standards (rounded borders) Task-6511787
Uploading a product image now refreshes the preview right away instead of continuing to show the previous image until the record is saved. This helps users confirm they selected the correct image without an extra save step.
Original PR description
Bug === 1. Open the product form view 2. Upload an image -> You need to save to see the preview of the new image Technical ========= Before 23a7d8cc5b1d2f38eaee35a4f6729fe128c1b62b, it used `this.props.record.data[this.props.name]` in `getUrl` (so `image_1920`) and not `this.props.record.data[<preview_image>]` (`image_128`). When we upload a new image, we write on `image_1920`, but `image_128.content` is missing, and so it fallback to the old image. Task-6509975
This change corrects an internal reference used when uninstalling the fleet stock integration. It prevents a build or uninstall error caused by an outdated module name, helping keep system maintenance reliable.
Original PR description
A reference to the `stock_picking_batch_action` was not updated in [^1] and still referred to `stock_picking_batch` instead of `stock`. runbot-build-error: [946649](https://runbot.odoo.com/odoo/runbot.build.error/946649) [^1]: https://github.com/odoo/enterprise/pull/128175
The data cleaning tool now correctly recognizes the database index details it relies on when checking linked records. This prevents missed references during merge or cleanup operations after a related platform change.
Original PR description
`ir.model.fields.index` now stores the exact index type instead of a boolean. Match B-tree index types when looking for indexed references. task-6507120 Related: https://github.com/odoo/odoo/pull/284668
The Point of Sale dashboard now keeps sales graphs aligned at the bottom of each card, even when cards show different amounts of information. This makes the dashboard easier to scan and gives users a cleaner, more consistent view.
Original PR description
In the POS config dashboard kanban view, cards could display a variable number of data lines (e.g. session dates, opening, sold, ongoing amounts, or closing date). Because the graph was placed right below the text content without vertical pushing, graphs across cards in the same row ended up vertically misaligned. Fix this by adding `d-flex flex-column` to the card template and `mt-auto` to the graph container wrapper so that graphs are always pushed to the bottom of the card, ensuring consistent alignment regardless of the number of displayed lines. task-id: 6424698 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#279040
Asset disposals with no depreciation no longer create unnecessary zero-value accounting lines. This keeps accounting entries cleaner and improves the accuracy of depreciation values by calculating them directly instead of relying on line order.
Original PR description
Purpose: When we try to dispose of an asset with 0 depreciation, we get a move line with 0 balance, this line is supposed to debit depreciated amount till date on asset depreciation account which in our case is 0. And line with 0 balance seems like a noise in accounting. Fix:- - When creating disposal move, create lines with either +ve or -ve balance and skip lines with 0 balance. - Computation of `depreciation_value` on `account.move` assumed that `move.line_ids[1]` will be always depreciated amount. Which is guess work and break if at that index there is some other line. So instead of guessing calculate here depreciation amount with the same logic as disposal move.
The shared time selection control has been moved into the main HR module so it is available even when Time Off is not installed. This prevents warning messages in HR Attendance tests and improves reliability across HR applications.
Original PR description
Using widget="float_time_selection" in hr_attendance triggered a missing widget warning during view tests when hr_holidays was not installed, as the widget was defined in hr_holidays. This move the float_time_selection component to the hr module so the widget is available across all HR applications. Task-6523568 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes automated tests for the HTML editor so they no longer depend on visual design settings that can vary between editions or themes. It helps keep quality checks stable while preserving the intended color contrast behavior for users.
Original PR description
The ContrastPlugin adjusts the colors of the content against the background the editable is drawn on, which it reads from a CSS variable whose value is a design decision: it differs between community and enterprise, as well as between light and dark mode. The tests asserting the exact adjusted colors pin that variable so as not to assert on the design of the assets they happen to run with, but they were still pinning its former name, which the follow-up below renamed to `--o-html-editor-background-contrast`. Pin the current name, on the white background the expected colors were computed against. This is the follow-up of: https://github.com/odoo/odoo/pull/285000 https://github.com/odoo/odoo/pull/285285 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
A Point of Sale automated test was corrected so it no longer tries to install the Restaurant feature unnecessarily. This prevents avoidable test failures and helps keep development validation reliable without changing customer-facing behavior.
Original PR description
`TestPosOrderReceipt.test_split_per_product_preserves_combo_children`: This test sets `module_pos_restaurant` to `True`, which causes the `pos_restaurant` module to start installing, leading to this error: ``` RuntimeError: Module operations inside tests are not transactional and thus forbidden. If you really need to perform module operations to test a specific behavior, it is best to write it as a standalone script, and ask the runbot/metastorm team for help. ``` The test does not in fact rely on any `pos_restaurant` behaviour, so the line can simply be removed. runbot-946164 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Responses to invoices received through France's PDP are now sent through only the PDP channel instead of both PDP and classic Peppol. This avoids duplicate messages and keeps invoice communication threads cleaner for users.
Original PR description
When responding to an invoice received through PDP, 2 responses were actually sent: one through PDP and the other through the 'classic' Peppol. This was done to allow more reliability, in case one channel is down when trying to respond, but this mainly creates cluttah' in the chattah' (call me busta rhymes yo) task-6522652 Forward-Port-Of: odoo/odoo#285596
Fixed an issue where reprinting a preparation receipt from the preparation display could fail with an error. This ensures staff can reliably reprint kitchen or preparation receipts when needed, avoiding interruptions during service.
Original PR description
Reprinting a preparation receipt from the preparation display was showing a traceback because the preparation template wasn't correctly loaded. task-6522158
The website now sends a visitor's saved cookie consent choice to Google before loading analytics settings on each page. This prevents tracking gaps between page views while continuing to respect visitors who declined cookies.
Original PR description
With Google Consent Mode V2, we have to set a default consent state, then update it according to the user's choice. While our setup worked fine with new users interacting with the cookies bar, on subsequent pages it would update the consents after pinging Google first. This meant that, from Google's point of view, there was a gap for a single user when switching pages. By updating it before setting the config, we make sure that Google handles the analytics as expected, without any hole, while keeping it safe for users who refuse the cookies. task-6471290
This fix prevents slow mobile-style taps in Odoo's web test tools from being incorrectly treated as long presses. It reduces random test failures, helping teams get more dependable build results and avoid false alarms during quality checks.
Original PR description
Before this commit, MobileWebSuite.test_unit_mobile failed at random on the mail test "HtmlMail add icon and save inline html", which taps the save button of an html_mail field and waits for the…
Before this commit, MobileWebSuite.test_unit_mobile failed at random on the mail test "HtmlMail add icon and save inline html", which taps the save button of an html_mail field and waits for the write:
[verifySteps] expected the following steps
> Expected: [
"web_save",
]
> Received: []
This happens because a tap held longer than `LONG_TAP_DELAY` counts as a long press, and `_pointerUp` then dispatches no click at all. That delay spans the synthetic pointerdown and pointerup of a single `click()`, so the work a listener does during the press counts towards that delay: tapping save blurs the html field, which converts the whole editor content to inline styles, and under the load of a runbot build that conversion alone takes longer than the delay.
One solution could have been to raise `LONG_TAP_DELAY`, but a listener slower than the new value suppresses the click again.
This commit counts a tap as long only when the test releases the pointer itself, with `pointerUp`, so the work a listener does during a `click()` no longer suppresses the click.
https://runbot.odoo.com/odoo/error/946581
Forward-Port-Of: odoo/odoo#285640
Forward-Port-Of: odoo/odoo#284971Users can now click links in read-only website content to open the link popover and inspect where the link goes. This fixes a case where non-editable article links appeared inactive, improving clarity without changing the content itself.
Original PR description
Problem: Clicking a non-editable link does nothing, making it impossible to open or inspect the link. Solution: Allow the link popover to open in read-only mode for non-editable links. Steps to reproduce: - Run `/article`. - Click on the inserted article link. - Observe that nothing happens. opw-6442026 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285445 Forward-Port-Of: odoo/odoo#280224
This fix prevents the HTML editor from accidentally deleting visible items that do not contain text, such as icons or images. It helps ensure saved website or document content keeps its intended visual elements.
Original PR description
#### Description of the issue this PR addresses: - Empty inline elements were detected using only their text content, causing visible non-text content (e.g. icons, images) to be removed. #### Desired behavior after PR is merged: - Remove the empty inline attribute when an inline element contains visible content by using `isVisible`. - Use `isVisible` to detect visible content instead of relying on text content. task-6391496 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#276587
Belgian payroll test demo employee records have been cleaned up so they no longer create unnecessary empty versions. Employee identifiers, schedules, tags, wages, and worker codes now align with the stated demo records, making payroll test data more reliable.
Original PR description
Every employee record was also creating an empty version dated 2023-01-01, because hr.employee delegates to hr.version. Employees now carry their own first version, so those extra ones are gone. Fields the ORM was throwing away are removed, the NISS numbers are rebuilt from each birthday and sex, and the schedules, tags, wages and worker codes now match what the records claim. task-6519088
Users will now see a newly selected image right away when editing image fields with previews. This removes confusion where the old image stayed visible until the record was saved.
Original PR description
**Description of the issue/feature this PR addresses:** The uploaded image is not displayed immediately when using the `preview_image` option. **Current behavior before this PR:** The widget checks the preview field (e.g. `image_128`), which remains stale until the record is saved. As a result, the newly uploaded image is only displayed after saving. **Desired behavior after this PR is merged:** The widget checks the edited field itself instead of the preview field, allowing the newly uploaded image to be displayed immediately. **Related PR**: https://github.com/odoo/odoo/pull/266082
The search bar filter labels now display their icons at a consistent height and with cleaner rounded styling. This small visual fix makes the interface look more polished and easier to scan without changing functionality.
Original PR description
Before this commit, the facet label never centered its children, so each icon compensated on its own (`align-middle`, `align-content-around`, `ms-1 mt-1`) and the three landed at different heights. The swap_vert overlay also had no radius, drawing a square over the rounded label. This commit centers each icon from its own container and rounds the swap_vert overlay. It also drops the pencil overlay's transparent border and `pe-2`, which only pushed it down and off-center, and an unreachable `!facet.icon` branch on the swap_vert span. requires: https://github.com/odoo/enterprise/pull/129724 task-6518046 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Indian localization now hides the generic Self Billing option in journal settings. This prevents users from enabling conflicting invoicing options and helps keep the Indian Self Invoice process compliant with GST requirements.
Original PR description
With this commit:- The generic Self Billing option is hidden from the journal configuration for Indian localization, preventing users from enabling both Self Invoice and Self Billing, and ensuring the Indian Self Invoice flow and output remain compliant with the GST requirements. Related [Self Invoice PR](https://github.com/odoo/odoo/pull/269434) task-6505237
This fixes an automated mail test so messages containing emoji shortcuts are posted reliably. The change prevents the emoji suggestion popup from blocking the test action, reducing false failures in quality checks without changing user-facing behavior.
Original PR description
Before this commit, "[text composer] Posting message should transform relevant data to emoji." posted no message on runbot:
Failed to find 1 of ".o-mail-Message-body:text('test ...')"
(Timeout of 10 seconds). Found 0 instead.
This happens because "test :P :laughing:" leaves the emoji suggestion of the shortcode it just typed pending, and Composer.onKeydown returns without posting when the NavigableList takes the Enter. The fetch behind that suggestion is debounced by 250ms, so the test posts only while the debounce has not fired.
This comes from "[IMP] web,*: emoji loader": the search reads the emoji data the mail test helpers preload, so the list has an entry to offer where it had none.
This commit types a trailing space, which closes the suggestion and leaves the Enter to post.
https://runbot.odoo.com/odoo/error/946650
Forward-Port-Of: odoo/odoo#285616Event agenda pages with many items now scroll horizontally more smoothly in Firefox and Safari. This reduces shaking or stuttering when visitors browse busy event schedules, improving the attendee browsing experience.
Original PR description
On Firefox and Safari, horizontal scrolling on an agenda with many items stuttered. This was likely caused by triggering too many scroll events, without throttling them. Steps to reproduce: - On Firefox or Safari, run with demo data - Go to the "Design Fair Los Angeles" agenda (click on the event > Talks > Agenda. Alternatively, enter the URL directly: `/event/ID/agenda`, with the right event ID) - Resize the page (or open the dev tools) so that there is a horizontal scrollbar. - Scroll horizontally with a trackpad or with shift + mouse wheel. => The agenda stutters/shakes: as you go to the right, it sometimes slightly goes back left, and vice-versa. You might have to scroll from left to right and right to left a few times to see the issue. Forward-Port-Of: odoo/odoo#285237
Manufacturing bills of materials now prevent configurable combo products from being selected as components. This avoids using sales bundle items where physical manufacturing parts are expected, reducing setup errors in production planning.
Original PR description
Version: --------- - 19.0+ Steps to reproduce: ------------------- - Install `mrp` and `sale_management` - Create a product of type `combo` - Go to Manufacturing > Products > Bills of Materials - Create or edit a BoM - Add a component line - Select the combo product Issue: ------ Combo products can be selected as BoM components. Since combo products represent configurable sales bundles rather than physical products, they are not meaningful manufacturing components. Before Commit: ------------------- - It was possible to select a product of type 'combo' as a component in a Bill of Materials. After Commit: ----------------- - Combo products are filtered out of the component picker and cannot be added as BoM components --- opw-6425024 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278861
Secondary badges are now easier to read in both light and dark display modes. This improves clarity for users by ensuring badge labels stand out consistently across the interface.
Original PR description
Before this PR:- ========================== Secondary badges are barely visible in light and dark modes. <img width="500" height="200" alt="image" src="https://github.com/user-attachments/assets/552dd924-4ab4-4fd5-b0fe-b103697a0bb9" /> <img width="500" height="200" alt="image" src="https://github.com/user-attachments/assets/a199ad73-bd94-42dd-aa46-1fc7fb2f9436" /> After this PR:- ========================== Make the badge text and background clearly visible in both modes. <img width="1232" height="672" alt="image" src="https://github.com/user-attachments/assets/cbff2756-f2e4-42fa-97c6-669409fd4efb" /> Enterprise PR:- odoo/enterprise#129792
A mail testing helper now stops retrying after a timeout instead of continuing to report the same failure across later tests. This makes automated test results clearer and helps developers identify the real issue faster without misleading follow-on failures.
Original PR description
Before this commit, one test contains() reaching its 10 seconds budget made the 129 tests that ran after it fail with its own assertion, over 14 suites:
[HOOT] Test "@mail/message/link_preview/Delete all link previews at
once" failed:
Failed assertion:
3. [toBe] expected values to be strictly equal (Failed to find 1 of ".o-mail-Message-body:text(...)" (Timeout of 87 seconds). Found 0 instead.)
This happens because the tick re-schedules itself on the result of runOnce(), which is undefined on a failure, the crashing one included. The check keeps selecting every 500ms and logs its assertion against whichever test is running, until a tick lands between two suites and getFixture() throws.
This commit re-schedules a tick only while the check is not done, so the crashing one is the last.
https://runbot.odoo.com/odoo/error/946650
Forward-Port-Of: odoo/odoo#285585Mexican DIOT reports now show the remaining column headers in Spanish for Latin America instead of mixing Spanish and English. This makes the report easier and more consistent for Spanish-speaking users to read.
Original PR description
## Merge method squash --- ## Problem The DIOT report (`account_report_diot.xml`) uses inline `name@es_419` translations for Spanish (Latin America) column headers. However, the translations were…
## Merge method squash --- ## Problem The DIOT report (`account_report_diot.xml`) uses inline `name@es_419` translations for Spanish (Latin America) column headers. However, the translations were inconsistently applied: columns at 16% had them, while the equivalent 8% columns and several others were left without Spanish translations. **Columns missing `name@es_419` (before this fix):** | `id` | English name | Added es_419 | |---|---|---| | `diot_report_paid_8_n_wnc` | Paid 8 % Northern | Pagado al 8% Norte | | `diot_report_paid_8_n_r` | Refunds 8 % Northern | Devoluciones 8% Norte | | `diot_report_paid_8_s_wnc` | Paid 8 % Southern | Pagado al 8% Sur | | `diot_report_paid_8_s_r` | Refunds 8 % Southern | Devoluciones 8% Sur | | `diot_report_paid_16_r` | Refunds 16% | Devoluciones 16% | | `diot_report_paid_16_imp_r` | Refunds Importation 16% | Devoluciones Importación 16% | | `diot_report_paid_16_imp_int_wnc` | Intangible Imports 16% | Importaciones Intangibles 16% | | `diot_report_paid_16_imp_int_r` | Refunds Intangible Imports 16% | Devoluciones Importaciones Intangibles 16% | | `diot_report_paid_8_n` | Paid 8 % N. - Creditable | Pagado al 8% Norte - Acreditable | | `diot_report_paid_8_s` | Paid 8 % S. - Creditable | Pagado al 8% Sur - Acreditable | | `diot_report_paid_16` | Paid 16% - Creditable | Pagado al 16% - Acreditable | | `diot_report_paid_16_imp` | Importation 16% - Creditable | Importación 16% - Acreditable | | `diot_report_paid_16_imp_int` | Intangible Imports 16% - Creditable | Importaciones Intangibles 16% - Acreditable | | `diot_report_paid_8_n_nc` | Paid 8 % N. - Non-Creditable | Pagado al 8% Norte - No acreditable | | `diot_report_paid_8_s_nc` | Paid 8 % S. - Non-Creditable | Pagado al 8% Sur - No acreditable | | `diot_report_paid_16_imp_nc` | Importation 16% - Non-Creditable | Importación 16% - No acreditable | | `diot_report_paid_16_imp_int_nc` | Intangible Imports 16% - Non-Creditable | Importaciones Intangibles 16% - No acreditable | | `diot_report_exempt_imp` | Exempt Imports | Importaciones Exentas | | `diot_report_no_obj` | No Tax Object | No Objeto de Impuesto | ## Why this matters Mexican Odoo instances run with `es_419` locale. Without these inline translations, column headers in the DIOT report display in English for Mexican accountants, even though the equivalent 16% columns already had Spanish translations. This creates an inconsistent bilingual UI on the same report. ## Fix Adds `<field name="name@es_419">` entries to all column records that were missing them, following the same pattern already used by `diot_report_paid_16_wnc`, `diot_report_paid_16_nc`, `diot_report_withheld`, `diot_report_exempt`, and `diot_report_paid_0`. ## Files changed - `addons/l10n_mx/data/account_report_diot.xml`
Website popups are now fully hidden before a page is saved, preventing popup display settings from being saved incorrectly. This makes page editing more reliable when popups are present.
Original PR description
The method `hide` of Bootstrap's `Modal` internally calls `_hideModal` asynchronously. When saving the page, the builder must hide the popups of the page. Calling `hide` does not work well, as the changes done in `_hideModal` are done after the ave is finished. This commit replaces the call to `hide` in the "clean for save" implementation of popup visibility plugin with the internals of `hide` that inpact the content of the saved element (without the delay): - removing the class `show` - calling `_hideModal`
This fixes a pricing display issue where product variants could show fewer decimal places than the main product price in reports. Businesses using reports or Studio fields will now see consistent price formatting that respects the configured minimum precision.
Original PR description
Issue: --- Record's `min_display_digits` is not inherited in case of a model inheritance. e.g. `list_price` is inherited to `product.product` from `product.template`, however it renders with fewer decimals than `product.template.list_price` in reports. Steps to reproduce: 1- Set a product's Sales Price to 19.5. 2- Add `product.product.list_price` to a report using studio. The variant's field renders with 1 decimal while `decimal.precision` is 2. Cause: --- This is missed in ee32a17495a10af18f0b5de0a295283c5059d3c2 which introduces minimum precision. opw-6465159 Forward-Port-Of: odoo/odoo#285336 Forward-Port-Of: odoo/odoo#285064
Gantt charts using a weekly view now place tasks in the correct week based on the user's locale, such as weeks starting on Sunday. This prevents tasks from appearing in an extra or incorrect column and keeps planning views accurate for localized configurations.
Original PR description
In Gantt views, for a given focus date, the appropriate time interval is displayed by finding its start and end date, based on the scale. For example, if I focus on 18 may 2026 with a month scale,…
In Gantt views, for a given focus date, the appropriate time interval is displayed by finding its start and end date, based on the scale. For example, if I focus on 18 may 2026 with a month scale, then the whole month of may is displayed. The behaviour was as expected in standard code, because all localisations agree on the beginning of the available scales (day, month, year). In custom code, however, some customer requires to see the gantt charts with a weekly scale. The differences in start of the week based on the localisations and the inconsistencies of use of localStartOf breaks the view. For example, if the localization has the start of the week on a sunday, and a task on the first column starts on a sunday as well, it will get assigned to column before (because it considers sunday as the last day of the previous week). The column before the first column does not exist, so one empty column is created to put the task in it. This commit fixes these inconsistencies so that GanttRenderer behaves as expected with weekly scales, without changing the standard behaviour. Tests are written to check both that the task is assigned to the proper localized week (starting on Sunday) and column (1, not 0). Forward-Port-Of: odoo/enterprise#129408 Forward-Port-Of: odoo/enterprise#118625
The Kenya OSCU invoice form now hides the validation message area when there is no message to show. This removes an unnecessary blank space, making the form layout cleaner and easier to read.
Original PR description
When there is no validation message, an empty div causes a whitespace gap between the header and the sheet in the form view. This commit adds `invisible="not l10n_ke_validation_message"` to the div to prevent this issue. Forward-Port-Of: odoo/enterprise#129364 Forward-Port-Of: odoo/enterprise#129318
This update prevents an error when saving an employee payroll declaration before an employee has been selected. It makes the payroll reporting workflow more reliable by avoiding an unexpected crash in Belgian payroll individual accounts.
Original PR description
When creating an employee declaration without selecting an employee, a traceback occurs. Steps to reproduce the error: - Install ``l10n_be_hr_payroll`` module with demo data - Switch to Belgian…
When creating an employee declaration without selecting an employee, a traceback occurs. Steps to reproduce the error: - Install ``l10n_be_hr_payroll`` module with demo data - Switch to Belgian company - Go to Payroll > Reporting > Individual Accounts > Create a new Individual Account > Click on Eligible Employees > Create a new employee declaration without employee > Save Traceback: ```py ValueError: Expected singleton: hr.employee() ``` https://github.com/odoo/enterprise/blob/000544c3d5b93e194264e15bb73d9599525106e3/hr_payroll/models/hr_payroll_employee_declaration.py#L71 The ``_compute_version_id()`` method calls ``_get_version()``. When ``employee_id`` is empty, ``_get_version()`` is invoked on an empty ``hr.employee`` record, and its ``ensure_one()`` call raises the above traceback at [1]. [1]: https://github.com/odoo/odoo/blob/3c358ae2badad69b125695a97b4a14e8ab77fccd/addons/hr/models/hr_employee.py#L745-L750 Upgrade PR: https://github.com/odoo/upgrade/pull/11026 sentry-7625826444 Forward-Port-Of: odoo/enterprise#125175
The Indian payroll settings now validate EPF Employee IDs using the correct 15-character format. This helps payroll administrators enter compliant establishment identifiers and avoids accepting outdated or incorrect EPF values.
Original PR description
Steps to reproduce: - Install Indian localization, and use an Indian company - Go to Settings under Payroll > Indian Localization - Tick the "Employee Provident Fund (EPF)" - Insert a EPF Employee ID Issue: The "valid" format is not correct: XX/XXX/1234567/000/1234567 with the first series of 7 numbers having a flexible range from 1 to 7. The first series of 7 numbers must always equal to 7 (it represents the establishment ID), and the last series of number should be dropped as it represents the employee's unique PF account number. Solution: - Modify the constraint for the variable: - Remove last 7 trailing digits from the constraint. - Make the length of the first series of 7 digits strictly equal to 7. - Update placeholder value and help info. Task: 6482315 Forward-Port-Of: odoo/enterprise#128777 Forward-Port-Of: odoo/enterprise#128421
This fixes an issue where the online store could accidentally treat unrelated form fields as product option choices. The change helps ensure product selections behave correctly and avoids confusion during shopping.
Original PR description
The selector was matching unrelated inputs because it wasn't specific enough. Forward-Port-Of: odoo/odoo#283742 Forward-Port-Of: odoo/odoo#283464
This fix prevents an extra misleading error from appearing when web unit tests fail. It keeps the memory information in the logs but records it before the test result is finalized, making failed builds easier to diagnose.
Original PR description
Before this commit, a build whose unit tests suite fails collects a second runbot error on top of the real one: odoo.addons.web.tests.test_js.WebSuite.test_unit_desktop.browser: Error received after…
Before this commit, a build whose unit tests suite fails collects a second runbot error on top of the real one:
odoo.addons.web.tests.test_js.WebSuite.test_unit_desktop.browser:
Error received after termination: [MEMINFO] tests done (after GC)
- used: 220535896 - total: 341990868 - limit: 4395630592
Note that the figures themselves are fine (220MB used of a 4.4GB limit): the error is not about memory, only about when the line is logged.
This happens because the runner logs that line after `stop()`, and `stop()` is what reports the suite result: the server settles the test on that report and kills the browser. The final major GC outlasts the report. A passing build escapes because the browser dies within milliseconds; a failing one stays up for the screenshot, long enough for the GC to finish and the line to land after termination.
This commit fixes the issue by moving `stop()` after the final cleanups and their memory log: the [MEMINFO] line is still logged, but before the result report, while the server still waits on the browser.
https://runbot.odoo.com/odoo/error/229655
Forward-Port-Of: odoo/odoo#284957Breadcrumb navigation is restored on several customer portal pages, including signatures, subscriptions, field service, tickets, appointments, and equity pages. This helps users understand where they are and move around the portal more easily.
Original PR description
Problem: Since [this commit][1], breadcrumbs have not been visible from portal pages. Specifically, they have not been visible from the following: * /my/signatures * /my/subcriptions * /my/field-service * /my/tickets * /my/appointments * /my/equity Cause: The change split calls for `portal.portal_layout` and `portal.portal_searchbar`. Previously, `breadcrumbs_searchbar` was set to true just after portal layout was called and this spread into the portal searchbar call. After the commit, `breadcrumbs_searchbar` was no longer being passed to the portal searchbar. As this is what controls the visibility of breadcrumbs on a portal page, they were no longer displayed. Solution: Explicitly call portal searchbar with the `breadcrumbs_searchbar` in each of the above routes' portal page definitions. [1]: https://github.com/odoo/enterprise/commit/99d583d5d6362504b4e838c7825fe9ca8d2b342c task-6365169
AvaTax invoice PDFs now size section or divider rows correctly when the Taxes column is hidden. This prevents misaligned borders and avoids large blank gaps on longer printed invoices, improving the accuracy and appearance of customer documents.
Original PR description
Steps: 1. Turn on AvaTax for a company (connect it to Avalara). 2. In Settings > General Settings > Invoicing, set the Document Layout to Boxed (Box), just for a clear view. 3. Create a customer…
Steps: 1. Turn on AvaTax for a company (connect it to Avalara). 2. In Settings > General Settings > Invoicing, set the Document Layout to Boxed (Box), just for a clear view. 3. Create a customer invoice: - Use the customer with an AvaTax fiscal position and proper address details. - Add a product with an AvaTax category. - Add a section line (a divider/heading row). - Compute Taxes for the AvaTax. 4. Print the invoice as a PDF. 5. Look at the section/divider row. Its cell border does not line up with the other rows. On longer invoices, this can also cause a big blank gap at the bottom of a page. Cause: When an invoice is computed by AvaTax, the Taxes column is hidden from the PDF (this is intentional, since AvaTax shows tax differently). But a different part of the same template decides how wide the section row should be. This part does not know the Taxes column was hidden, so it still counts it. That makes the section row's width wrong by one column, which breaks the table layout in the PDF. Fix: Instead of hiding the Taxes column only in one place, fix it at the source: the variable that decides (does this invoice show a Taxes column) now also checks if the invoice is an AvaTax invoice. Every other part of the template that uses this variable (the header, the tax cells, and the section row width) automatically gets the right answer, since they all read from the same place. Result: - Section rows on AvaTax invoices now have the correct width. opw - 6455674 Forward-Port-Of: odoo/enterprise#129097
The Project activity menu now opens Project Updates filtered to the current user's own activities and the selected timing bucket, such as late or upcoming. This prevents users from seeing unrelated project updates when following activity counts, making the activity list clearer and more accurate.
Original PR description
**Problem:** Opening a Project Update activity from the activity menu (the clock icon in the systray) lists every project update of every user, instead of the ones carrying the current user's…
**Problem:**
Opening a Project Update activity from the activity menu (the clock icon in the systray) lists every project update of every user, instead of the ones carrying the current user's activities.
**Steps to reproduce:**
1. Schedule an overdue activity on a project update
2. Have a colleague create another project update with no activity
3. Click the clock icon in the systray
4. Under "Project Update", click the "Late" count
**Current behavior:**
The list opens unfiltered and shows all project updates, including the ones of other users and the ones carrying no activity at all.
**Expected behavior:**
The list shows only the updates carrying the user's own activities, restricted to the bucket that was clicked.
**Cause of the issue:**
The activity menu never builds a "my activities" domain. `openActivityGroup` in `mail/static/src/core/web/activity_menu.js` narrows the generic act_window it opens purely through context keys — `search_default_filter_activities_my` plus `search_default_activities_overdue` / `_today` / `_upcoming_all` — and the only domain it forwards comes from `_get_activity_groups`, which is limited to `[('active', 'in', [True, False])]`. A `search_default_<name>` key is resolved against a filter of that name in the model's search view, and is silently dropped when no such filter exists. `project.update`'s search view never declared them, so every key the menu sends is discarded and the action opens on an empty domain.
**Fix:**
`project.project` and `project.task` — the addon's two other `mail.activity.mixin` models — already declare this block of invisible activity filters, as does every other model reachable from the activity menu. Declaring them on `project.update` is what makes the menu's context keys resolvable, and keeps the model consistent with the rest of the codebase instead of special-casing `project.update` on the client side.
opw-6416397
Forward-Port-Of: odoo/odoo#281511This fix prevents an upgrade warning when employee records temporarily have no version information during migration. It helps upgrades complete more cleanly by handling that short-lived data state without raising an error.
Original PR description
### Issue: A warning `IndexError: tuple index out of range` is logged on RunBot when upgrading from 18.0 to 19.0 for employees without any version ### Cause: `_get_version` on `hr.employee` falls…
### Issue: A warning `IndexError: tuple index out of range` is logged on RunBot when upgrading from 18.0 to 19.0 for employees without any version ### Cause: `_get_version` on `hr.employee` falls back to `versions[0]` when no version matches the given date But if the employee has no versions at all, `versions` is empty and `versions[0]` raises an `IndexError` ### Steps to reproduce: - Create a database with `hr_attendance` installed in 18.0 - Upgrade to 19.0 Before the fix, a warning is logged during the upgrade ### Notes: An employee without any version is a transient state during upgrade `hr/saas~18.4.1.1/end-migrate.py` backfills a version for every employee still missing one (`current_version_id IS NULL`) once the whole upgrade chain is done Since it only runs at the very end, an employee can still be found without a version by earlier steps (e.g. modules reloading their demo data), which is when this warning was logged Confirmed on an upgraded RunBot database that employees without a version before the upgrade do end up with one once fully completed runbot-241187 Forward-Port-Of: odoo/odoo#284467
This update prevents unnecessary warning messages when Odoo uses newer operating system versions of certificate software. It keeps email and certificate-related connections working smoothly across different deployment environments.
Original PR description
pyOpenSSL 24.3.0 deprecated passing its own X509/PKey objects to Context.use_certificate()/use_privatekey(), and started accepting cryptography objects instead. Odoo pins pyopenssl 24.1.0, but the distro builds run the version shipped by the OS: since the test added by f0fb287c6502 covers that path, they now add a warning in the logs. Load the certificate and the key as cryptography objects when the installed pyOpenSSL supports them, keep the previous loaders otherwise. Reference: https://github.com/pyca/pyopenssl/commit/b0cb4b4 This fix is based on https://github.com/odoo/odoo/blob/a2b4f618328f3ce3f654fd2c1ee4410365706a7e/odoo/addons/base/models/ir_mail_server.py#L34-L46 runbot-944176 Forward-Port-Of: odoo/odoo#285569 Forward-Port-Of: odoo/odoo#277449
An obsolete styling setting for search facets was removed because the interface now uses a newer shared background style. This is a small cleanup that helps keep the codebase simpler without changing what users see.
Original PR description
--SearchBar-facet-background is not read anywhere anymore: the control panel frost restyle switched the facet background to the bg-100 utility. requires: https://github.com/odoo/odoo/pull/285359 task-6518046
This change simplifies the web tour code by moving small helper logic directly into the tour pointer component and removing an unused utility file. It should not change how users experience tours, but it reduces maintenance overhead for future updates.
Original PR description
tour_pointer.js was the only remaining consumer of tour_utils.js. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change reorganizes how spreadsheet-related data is evaluated behind the scenes, including charts, filters, lists, pivots, currency, translations, and accounting spreadsheets. It should improve maintainability and help ensure the right spreadsheet components run in the right context, with minimal direct impact on day-to-day users.
Original PR description
This commit is the odoo counterpart of https://github.com/odoo/o-spreadsheet/pull/9439. Task: 6428159 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update reorganizes how spreadsheet features access evaluated data and corrects related command handling. It helps keep spreadsheet surveys, pivots, comments, and sales field synchronization aligned with the latest spreadsheet engine behavior, reducing the risk of inconsistencies for users.
Original PR description
This commit is the odoo counterpart of https://github.com/odoo/o-spreadsheet/pull/9439. Task: 6428159
Several Odoo business apps were updated to align with the latest underlying web framework changes. This keeps key areas such as Documents, spreadsheets, payroll, manufacturing, and reporting compatible and easier to maintain, without introducing expected user-facing behavior changes.
Original PR description
*: account_reports,documents_spreadsheet,hr_payroll,mrp_mps, mrp_workorder,spreadsheet_edition
`viewService` has been converted to an OWL3 Plugin, so existing useService("view") call sites need to be rewritten. This commit is the result of the owl3-migration script.