Introduzione
In Odoo, i modelli sono lo schema dei dati: definiscono quali informazioni vengono memorizzate nel database e come sono organizzate. Ogni entità con cui lavora un'azienda — clienti, ordini, fatture, articoli — è rappresentata da un modello.
Per chi lavora su Odoo, sia da un punto di vista tecnico sia funzionale, capire come funzionano i modelli è fondamentale. Sono la spina dorsale dell'architettura dei dati e determinano campi, relazioni e comportamenti applicativi.
Ma dove tiene traccia Odoo di tutti questi modelli? La risposta è ir.model: un registro interno che contiene i metadati di ogni modello presente nel sistema. Se sviluppi moduli personalizzati, esplori l'API o fai debugging, prima o poi incontrerai ir.model.
Che cos'è il modello ir.model
ir.model è il registro dei metadati di Odoo: esiste una voce per ogni modello installato. Quando dichiari un nuovo modello in Python o lo crei con Odoo Studio, viene creato o aggiornato un record in ir.model.
Questo modello fa parte del modulo base e appartiene al nucleo della piattaforma. Ogni tipo di modello Odoo — normale, astratto o transitorio — è rappresentato da un corrispondente record in ir.model (salvo le eccezioni degli astratti senza tabella DB).
La definizione di ir.model risiede nel modulo base e lavora a stretto contatto con ir.model.fields, che conserva i metadati di ogni singolo campo. Insieme permettono a Odoo di 'guardarsi dentro' e offrire funzioni di introspezione.
Gli sviluppatori consultano ir.model quando devono elencare i modelli disponibili, analizzare l'ereditarietà o costruire strumenti dinamici che operino su modelli generici. Il registro è accessibile anche via API (XML-RPC/JSON-RPC).
Campi principali del modello
Ecco i campi più rilevanti presenti in ir.model: conoscere questi attributi facilita il lavoro con il registro dei modelli e con gli strumenti di amministrazione.
1. name
Tipo: Char. Etichetta leggibile del modello; è traducibile e compare negli strumenti tecnici e nei menu di sviluppo. Serve a identificare il modello in modo umano.
2. model
Tipo: Char. Nome tecnico del modello, quello che usi nel codice Python (per esempio res.partner o sale.order). Campo obbligatorio e indicizzato per ricerche rapide.
3. info
Tipo: Text. Note descrittive o documentazione interna sul modello. Spesso è vuoto, ma utile per spiegare particolarità o scopi del modello.
4. state
Tipo: Selection. Indica l'origine del modello: base (proveniente da un modulo) o manuale (creato in Studio o dinamicamente). I modelli base sono generalmente protetti, quelli manuali più modificabili.
5. transient
Tipo: Boolean. Segna i modelli transitori: usati per dati temporanei e wizard, i loro record vengono puliti automaticamente e non servono per dati persistenti.
6. field_id
Tipo: One2many (ir.model.fields). Collezione di campi definiti per il modello: ogni record descrive un campo (nome, tipo, proprietà).
7. access_ids
Tipo: One2many (ir.model.access). Regole di accesso: quali gruppi possono creare, leggere, aggiornare o cancellare i record del modello.
8. rule_ids
Tipo: One2many (ir.rule). Regole di riga che limitano la visibilità dei record per utenti o gruppi, impiegate per la sicurezza a livello di record.
9. inherited_model_ids
Tipo: Many2many (ir.model). Elenco dei modelli da cui questo modello eredita. Quando si usa l'ereditarietà, qui vengono collegate le relazioni parentali.
10. modules
Tipo: Char. Campo calcolato che mostra i moduli che definiscono o estendono il modello. Aiuta a capire dipendenze e provenienza del modello.
11. sort
Tipo: Integer. Ordine di visualizzazione nei menu tecnici: valori più bassi compaiono prima, utile per organizzare l'elenco dei modelli.
12. constrains
Tipo: Text. Definizioni delle constraint Python (@api.constrains) associate al modello; rappresenta la logica di validazione applicativa.
13. post_constrains
Tipo: Text. Constraint eseguite dopo le validazioni principali, usate in scenari avanzati di controllo dati.
14. sql_constraints
Tipo: Text. Vincoli a livello di database (per esempio unique). Garantiscono l'integrità dei dati sul layer SQL.
15. view_ids
Tipo: One2many (ir.ui.view). Elenco delle viste correlate al modello; campo calcolato utile per la gestione dell'interfaccia.
16. record_count
Tipo: Integer. Campo calcolato che mostra quante righe esistono per quel modello; comodo per report e per avere un'idea della dimensione dei dati.
17. display_name
Tipo: Char. Rappresentazione testuale usata nelle liste e nei riferimenti, di solito una combinazione di nome e identificatore.
18. create_date
Tipo: Datetime. Data/ora di creazione del record in ir.model; gestita automaticamente dal sistema.
19. create_uid
Tipo: Many2one (res.users). Utente che ha creato l'entry; utile per audit e tracciamento.
20. write_date
Tipo: Datetime. Timestamp dell'ultima modifica; aggiornato automaticamente.
21. write_uid
Tipo: Many2one (res.users). Utente che ha eseguito l'ultima modifica; serve per controllo delle modifiche.
22. active
Tipo: Boolean. Flag per soft-delete: se impostato a False il modello è considerato archiviato o deprecato.
23. id
Tipo: Integer. Identificatore univoco del record nel database, usato nelle chiamate API e nei riferimenti interni.
24. restrict_functionality
Tipo: Boolean. Segnala funzionalità limitate in alcune edizioni di Odoo; usato per differenziare comportamenti tra Community ed Enterprise.
25. is_mail_thread
Tipo: Boolean. Indica se il modello supporta la 'chatter' (messaggi, followers) e le funzionalità di messaggistica.
26. is_mail_activity
Tipo: Boolean. Indica se il modello supporta le attività (planner, prossime azioni) e il relativo tracking.
Come questo modello entra nei processi aziendali
1. Impostazioni tecniche e configurazione
Gli amministratori consultano il menu Impostazioni tecniche per esplorare i modelli: ir.model alimenta quell'elenco mostrando nome, descrizione e numero di campi per ogni voce.
2. Gestione dei diritti di accesso
Quando si configura la sicurezza, si assegnano permessi ai gruppi. I record di access_ids su ir.model stabiliscono chi può creare, leggere, modificare o cancellare i dati di un modello.
3. Personalizzazioni con Odoo Studio
Le modellazioni fatte con Odoo Studio generano nuovi record in ir.model con state impostato a manual; la relazione field_id viene popolata con i campi personalizzati creati dall'utente.
4. Scoperta via API e integrazioni
Sistemi esterni che si integrano con Odoo possono interrogare ir.model tramite XML-RPC o JSON-RPC per scoprire dinamicamente quali modelli e campi sono disponibili, evitando di hardcodare nomi e strutture.
5. Sviluppo moduli e debugging
Durante lo sviluppo, ir.model è utile per comprendere le catene di ereditarietà (inherited_model_ids) e per ispezionare tutti i campi (field_id) definiti su un modello.
Come gli sviluppatori estendono questo modello
Gli sviluppatori di solito non estendono ir.model direttamente: il registro si aggiorna automaticamente quando si caricano moduli che definiscono nuovi modelli. Si lavora piuttosto sui modelli descritti dal registro.
Ereditarietà dei modelli
Quando nel codice Python si dichiara _inherit = 'res.partner', Odoo aggiorna il registro per collegare il nuovo modello al genitore: inherited_model_ids riflette questi legami, mantenendo la coerenza della struttura dei modelli.
Aggiunta di campi
Aggiungendo nuovi campi a un modello, Odoo crea record in ir.model.fields collegati tramite model_id. Il record ir.model esistente funge da contenitore di metadati ma non è normalmente modificato per ogni nuovo campo.
Estensioni in Python
Non è comune sovrascrivere i metodi di ir.model: essendo parte del core, le personalizzazioni si fanno estendendo i singoli modelli applicativi piuttosto che il registro stesso.
Odoo Studio
Odoo Studio si occupa automaticamente della creazione di voci in ir.model e ir.model.fields per i modelli costruiti tramite interfaccia: non serve scrivere codice. I modelli transitori vengono contrassegnati con transient; i modelli astratti, non avendo una tabella DB, non generano sempre una voce in ir.model.
Buone pratiche
- Per integrazioni e strumenti dinamici, interrogare ir.model è la strada corretta: costruire logiche che scoprono i modelli a runtime evita dipendenze rigide e rende il sistema più resiliente.
- Per ricerche puntuali, usa il campo model: è indicizzato e permette lookup veloci del metadata associato a un nome tecnico.
- Prima di estendere un modello, verifica inherited_model_ids per comprendere la gerarchia di ereditarietà; intervenire senza analizzare la catena può introdurre conflitti.
- Preferisci leggere ir.model tramite API (XML-RPC/JSON-RPC) piuttosto che modificarlo: l'accesso in lettura supporta discovery e automazione; le modifiche dirette al registro vanno evitate salvo casi molto particolari.
- Per ispezionare i singoli campi, affidati a ir.model.fields: la relazione field_id fornisce tutti i dettagli necessari per costruire form dinamici o mappe di integrazione.
Errori comuni
- Evitare modifiche dirette ai record di ir.model: il registro è gestito dalla piattaforma e cambi inadatti possono corrompere il sistema o essere sovrascritti dagli aggiornamenti.
- Non confondere il record in ir.model con la classe Python del modello: il primo è un dato di registro nel DB, la seconda è l'implementazione attiva; sono collegati ma distinti.
- Ricorda che non tutti i modelli hanno una voce in ir.model: i modelli astratti non creano tabelle DB né sempre un record nel registro.
- Non usare il flag transient per dati permanenti: i modelli transitori sono pensati per dati temporanei e vengono puliti automaticamente dal sistema.
- Quando interroghi ir.model, applica filtri: un'istanza Odoo può contenere centinaia di modelli, quindi cercare senza limitare il dominio restituisce risultati poco utili.
Conclusione
In sintesi: ir.model è il registro che descrive tutti i modelli di Odoo. Conoscere i suoi campi e la relazione con ir.model.fields facilita la navigazione dell'architettura dati e aiuta a prendere decisioni informate durante personalizzazioni e integrazioni.
Sia che tu stia esplorando le Impostazioni tecniche o progettando integrazioni via API, padroneggiare il concetto di ir.model ti farà risparmiare tempo ed eviterà errori evitabili.
Serve supporto per la tua implementazione Odoo?
Dasolo supporta le aziende nell'implementazione, personalizzazione e ottimizzazione di Odoo. Siamo specializzati in integrazioni API e sviluppo su Odoo, con esperienza approfondita nell'architettura dei dati e nei modelli come ir.model.
Se ti serve supporto per implementazioni Odoo, moduli personalizzati o integrazioni, possiamo aiutarti. Prenota una demo per discutere il tuo progetto.