with one click
odoo-migration-helper
Step-by-step guide for migrating Odoo custom modules between versions (v14→v15→v16→v17). Covers API changes, deprecated methods, and view migration.
Menu
Step-by-step guide for migrating Odoo custom modules between versions (v14→v15→v16→v17). Covers API changes, deprecated methods, and view migration.
Use when CrossFrame Suite routes explicit Chinese casebook work: turning materials into reusable cases, anonymized entries, mechanisms, and retrieval indexes.
Use only when the user explicitly names crossframe-critical for a Chinese structural critique dossier, article plan, or long-form critical essay.
Use when CrossFrame Suite routes explicit Chinese proposition testing, debate analysis, hidden-premise review, rebuttal design, or withdrawal condition checks.
Use when CrossFrame Suite routes explicit Chinese reader replies, editor responses, consultation-style short answers, or boundary-aware structural advice.
Use when explicit CrossFrame work needs a Chinese critical insight essay, commentary, concept essay, public piece, or structure-to-article draft after diagnosis.
Use when CrossFrame Suite routes explicit Chinese notes for books, theories, articles, excerpts, bidirectional reading, absorption, or conflict mapping.
| name | odoo-migration-helper |
| description | Step-by-step guide for migrating Odoo custom modules between versions (v14→v15→v16→v17). Covers API changes, deprecated methods, and view migration. |
| risk | safe |
| source | self |
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.