with one click
odoo
Access Odoo ERP at 100.100.1.2:8069 using OdooRPC Python library
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Access Odoo ERP at 100.100.1.2:8069 using OdooRPC Python library
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Run the self-improvement pipeline to analyze usage, plan, and apply Claude Code configuration improvements
Create, schedule, and manage autonomous AI-agent tasks with systemd timers
Create and manipulate Obsidian Canvas (.canvas) files using the JSON Canvas spec
Create a git commit with proper conventional commit message
Code generation, exploration, and image analysis via Codex CLI
Query Gemini CLI for quick lookups, deep research, and approach comparison
| name | odoo |
| description | Access Odoo ERP at 100.100.1.2:8069 using OdooRPC Python library |
Use OdooRPC to interact with Odoo at 100.100.1.2:8069.
Use the ODOO_API_KEY environment variable (injected automatically):
import os, odoorpc
odoo = odoorpc.ODOO('100.100.1.2', port=8069)
odoo.login('odoo', 'claude@localhost', os.environ['ODOO_API_KEY'])
Run Python with OdooRPC:
nix run /home/dtgagnon/nix-config/nixos#odoorpc -- -c "CODE"
Example - list databases:
nix run /home/dtgagnon/nix-config/nixos#odoorpc -- -c "import odoorpc; odoo = odoorpc.ODOO('100.100.1.2', port=8069); print(odoo.db.list())"
Example - authenticated query:
nix run /home/dtgagnon/nix-config/nixos#odoorpc -- -c "
import os, odoorpc
odoo = odoorpc.ODOO('100.100.1.2', port=8069)
odoo.login('odoo', 'claude@localhost', os.environ['ODOO_API_KEY'])
print(odoo.env.user.name)
"
Partner = odoo.env['res.partner']
partner = Partner.browse(1)
print(partner.name)
# Search returns IDs
ids = Partner.search([('is_company', '=', True)], limit=10)
# Read returns field values
data = Partner.read(ids, ['name', 'email'])
# Combined search_read
records = Partner.search_read([('is_company', '=', True)], ['name', 'email'], limit=10)
new_id = Partner.create({'name': 'New Partner', 'email': 'new@example.com'})
Partner.write([partner_id], {'name': 'Updated Name'})
# Or via browse
partner.name = 'Updated Name'
Partner.unlink([partner_id])
result = Partner.execute('method_name', arg1, arg2, kwarg=value)
| Model | Purpose |
|---|---|
| res.partner | Contacts/customers |
| res.users | System users |
| sale.order | Sales orders |
| purchase.order | Purchase orders |
| account.move | Invoices/journals |
| product.product | Products |
| stock.picking | Inventory transfers |
| project.task | Tasks |
# Operators: =, !=, >, <, >=, <=, like, ilike, in, not in
[('field', 'operator', value)]
# AND (default)
[('is_company', '=', True), ('country_id.code', '=', 'US')]
# OR
['|', ('name', 'ilike', 'test'), ('email', 'ilike', 'test')]
fields = odoo.env['res.partner'].fields_get()
NEVER assign tasks to Claude Bot (user ID 7, login claude@localhost). All tasks must be assigned to Derek Gagnon (user ID 2, login gagnon.derek@pm.me).
When creating or updating tasks in project.task, always use:
derek_id = 2 # Derek Gagnon
Task.create({'name': 'Task name', 'user_ids': [(6, 0, [derek_id])], ...})
When doing bulk updates that would trigger emails, use context to disable notifications:
context = {
'mail_create_nosubscribe': True,
'mail_notrack': True,
'tracking_disable': True,
'mail_auto_subscribe_no_notify': True,
}
odoo.execute_kw('project.task', 'write', [[task_id], values], {'context': context})