Skip to content

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 in hooks.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>
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

  1. Enable All Inspections: Use comprehensive validation from the start
  2. Address Issues Immediately: Fix violations as they appear
  3. Team Consistency: Share inspection settings across the development team
  4. 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.