name: odoo-code-review description: Review Odoo code for correctness, security, performance, and version-specific standards (Odoo 17, 18, or 19). Use when reviewing Odoo modules, diffs, or pull requests; produce a scored report with weighted criteria.
Odoo Code Review
Objective
Review Odoo code changes against clear criteria, identify risks, and score using a weighted scale from an Odoo-expert perspective — using the reference pack that matches the target Odoo version.
Resolve the target Odoo version
Before reviewing, resolve ODOO_VERSION (one of 17.0, 18.0, 19.0) in this order. Stop at the first one that succeeds:
- Explicit argument passed to the agent invocation (e.g.
odoo_version: "19.0"). - Project config, in this order:
.odoo-versionfile at the repo root (contents: e.g.19.0).odoo_versionkey in.claude/odoo.json.odoo.versionkey inpackage.jsonortool.odoo.versioninpyproject.toml.
- Manifest heuristic — scan workspace
__manifest__.pyfiles for the'version'key. Use the dominant major version (e.g.18.0.1.0.0→18.0). - Fallback — default to
19.0(latest supported) and note the assumption in the review output so the user can correct it.
Derive ODOO_MAJOR from ODOO_VERSION by stripping .0 (e.g. 18.0 → 18). All guide paths below use these placeholders.
Supported versions: 17.0, 18.0, 19.0. If resolution yields anything else, stop and tell the user the version is out of scope.
Pre-review Requirements
- Read
skills/odoo-${ODOO_VERSION}/SKILL.mdas the master index for the resolved version's guides. - Read
skills/odoo-${ODOO_VERSION}/references/api-highlights.mdfor the version-distinguishing rules (what changed, what to flag, what's allowed). - Read relevant guides from
skills/odoo-${ODOO_VERSION}/references/based on change scope:- Models/ORM:
odoo-${ODOO_MAJOR}-model-guide.md - Fields:
odoo-${ODOO_MAJOR}-field-guide.md - Decorators:
odoo-${ODOO_MAJOR}-decorator-guide.md - Performance:
odoo-${ODOO_MAJOR}-performance-guide.md - Views/XML:
odoo-${ODOO_MAJOR}-view-guide.md - Security:
odoo-${ODOO_MAJOR}-security-guide.md - Controllers:
odoo-${ODOO_MAJOR}-controller-guide.md - Transactions:
odoo-${ODOO_MAJOR}-transaction-guide.md - Mixins:
odoo-${ODOO_MAJOR}-mixins-guide.md(mail.thread, activities) - Testing:
odoo-${ODOO_MAJOR}-testing-guide.md - Migration:
odoo-${ODOO_MAJOR}-migration-guide.md - Actions:
odoo-${ODOO_MAJOR}-actions-guide.md - Data Files:
odoo-${ODOO_MAJOR}-data-guide.md - Manifest:
odoo-${ODOO_MAJOR}-manifest-guide.md
- Models/ORM:
- Identify scope: module, file, and change context.
- Apply the version-distinguishing rules from
api-highlights.md(e.g.<tree>vs<list>,group_operator=vsaggregator=, optional_namein v19, etc.).
Expert Review Process
- Scope: Identify change scope, objectives, and key risks
- ORM & Model Methods: Search patterns, CRUD operations, recordset operations
- Field Definitions: Field types, computed fields, relational field parameters
- API Decorators:
@api.depends,@api.constrains,@api.ondelete,@api.model_create_multi - Performance: N+1 detection, batch operations, field selection
- Transaction Management: Savepoints,
UniqueViolation, serialization - Views & XML: Version-appropriate list tag, inheritance, structure (see
api-highlights.md) - Security: ACL, record rules, exceptions,
sudo()usage - Controllers: Auth types, CSRF protection, routing
- Mixins:
mail.thread,mail.activity.mixin,mail.alias.mixinusage - Testing: Test coverage, proper test cases,
@taggeddecorators - Migration: Migration scripts, data migration patterns
- Actions: Window actions, server actions, cron jobs
- Data Files: XML/CSV data structure,
noupdate, shortcuts - Manifest: Dependencies, external deps, hooks, assets
Complete Checklist
Rules below are version-neutral unless they reference api-highlights.md. Always combine this checklist with the version-specific highlights for the resolved ODOO_VERSION.
ORM & Model Methods (30%)
- ❌ DO NOT use
search()inside a loop (N+1 anti-pattern) - ✅ Use
search_read()when dict output needed - ✅ Use
read_group()for aggregate queries - ✅ Use
INdomain instead of search in loop:[('order_id', 'in', orders.ids)] - ✅ Batch
create([{...}, {...}])for multiple records - ✅ Use
recordset.write()instead of loop - ✅ Use
recordset.unlink()instead of loop - ✅
@api.model_create_multioncreate()overrides (seeapi-highlights.mdfor version-specific enforcement)
Views & XML (15%)
- Use the list tag appropriate to
ODOO_VERSION(seeapi-highlights.md:<tree>in 17,<list>in 18+). - Use direct-expression attrs (
invisible="...",readonly="...",required="...") — legacyattrs=/states=are rejected in 17+. - Inheritance via
xpath/position— the nested list tag must match the version. - Avoid duplicate
name=attributes in records.
Fields (15%)
Monetarywithcurrency_fieldMany2onewithondelete- Computed field with
store=Trueif filtered/searched - Aggregation parameter:
group_operator=(v17) vsaggregator=(v18+) — seeapi-highlights.md.
Decorators (10%)
@api.dependswith complete dotted paths@api.constrainsfor invariants@api.ondelete(at_uninstall=False)instead of overridingunlink()for validation@api.model_create_multifor batch create
Performance (10%)
- Avoid N+1 in loops
- Prefer
read_group()/search_read()over per-record fetches - Use
prefetch_fieldsthoughtfully
Transactions (5%)
savepointaround recoverable failures- Handle
UniqueViolationexplicitly - Advisory locks for cross-record serialization
Security (5%)
- Specific exceptions:
UserError,ValidationError,AccessError - No bare
except Exception sudo()used narrowly with justification
Controllers (3%)
- Correct
auth=(user,public,none) csrf=Falseonly with justificationtype='json'vstype='http'matches the client
Mixins (3%)
mail.threadwith proper tracking fieldsmail.activity.mixinfor activitiesmail.alias.mixinwith alias fields
Testing (2%)
- Tests for new functionality
- Proper use of
@tagged - Query count assertions for hot paths
Manifest & Data (2%)
- All dependencies declared
- External deps listed
- Hooks wired correctly
noupdate="1"for reference data
Scoring
Weight each section per the percentages above. Total out of 100. Report:
- Score per section with brief justification.
- Blocking issues (must fix before merge).
- Non-blocking suggestions.
- Explicitly name the resolved
ODOO_VERSIONat the top of the report.
Deep Dive Checks
When reviewing, thoroughly check (references below use ${ODOO_MAJOR} — substitute the resolved value):
Does
@api.dependshave complete dependencies?- Check dotted paths:
partner_id.emailinstead of justpartner_id - Missing dependencies cause N queries
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-decorator-guide.md
- Check dotted paths:
Are there N+1 queries?
- Loop with
search(),browse(),read()inside - Solution:
search_read()withINdomain orread_group() - Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-performance-guide.md
- Loop with
Are there batch operations?
create(),write(),unlink()in loop- Solution: batch operations on recordset
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-performance-guide.md
Is transaction safe?
UniqueViolationhandling without savepoint- Concurrent updates without advisory lock
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-transaction-guide.md
Are version-specific patterns correct?
- List tag, attrs syntax, aggregation parameter, optional
_name(v19). - Reference:
skills/odoo-${ODOO_VERSION}/references/api-highlights.md+odoo-${ODOO_MAJOR}-view-guide.md
- List tag, attrs syntax, aggregation parameter, optional
Are field definitions correct?
Monetarywithcurrency_fieldMany2onewithondelete- Computed field with
store=Trueif needed - Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-field-guide.md
Is exception handling correct?
UserError,ValidationError,AccessError- No generic
Exception - Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-security-guide.md
Are mixins properly configured?
mail.threadwith proper tracking fieldsmail.activity.mixinfor activitiesmail.alias.mixinwith alias fields- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-mixins-guide.md
Is testing adequate?
- Tests for new functionality
- Proper use of
@taggeddecorators - Query count assertions for performance
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-testing-guide.md
Are migrations handled correctly?
- Proper migration script location
- Pre/post migration scripts
- Idempotent operations
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-migration-guide.md
Are actions properly defined?
- Window actions with correct context
- Server actions for automation
- Cron jobs with proper intervals
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-actions-guide.md
Are data files correct?
- Proper XML record structure
noupdate="1"for reference data- CSV data properly formatted
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-data-guide.md
Is manifest correct?
- All dependencies declared
- External dependencies listed
- Hooks properly configured
- Reference:
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-manifest-guide.md