Skip to main content
iVentureTeam

many2many_avatar_employee_class

Employee avatars with some of them flagged. It exists for one wizard, it takes its list of problem employees from a field you name, and on the development branch both the wizard and the widget are gone.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated September 7, 20265 min read
Technical namemany2many_avatar_employee_class
Field typesmany2many
Viewsform
Modulehr_work_entry, work entries for payroll
Used in core1 occurrence, the work entry regeneration wizard in hr_work_entry
VersionsOdoo 19.0
No-code setupNo. It needs a companion field naming the employees in error
Alternativesmany2many_avatar_employee, many2many_avatar_user, many2many_tags_avatar, many2many_tags

What the employee avatars with errors does

Regenerating work entries for a group of employees mostly succeeds, and occasionally does not: an employee whose contract has changed, or whose entries overlap something that cannot be recomputed. Telling the user which ones is the wizard's whole job.

This widget is how it tells them. The employees are shown as avatars, exactly as elsewhere in Odoo, and the ones that cannot be regenerated are marked. The list of problem employees is a second field on the wizard, and the widget is told its name through an attribute on the field element.

Beyond that flag it changes nothing. The avatars, their tooltips and the employee-specific handling all come from the widget it extends, and the tag list component it substitutes exists only to render the mark.

What this means for your team

Batch operations that report failures as a list of names in a message are hard to act on, because the reader has to map names back to the people in front of them. Marking the failures in place, among the ones that worked, keeps the comparison visible.

The wider point for custom work is the mechanism rather than the widget. Passing a second field's contents as a per-tag flag is a light way to annotate any relational display, and it needs no server-side change beyond computing that second field.

What is worth planning for is that this particular screen does not survive the next version. If your payroll process depends on the regeneration wizard, that is a change to check before upgrading, and it is a bigger question than the widget.

Supported options in Odoo 19

The widget declares no options of its own and inherits the employee avatar widget's descriptor. Its one knob is an attribute, read in the extractor without being declared, described in the note. Read from many2many_avatar_employee_error_field.js, Odoo 19.0.

OptionTypeWhat it does
in_errorstring (attribute, undeclared)Written on the field element rather than in options. Names the field holding the subset of employees to mark. Read in the extractor without being declared, so no tooling suggests it.(since Odoo 19.0)
no_createbooleanInherited from the tags widget. Removes creation from the employee input.(default: false)
no_quick_createbooleanInherited. Removes creation from the typed text while keeping the popup form path.(default: false)

The flag field is an attribute, and undeclared. It is written on the field element rather than inside the options dictionary, and the extractor reads it without the descriptor declaring it, so no tooling will suggest it. If it is missing, the per-tag lookup has no field to read and the widget fails rather than rendering unflagged avatars.

Working examples

The core usage

<field name="employee_ids"
       widget="many2many_avatar_employee_class"
       in_error="employee_in_error_ids"/>

Note that the flag field is named through an attribute, not through options. That is unusual in Odoo and easy to mistype.

The companion field

# on the wizard, holding the subset in error
employee_in_error_ids
# membership is tested per avatar

It has to be loaded on the record, since the widget reads it directly rather than declaring a dependency.

Without the flag

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

The widget it extends: the same avatars, with no error marking.

A flag computed per avatar from another field

The widget is thirty lines and does two things.

It substitutes the tag list component for a subclass whose only difference is its template, which is where the visual mark is drawn. And it overrides the method that builds each tag's properties, adding a flag computed by testing whether that employee's id appears in the current ids of the named field.

Testing against the field's current ids rather than a snapshot is what makes the marking follow the record. If the wizard recomputes which employees are in error, the avatars update without any extra wiring.

The extractor is the part to be careful with. It spreads the parent's extraction and then adds the flag field name, read from the field element's attributes. Because the descriptor does not declare it as a supported option or attribute, the only way to discover it is to read the source or a page like this one.

Its fate in the next version is not a rename. The wizard it serves is absent from the development branch, and so is the widget, so anything referring to either has to be reconsidered rather than repointed.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Neither the widget nor its wizard exists on the development branch.
Odoo 19.0VerifiedFirst version. Verified against the shipped source.
Odoo 18.0Not availableWidget does not exist.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. The widget is new in Odoo 19. Coming from Odoo 18 there is nothing to migrate. Going to Odoo 20 there is a real question: the widget and the wizard it belongs to are both absent from the development branch, so a payroll process built around regenerating work entries needs reviewing before that upgrade.

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 may still change; we re-verify the page after release.

Both the widget and its wizard are gone. There is no registration under this name on the development branch, and the work entry regeneration wizard is no longer part of the module's wizard directory.

Because an unknown widget name falls back to the field's type, a custom view still naming it would render plain avatars without the error marking, and the underlying wizard would be missing entirely. Treat this as work to redo rather than to migrate.

Common problems and fixes

SymptomCause and fix
An error when the field rendersThe flag attribute is missing or misspelled, so the per-tag lookup has no field to read. Add in_error="your_field" on the field element, spelled exactly.
No employees are markedThe named field is empty or not loaded on the record. Check that the wizard computes and loads that field.
The marking does not updateThe named field did not change; the widget reads its current ids on every tag build. Check the server-side computation of the error set.
Developer tooling does not offer the attributeIt is read in the extractor but never declared. Consult this page or the source.
The avatars render but the wizard is missingThe database is on a version where the regeneration wizard no longer exists. Review your payroll process; this is a feature removal rather than a rename.
Missing widget errorThe work entry module is not installed in that database. Install it, or use the plain employee avatar widget.

Employee avatars with errors vs the alternatives

WidgetBest forKey difference
many2many_avatar_employee_classEmployee avatar lists where some entries need flagging from another fieldMarks each avatar by testing membership in a companion field named through an attribute
many2many_avatar_employeeEmployee lists with no markingThe widget this one extends, without the error flag
many2many_avatar_userLists of internal usersUsers rather than employees, and no flag
many2many_tags_avatarAny relation shown as avatarsGeneric, with no HR-specific behavior
many2many_tagsPlain tagsNo pictures and no per-tag state

Use the employee avatar widget wherever the marking is not needed, and the general user avatar widget for non-employee records. If you want the same annotation on your own screen, the per-tag flag from a companion field is worth copying, ideally with the flag field named in options rather than in an attribute.

Frequently asked questions

How does it know which employees to mark?+
From a second field on the same record, named through an in_error attribute on the field element. Each avatar is flagged if its id appears in that field's current ids.
Why is the setting an attribute rather than an option?+
That is how it was written. The extractor reads it from the field element's attributes, and the descriptor never declares it, so no developer tooling will suggest it.
Does the marking update as the record changes?+
Yes. The membership test runs when each tag's properties are built, against the named field's current ids rather than a snapshot.
Can I use it on a non-employee relation?+
It extends the employee avatar widget, so it carries that widget's employee-specific behavior. For other relations, apply the same idea to the generic avatar widget instead.
What happens in Odoo 20?+
Both the widget and the work entry regeneration wizard it was written for are absent from the development branch. That is a feature removal, so it needs reviewing rather than repointing.

Payroll runs that flag problems before they cost you

Work entries, contract changes and the regeneration behind them are where payroll quietly diverges from reality. We implement and verify Odoo payroll data flows on versions 16 through 19.

Book a free consultation

How this page was produced

The substituted tag list, the per-tag flag computed from the named field's current ids, and the undeclared attribute read in the extractor were read from many2many_avatar_employee_error_field.js on the Odoo 19.0 branch, with the inherited behavior read from the employee avatar widget in hr. The usage comes from hr_work_entry/wizard/hr_work_entry_regeneration_wizard_views.xml. The removal was verified by searching the public development branch for the registration and by listing the module's wizard directory there. Spotted an error? Tell us and we will correct the page.