đ§© Odoo â Guide âSenior Odoo Developerâ (Web & Dev)
Odoo = ERP/CRM web modulaire basé sur Python + PostgreSQL, avec un framework applicatif complet (ORM, sécurité, vues, workflows). Guide densifié : architecture, modules, dev backend/JS, perf, CI/CD, migrations, intégrations.
Odoo, câest quoi ?
ERP web open-source / enterprise : Apps métiers + framework Python.
ERPWebPostgreSQLĂcosystĂšme & modules
CRM, Sales, Accounting, Inventory, Manufacturing, HR⊠+ custom.
AppsModulesAddonsRĂŽle Senior Odoo Dev
Tech lead, architecture, intégrations, perf, migrations, qualité.
LeadIntegrationQualityArchitecture Odoo
Server, ORM, models, views, actions, security, workers, DB.
ORMMVC-ishWorkersModÚle de données
Models, fields, relations, computed fields, constraints, SQL views.
ModelsFieldsRelationsSécurité & droits
ACL, record rules, groups, sudo(), multi-company, audit.
ACLRecord rulesMulti-companyDev Backend (Python)
Modules, models, business logic, ORM, controllers, cron jobs.
PythonORMCronUI / Web Client
Views XML, actions, menus, QWeb, OWL/JS, widgets.
XMLQWebOWLIntégrations & API
REST/JSON-RPC, webhooks, ETL, connecteurs (Stripe, SAP, etc.).
APIETLConnectorsDéploiement & Ops
Docker, Nginx, workers, scaling, backups, monitoring.
DockerNginxPostgresPerformance
ORM patterns, prefetch, indexes, cron offloading, caching.
SQLIndexesCacheMigrations & upgrades
Version jumps, data migration, compat modules, tests.
UpgradeData migrationRegressionCheat-sheet Senior
Questions dâentretien, checklists, patterns, anti-patterns.
InterviewChecklistPatternsDĂ©finition âtechâ
Odoo est un ERP/CRM web modulaire avec un framework applicatif complet : ORM, modÚles, vues, workflows, sécurité, moteur de reporting, jobs planifiés (cron), bus de notifications, multi-sociétés, et une UI web riche.
Deux mondes
- Odoo Standard : modules officiels + paramétrage (fonctionnel).
- Odoo Custom : développement de modules, intégrations, perf, migrations (tech).
DĂ©finition âmĂ©tierâ
Odoo assemble des apps mĂ©tiers (Ventes, Achats, Stock, ComptabilitĂ©, HRâŠ) autour dâun modĂšle de donnĂ©es cohĂ©rent. LâintĂ©rĂȘt : âun seul systĂšmeâ plutĂŽt que 10 outils isolĂ©s.
| Atout | Impact |
|---|---|
| Modularité | On installe/compose par apps, on ajoute du custom proprement. |
| Time-to-market | Beaucoup est déjà là (workflows, UI, droits, mails, reporting). |
| Data model | Relations inter-apps natives (ex: sale â stock â invoice). |
| Extensibilité | Modules + API + intégrations externes. |
Pourquoi les boĂźtes choisissent Odoo ?
- Remplacer des Excel/outils dispersés par un ERP unifié.
- Personnaliser vite (modules + UI) sans ârĂ©inventerâ un CRM/ERP.
- Automatiser : facturation, stock, procurement, workflows, approvals.
- Intégrer : paiement, e-commerce, BI, data warehouse, EDI, marketplaces.
Ce qui fait gagner du temps au dev
- ORM + relations + computed fields
- UI générée via views (form/tree/kanban/search)
- Sécurité (groups, ACL, record rules)
- Mail/threading, activities, templates
- Scheduled actions (cron)
Odoo âdans le monde du web & devâ
Backend
- Serveur applicatif Odoo (Python) + modules.
- ORM au-dessus de PostgreSQL.
- Controllers HTTP (site, API, portail).
Frontend
- Web client riche (JS), composants OWL selon versions.
- Templates QWeb pour rendu/rapports/website.
- Widgets UI, actions, menus, search views.
Ops / Platform
- Reverse proxy (Nginx), TLS, caching statiques.
- Workers, cron workers, scaling horizontal.
- Monitoring: logs, métriques, Postgres perf.
- Backups & disaster recovery.
Quand Odoo est un trĂšs bon choix
- PME/ETI : besoin ERP modulaire, rapide à déployer.
- Cas mĂ©tier âstandardâ + quelques personnalisations.
- Besoin de centralisation données et workflows.
Quand il faut cadrer (ou éviter)
- VolontĂ© de âtout customiser comme un produit sur mesureâ â risque explosion coĂ»ts.
- TrĂšs haute charge web transactionnelle type marketplace gĂ©ante â Odoo peut nĂ©cessiter architecture spĂ©cifique (cache, offload, microservices autour).
- Contraintes BI/temps rĂ©el trĂšs strictes â prĂ©voir CDC/ETL/replication vers DWH.
Modules âcoreâ (exemples)
| Domaine | Apps | Exemples de flux |
|---|---|---|
| Sales | CRM, Sales | Lead â Opportunity â Quote â Order |
| Finance | Invoicing, Accounting | Order â Invoice â Payment â Reconcile |
| Supply | Inventory, Purchase | Reorder rules â PO â Receipt â Stock moves |
| Industry | MRP, PLM, Quality | BOM â Work orders â QC â Delivery |
| People | Employees, Payroll | Contracts â Timesheets â Payroll |
Ces modules sont interconnectĂ©s via modĂšles/relations (câest une force⊠et une source de complexitĂ©).
Custom modules : bonnes pratiques
Pourquoi faire un module custom
- Ajouter un modĂšle mĂ©tier (ex: âAssetsâ, âContractsâ, âTicketsâ).
- Ătendre un module existant (champs, rĂšgles, workflow).
- Intégrer un SI externe (webhooks, sync, EDI).
Ce quâun module contient
my_module/
- __manifest__.py
- models/*.py
- views/*.xml
- security/ir.model.access.csv
- data/*.xml (actions, sequences, emails)
- static/src/* (JS/CSS, widgets)
RĂšgles âseniorâ
- Limiter lâover-custom : prefer config > custom code si possible.
- Respecter conventions Odoo (naming, inheritance, super()).
- Ăviter âwrite()â lourds en boucle : batcher.
- Tester : unit + flows critiques (invoicing/stock).
- Documenter : README + migration notes.
Website / eCommerce
- CMS + pages, templates QWeb, thĂšmes.
- eCommerce : produits, variantes, panier, checkout, paiement.
- Portail client : commandes, factures, tickets, documents.
Patterns:
- intégrer un PSP (Stripe/Adyen) via connecteur
- webhooks paiement -> update invoice/payment state
- anti-fraude / logging / monitoring
Enterprise & services
- Fonctionnalités additionnelles selon éditions et modules.
- SSO/LDAP, avancĂ© reporting, apps âverticalesâ.
- Odoo.sh / hosting : pipelines, staging, backups (selon offre).
En entretien : savoir parler âtrade-offsâ entre on-prem, cloud managĂ© et Odoo.sh.
Ce quâon attend souvent dâun Senior
- Concevoir lâarchitecture modules + conventions.
- Encadrer devs + code reviews + qualité.
- Gérer intégrations critiques (paiement, EDI, BI, legacy).
- Optimiser performances (ORM/SQL) + stabiliser prod.
- Préparer upgrades/migrations avec stratégie de risque.
Interface avec le fonctionnel
- Traduire processus métier en modÚles/workflows.
- Arbitrer : configuration vs custom dev.
- Accompagner UAT, bug triage, priorisation.
Compétences attendues (tech)
| Zone | Compétences |
|---|---|
| Backend | Python, ORM Odoo, inheritance, compute fields, constraints, cron, controllers |
| DB | PostgreSQL, indexes, query plans, vacuum/maintenance, locks |
| UI | Views XML, actions/menus, QWeb, JS/OWL, widgets |
| Security | ACL, record rules, groups, sudo(), multi-company |
| Ops | Docker, reverse proxy, scaling, logs/metrics, backups, release process |
| Delivery | CI/CD, tests, lint, versioning, migration plans |
Deliverables âseniorâ typiques
- Blueprint repo : structure addons, conventions, guidelines.
- Modules robustes + documentation + tests.
- Integration layer (API) + retries + idempotence + monitoring.
- Plan dâupgrade + check compat + rollout staging â prod.
- Dashboard perf + playbooks incidents (logs, slow queries).
Red flags (pour Ă©viter les projets âpainfulâ)
- Custom massif sans spec claire, sans tests, sans staging.
- Tout le monde admin (sécurité inexistante).
- DB non maintenue, pas de backups, pas dâILM logs.
- Upgrades repoussĂ©s 3 ans â dette Ă©norme.
- Pas de process PR, pas de code review.
Vision dâensemble
[Browser]
ââ Web client (JS/OWL) + Views (XML/QWeb)
â HTTP/JSON-RPC
âŒ
[Odoo Server (Python)]
- ORM: models, fields, computed fields
- Security: groups, ACL, record rules
- Business logic: create/write, constraints, onchange
- Controllers: website / api
âŒ
[PostgreSQL]
- tables / indexes
- transactions
- performance & locks
Odoo ressemble Ă un framework web + un framework ERP + une âmeta-plateforme dâappsâ.
Cycle dâune action utilisateur
- Lâutilisateur clique (UI) â action (open view / call method).
- Le client envoie une requĂȘte (souvent JSON-RPC) au serveur.
- Odoo exécute logique ORM (read/search/write + rules + constraints).
- Réponse : dataset + view rendering / UI refresh.
Hotspots perf:
- search() sans index
- compute fields en cascade
- loops create/write (N+1)
- record rules coûteuses (domain complexes)
Modules : extension propre
- Inheritance : étendre modÚles existants sans fork (idéal).
- Views : ajouter champs/onglets/boutons via XML.
- Data : sequences, mail templates, scheduled actions.
Patterns:
- _inherit = "res.partner" (extend)
- new model (business entity)
- server actions / automated actions (low-code)
Workers & scheduled jobs
- Cron jobs (scheduled actions) : sync, batch, exports.
- External integrations : retry, dead-letter, idempotence.
- Long tasks : éviter de bloquer les workers HTTP.
Senior tip:
- séparer "web workers" et "cron workers"
- batcher les traitements (commit chunked)
- log structuré + monitoring
Fields (concepts)
- Simple: Char, Integer, Float, Boolean, Date/Datetime
- Business: Monetary, Selection, Many2one/One2many/Many2many
- Meta: related fields, stored vs non-stored, tracking (chatter)
Good practice:
- index=True sur champs filtrés
- éviter champs "libres" trop nombreux (qualité data)
- normaliser (selection) plutĂŽt que texte libre
Relations
| Type | Usage | Exemple |
|---|---|---|
| Many2one | FK | invoice.partner_id |
| One2many | inverse | partner.invoice_ids |
| Many2many | table pivot | sale.tag_ids |
Senior tip : comprendre lâimpact SQL et Ă©viter les boucles ORM sur des relations massives.
Computed fields : puissance & risques
- Compute : calcul auto, dépendances, store ou not.
- Risques : cascades (recompute), perf, locks, batch updates.
Perf rules:
- compute en batch (vectorisé sur recordset)
- minimiser queries à l'intérieur du compute
- store=True si utilisé en search/sort
Contraintes
- Python constraints : rÚgles métier (cohérence)
- SQL constraints : unicité, check (plus robustes)
- Onchange : UX (pré-validation), pas une sécurité
Senior tip:
- "onchange" améliore UX
- "constraints" garantissent l'intégrité
- SQL constraints si possible (plus safe)
Couches de sécurité
| Couche | RĂŽle | Exemples |
|---|---|---|
| Groups | profils | Sales user, Accounting manager |
| ACL | CRUD par modĂšle | read/write/create/unlink |
| Record rules | filtre par enregistrement | voir uniquement ses clients |
| Multi-company | isolement business | company_id domains |
ACL : rĂšgles simples
- Donner le minimum : read par défaut, write limité.
- CrĂ©er des groupes mĂ©tiers propres, Ă©viter âeveryone can writeâ.
- Documenter les exceptions.
Record rules : puissantes mais coûteuses
- Domain complexes â perf (car appliquĂ©s sur beaucoup de queries).
- Tester sur volume de données réaliste.
- Ăviter les rĂšgles âtrop globalesâ sur modĂšles massifs.
Senior tip:
- une record rule mal pensée peut "tuer" toutes les pages list view
- mesurer et simplifier les domains
Traps / anti-patterns
- Abuser de
sudo()â contournement de la sĂ©curitĂ©. - Mettre des rĂšgles dans lâUI (onchange) au lieu de constraints.
- Exposer des endpoints sans auth forte.
Squelette module (exemple)
my_module/
__init__.py
__manifest__.py
models/
__init__.py
my_model.py
views/
my_model_views.xml
security/
ir.model.access.csv
data/
ir_sequence.xml
mail_template.xml
static/
src/ (js, css)
Le senior met en place des conventions repo (naming, structure, lint, tests).
ORM patterns (senior)
Bonnes pratiques
- Travailler sur des recordsets (batch), pas 1 record Ă la fois.
- Minimiser les search() dans des boucles.
- Préparer indexes sur champs de filtrage.
- Préférer méthodes existantes (super) plutÎt que re-coder.
Anti-patterns
- Loop
for rec in records: rec.write(...)sur 50k rows. - Compute field qui fait 10 queries par record.
- Domain record rules trop lourds sur tables massives.
Perf quick win:
- regrouper opérations
- utiliser read_group() pour agrégations
- indexer les champs sur lesquels on filtre/trie
Controllers web (site / API)
- Endpoints pour portail client, webhooks, intégrations.
- Auth : session, tokens, API keys, signature HMAC selon cas.
- Idempotence : éviter doublons si webhook rejoué.
Integration rules:
- timeouts + retries
- idempotence keys
- logging structuré
- DLQ (dead-letter) pour erreurs non récupérables
Cron jobs
- Sync batch (import/export), facturation planifiée, rapprochement.
- Split en petits batches (commit chunked) pour limiter locks.
- Observabilité : logs, métriques, alertes si job échoue.
Views XML (form/tree/kanban/search)
- Form = édition, Tree/List = navigation, Kanban = workflow visuel.
- Search view = filtres, group by, domaines.
- Extensions via xpath (héritage view) plutÎt que copy/paste.
Senior tip:
- éviter de dupliquer des vues entiÚres
- utiliser inheritance (xpath) pour maintenir la compat upgrade
Actions, menus, context
- Actions = ouvrir une vue, lancer un wizard, rapport, server action.
- Context = valeurs par défaut, paramÚtres UI.
- Domains = filtrage (attention perf).
QWeb (templates / reporting / website)
- Rapports (invoices, delivery slips) : templates + variables.
- Website : layout, thÚmes, composants réutilisables.
- Perf : limiter logique complexe dans templates.
JS / OWL (selon versions)
- Widgets custom, champs UI avancés, interactions.
- Composants OWL : state, props, services, actions.
- Qualité : tests, compat version, éviter hacks DOM.
Senior tip:
- isoler JS custom (widgets) avec API stable
- documenter dépendances version Odoo
- prévoir fallback UX
Patterns dâintĂ©gration
| Pattern | Quand | Notes |
|---|---|---|
| Webhook â Odoo | paiement, e-commerce | signature + retries + idempotence |
| Odoo â API | sync CRM, ERP legacy | batch + rate limiting |
| ETL batch | BI/warehouse | CDC si besoin near real-time |
| Event bus | architecture SI | decouple + DLQ |
Idempotence (indispensable)
Si un webhook est rejoué:
- on ne doit pas créer 2 factures
- on doit détecter "déjà traité" via clé idempotente
Ex:
- event_id externe stocké dans Odoo
- unique constraint + catch duplicates
ETL / DWH / reporting
- Odoo DB â DWH : pour BI lourde, extraire vers un warehouse.
- CDC / replication si near real-time requis.
- Modéliser : dimensions (clients, produits) + faits (ventes, paiements).
Sécurité API
- Auth forte : tokens, API keys, rotation, scopes.
- Validation payloads : schema, signature HMAC.
- Rate limiting & WAF si exposition internet.
- Logs audit (qui/quoi/quand), mais sans données sensibles.
Topologie âclassiqueâ
[Users] -> [Nginx/Proxy TLS] -> [Odoo Web Workers] -> [PostgreSQL]
-> [Odoo Cron Workers] -> [PostgreSQL]
Optional:
- Redis/cache (selon besoins)
- Object storage pour attachments (selon infra)
Le point critique : Postgres + I/O disque + latence DB.
Scaling
- Scale horizontal des workers (stateless si sessions/filestore maßtrisés).
- Séparer cron pour éviter saturation sur web.
- Limiter âlong requestsâ : offload batch vers cron.
Observabilité
- Logs : erreurs, slow endpoints, cron failures.
- DB metrics : locks, slow queries, bloat, IO.
- Alerting : 5xx, latency, queue backlog, disk watermark.
Backups & DR
- Backup Postgres (snapshot + logical selon stratégie).
- Filestore/attachments : sauvegarde cohérente avec DB.
- RPO/RTO définis, test de restore régulier.
Senior rule:
Un backup non testé = pas un backup.
Top causes de lenteur
- Search() fréquents sur colonnes non indexées.
- Compute fields recompute en cascade.
- Loops write/create non batchés.
- Record rules lourdes (domain complexes).
- Rapports/QWeb sur gros volumes sans agrégation.
PostgreSQL : points clés
- Index sur champs filtrés/tris (et sur foreign keys critiques).
- Maintenance : vacuum/analyze (bloat).
- Locks : batch commits, éviter transactions longues.
- Plans : expliquer les queries lentes (EXPLAIN).
Senior habits:
- mesurer avant/aprĂšs
- garder une "slow query list"
- corriger d'abord les top offenders (ROI)
ORM : rĂšgles dâor
- Batch : manipuler recordsets, pas record par record.
- read_group() pour agrégations plutÎt que boucles Python.
- Limiter champs lus (read) si dataset énorme.
- Ăviter compute non-store si utilisĂ© en search/sort.
Playbook perf (rapide)
- Identifier page lente (UI) + logs time.
- Mesurer nombre de queries + top queries.
- EXPLAIN sur top query â index / rewrite.
- Optimiser record rules / domains.
- Re-test sur dataset réaliste.
StratĂ©gie dâupgrade
- Inventaire modules custom + dépendances.
- Lire breaking changes / compat libs.
- Plan staging : clone prod â migration dry-run.
- Limiter scope : upgrade + stabilisation, puis features.
Data migration
- Transformations : champs renommés, types, relations.
- Scripts dâupgrade idempotents (rejouables).
- Vérifications : totals compta, stock valuation, documents.
Tests (ce qui compte)
- Flux critiques : sale â invoice â payment, purchase â receipt.
- Permissions : users non-admin (record rules).
- Perf : pages/listes principales.
- Intégrations : webhooks, exports, ETL.
Rollout & rollback
- FenĂȘtre de maintenance, freeze changes, backup avant.
- Plan rollback clair (snapshots + filestore + DB).
- Observabilité renforcée post-upgrade.
Senior rule:
upgrade sans rollback = pari dangereux.
RĂšgles dâor (senior)
1) Config > Custom code (quand possible)
2) Custom = modules propres + inheritance (pas de fork)
3) Sécurité: ACL + record rules testées (user non-admin)
4) Perf: batch ORM + indexes + éviter compute cascades
5) Intégrations: idempotence + retries + observabilité
6) Upgrades: staging, tests flows critiques, rollback plan
Checklist âmodule prĂȘt prodâ
- Manifest propre + dépendances explicites
- ACL + record rules cohérentes
- Views inheritance (xpath), pas de duplication
- Logs structurés + erreurs gérées
- Tests mini (au moins flows critiques)
Questions dâentretien typiques
- Comment éviter N+1 / loops write() en ORM ?
- Comment diagnostiquer une page Odoo lente ?
- ACL vs record rules : différence ?
- Comment gérer une intégration webhook sans doublons ?
- Quelle stratĂ©gie dâupgrade entre 2 versions majeures ?
Anti-patterns
- Tout le monde admin
- sudo() partout
- custom massif sans tests
- record rules lourdes non mesurées
- upgrade âbig bangâ sans staging
