Skip to main content
iVentureTeam

res_user_group_ids_privilege

This widget draws a single privilege row inside the access rights grid, including the warning triangle for conflicting groups. Its own source carries a notice telling you not to use it anywhere else.

September 18, 2026Updated September 18, 20264 min read
Technical nameres_user_group_ids_privilege
Field typesselection, boolean (generated)
Viewsform
Moduleweb, present in every Odoo database
Used in core0 uses as a widget attribute. It is instantiated by the form that res_user_group_ids generates at runtime.
VersionsOdoo 19.0, Odoo 20.0
No-code setupNo. This is an internal component, not a widget you apply.
Alternativesres_user_group_ids, selection, boolean

What the res_user_group_ids_privilege widget does

The access rights grid is assembled by res_user_group_ids, which generates a form view at runtime. Each privilege in that generated form is rendered by this widget.

A row is a selection or a boolean, plus a small icon that opens a popover explaining what the selected group grants. The widget works out which group is currently selected, which group is implied by another selection, and whether any of them conflict.

It is registered in the fields registry like any other widget, which is why it turns up in a registry listing. That is the only sense in which it is a widget you could use.

What this means for your team

The part of this that matters outside a development team is the warning triangle. When two selected groups are marked as disjoint, meaning they should not be held together, this row stops showing an information icon and shows a red triangle instead.

Administrators tend to read that as decoration. It is not. It is Odoo saying the combination of access rights on this user is contradictory, and it is worth stopping to read the popover before saving.

Working examples

There is no correct example of applying this widget yourself. The source says so directly:

/*
 * /!\ This widget is not meant to be used anywhere else than inside form view
 * dynamically generated by the res_user_group_ids widget.
 */

What you apply is the parent, which builds the rows itself:

<field name="group_ids" widget="res_user_group_ids" nolabel="1"/>

Why it cannot work on its own, and what the red triangle means

The dependency is not a convention, it is structural. In setup the component reaches into its environment:

setup() {
    this.isDebug = odoo.debug;
    this.popover = usePopover(ResUserGroupIdsPopover);
    this.groups = this.env.resUserGroupsInfo.groups;
}

resUserGroupsInfo is put into a child sub-environment by res_user_group_ids. Nothing else in Odoo provides it. Put this widget on an ordinary field and the lookup fails immediately, because the environment has no such key. That is why it is registered but has zero usages: the registration exists so the generated form can resolve it by name.

The icon logic is the useful part to know:

get infoButtonClassnames() {
    const invisible = !this.isSet && !this.impliedGroup?.id;
    const isDisjoint = this.isDisjoint;
    return {
        ...
        "fa-info-circle": !isDisjoint,
        "fa-exclamation-triangle": isDisjoint,
        "link-danger": isDisjoint,
    };
}

Three states. No icon at all when nothing is set and nothing is implied. An information circle when a group is selected or implied and everything is consistent. A red exclamation triangle when the selected group is disjoint from another the user holds.

The row also distinguishes a group the administrator chose from one that arrived through implication. A privilege the user did not set explicitly but holds anyway, because another group implies it, still shows an icon and names the implying group in the popover. That is the mechanism behind the common support question of why a user has an access right nobody granted them.

Version compatibility

VersionStatusNotes
Odoo 19.0VerifiedVerified against the shipped 19.0 source. Internal use only.
Odoo 20.0VerifiedVerified against the 20.0 branch. No changes.

Unchanged between the two branches we checked.

What is changing in Odoo 20

No change. Diffing the registration between the 19.0 and 20.0 branches shows no options added or removed and no registration changes.

One Odoo 19 registration variant, form.hr_presence_status_private, was removed from a neighboring widget in Odoo 20, but this one keeps both of its registrations.

Common problems and fixes

SymptomCause and fix
The widget throws when applied to a normal fieldIt reads this.env.resUserGroupsInfo, a sub-environment only res_user_group_ids provides. Do not apply it directly. Use res_user_group_ids, which renders these rows itself.
A red warning triangle appears next to a privilegeThe selected group is disjoint from another group the user holds. The widget swaps fa-info-circle for fa-exclamation-triangle. Open the popover and resolve the conflicting access rights before saving.
A user holds a privilege nobody selectedAnother group implies it. The row shows the implied group rather than an explicit selection. Check the popover, which names the implying group, then adjust that group instead.

Res_user_group_ids_privilege widget vs the alternatives

WidgetBest forKey difference
res_user_group_ids_privilegeOne privilege row inside the generated access rights formInternal by design: depends on a sub-environment only its parent provides
res_user_group_idsThe whole access rights gridThe widget you actually apply, which renders these rows
selectionAn ordinary selection fieldNo group logic, no popover and no conflict warning
booleanAn ordinary checkboxNo implication or disjoint handling

There is no alternative because there is no standalone use. If you want the access rights grid, apply res_user_group_ids. If you want to read group membership for an audit, read group_ids directly with a plain relational widget, which shows the real memberships rather than the presentation layer.

Frequently asked questions

Can I use res_user_group_ids_privilege in my own Odoo view?+
No. Its source carries an explicit notice against it, and it reads this.env.resUserGroupsInfo, a sub-environment only the res_user_group_ids widget provides. Applied elsewhere it fails at setup.
What does the red triangle next to an Odoo access right mean?+
It means the selected group is disjoint from another group the user holds, so the combination is contradictory. The widget swaps the information icon for fa-exclamation-triangle with a danger color. Open the popover to see the conflict.
Why does a user have an access right nobody granted?+
Because another group implies it. This row distinguishes an explicitly selected group from an implied one and names the implying group in its popover, which is usually where that question gets answered.

Conflicting access rights nobody has resolved?

Odoo flags disjoint groups with a small red triangle that almost everyone scrolls past, and implied groups grant rights nobody remembers granting. We audit the real permission set per user and document who can do what.

Request an access rights audit

How this page was produced

Verified by reading addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_privilege_field.js on the 19.0 branch of a local clone of the official Odoo repository. The warning notice, the this.env.resUserGroupsInfo dependency and the icon class logic are quoted verbatim. The registration was diffed against the 20.0 branch. The zero usage count comes from scanning every XML file in Community, Enterprise and odoo/addons/base. Corrections welcome via our contact page.