Code Inspection
The plugin provides comprehensive inspection tools that enforce Odoo development standards across Python, XML, and CSV files. With 70+ validation rules covering file structure, naming conventions, and Odoo-specific patterns, it ensures your code follows best practices and maintains consistency.
Overview
- Python Standards: 35+ rules across 14 categories including manifest validation, field conventions, and function naming
- XML Standards: 25+ rules across 15 categories with context-aware validation and cross-reference tracking
- CSV Standards: 15+ checks focused on access control files with sophisticated parsing
- Real-time Validation: Inline error highlighting with precise error location reporting
- Quick Fixes: Automated corrections for common issues
Python File Inspections
File Structure Standards
Encoding and Imports
python
# Required: UTF-8 encoding declaration
# -*- coding: utf-8 -*-
# Alphabetically ordered imports in __init__.py
from . import models
from . import wizards
# Individual import items must be alphabetically ordered
from odoo import api, fields, models
Manifest File (manifest.py) Standards
Required Keys Validation
python
{
'name': 'Module Name',
'summary': 'Brief module summary', # Required, must differ from description
'description': 'Detailed description', # Required, must differ from summary
'version': '16.0.1.0.0', # Required, 5-number format
'license': 'LGPL-3', # Required
'category': 'Sales', # Required
'images': ['static/description/icon.png'], # Required, cannot be empty
}
Hook Function Validation
- If hooks (
pre_init_hook
,post_init_hook
,uninstall_hook
,post_load
) are declared, corresponding functions must exist inhooks.py
Model and Class Standards
Model Naming Conventions
python
# File name must match model: sale.order → sale_order.py
# Class name must be PascalCase: sale.order → SaleOrder
class SaleOrder(models.Model):
_name = 'sale.order' # Only lowercase, dots, underscores
_description = 'Sales Order' # Required when _name is specified
Field Naming Conventions
python
class SaleOrder(models.Model):
_name = 'sale.order'
_description = 'Sales Order'
# Many2one fields must end with _id
partner_id = fields.Many2one('res.partner')
# Many2many and One2many fields must end with _ids
line_ids = fields.One2many('sale.order.line', 'order_id')
tag_ids = fields.Many2many('sale.order.tag')
Field Attributes Optimization
python
# Don't specify default behaviors explicitly
name = fields.Char(required=False) # required=False is default
amount = fields.Float(readonly=False) # readonly=False is default for stored fields
total = fields.Float(store=True) # store=True is default for non-computed fields
# Clean field definitions
name = fields.Char()
amount = fields.Float()
total = fields.Float()
# Cannot have conflicting attributes
invalid_field = fields.Char(required=True, readonly=True) # Conflict
String Attribute Standards
python
# String should start with capital letter
name = fields.Char(string='Customer Name')
# Don't specify string if it matches field name transformation
name = fields.Char(string='Name') # Redundant
# String and help cannot be identical
description = fields.Text(
string='Description',
help='Description' # Same as string
)
Function Naming Conventions
Decorator-Based Function Naming
python
class SaleOrder(models.Model):
_name = 'sale.order'
# @onchange functions: _onchange_{field_name}
@api.onchange('partner_id')
def _onchange_partner_id(self):
pass
# @constrains functions: _check_{field_name}
@api.constrains('amount_total')
def _check_amount_total(self):
pass
# Compute functions: _compute_{field_name}
@api.depends('line_ids.price_subtotal')
def _compute_amount_total(self):
pass
# Default functions: _default_{field_name}
@api.model
def _default_currency_id(self):
return self.env.company.currency_id
Default Function Standards
python
class SaleOrder(models.Model):
_name = 'sale.order'
# Use lambda to call default functions
currency_id = fields.Many2one(
'res.currency',
default=lambda self: self._default_currency_id()
)
# Default functions must have @api.model decorator
@api.model
def _default_currency_id(self):
return self.env.company.currency_id
XML File Inspections
Record Tag Standards
Basic Structure
xml
<!-- Record must have id and model attributes, id before model -->
<record id="view_sale_order_form" model="ir.ui.view">
<!-- Field tags must have name attribute first -->
<field name="name">sale.order.view.form</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<form>
<field name="name"/>
</form>
</field>
</record>
Data Tag Standards
xml
<!-- Use noupdate="1" for non-updatable data -->
<data noupdate="1">
<record id="demo_record" model="sale.order">
<field name="name">Demo Order</field>
</record>
</data>
View Naming Conventions
Automatic View Type Detection
xml
<!-- View names: {model.name}.view.{view_type} -->
<record id="sale_order_view_form" model="ir.ui.view">
<field name="name">sale.order.view.form</field> <!-- Auto-detected: form -->
<field name="model">sale.order</field>
<field name="arch" type="xml">
<form> <!-- View type detected from arch -->
<field name="name"/>
</form>
</field>
</record>
<!-- View IDs: {model_name}_view_{view_type} -->
<record id="sale_order_view_tree" model="ir.ui.view">
<field name="name">sale.order.view.tree</field> <!-- Auto-detected: tree -->
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record>
Menu Item Standards
Menu Naming Patterns
xml
<!-- Menu IDs: {model_name}_menu_{action_description} -->
<menuitem id="sale_order_menu_main"
name="Sales Orders"
action="sale_order_action"
parent="sale.sale_menu_root"/>
<!-- Pattern validation: ^[a-z0-9]+(_[a-z0-9]+)*_menu(_[a-z0-9]+)*$ -->
Security Standards
Access Rules (ir.rule)
xml
<!-- Rule IDs: {model_name}_rule_{group_type} -->
<record id="sale_order_rule_company" model="ir.rule">
<field name="name">Sale Order: Multi-Company</field>
<field name="model_id" ref="model_sale_order"/>
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
<!-- Auto-detected as 'company' rule (domain contains company_id) -->
</record>
<record id="sale_order_rule_user" model="ir.rule">
<field name="name">Sale Order: User Access</field>
<field name="model_id" ref="model_sale_order"/>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
<!-- Auto-detected as 'user' rule (base.group_user) -->
</record>
Group Standards (res.groups)
xml
<!-- Group IDs: {module_name}_group_{group_name} -->
<record id="sale_management_group_manager" model="res.groups">
<field name="name">Sales Manager</field>
<!-- Module name auto-detected from file path -->
</record>
Action Standards
Window Actions
xml
<!-- Action IDs: {model_name}_action -->
<record id="sale_order_action" model="ir.actions.act_window">
<field name="name">Sales Orders</field>
<field name="res_model">sale.order</field>
<field name="view_mode">tree,form</field>
<!-- Model name derived from filename -->
</record>
Advanced XML Features
Cross-Reference Validation
- Menu-Action Relationships: Tracks and validates consistency between menu items and their corresponding actions
- Context-Aware Validation: Uses file path to determine module name and expected patterns
- Pattern Matching: Intelligent model name extraction and dot-to-underscore conversions
CSV File Inspections
Access Control Files (ir.model.access.csv)
File Structure Requirements
csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
# Must have header + data (minimum 2 lines)
# Required columns: id, name, model_id
Naming Convention Validation
csv
# Access rule IDs: access_{model_name}
# Access rule names: access.{model.name}
access_sale_order,access.sale.order,model_sale_order,base.group_user,1,1,1,1
access_account_move,access.account.move,model_account_move,base.group_user,1,0,0,0
Advanced CSV Processing
- Quote Handling: Properly processes quoted fields with embedded commas
- Escape Sequences: Handles escaped quotes within fields
- Precise Error Location: Calculates exact character offsets for error highlighting
- Field-Level Reporting: Points to specific problematic CSV fields
Example Transformations
csv
# Model Reference → Expected ID → Expected Name
model_sale_order → access_sale_order → access.sale.order
model_account_move → access_account_move → access.account.move
model_res_partner → access_res_partner → access.res.partner
Advanced Inspection Features
Context-Aware Validation
- File Path Analysis: Uses file structure to determine module names and expected patterns
- Cross-Reference Tracking: Links related elements (menus↔actions, models↔views) for consistency
- Intelligent Pattern Detection: Automatically derives expected names from file context
Error Reporting
- Precise Location: Exact line and character position for all errors
- Contextual Messages: Specific expected values and patterns
- Real-time Feedback: Immediate validation as you type
Pattern Intelligence
- Model Name Extraction: Converts between different naming formats (dots↔underscores)
- View Type Detection: Automatically identifies view types from XML structure
- Group Type Classification: Categorizes security rules based on group references
Inspection Control
You can now enable or disable individual inspections for Odoo standards.
To configure inspection settings, navigate to:
Settings → Editor → Inspections → Cybrosys Assista
The following inspection options are available:
- Assista Py-Inspection – Enables/disables Python standard inspections.
- Assista XML-Inspection – Enables/disables XML standard inspections.
- Assista CSV-Inspection – Enables/disables CSV standard inspections.
Best Practices
Development Workflow
- Enable All Inspections: Use comprehensive validation from the start
- Address Issues Immediately: Fix violations as they appear
- Team Consistency: Share inspection settings across the development team
- Regular Reviews: Periodically review and update inspection rules
Code Quality Maintenance
- Follow Naming Conventions: Consistent patterns improve code readability
- Use Proper Structure: Organize files and directories according to Odoo standards
- Validate Early: Catch issues during development, not deployment
Summary Statistics
- Total Standards: 70+ validation rules
- Python Coverage: 35+ rules across 14 categories
- XML Coverage: 25+ rules across 15 categories
- CSV Coverage: 15+ checks with sophisticated parsing
- Advanced Features: Cross-reference tracking, context-aware validation, pattern matching
The inspection system provides comprehensive coverage of Odoo development standards, ensuring code quality and consistency across your entire project.