resume_one2many
The Resume block on an Odoo employee form, with its timeline dots, date ranges and grouped experience types, is resume_one2many. It is a heavily customized one2many renderer with a hardcoded grouping and one genuine rendering bug that Odoo 20 fixes.
| Technical name | resume_one2many |
|---|---|
| Field types | one2many |
| Views | form |
| Module | hr_skills |
| Used in core | 2 occurrences across 1 module: both employee form variants in hr_skills |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | No. Applied in XML with a custom inline list arch |
| Alternatives | skills_one2many, one2many, internal_resume_lines |
What the Resume timeline widget does
What this means for your team
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
create | boolean or domain | Inherited x2many crud gate for adding resume lines; also honored by the per-group Add buttons and the empty-state Create Resume Lines button. Runtime-read from options, never declared in supportedOptions.(since Odoo 17.0) |
delete | boolean or domain | Inherited x2many crud gate for removing lines; controls the trash action column the renderer keeps from the base list.(since Odoo 17.0) |
link | boolean or domain | Inherited x2many gate; relevant on many2many usage only, falls back to create when absent. The core resume field is a one2many, where it is moot.(since Odoo 17.0) |
unlink | boolean or domain | Inherited x2many gate for detaching rather than deleting on many2many usage.(since Odoo 17.0) |
write | boolean or domain | Inherited x2many gate; when false the sub-list renders readonly. The readonly gating in the generic component is itself 19-new.(since Odoo 17.0) |
The real configuration lives in the view arch, not in options. The inline <list> inside the field decides which fields the renderer can read. Omit is_course or duration there and course lines silently render like plain lines; omit description and descriptions vanish. Core ships the full list for a reason.
Working examples
The one-ref link bug and the hardcoded grouping
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | Verified | Not released. Resource ref migration fixes the link retargeting bug; see below. |
| Odoo 19.0 | Verified | Verified against the shipped source; adds the internal_resume_lines sibling widget. |
| Odoo 18.0 | Verified | Adds the new-tab link forcing on descriptions, with the single-ref limitation. |
| Odoo 17.0 | Verified | Descriptor registration introduced; options machinery works from here. |
| Odoo 16.0 | Partial / changed | Class-only registration; renders, but descriptor-level option handling does not exist. |
Upgrade note. The widget exists since 16, but 16's class-only registration means x2many option gates were not extracted there; treat 16 views as display-only compatibility. From 17 on, views carry over unchanged.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| Course duration or link icon does not appear | is_course, duration or external_url is missing from the inline list arch, so the renderer cannot read it. Add the fields to the inline <list> inside the widget field, as the core form does. |
| Links in some resume descriptions open in the same tab | The 18/19 renderer's single ref only retargets one row's description links. Known source limitation, fixed by the Odoo 20 Resource migration; harden descriptions manually if it matters. |
| The resume ignores my group_by or column setup | The renderer hardcodes grouping by line_type_id and replaces the row template entirely. Use a standard one2many widget if you need configurable columns or grouping. |
| Nothing renders where the resume should be | With zero lines and edit rights, the table hides behind the Create Resume Lines button; without the inline list arch the renderer has no fields. Check for the empty-state button, and ensure the field carries mode="list" with an inline arch. |
| New lines land without an employee or type | The context defaults are missing; core passes default_employee_id and the group buttons add default_line_type_id. Keep the context="{'default_employee_id': employee_id}" from the core arch, with employee_id loaded invisibly. |
Resume timeline widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
resume_one2many | The typed, dated resume timeline on employee forms | Fully custom timeline renderer with hardcoded type grouping and course-aware rows |
| skills_one2many | The skills matrix next to the resume on the same form | Same wizard machinery but renders leveled skill groups instead of a timeline |
| one2many | Generic editable sub-lists with configurable columns | Standard list rendering, view-controlled grouping and full option surface |
internal_resume_lines | The company-side timeline block above the resume in 19 | A view widget fetching lines via ORM call, not bound to the one2many field |
Frequently asked questions
What renders the Resume section on the Odoo employee form?+
Why must the fields be listed inside the widget's inline list arch?+
How do completed eLearning courses end up in the resume?+
Can I change how the resume is grouped?+
What does Current mean in a resume date range?+
Is the resume_one2many widget the same in Odoo 20?+
Employee data that works as hard as your team?
We implement Odoo HR with structured resumes, skills matrices and e-learning feeding one talent picture, including the custom timeline renderers and reporting layers on top, for Odoo 16 through 19.
Build my HR workspace