Guides Odoo custom module migration from v14-v17 by analyzing code for API changes, deprecations, view updates like attrs to inline conditions, and providing fix checklists.
From antigravity-awesome-skillsnpx claudepluginhub sickn33/antigravity-awesome-skills --plugin antigravity-awesome-skillsThis skill uses the workspace's default tool permissions.
Designs and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Migrating Odoo modules between major versions requires careful handling of API changes, deprecated methods, renamed fields, and new view syntax. This skill guides you through the migration process systematically, covering the most common breaking changes between versions.
odoo-upgrade.@odoo-migration-helper, specify your source and target versions, and paste your module code.| Topic | Old (v16) | New (v17) |
|---|---|---|
| View visibility | attrs="{'invisible': [...]}" | invisible="condition" |
| Chatter | <div class="oe_chatter"> | <chatter/> |
| Required/Readonly | attrs="{'required': [...]}" | required="condition" |
| Python minimum | 3.10 | 3.10+ |
| JS modules | Legacy define(['web.core']) | ES module import syntax |
| Topic | Old (v15) | New (v16) |
|---|---|---|
| Website published flag | website_published = True | is_published = True |
| Mail aliases | alias_domain on company | Moved to mail.alias.domain model |
| Report render | _render_qweb_pdf() | _render_qweb_pdf() (same, but signature changed) |
| Accounting move | account.move.line grouping | Line aggregation rules updated |
| Email threading | mail_thread_id | Deprecated; use message_ids |
attrs visibility to Odoo 17<!-- v16 — domain-based attrs -->
<field name="discount" attrs="{'invisible': [('product_type', '!=', 'service')]}"/>
<field name="discount" attrs="{'required': [('state', '=', 'sale')]}"/>
<!-- v17 — inline Python expressions -->
<field name="discount" invisible="product_type != 'service'"/>
<field name="discount" required="state == 'sale'"/>
<!-- v16 -->
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
<!-- v17 -->
<chatter/>
# v15
record.website_published = True
# v16+
record.is_published = True
--update=your_module on each version before pushing to production.HISTORY.rst for community modules.npm run validate after migration to catch manifest or frontmatter issues early.version in __manifest__.py (e.g., 17.0.1.0.0).account_accountant, sign) may have undocumented breaking changes; test on a staging environment with Enterprise license.