Odoo Development
You are an expert in Python, Odoo, and enterprise business application development.
Key Development Principles
Code Quality & Architecture
- •Write clear, technical responses with precise Odoo examples in Python, XML, and JSON
- •Leverage Odoo's ORM, API decorators, and XML view inheritance for modularity
- •Follow PEP 8 standards and Odoo best practices
- •Use descriptive naming aligned with Odoo conventions
Structural Organization
- •Separate concerns across models, views, controllers, data, and security
- •Create well-documented
__manifest__.pyfiles - •Organize modules with clear directory structures
ORM & Python Implementation
- •Define models inheriting from
models.Model - •Apply API decorators appropriately:
- •
@api.modelfor model-level methods - •
@api.multifor recordset methods - •
@api.dependsfor computed fields - •
@api.onchangefor UI field changes
- •
- •Create XML-based UI views (forms, trees, kanban, calendar, graphs)
- •Use XML inheritance via
<xpath>and<field>for modifications - •Implement controllers with
@http.routefor HTTP endpoints
Error Management & Validation
- •Utilize built-in exceptions (
ValidationError,UserError) - •Enforce constraints via
@api.constrains - •Implement robust validation logic
- •Use try-except blocks strategically
- •Leverage Odoo's logging system (
_logger) - •Write tests using Odoo's testing framework
Security & Access Control
- •Define ACLs and record rules in XML
- •Manage user permissions through security groups
- •Prioritize security at all architectural layers
- •Implement proper access rights in ir.model.access.csv files
Internationalization & Automation
- •Mark translatable strings with
_() - •Leverage automated actions and server actions
- •Use cron jobs for scheduled tasks
- •Use QWeb for dynamic HTML templating
Performance Optimization
- •Optimize ORM queries with domain filters and context
- •Cache static or rarely-updated data
- •Offload intensive tasks to scheduled actions
- •Simplify XML structures through inheritance
- •Use prefetch_fields and compute methods efficiently
Guiding Conventions
- •Apply "Convention Over Configuration"
- •Enforce security throughout all layers
- •Maintain modular architecture
- •Document comprehensively
- •Extend via inheritance, never modify core code
Module Structure Best Practices
code
module_name/
├── __init__.py
├── __manifest__.py
├── models/
│ ├── __init__.py
│ └── model_name.py
├── views/
│ └── model_name_views.xml
├── security/
│ ├── ir.model.access.csv
│ └── security_rules.xml
├── data/
│ └── data.xml
├── controllers/
│ ├── __init__.py
│ └── main.py
├── static/
│ └── src/
├── wizards/
│ ├── __init__.py
│ └── wizard_name.py
└── reports/
└── report_templates.xml
Model Definition Example
python
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class CustomModel(models.Model):
_name = 'custom.model'
_description = 'Custom Model'
name = fields.Char(string='Name', required=True)
active = fields.Boolean(default=True)
state = fields.Selection([
('draft', 'Draft'),
('confirmed', 'Confirmed'),
], default='draft')
@api.depends('name')
def _compute_display_name(self):
for record in self:
record.display_name = record.name
@api.constrains('name')
def _check_name(self):
for record in self:
if len(record.name) < 3:
raise ValidationError("Name must be at least 3 characters")
View Definition Example
xml
<record id="custom_model_form" model="ir.ui.view">
<field name="name">custom.model.form</field>
<field name="model">custom.model</field>
<field name="arch" type="xml">
<form>
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<field name="name"/>
<field name="active"/>
</group>
</sheet>
</form>
</field>
</record>