Skip to main content
iVentureTeam

many2manyattendeeexpandable

The attendee widget again, with a collapse. In a calendar popover there is no room for thirty avatars, so it shows the counts and lets you open the list when you want it.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated September 8, 20265 min read
Technical namemany2manyattendeeexpandable
Field typesmany2many
Viewscalendar side panel, form
Modulecalendar, the Meetings app
Used in core1 occurrence, the attendee summary in the calendar side panel in calendar
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0
No-code setupNo. It depends on calendar-specific count fields and server methods
Alternativesmany2manyattendee, many2many_tags_avatar, many2many_avatar_user, statinfo

What the expandable attendee list does

The attendee widget is designed for a form, where there is room for a row of avatars. In the calendar, the same information has to fit in a popover next to a small event block, and a company-wide meeting with forty invitees would fill it entirely.

This widget solves that by starting collapsed. Instead of every avatar it shows the numbers: how many people are invited, how many accepted, how many declined, and by subtraction how many have not answered. An expander opens the full attendee list underneath, with all the icons and flags the parent widget provides.

Nothing else changes. It is a direct subclass, so the status call, the icon map, the missing email flag, the availability flag and the organizer sort all behave exactly as they do on the full widget.

What this means for your team

This is a small but instructive piece of interface design: the same data, two densities, chosen by where it appears. A count answers the question you have while scanning a calendar, which is whether the meeting is happening. The full list answers the question you have once you have decided to look, which is who exactly.

The pattern generalizes to any relation that is short on some records and long on others. Showing the summary first and making expansion cheap avoids designing for the worst case, which is what an always-expanded list forces you to do.

One thing to know operationally: the counts are read when the popover opens. If replies arrive while you are looking at it, the numbers will not move until you reopen it.

Supported options in Odoo 19

The widget declares no options of its own and inherits the attendee widget's descriptor unchanged. What it adds are three count fields it reads from the record, listed below. Read from many2many_attendee_expandable.js, Odoo 19.0.

OptionTypeWhat it does
attendees_countcompanion fieldRead by literal name in setup. The total number of invitees shown in the collapsed summary.
accepted_countcompanion fieldRead by literal name in setup. Feeds both the accepted figure and the derived undecided figure.
declined_countcompanion fieldRead by literal name in setup. Feeds both the declined figure and the derived undecided figure.
no_quick_createbooleanInherited through the attendee widget from the tags widget. Removes creation from the typed text.(default: false)

The counts are captured once. All three are read in the component's setup and stored, rather than being read on each render, so they are a snapshot from when the popover opened. The undecided count is derived by subtracting accepted and declined from the total, so a stale total makes all four numbers stale together.

Working examples

The core usage

<field name="partner_ids"
       widget="many2manyattendeeexpandable"
       write_model="calendar.filters" filters="1"/>

Used in the calendar side panel, where space is tight and the collapsed summary is the point.

The count fields it reads

<field name="attendees_count" invisible="1"/>
<field name="accepted_count" invisible="1"/>
<field name="declined_count" invisible="1"/>

All three are read by literal name in setup. Missing any of them makes the derived undecided count wrong rather than absent.

The full list instead

<field name="partner_ids" widget="many2manyattendee"/>

The parent widget, for a form where there is room to show every avatar.

A snapshot, and the repositioning that used to be here

The subclass is fifteen lines. It points at its own template, holds one piece of local state for whether the list is expanded, reads three counts in setup and computes a fourth, and exposes a toggle for the expander.

Reading the counts in setup rather than in getters is the decision worth recording. It makes the summary a snapshot of the moment the component was created, which for a calendar popover is exactly right, since the popover is short-lived and recreated each time it opens. On a long-lived form it would be a limitation.

The undecided count is not a field. It is the total minus the accepted and declined counts, computed once alongside them. That means it inherits any staleness in the three fields and, if a custom view supplies only some of them, it will silently come out wrong rather than missing.

Odoo 18 did one thing this version does not. It contained an effect that, on non-mobile screens, looked up the calendar popover in the document and repositioned it against the event block, so that expanding the attendee list did not push the popover off screen. Odoo 19 removed that entirely, presumably because the popover positioning is now handled generically.

The development branch keeps the same structure and moves the expander toggle out of the component, which is a template-level change rather than a behavioral one.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Same behavior; the toggle moves to the template and the base widget changes underneath it.
Odoo 19.0VerifiedVerified against the shipped source. The Odoo 18 popover repositioning is removed.
Odoo 18.0VerifiedSame summary, plus an effect that repositioned the calendar popover when expanded.
Odoo 17.0VerifiedFirst version.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. No view change is needed between Odoo 17 and Odoo 19. The behavioral difference is that Odoo 18 repositioned the calendar popover when the list expanded and Odoo 19 does not; if a customization relied on that, it has to be reimplemented against the current popover handling. The widget does not exist in Odoo 16.

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.

No behavior change of its own. The counts, the derived undecided figure and the collapsed default are identical. The expander's toggle method is removed from the component, which means the template handles it directly, and the local state moves to the new reactive helper.

It does inherit the parent widget's Odoo 20 changes, which are more substantial: a new base, a dedicated attendee tag component and the new icon set. See the attendee widget's own page for those.

Common problems and fixes

SymptomCause and fix
The counts do not update as people replyAll three are read once when the component starts. Close and reopen the popover, which recreates the component.
The undecided figure is wrongIt is derived by subtracting accepted and declined from the total, so a missing or stale count skews it. Make sure all three count fields are present and computed on the meeting.
The list will not expandThe expanded state is local to the component and the toggle is on the expander element. Check for a custom template that dropped the expander.
The popover is cut off when expandedOdoo 19 removed the repositioning that Odoo 18 did here. Scroll the popover, or use the full attendee widget on a form where space allows.
No status icons inside the expanded listThat comes from the parent widget's server call, which is separate from the counts. See the attendee widget's own troubleshooting; the counts and the icons have different sources.
Missing widget errorThe calendar module is not installed in that database. Install Calendar.

Expandable attendee list vs the alternatives

WidgetBest forKey difference
many2manyattendeeexpandableAttendee lists in a popover or anywhere space is tightStarts collapsed with accepted, declined and undecided counts, expanding to the full attendee list
many2manyattendeeAttendee lists on a formAlways expanded, with no counts
many2many_tags_avatarAny list of people as avatarsNo attendee status, no counts and no calendar dependency
many2many_avatar_userInternal usersUser-aware avatars, again with no attendee status
statinfoJust a headcountOne number with a label, no list behind it

Use the full attendee widget wherever there is room, and this one where there is not. If you only need a headcount and never the list, a plain integer field with a label is lighter than either. The decision is about the space available, not about the data.

Frequently asked questions

What does the collapsed summary show?+
Four numbers: total invitees, accepted, declined, and the remainder as undecided. The last one is not a field; it is computed by subtraction.
Why do the numbers not change while I watch?+
All three source counts are read once when the component starts. In a calendar popover that is fine, because the popover is recreated each time it opens.
Does it show the same status icons as the full widget?+
Yes, once expanded. It is a direct subclass, so the status call, the icons and the email and availability flags all behave identically.
Why does the popover no longer reposition when I expand?+
Odoo 18 had an effect that repositioned the calendar popover against the event block; Odoo 19 removed it.
Which versions have it?+
Odoo 17 onwards. It does not exist in Odoo 16, and on the Odoo 20 development branch it inherits the parent widget's rebase onto the user avatar tags field.

A calendar your team trusts enough to check

Shared calendars only work when availability, invitations and external sync are all correct, and the failures are quiet. We implement Odoo Calendar and its Google and Outlook integrations on versions 16 through 19.

Book a free consultation

How this page was produced

The three counts read in setup, the derived undecided figure, the local expanded state and the toggle were read from many2many_attendee_expandable.js on the Odoo 19.0 branch, with the inherited behavior read from the attendee widget in the same module. The usage comes from calendar/views/calendar_views.xml. The removed popover repositioning was established by comparing the file on the 18.0 branch, and the Odoo 20 notes come from the public development branch. Spotted an error? Tell us and we will correct the page.