Skip to main content
iVentureTeam

many2many_avatar_employee

Employee pickers in Odoo HR render as avatar pills through many2many_avatar_employee, a widget whose defining trick is deciding which employee model you are really looking at.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 21, 2026Updated August 21, 20266 min read
Technical namemany2many_avatar_employee
Field typesmany2many
Viewsform, list, kanban, activity
Also registered askanban.many2many_avatar_employee, activity.many2many_avatar_employee, list.many2many_avatar_employee
Modulehr
Used in core3 occurrences across 2 modules: hr_holidays allocation wizards and hr
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. Applied via the widget attribute in view XML
Alternativesmany2many_avatar_user, many2one_avatar_employee, many2many_tags_avatar, many2many_tags

What the Employee avatars field does

Anywhere Odoo needs "pick several employees", the multi-employee allocation wizard in Time Off being the canonical case, this widget draws each selected employee as a pill with their photo and name, plus an autocomplete to add more. Visually it is the same experience as the assignee pickers on tasks, because it extends exactly that widget, many2many_avatar_user, which in turn extends the generic avatar-tags field.

What the employee variant adds is model awareness. Odoo splits employee data between hr.employee, the full record HR can see, and hr.employee.public, the trimmed version every user may read. The widget checks hr.group_hr_user membership when it loads and aims its searches, avatars, and cards at whichever model the current user is entitled to. The same field therefore works for an HR officer and a regular employee without access errors, showing each exactly what they are allowed.

It also decides one thing firmly: employees are not created from a picker. The descriptor hardcodes quick create off, so the dropdown only ever offers existing employees.

What this means for your team

The model switch is invisible when it works, which is the point, but it explains two things administrators run into. First, avatars and names can differ subtly by user: non-HR users see the public employee record, so anything HR maintains only on the full record does not surface for them. Second, record counts in the picker can differ between users when record rules scope the public model, say per company. Neither is a bug; both are the access design doing its job in the UI.

The no-creation rule is a data-governance decision embedded in a widget. Employee records carry contracts, payroll links, and access implications, so "quickly add Jane" from a wizard is exactly how HR databases grow duplicate half-employees. Odoo's choice to disable it here is one to preserve in customizations: if a flow seems to need employee creation mid-picker, the flow is usually wrong, not the widget.

For custom models that relate to employees, the widget is reusable as-is, and the relation option covers the edge case of always targeting one specific model, for example pinning to the public model so a shared screen never exposes HR-only data.

Supported options in Odoo 19

Verified against many2many_avatar_employee_field.js in the Odoo 19.0 hr module, plus the avatar-user and tags widgets it inherits from. The relation option is the variant's own; the rest arrive through the tags family pipeline.

OptionTypeWhat it does
relationmodel nameThe variant's own option: pins the widget to an explicit model, bypassing the hr.group_hr_user switch between hr.employee and hr.employee.public. Present since 16, where it overrode the then-hardcoded public model.
no_createbooleanInherited from the tags family. Removes the remaining creation route, the Create and Edit dialog, making the picker select-only.
no_create_editbooleanInherited from the tags family. Removes only the dialog-based creation entry.
no_quick_createbooleanInherited but effectively always on: the base variant hardcodes canQuickCreate false after spreading inherited props, so typed-text creation is disabled regardless.
search_thresholdnumberInherited from the tags family since 19. Minimum characters typed before the employee search fires; without it the dropdown searches on focus.(since Odoo 19.0)
placeholder_fieldfield nameInherited from the tags family. A char field on the current record supplying a dynamic placeholder for the input.(since Odoo 19.0)

Creation options are mostly moot here. The base variant hardcodes canQuickCreate: false after spreading the inherited props, so no_quick_create is already the permanent reality. A tags-style color_field is accepted by the schema but pointless: the avatar variants drop the color fetch from their data specification.

Working examples

As core uses it in the allocation wizard

<field name="employee_ids" widget="many2many_avatar_employee"/>

Pinned to the public model

<field name="employee_ids" widget="many2many_avatar_employee"
       options="{'relation': 'hr.employee.public'}"/>

The HR-group switch is bypassed; every user, including HR, works against the stated model.

Blocking the popup-create route too

<field name="employee_ids" widget="many2many_avatar_employee"
       options="{'no_create': True}"/>

Quick create is already off; this removes the Create and Edit dialog path as well, making the picker strictly select-only.

From hardcoded model to group-aware switch

The version history of this small file is a map of where the widget's behavior comes from.

Odoo 16 hardcoded the safe answer. The 16 implementation pinned relation to hr.employee.public for everyone, HR users included, though it already accepted a relation override from options. The group-aware switch arrived in 17 with the shared EmployeeFieldRelationMixin, which is also what the many2one employee variants use.

Odoo 19 made the pills clickable. The displayAvatarCard override, showing the employee card popover on desktop whenever the resolved relation is one of the two employee models, is new in 19, as are the dedicated list. variant and the activity. registration. On 17 and 18 the variants existed without the card override and activity views fell back to the kanban variant only.

The mixin is the extension point. If you build an avatar field for another split-access model, the pattern to copy is exactly this file: wrap the user-avatar classes with a mixin that resolves the relation from a group check and passes it into the avatar card props. The widget layer stays five lines per variant.

One inherited behavior worth restating from the avatar family: in kanban views the visible avatars are capped (with a counter pill for the rest), and the kanban popover editing flow saves the record on every change, both inherited from the avatar-user implementation.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. kanban variant renamed to card, activity registration repointed, search placeholder added; details below.
Odoo 19.0VerifiedVerified against the shipped source. Avatar card popover, list variant, and activity registration are new this release.
Odoo 18.0Partial / changedGroup-aware model switch present; no avatar card popover, list variant, or activity registration.
Odoo 17.0Partial / changedEmployeeFieldRelationMixin introduced; same feature set as 18.
Odoo 16.0Partial / changedRelation hardcoded to hr.employee.public for all users, overridable via the relation option.

Upgrade note for 16 to 17+. HR users started seeing hr.employee instead of the public model, which can change what the picker returns under company-specific record rules. Views themselves need no changes; the widget name and options carried over.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. These notes come from the public development branch, which is unstable until feature freeze; we re-verify against the shipped release.

Three visible changes. The kanban variant is renamed: kanban.many2many_avatar_employee becomes card.many2many_avatar_employee, with the activity registration now pointing at the card variant, part of the framework-wide kanban-to-card rename; any patch targeting the old registry key needs updating. The card variant gains a "Search employee..." placeholder. And the mixin signature changes to take the props set as a second argument as part of the props-validation migration, which affects custom code extending EmployeeFieldRelationMixin directly.

Common problems and fixes

SymptomCause and fix
Different users see different employees in the pickerThe widget targets hr.employee for HR users and hr.employee.public for others, and record rules on each model differ. Expected. Pin a model with the relation option if both audiences must match.
Typing a new name does not offer to create the employeecanQuickCreate is hardcoded false in the descriptor. By design; create employees in the Employees app. Custom widgets can lift the restriction deliberately.
Clicking an avatar does nothing on Odoo 17 or 18The employee card popover override is new in Odoo 19. Upgrade, or accept pills without cards on older versions.
color_field option has no visible effectThe avatar variants drop the color fetch from their data specification. Colors are not part of this widget family; use many2many_tags for colored pills.
A patch on kanban.many2many_avatar_employee stops working after Odoo 20The development branch renames the registration to card.many2many_avatar_employee. Target the new registry key when migrating, and retest the activity view which now uses the card variant.
Not all assigned employees show on kanban cardsThe inherited avatar display caps visible avatars with a counter for the rest. Expected; open the record or the counter popover for the full list.

Employee avatars field vs the alternatives

WidgetBest forKey difference
many2many_avatar_employeeMulti-employee pickers in HR flowsResolves hr.employee vs hr.employee.public per user, creation off
many2many_avatar_userAssignee pickers on res.users fieldsUser model, assign-me command support, quick create rules differ
many2one_avatar_employeeSingle-employee fieldsSame model switch for exactly one pick
many2many_tags_avatarAvatar pills on any model with an imageNo employee model logic, no group switch
many2many_tagsRelations where photos add nothingPlain colored pills, creation enabled by default

Choose by what the relation points at: this widget for employees, the user variant for res.users assignees, plain tags when photos add nothing, and the many2one employee variants when only one person can be picked.

Frequently asked questions

Why does the widget sometimes query hr.employee.public instead of hr.employee?+
The mixin checks hr.group_hr_user at load: HR users get the full model, everyone else the public one. That keeps the same field usable by both audiences without access errors. The relation option pins a specific model when needed.
Can users create a new employee from the picker?+
No. The descriptor hardcodes quick create off, so typed text never creates an employee. The dialog-based route can additionally be removed with no_create. This is deliberate data governance around employee records.
What do the avatar cards show, and who gets them?+
Clicking a pill on desktop opens the employee avatar card popover, introduced for this widget in Odoo 19. It renders from whichever employee model the user resolved to, so non-HR users see only public fields.
Does it work on models other than employees?+
Yes, mechanically: with options="{'relation': 'your.model'}" it behaves like the avatar-user widget pointed elsewhere. The employee card popover logic only engages for the two employee models.
What changed for this widget across recent versions?+
16 hardcoded the public model; 17 introduced the group-aware mixin; 19 added the avatar card popover, a dedicated list variant, and an activity registration. The development branch renames kanban to card for Odoo 20.
Why do avatar colors from my color field not appear?+
The avatar family intentionally drops the tags color fetch from its specification, so color_field is accepted but inert. Avatars replace colors as the visual identity in this widget family.

HR data that respects who is asking?

Employee visibility, public profiles, and multi-company record rules decide what every HR screen shows. We implement Odoo HR with the access design done right, from employee models to the widgets on top, on Odoo 16 through 19.

Book a free consultation

How this page was produced

This page was verified by reading many2many_avatar_employee_field.js and employee_field_relation_mixin.js on the Odoo 19.0 branch, tracing the inherited option pipeline through the avatar-user and tags-avatar sources, and diffing the widget file across 16.0, 17.0, 18.0, and master for the version table and Odoo 20 notes. Behavior was checked on a clean Odoo 19 database with HR installed, where the screenshot was captured. Corrections welcome via our contact page.