Skip to main content
iVentureTeam

account_merge_wizard_lines_one2many

Merging duplicate accounts means reading groups of candidates and ticking the ones to keep. This widget is the sectioned list that makes those groups legible, down to keeping one column deliberately visible.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 27, 20266 min read
Technical nameaccount_merge_wizard_lines_one2many
Field typesone2many
Viewsform, with an embedded list
Moduleaccount, present wherever Invoicing or Accounting is installed
Used in core1 occurrence, the merge accounts wizard in account
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. It is a bespoke wizard list tied to the merge candidate model
Alternativesone2many, section_one2many, so_template_line_o2m, question_page_one2many

What the merge wizard list does

Charts of accounts accumulate duplicates: the same account created twice with slightly different codes, or two localization packages contributing overlapping entries. Odoo has a wizard that finds those candidates, groups them, and lets you choose which one survives the merge.

The interface problem is that the wizard shows two different kinds of row in one list. Some rows are group headings, telling you which duplicates belong together, and the rest are the individual accounts with a checkbox each. This widget is the renderer that keeps those apart.

It builds on Odoo's shared section list, the same machinery that renders sections on sale orders, and adapts it in three small ways: it uses a different field as the section title, it disables sorting, and it keeps one column visible on section rows that the base renderer would have hidden.

What this means for your team

Merging accounts is irreversible in practice, because the entries move and the losing account is gone. So the wizard's whole job is to be readable enough that someone can make the right choice without opening each account. Grouping is what makes that possible: you compare within a group rather than across a list of two hundred rows.

The alignment detail is a good example of how much small layout decisions matter on a screen like this. If the group heading did not line up with the account names underneath it, the eye would have to work to associate them, and on a screen where the cost of a mistake is high, that friction turns into errors.

The practical advice for anyone about to use the wizard is to work group by group and save nothing until the whole list has been reviewed, because the choice within one group can change what you want to do in another when the same account appears twice.

Supported options in Odoo 19

The widget declares no options of its own. It spreads the section list descriptor, so the options below are inherited from it. Read from the widget's source and the shared section-and-note field, Odoo 19.0.

OptionTypeWhat it does
subsectionsbooleanInherited from the section list. Enables a second level of section nesting. Not used by the merge wizard.(default: false)
hide_pricesbooleanInherited, and read in the base extractor without being declared. Hides price columns, which the merge wizard has none of.(default: false)
hide_compositionbooleanInherited and undeclared in the same way. Hides composition display on lines.(default: false)
aggregated_fieldsstring (attribute)Inherited. Comma-separated list of fields to aggregate on section rows, written as an attribute on the field element.

Two behaviors are hardcoded. The title field is set to info in the renderer's setup, and the selection column that stays visible on section rows is named literally. Both are written for the merge wizard's model, so the widget is not portable to a differently shaped list.

Working examples

The core usage

<field name="line_ids"
       widget="account_merge_wizard_lines_one2many">
  <list>
    <field name="is_selected"/>
    <field name="info"/>
    ...
  </list>
</field>

Both field names matter: one is the title column, the other is the column kept visible on section rows for alignment.

The section rows

<!-- rows carrying a display type render as sections -->
<field name="display_type" column_invisible="True"/>

Section detection comes from the shared section list, which uses the display type convention rather than a boolean flag.

What sorting does

# nothing. isSortable returns false for every column,
# with a source comment saying it makes no sense here

The list is grouped, so reordering it by a column would scatter the groups.

A hidden column deliberately un-hidden

The renderer overrides three methods, and the most interesting is the one about a hidden column.

In the shared section list, a section row collapses: most columns are hidden so the title can stretch. Here that would hide the selection column too, and because that column sits before the title, hiding it would shift the group heading left relative to the account names below. The renderer therefore intercepts the cell class for that specific column on section rows and removes the hidden class, so the column keeps its width and everything lines up. The source carries a comment saying exactly that, which is rare enough to be worth quoting the intent of.

The second override decides which columns survive on a section row: only the title column and the selection column, with the title given a colspan covering everything else. That is a narrower set than the survey or eLearning equivalents, which keep the drag handle instead.

The third is a flat refusal to sort, again with a comment explaining that sorting a wizard list does not make sense. Because the rows are grouped by section, sorting by any column would interleave groups and destroy the grouping the whole screen depends on.

The one Odoo 20 change is a rename: the method that picks the section columns takes a longer name on the development branch, matching a rename in the shared base. It has no visible effect but will break a custom module that overrode the old name.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. One internal method is renamed on the development branch; behavior is unchanged.
Odoo 19.0VerifiedVerified against the shipped source. Unchanged in substance from Odoo 18.
Odoo 18.0VerifiedFirst version.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. The widget is new in Odoo 18 and unchanged in substance in Odoo 19, so nothing needs attention there. Going to Odoo 20, the section column method is renamed in line with the shared base; that matters only to custom code that overrode it.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable and this can still change; we re-verify the page after release.

One rename, no behavior change. The method that selects which columns survive on a section row is renamed to match the shared section list's own rename. The title field, the deliberately visible selection column and the disabled sorting are all identical.

Common problems and fixes

SymptomCause and fix
Group headings do not line up with the accountsThe selection column was removed or renamed, so the alignment fix has nothing to keep visible. Keep the selection field in the embedded list under its expected name.
Sections render as ordinary rowsThe rows do not carry the display type the shared section list looks for. Make the server-side computation set the display type on group heading rows.
Clicking a column header does nothingIntended. Sorting is disabled on every column. Nothing to fix; sorting would scatter the groups.
The section title is blankThe embedded list does not include the field the renderer uses as its title column. Include that field in the list.
A custom override stopped working on Odoo 20The method that selects section columns is renamed on the development branch. Override the new method name.
Missing widget errorThe accounting module is not installed in that database. Install Invoicing or Accounting.

Merge wizard list vs the alternatives

WidgetBest forKey difference
account_merge_wizard_lines_one2manyReviewing grouped duplicate accounts before merging themSection list whose group rows keep the selection column visible so headings align with the rows below
one2manyAn ordinary embedded listNo sections, no alignment handling and sorting still works
section_one2manyGeneric sectioned relationsThe shared base, without the merge wizard's specific adjustments
so_template_line_o2mQuotation templates with optional sectionsAnother descendant of the same base, with quantity bookkeeping instead
question_page_one2manySectioned survey questionsA different section renderer with a forced parent save

The shared section list is the right base for any other grouped document list, and it is what this widget extends. Reach for this one only inside the merge wizard, since its title field and its alignment fix are written for that model. If you are building a similar review screen, the pattern worth copying is the alignment fix rather than the widget.

Frequently asked questions

What does the merge wizard list widget do differently?+
Three things: it uses a field named info as the section title, it disables sorting on every column, and it keeps the selection column visible on section rows so group headings align with the account names below.
Why can I not sort the list?+
Because the rows are grouped into merge candidates. Sorting by a column would interleave the groups, and the source says outright that it does not make sense here.
Does it support any options?+
None of its own. It inherits the shared section list's options, including two that are read in the base extractor without being declared.
Can I reuse it on another list?+
Not usefully. The title field and the column kept visible on section rows are written literally for the merge wizard's model.
Does anything change in Odoo 20?+
One internal method is renamed to match a rename in the shared base. Nothing visible changes, but a custom override of the old name would stop taking effect.

A chart of accounts nobody wants to touch

Duplicate accounts, inconsistent codes and localization overlaps make every report a negotiation. We clean up and restructure charts of accounts on live Odoo databases, on versions 16 through 19, without losing history.

Book a free consultation

How this page was produced

The title field, the section column selection, the deliberately visible selection column with its source comment and the disabled sorting were read from account_merge_wizard_line_one2many.js on the Odoo 19.0 branch, with the inherited behavior read from the shared section-and-note field in the same module. The usage comes from the merge wizard view. Version coverage comes from the absence of the file on 16.0 and 17.0, a comparison with 18.0, and a full comparison against the public development branch. Spotted an error? Tell us and we will correct the page.