skills_one2many
The skills block on an Odoo employee form is not a normal one2many list. skills_one2many ships its own renderer with hardcoded grouping, permission checks, and a report shortcut.
| Technical name | skills_one2many |
|---|---|
| Field types | one2many, many2many |
| Views | form |
| Module | hr_skills |
| Used in core | 3 occurrences across 2 modules: employee forms in hr_skills and applicant forms in hr_recruitment_skills |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | No. Applied via the widget attribute in view XML |
| Alternatives | one2many, resume_one2many, many2many_tags, section_one2many |
What the Skills list 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 skills. Read from the options dict at runtime; never declared in supportedOptions. Moves to a view attribute on the Odoo 20 development branch. |
delete | boolean or domain | Inherited x2many crud gate for removing skill lines. Same runtime-read, undeclared status as create. |
link | boolean or domain | Inherited x2many gate controlling the Add button on many2many usage; falls back to create when absent. |
unlink | boolean or domain | Inherited x2many gate for detaching rather than deleting on many2many usage. |
write | boolean or domain | Inherited x2many gate; when false the sub-list renders readonly. The readonly gating itself is 19-new in the generic component. |
no_timeline goes in context, not options. The renderer reads this.props.list.context.no_timeline, so writing it into options="{...}" does nothing. Core's applicant view passes it via the field's context attribute.
Working examples
Permissions, grouping, and the 18 to 19 save change
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | In development | Not released. Widget file identical on the development branch, but inherited crud options move to attributes upstream; details below. |
| Odoo 19.0 | Verified | Verified against the shipped source. Update Skills dialog, no parent autosave, new history report model. |
| Odoo 18.0 | Partial / changed | Same widget, but the dialog is titled Select Skills, each skill save also saves the parent record, and the report uses hr.employee.skill.log. |
| Odoo 17.0 | Verified | Present at the current file path with the same renderer architecture. |
| Odoo 16.0 | Partial / changed | Present under the older hr_skills file layout with the same registration name and a simpler renderer. |
Upgrade note for 18 to 19. Skills stopped saving the parent record on every skill edit, the wizard title changed, and the history report moved to a new model. If you patched hr.employee.skill.log reports or relied on the immediate parent save, both need attention during an Odoo migration.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| Timeline and Skills Report missing for a manager | The extras show only to HR users or managers whose subordinate tree contains the employee. Check the employee's manager chain or grant hr.group_hr_user. |
| no_timeline in options has no effect | The renderer reads it from the field's context, not from options. Pass context="{'no_timeline': True}" on the field. |
| Skills block shows a prompt about skill types instead of skills | No hr.skill.type records exist yet; the renderer checks the count at load. Configure skill types first, via the shortcut the widget offers or the Skills settings. |
| Skills edits no longer save instantly after upgrading to 19 | Odoo 19 removed the automatic parent-record save that 18 performed after each skill change. Save the form as with any one2many; retrain users if needed. |
| Cannot group skills by something other than type | Grouping is a hardcoded getter returning skill_type_id. Subclass SkillsListRenderer in a custom module to override groupBy. |
Skills list vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
skills_one2many | Employee and applicant skills with levels and progress | Purpose-built renderer: fixed grouping, gated timeline, tuned dialog |
| one2many | Generic child-record grids | Plain rows, configurable columns, no skills logic |
resume_one2many | The employee resume timeline block | Same renderer family tuned for resume lines |
| many2many_tags | Flat tagging without levels | Pills with no level, progress, or grouping |
| section_one2many | Sectioned lists like planning slots | Sections come from a display_type row, not a related field |
Frequently asked questions
What does skills_one2many add over a plain one2many?+
Who sees the skills timeline and report button?+
How do I hide the timeline?+
Can I group skills by level or by certification instead of type?+
Why did skills behave differently after upgrading from Odoo 18?+
Does the widget work on many2many fields?+
Skills data that HR actually maintains?
We implement Odoo Skills Management end to end: skill taxonomies, levels, recruitment matching, and the custom renderers when the stock matrix is not enough. From HR module setup to bespoke widgets, on Odoo 16 through 19.
Book a free consultation