About odoo-code-review
A code review skill for Odoo developers, with guidance for Python, ORM usage, XML views and data, manifests, and review checks. It focuses on maintainability, security, performance, and upgrade safety in Odoo modules.
Key features
- 01Python style and import guidance
- 02Odoo ORM usage patterns
- 03XML view and data checks
- 04Manifest dependency and file checks
- 05Security, performance, and upgrade checklist
Use cases
- 01Reviewing Odoo Python model changes
- 02Checking XML views and data files
- 03Auditing module manifests before release
- 04Finding security and performance risks
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ nguyenhuy158/ skills --skill odoo-code-reviewAfter installing, type/odoo-code-reviewin Claude Code to confirm it loaded.
Details
From the project READMEOdoo Code Reviewer
Python Guidelines
General
- PEP8: Strictly follow PEP8 (120 chars line length is often acceptable in Odoo).
- Imports:
odooimports first.from odoo import models, fields, api, _from odoo.exceptions import UserError, ValidationError
ORM Methods
- Search: Use
search_count()instead oflen(search()). - Filtered: Use
filtered()for in-memory filtering of recordsets. - Mapped: Use
mapped()to extract values. - Write/Create: Batch operations where possible.
- SQL: Avoid direct SQL (
self.env.cr.execute) unless absolutely necessary for performance. If used, never inject variables directly; use parameters.
Fields & Models
- Naming:
- Fields:
snake_case. Many2one fields usually end with_id(e.g.,partner_id). - One2many/Many2many: usually plural (e.g.,
line_ids,tag_ids).
- Fields:
- Computed Fields: Always add
@api.depends. - Constrains: Use
@api.constrainsfor data integrity checks. - Translations: Wrap user-facing strings in
_().
XML Guidelines
Views
- Records: Use
<record id="..." model="ir.ui.view">. - Arch: All views must have an
<arch type="xml">block. - XPath: Use concise XPath expressions. Prefer
nameattributes over indices.- Bad:
//field[3] - Good:
//field[@name='description']
- Bad:
- Attributes:
invisible: Use strictly for hiding.readonly: For uneditable fields.required: For mandatory fields.
- Noids: Avoid hardcoded database IDs. Use
ref="module.xml_id".
Data Files
- NoUpdate: Use
noupdate="1"in<data>for data that shouldn't be reset on upgrade (like sequence numbers or cron jobs).
Manifest (manifest.py)
- Ensure
dependslists all required modules. - Ensure
datalists all XML/CSV files in correct order (security -> views -> data). - Ensure
licenseis specified (e.g., LGPL-3).
Review Checklist
- Security: Are access rights (ir.model.access.csv) defined?
- Performance: Are there loops doing SQL queries inside? (N+1 problem).
- Upgrade: Will this code break on module update?
- Idempotency: Can this XML be loaded multiple times without duplicating data?
Comments
Markdown supported