Daily updates from Odoo
Thursday, June 25, 2026
34 changes · master
New functionality added to Odoo
This update adds a new command introduced in the recent o-spreadsheet update to the list of publicly available commands. This ensures users can easily access and utilize the latest functionality within the spreadsheet module. It's a straightforward addition to improve usability.
Original PR description
Last o-spreadsheet update added a new command, so we need to add it to the public command list.
Enhancements to existing features
The POS blackbox module was updated to follow a change in how POS sessions are identified. This ensures the module keeps working correctly when checking whether a session exists, which helps avoid issues with future orders.
Original PR description
This commit adapts the pos_blackbox_be module to the changes in the community PR. The change is that the has_active_session is now defining if a config has a session that is opened or in closing_control but to check if a session exists, we have to check current_session_id instead of has_active_session. task-id: 6034751 Community PR: https://github.com/odoo/odoo/pull/254408
This update allows users to easily duplicate existing website appointment menus, streamlining the process of creating similar appointment pages. Previously, this functionality required a manual step. This change improves efficiency and simplifies website management for the team.
Original PR description
The corresponding community PR makes it possible to duplicate multi-level template menus but The duplication function needs to be explicitly called. Task-6030210
Resolved issues and error corrections
This change removes an unintended extra padding in the bank reconciliation widget. It makes the layout look more consistent and improves the display of statement lines for users working in accounting.
Original PR description
Since this commit: https://github.com/odoo/odoo/commit/185b70434091d7c20b3993d59dad6490a8a77a6e it seems that kanban record have an extra padding to it. This pr will remove it in the bank rec widget at least. no task id
This change updates how automated tests clean up test components so they remove whole test apps only when appropriate. It prevents tests from accidentally tearing down shared pieces of the interface, which makes the test suite more stable and reduces flaky failures.
Original PR description
- Community: https://github.com/odoo/odoo/pull/271765 Before this commit, 'destroy' was used to destroy individual components in unit tests. The issue is that this helper is meant to destroy the entire app, which creates weird situations when several components are spawned under the same app in a same test. This commit ensures the 2 following scenarios: - the previous component is entirely replaced, and 'destroy' is used legitimately; - or multiple components have been aggregated under a common parent, and are then mounted/unmounted through reactivity.
This update streamlines the layout of quantity buttons within the Odoo inventory barcode interface. Previously, a confusing button arrangement and inconsistent delete functionality caused user friction. Now, the layout is more intuitive, and the delete button's behavior has been clarified to only remove lines from the view, improving the user experience.
Original PR description
This commit improves the layout of quantity buttons in barcode in both cases of physical inventory and transfers. ### Before this commit: 1- The fulfill button disappeared if `quantity done == demand…
This commit improves the layout of quantity buttons in barcode in both cases of physical inventory and transfers. ### Before this commit: 1- The fulfill button disappeared if `quantity done == demand - 1` which causes the increment and decrement buttons to shift their positions, that caused confusion to the user. 2- The delete button (red trash button) in case of physical inventory count was used to set the count of the product to 0 and remove the line from barcode view. 3- The "?" button (to mark the quantity as not set yet while inventory count) appeared whether the quantity on line was set to a number >= 0. 4- The button for registering components was among the lower buttons (increment, decrement, and fulfill). ### After this commit: 1- The fulfill button still disappears when `quantity done == demand - 1` but an empty spacer replaces it, which causes other buttons to hold positions. 2- The delete button now only appears when the user adds a product by themselves using the form or scanning the product (not while the product is in an inventory request). Also the functionality is of the button is now different, it just removes the line from the barcode view without affecting the inventory count at all. 3- The "?" button now only appears if the quantity = 0. 4- The button for registering components is no next to the edit button. Upgrade PR: https://github.com/odoo/upgrade/pull/10224 Task-6095725
This update resolves an issue where the website link wasn't correctly populated when creating a lead through the AI-powered CRM tool. The fix ensures that the visitor's website information is accurately captured, improving the lead generation process. This prevents missing website data from being associated with new leads.
Original PR description
see: https://github.com/odoo/odoo/pull/252766 ERROR: Subtest TestAiCrmLivechatTools.test_create_lead_tool_from_livechat (login='public_user') Traceback (most recent call last): File…
see: https://github.com/odoo/odoo/pull/252766
ERROR: Subtest TestAiCrmLivechatTools.test_create_lead_tool_from_livechat (login='public_user') Traceback (most recent call last):
File "/data/build/odoo/odoo/tools/safe_eval/evaluation.py", line 431, in safe_eval
return unsafe_eval(c, globals_dict, None)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "ir.actions.server(272,)", line 1, in <module>
File "/data/build/odoo/odoo/tools/safe_eval/runtime.py", line 659, in safe_call
return callee(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/enterprise/ai_crm/models/crm_lead.py", line 16, in _ai_create_lead
self.create(self._ai_prepare_lead_creation_values({
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/enterprise/ai_crm_livechat/models/crm_lead.py", line 21, in _ai_prepare_lead_creation_values
if 'website' in self.env and (visitor := channel.livechat_visitor_id):
^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'discuss.channel' object has no attribute 'livechat_visitor_id'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/data/build/odoo/odoo/tests/common.py", line 2949, in with_users
func(self, *args, **kwargs)
File "/data/build/enterprise/ai_crm_livechat/tests/test_ai_crm_livechat_tools.py", line 17, in test_create_lead_tool_from_livechat
tool.with_context({'discuss_channel': livechat_channel})._ai_tool_run(None, {
File "/data/build/enterprise/ai/models/ir_actions_server.py", line 288, in _ai_tool_run
self._run_action_code_multi(eval_context=eval_context)
File "/data/build/odoo/odoo/addons/base/models/ir_actions.py", line 1012, in _run_action_code_multi
safe_eval(self.code.strip(), eval_context, mode="exec", filename=str(self))
File "/data/build/odoo/odoo/tools/safe_eval/evaluation.py", line 437, in safe_eval
raise ValueError('%r while evaluating\n%r' % (e, expr))
ValueError: AttributeError("'discuss.channel' object has no attribute 'livechat_visitor_id'") while evaluating "ai['result'] = record.sudo()._ai_create_lead(name, contact_name, description, email, phone, team_id, tag_ids, priority, country_id, state_id, city, zip_code, street, job_position)"This update resolves an issue where users assigned to sign requests ('Own Templates' group) were encountering an 'Access Error' when attempting to sign documents. The fix utilizes `sudo()` to correctly access document counts, ensuring these users have the necessary permissions to open and sign documents. This improves the user experience for sign requests created with the 'Own Templates' access right.
Original PR description
Steps to Reproduce: 1. create a new user (UserB) and grant the 'User: Own Templates' access right. 2. send a new Sign Request to UserB. 3. log in with the UserB account and try to sign the document. Issue: An 'Access Error' message is displayed instead of opening the document to sign. Cause: `go_to_document` and `go_to_signable_document` read `self.template_id.document_ids` to compute `document_count`, and the `sign.template` record rule for `group_sign_user` only grants access to the template owner. Users assigned to sign request created from that template do not have access to the template itself, so reading `document_ids` raises an `AccessError` before the document can be opened. Solution: Used `sudo()` in both methods to compute document_count.
This update resolves an issue preventing proper grouping in the resource search view based on job position. The fix ensures that users can now filter and group resources accurately, improving search efficiency. This enhancement streamlines resource management within the Enterprise module.
Original PR description
In a recent commit, we added the job position to the resource search view. However, the group by was not working because the field was not stored. This is now fixed in this commit. task-6329358
A previous bug caused an unwanted 'Uninstall modules' prompt to appear after saving settings, specifically when the Website Form module was installed. This fix ensures the module remains installed regardless of the Website Form setting, as it's now essential for displaying Field Service information in the portal. This prevents unnecessary user disruption.
Original PR description
Steps to reproduce: - 1. Install `website` and `planning_field_service` (so `website_planning_field_service` auto-installs). 2. Open Settings and click Save. Issue: - An "Uninstall modules" wizard…
Steps to reproduce: - 1. Install `website` and `planning_field_service` (so `website_planning_field_service` auto-installs). 2. Open Settings and click Save. Issue: - An "Uninstall modules" wizard pops up offering to remove `website_planning_field_service`. Cause: - Since the module is now `auto_install` with its `post_init_hook` removed, it is installed alongside `website` and `planning_field_service` while the setting remains disabled by default. On Save, `set_values` re-derives the `module_website_planning_field_service` field from a company `search_count`, setting it to False when no company has the feature enabled, even though the module is installed. Base `execute()` then sees `module_* = False` on an installed module and re-offers the uninstalls. Fix: - Make `set_values` install-only: enabling the setting still installs the module, but disabling it no longer attempts to uninstall it. The module is now also used to show or hide Field Service information in the portal, so it must remain installed even when the Website Form feature is disabled. task-6330718
This update fixes an issue where shift report PDFs displayed unnecessarily large pills for single-line shift names. The change ensures shift pill sizes are now correctly optimized for single-line names while still accommodating longer names that wrap to multiple lines. This improves the visual clarity and consistency of shift reports.
Original PR description
### Steps to reproduce: 1. Go to Planning. 2. Create a shift with a short name that easily fits on a single line. 3. Click Actions > Print to generate the PDF report. 4. Observe the printed shift pill. ### Issue: Single-line shift pills look unusually large because they take up unnecessary vertical space on the printed report. ### After: The pill now correctly shrinks to fit a single-line name natively, while still expanding downward if a longer name wraps to a second line. task-5062148
A recent update to Odoo's user interface broke the way certain fields, specifically the VAT field, are displayed. This fix corrects the broken XPath expressions, ensuring the VAT field is correctly rendered across multiple Odoo localization modules. This resolves a display issue impacting financial reporting.
Original PR description
The refactor of identifiers on both the partner and company views broke some xpaths. This commits aims at repairing those. See https://github.com/odoo/odoo/pull/262274 See https://github.com/odoo/enterprise/pull/115838 task-none
This update resolves an issue where sign templates with auto-filled fields would incorrectly display placeholders instead of the actual values, or fail to generate documents. The fix ensures falsy auto-filled values are properly preserved, preventing errors and guaranteeing accurate sign document generation.
Original PR description
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the…
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the document for signing. - Complete the signing flow. Issue: - Readonly sign items linked to auto-filled values could not properly handle falsy values. Empty values could trigger the error "Some required items are not filled" and completed sign requests displayed the sign item placeholder instead of the actual auto-filled value. - completed document generation could fail when rendering falsy values for textarea sign items. Cause: - Falsy auto-filled values were ignored during constant item population and replaced by the sign item placeholder. Additionally, readonly constant items were included in required field validation and completed sign requests continued to display placeholders when the stored value was empty. - document rendering assumed sign item values were always strings for textarea sign items but when auto field is empty it value can be False. Fix: - Preserve falsy values when populating readonly constant items, exclude constant items from signer validation, and hide placeholders for empty auto-filled constant items when displaying completed sign requests. - Normalize falsy values to prevent crashes and allow completed documents to be generated correctly. Forward-Port-Of: odoo/enterprise#121299 Forward-Port-Of: odoo/enterprise#121009
This update fixes a scheduling issue with semi-monthly payrolls. Previously, payslips were incorrectly aligned with the month's halves, resulting in overlapping periods. The change now ensures payslips start on the 16th of the month, accurately reflecting the payroll schedule.
Original PR description
Issue: ---------------------------------------- The start date of semi-monthly payslips on second half of the month is the 15 which is also the end date of the first half of the month. Steps to reproduce: ---------------------------------------- - Have an employee with a semi-monthly payroll - When in the first half of the month, create a payslip for this employee - The payslip is from 1st to 15th - Do the same when in the second half of the month - The payslip is from 15th to end of the month Cause: ---------------------------------------- In `_schedule_period_start()` we set the start date to th 15th for semi-monthly payslips. Solution: ---------------------------------------- Set it to the 16th. opw-6281556 Forward-Port-Of: odoo/enterprise#120887 Forward-Port-Of: odoo/enterprise#120172
This update fixes an issue where the system incorrectly rejected zero measurements from caliper devices in IoT data. This ensures accurate reporting of measurements, particularly when a device isn't detecting anything. The update also includes a minor typo correction.
Original PR description
Fix a check on the IoT response that incorrectly rejected valid measurements of 0 from caliper devices Also fix a typo opw-6184669 Forward-Port-Of: odoo/enterprise#121226 Forward-Port-Of: odoo/enterprise#121116
This update resolves an issue where users were encountering access errors when using the timesheet suggestion dropdown. The fix prevents the timer from suggesting tasks the user no longer has permission to view, ensuring a smoother timesheet experience. This improves usability and prevents potential disruptions for users.
Original PR description
Steps to reproduce: - 1. Log in as a user who can see their own timesheets and has already logged time on tasks that are now in projects they can no longer read (e.g. Marc Demo in the demo data). 2. Open the Timesheets timer in the systray and check in. 3. Click the task field to open the suggestions dropdown. Issue: - An access error is raised when the task dropdown is opened. Cause: - The timer's `project.task` `name_search` override suggests recently used tasks via `account.analytic.line.sudo()._get_recently_used_records()`. The sudo surfaces task ids the user can no longer read. `name_search` returns them, raising the access error. Fix: - Filter the aggregation result so only tasks the user can read are returned. task-6319815 Forward-Port-Of: odoo/enterprise#121345
A minor typo in the payroll warning system was causing incorrect alerts. This update corrects the typo, ensuring that payroll warnings are accurately identified and displayed to users. This resolves a potential disruption to payroll reporting.
Original PR description
The DMFA submission payroll warning was incorrectly matched by _get_payroll_translation because of a small typo task-6326554
This update resolves an issue where PrintRec components could receive incorrect data values. Previously, these components weren't properly validated, which could lead to unexpected behavior. This fix ensures data integrity for PrintRec components, particularly when used in production environments.
Original PR description
This commit fixes the props validation of PrintRec* components since they can receive `false` on some property. Before the components were not validated because they were mounted with a production mode app.
This update resolves a technical issue impacting work order duration calculations. A recent code change shifted a related function, but a critical component – accounting for travel time – was missed. This fix, triggered by a runbot error, ensures accurate work order duration reporting.
Original PR description
get_duration was moved from mrp_workorder to mrp in odoo/odoo#267113 and odoo/enterprise#118753 However, _intervals_duration missed the trip This solves runbot error 940411
This update resolves a technical issue impacting the performance of the Gantt chart within the Enterprise module. Specifically, a variable name was corrected to enhance the functionality and stability of the underlying planning service. This change ensures smoother chart operation for users.
Original PR description
task-6200248
This update resolves a stability issue in the point-of-sale tour. Previously, the tour could fail due to asynchronous order processing, leading to duplicate requests. By adding a delay to ensure requests are fully completed, this fix prevents race conditions and improves the reliability of the tour.
Original PR description
The tour could fail because `sendOrderInPreparationUpdateLastChange` is asynchronous when sending the order to the kitchen. The test was continuing to the next steps before the request was fully resolved, which could lead to sending the order again while the previous call was still in progress. This commit updates the tour to explicitly wait for the async call to complete before continuing, by adding a delay step after clicking the order button. This prevents race conditions during the test. --- Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/181846 Forward-Port-Of: odoo/enterprise#121237 Forward-Port-Of: odoo/enterprise#110909
A recent update to the Odoo Enterprise system (version 19.2 and later) caused a test for the 'hr_holidays_gantt' module to fail. This was due to an issue with a payroll-related field in the test's configuration. This fix ensures the test runs successfully, maintaining the functionality of the holiday Gantt chart.
Original PR description
__ ## Error description When the test runs with only the module `hr_holidays_gantt` installed, it fails. ## Origin of the issue There's a payroll related field in the `read_specification` variable. ### Note The error is only triggered since 19.2. __ original commit: https://github.com/odoo/odoo/pull/256636 Forward-Port-Of: odoo/enterprise#121119
Features or functions removed from Odoo
This update removes redundant app creation within Odoo, streamlining the system and reducing potential errors. By eliminating unnecessary app instances, we minimize the risk of configuration issues and simplify debugging, ultimately improving stability.
Original PR description
See commit messages for detail - https://github.com/odoo/odoo/pull/267998
Code cleanup and technical improvements
This change updates the VoIP softphone interface to use the newer input binding approach required by the latest framework version. It helps keep the calling experience compatible and maintainable as the platform evolves, without changing the user-facing behavior.
Original PR description
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 return check screen was updated to use the newer embedded action structure introduced elsewhere in the product. This keeps the interface working consistently after the internal refactor, with no expected change to business behavior.
Original PR description
Following the refactoring of embedded actions, this commit adapts the AccountReturnCheckControlPanel to utilize the new logic. Changes: - Created a new `AccountReturnCheckEmbeddedActions` component that extends `EmbeddedActionsPanel`. - Moved the `isEmbeddedActionVisible` method to AccountReturnCheckEmbeddedActions. - Moved the XML replacement for the embedded actions dropdown to the new component's template. - Registered the new embedded actions panel within the control panel components. Task~4277541 Related: odoo/odoo#269040
Replaced \`useLayoutEffect\` with \`onMounted\` because \`useLayoutEffect\` is deprecated in OWL3. The effect used an empty dependency array (\`() => []\`), meaning it ran exactly once after the first render — which maps directly to \`onMounted\`. No reactive tracking or DOM measurement was needed, so \`onMounted\` is the correct and minimal replacement. The \`useLayoutEffect\` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out: - @docu
Original PR description
Replaced \`useLayoutEffect\` with \`onMounted\` because \`useLayoutEffect\` is deprecated in OWL3. The effect used an empty dependency array (\`() => []\`), meaning it ran exactly once after the first render — which maps directly to \`onMounted\`. No reactive tracking or DOM measurement was needed, so \`onMounted\` is the correct and minimal replacement. The \`useLayoutEffect\` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out: - @documents/kanban_view/Check actions with preview - @documents/kanban_view/Download button availability - @documents/kanban_view/Ensure previewer shows correct name after renaming a document see runbot build: https://runbot.odoo.com/runbot/batch/2593689/build/114684050
This update removes an outdated code element (`useLayoutEffect`) that was causing instability in the Knowledge module. Replacing it with `onMounted` ensures the module functions reliably and aligns with current Odoo standards. Successful automated tests confirm the change.
Original PR description
Replaced `useLayoutEffect` with `onMounted` because `useLayoutEffect` is deprecated in OWL3. The effect called `toggler.click()` once when the toggler element became available on mount. `onMounted` is the correct replacement: the toggler ref's el is present at mount time, so a single `onMounted(() => this.toggler.el?.click())` fires synchronously at the same lifecycle point, matching the original timing without the deprecated hook. 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: - @knowledge/options_dropdown/Move Article - FAIL: WebSuite.test_unit_desktop (in html_editor,knowledge suite) - FAIL: MobileWebSuite.test_unit_mobile (in html_editor,knowledge suite) see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596678/build/114854269
This update replaces an outdated code component with a modern version compatible with Odoo's latest framework (OWL3). This ensures the appointment screen functions correctly and avoids potential issues with deprecated code. The change was verified through automated testing, confirming the functionality remains intact.
Original PR description
Replaced `useLayoutEffect` with `useEffect` (OWL3) because `useLayoutEffect` is deprecated in OWL3. The single `useLayoutEffect` was reacting to `this.props.actionName`: when `actionName ===…
Replaced `useLayoutEffect` with `useEffect` (OWL3) because `useLayoutEffect` is deprecated in OWL3. The single `useLayoutEffect` was reacting to `this.props.actionName`: when `actionName === 'manage-booking'` it makes an async `data.call` to open the booking gantt view, then dispatches `doAction` / `switchView`. This is not derived state and does not load data into component state — it dispatches an action, making OWL3 `useEffect` the correct replacement. OWL3 `useEffect` auto-tracks reactive values read in its body, so `this.props.actionName` is tracked automatically without an explicit dep array. 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: - `@pos_appointment/unit/screens/action_screen/ActionScreen => useEffect`: Expected gantt view action, received null - `FAIL: TestFrontend.test_appointment_kanban_view_date_filter`: Tour failed at 'Go to kanban view' step - `FAIL: TestUi.test_pos_restaurant_appointment_tour_basic`: Tour failed at 'Check that the booking gantt view is shown' see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596700/build/114854622
This update improves the way mock server data is structured and serialized, aligning it with recent changes in the Odoo Enterprise platform. Specifically, the mock models used in various modules (ai, approvals, voip, whatsapp, etc.) have been updated to use a new field list DSL and `as_dict()` serialization, ensuring better compatibility and data consistency. This change enhances the reliability of the mock server environment for testing and development.
Original PR description
Enterprise companion of the community commit "[REF] mail, *: match mock server Store to python implementation". Migrate the mock server mock models to the new `_store_<name>_fields` field list DSL and `as_dict()` serialization. https://github.com/odoo/odoo/pull/271117
This update simplifies the underlying model structure within Odoo's Web Studio. As part of a larger migration to a newer version (Owl 3), the team has replaced older model definitions with more modern `t-model` and `t-model.proxy` structures. This change improves the long-term maintainability and stability of Web Studio applications.
Original PR description
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`.
This update centralizes the configuration for printing IoT reports using a standardized registry. This change enhances flexibility and maintainability by allowing for easier updates and modifications to report printing methods for IoT printers, without requiring direct code changes.
Original PR description
we now use the registry to define the method to print reports using IoT printers. see odoo/odoo#271560
This update simplifies the codebase by replacing older model structures (`t-custom-model`) with newer, more efficient ones (`t-model` and `t-model.proxy`) as part of the ongoing migration to Owl 3. This change improves the underlying system's performance and maintainability.
Original PR description
* = [ai_website] 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`.
This update simplifies the underlying data structure within the Enterprise module by replacing older model types with newer, more efficient `t-model` and `t-model.proxy` structures. This change is part of a larger migration from `owl 2` to `owl 3`, ensuring the system remains current and optimized for future development.
Original PR description
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`.
This update changes how processors within Odoo handle data transformation. Previously, processors were limited in returning falsy values, now they can explicitly return null or undefined to signal no processing or a deliberate choice. This allows for more flexible and controlled data flow within Odoo's modules.
Original PR description
*: knowledge, web_studio Previously, `processThrough` used `|| item` to fall back to original value if a processor returned a falsy value. This prevented processors from intentionally returning falsy values (e.g. null, undefined). Now each processor is responsible for returning a value explicitly: - Return the transformed value if processing occurred. - Return the original item if no processing is needed or processing is in place. - Return null/undefined to intentionally pass a falsy value. Community PR: https://github.com/odoo/odoo/pull/255801 task-6030633