Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

đŸ§© 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.

1.1

Odoo, c’est quoi ?

ERP web open-source / enterprise : Apps métiers + framework Python.

ERPWebPostgreSQL
1.2

Écosystùme & modules

CRM, Sales, Accounting, Inventory, Manufacturing, HR
 + custom.

AppsModulesAddons
1.3

RĂŽle Senior Odoo Dev

Tech lead, architecture, intégrations, perf, migrations, qualité.

LeadIntegrationQuality
2.1

Architecture Odoo

Server, ORM, models, views, actions, security, workers, DB.

ORMMVC-ishWorkers
2.2

ModÚle de données

Models, fields, relations, computed fields, constraints, SQL views.

ModelsFieldsRelations

Sécurité & droits

ACL, record rules, groups, sudo(), multi-company, audit.

ACLRecord rulesMulti-company
3.1

Dev Backend (Python)

Modules, models, business logic, ORM, controllers, cron jobs.

PythonORMCron
3.2

UI / Web Client

Views XML, actions, menus, QWeb, OWL/JS, widgets.

XMLQWebOWL
3.3

Intégrations & API

REST/JSON-RPC, webhooks, ETL, connecteurs (Stripe, SAP, etc.).

APIETLConnectors
4.1

Déploiement & Ops

Docker, Nginx, workers, scaling, backups, monitoring.

DockerNginxPostgres

Performance

ORM patterns, prefetch, indexes, cron offloading, caching.

SQLIndexesCache
4.3

Migrations & upgrades

Version jumps, data migration, compat modules, tests.

UpgradeData migrationRegression
5.1

Cheat-sheet Senior

Questions d’entretien, checklists, patterns, anti-patterns.

InterviewChecklistPatterns
1.1 Odoo – dĂ©finition, positioning et mental model
DĂ©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.

Python PostgreSQL ORM Views XML Web client JS (OWL) ACL & Record rules

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.

AtoutImpact
ModularitéOn installe/compose par apps, on ajoute du custom proprement.
Time-to-marketBeaucoup est déjà là (workflows, UI, droits, mails, reporting).
Data modelRelations 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.
Un Senior Odoo Dev est souvent full-stack (Python + XML/JS) + ERP + ops minimum viable.
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.
1.2 Écosystùme Odoo – modules, addons, patterns de custom
Modules “core” (exemples)
DomaineAppsExemples de flux
SalesCRM, SalesLead → Opportunity → Quote → Order
FinanceInvoicing, AccountingOrder → Invoice → Payment → Reconcile
SupplyInventory, PurchaseReorder rules → PO → Receipt → Stock moves
IndustryMRP, PLM, QualityBOM → Work orders → QC → Delivery
PeopleEmployees, PayrollContracts → 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.
Le “niveau senior” = minimiser le code tout en rendant le systùme maintenable et upgradable.
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.

1.3 Senior Odoo Developer – responsabilitĂ©s, scope, compĂ©tences
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.
Senior = tech + produit : savoir dire “non” aux customs inutiles, proposer alternatives.
Compétences attendues (tech)
ZoneCompétences
BackendPython, ORM Odoo, inheritance, compute fields, constraints, cron, controllers
DBPostgreSQL, indexes, query plans, vacuum/maintenance, locks
UIViews XML, actions/menus, QWeb, JS/OWL, widgets
SecurityACL, record rules, groups, sudo(), multi-company
OpsDocker, reverse proxy, scaling, logs/metrics, backups, release process
DeliveryCI/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.
2.1 Architecture Odoo – server, ORM, modules, workers, DB
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
  1. L’utilisateur clique (UI) → action (open view / call method).
  2. Le client envoie une requĂȘte (souvent JSON-RPC) au serveur.
  3. Odoo exécute logique ORM (read/search/write + rules + constraints).
  4. 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
        
2.2 ModĂšle de donnĂ©es – models, fields, relations, compute, constraints
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
TypeUsageExemple
Many2oneFKinvoice.partner_id
One2manyinversepartner.invoice_ids
Many2manytable pivotsale.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)
        
SĂ©curitĂ© Odoo – groups, ACL, record rules, sudo(), multi-company
Couches de sécurité
CoucheRĂŽleExemples
GroupsprofilsSales user, Accounting manager
ACLCRUD par modĂšleread/write/create/unlink
Record rulesfiltre par enregistrementvoir uniquement ses clients
Multi-companyisolement businesscompany_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.
“Ça marche en admin” ne veut pas dire “c’est safe” : toujours valider avec un user standard.
3.1 Dev Backend – modules, ORM, business logic, controllers, cron
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.
3.2 UI / Web client – Views XML, QWeb, JS/OWL, widgets
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
        
3.3 IntĂ©grations & API – REST/JSON-RPC, webhooks, ETL, BI
Patterns d’intĂ©gration
PatternQuandNotes
Webhook → Odoopaiement, e-commercesignature + retries + idempotence
Odoo → APIsync CRM, ERP legacybatch + rate limiting
ETL batchBI/warehouseCDC si besoin near real-time
Event busarchitecture SIdecouple + 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.
4.1 DĂ©ploiement & Ops – Docker, Nginx, workers, Postgres, backups
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.
        
4.2 Performance – ORM/SQL, indexes, batch, caching, record rules
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)
  1. Identifier page lente (UI) + logs time.
  2. Mesurer nombre de queries + top queries.
  3. EXPLAIN sur top query → index / rewrite.
  4. Optimiser record rules / domains.
  5. Re-test sur dataset réaliste.
4.3 Migrations & upgrades – stratĂ©gie, compat modules, tests, rollback
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.
        
5.1 Cheat-sheet – Senior Odoo Developer (checklists + interview)
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
Si tu veux, je peux te gĂ©nĂ©rer une section CV “Senior Odoo Developer” en 2–3 bullets trĂšs “impact” (perf, intĂ©grations, migration, multi-company).