Introdução
No Odoo, os modelos são a forma como os dados são organizados e guardados na base de dados. Tudo o que manipula — encomendas, faturas, contactos, inventário — existe dentro de um modelo que define campos e relações.
Compreender os modelos do Odoo é crucial tanto para consultores funcionais como para desenvolvedores. É sobre estes modelos que se apoia toda a arquitetura dos dados: campos, ligações entre tabelas e regras de negócio são definidos aí.
Mas onde o Odoo mantém a informação sobre cada um desses modelos? É aqui que entra o ir.model: um registo central que guarda metadados sobre todos os modelos do sistema. Ao criar módulos personalizados, inspecionar a API ou depurar o sistema, provavelmente vai acabar por trabalhar com ir.model.
O que é o ir.model
O ir.model funciona como o catálogo de modelos do Odoo — existe uma entrada por cada modelo registado. Quando define um novo modelo em Python ou cria um através do Odoo Studio, é criado ou actualizado um registo em ir.model com essa referência.
Este registo faz parte do núcleo do Odoo, sendo gerido pelo módulo base. Quer o modelo seja normal, abstracto ou transitório, existe uma entrada correspondente em ir.model sempre que houver uma representação de base de dados associada.
O ir.model é complementado por ir.model.fields, que contém a descrição de cada campo de cada modelo. Em conjunto, estes dois elementos permitem que o Odoo «olhe para dentro» dos próprios modelos e suporte ferramentas dinâmicas de introspecção.
Os desenvolvedores recorrem ao ir.model quando precisam de obter a lista de modelos disponíveis, analisar cadeias de herança ou construir utilitários genéricos que funcionem com qualquer modelo. O Odoo expõe este registo através da API (XML-RPC/JSON-RPC) para fins de integração e descoberta.
Campos principais do modelo
A seguir estão os campos mais relevantes do ir.model. Conhecê-los facilita a navegação pelo registo de modelos e ajuda na integração e depuração.
1. name
Tipo: Char. Descrição legível do modelo, utilizada na interface técnica e nas ferramentas de desenvolvimento. É transponível e serve como rótulo quando se procura um modelo no sistema.
2. model
Tipo: Char. Nome técnico do modelo — a string usada em código Python, como res.partner ou sale.order. É obrigatório e indexado para pesquisas rápidas.
3. info
Tipo: Text. Campo livre para notas ou documentação interna sobre o modelo. Muitas entradas não têm texto aqui, mas serve para explicações adicionais quando necessário.
4. state
Tipo: Selection. Indica se o modelo vem do código base (base) ou foi criado manualmente (manual) — por exemplo, via Studio. Os modelos base tendem a ser protegidos, enquanto os manuais são mais flexíveis.
5. transient
Tipo: Boolean. Quando verdadeiro, trata-se de um modelo transitório: dados temporários, usados por assistentes e que o Odoo elimina automaticamente ao fim de algum tempo.
6. field_id
Tipo: One2many (ir.model.fields). Lista dos campos definidos no modelo. Cada registo em ir.model.fields descreve um campo: nome, tipo e atributos.
7. access_ids
Tipo: One2many (ir.model.access). Regras de acesso associadas ao modelo. Define que grupos podem criar, ler, escrever ou apagar registos — a base da segurança de acesso.
8. rule_ids
Tipo: One2many (ir.rule). Regras de registo que limitam quais os registos visíveis por cada utilizador — útil para aplicar segurança ao nível das linhas.
9. inherited_model_ids
Tipo: Many2many (ir.model). Refere-se aos modelos pais quando existe herança entre modelos. Permite acompanhar a cadeia de herança entre modelos.
10. modules
Tipo: Char. Campo calculado que lista os módulos onde o modelo é definido ou estendido. Ajuda a identificar dependências e origem das alterações.
11. sort
Tipo: Integer. Ordem de apresentação nos menus técnicos. Valores mais baixos aparecem primeiro, usado para organizar a lista de modelos.
12. constrains
Tipo: Text. Definições de constraints em Python (@api.constrains). Guarda o código de validação customizada a nível de modelo.
13. post_constrains
Tipo: Text. Validações executadas após as constraints normais. Utilizado em cenários de validação mais sofisticados.
14. sql_constraints
Tipo: Text. Definições de constraints SQL — por exemplo índices únicos — que asseguram integridade ao nível da base de dados.
15. view_ids
Tipo: One2many (ir.ui.view). Campo calculado com as vistas associadas ao modelo. Útil para gerir e inspecionar a apresentação dos dados.
16. record_count
Tipo: Integer. Número de registos existentes nesse modelo. Campo calculado que fornece uma visão rápida da quantidade de dados.
17. display_name
Tipo: Char. Representação do nome para exibição em listas e relações — geralmente uma combinação do nome legível e do identificador técnico.
18. create_date
Tipo: Datetime. Data e hora de criação do registo, mantida automaticamente pelo Odoo.
19. create_uid
Tipo: Many2one (res.users). Utilizador que criou o registo, útil para auditoria e rastreio.
20. write_date
Tipo: Datetime. Data e hora da última modificação, atualizada automaticamente.
21. write_uid
Tipo: Many2one (res.users). Último utilizador que modificou o registo — também para fins de auditoria.
22. active
Tipo: Boolean. Flag de arquivamento (soft delete). Quando falso, o registo fica inactivo sem ser eliminado da base de dados.
23. id
Tipo: Integer. Identificador único do registo na base de dados — usado em chamadas de API e referências internas.
24. restrict_functionality
Tipo: Boolean. Indica funcionalidades limitadas em determinadas edições do Odoo (ex.: diferenciação entre Community e Enterprise).
25. is_mail_thread
Tipo: Boolean. Indica se o modelo suporta chatter (mensagens, seguidores). Modelos com esta flag permitem discussão e histórico de mensagens.
26. is_mail_activity
Tipo: Boolean. Indica suporte a actividades (planner). Modelos com esta opção permitem agendar e acompanhar ações futuras.
Como este modelo entra nos fluxos de trabalho
1. Configuração técnica e navegação
Os administradores usam o menu de Configurações Técnicas para explorar os modelos. É o ir.model que determina o que aparece nessa lista, mostrando nome, descrição e número de campos.
2. Gestão de permissões
Ao configurar segurança, atribui-se permissões a grupos. Os registos em access_ids definem que grupos podem realizar operações CRUD para cada modelo.
3. Personalizações com Odoo Studio
Modelos criados pelo Odoo Studio geram registos em ir.model com state = manual. As colunas correspondentes em field_id são preenchidas com os campos adicionados pelo utilizador.
4. Descoberta via API e integrações
Sistemas externos podem descobrir modelos e estrutura consultando ir.model através da API XML-RPC/JSON-RPC, o que evita hardcoding e facilita integrações robustas.
5. Desenvolvimento e depuração de módulos
Os programadores consultam ir.model para entender heranças (inherited_model_ids) e inspeccionar field_id para ver todos os campos disponíveis num modelo durante o desenvolvimento.
Como os programadores estendem este registo
Os desenvolvedores raramente alteram diretamente o ir.model. Normalmente interagem com ele indiretamente ao definir novos modelos; o registo é actualizado automaticamente quando um módulo é carregado.
Herança de modelos
Ao usar _inherit = 'res.partner' num ficheiro Python, o Odoo actualiza o registo correspondente em ir.model. A ligação entre filho e pai fica refletida em inherited_model_ids, permitindo que a cadeia de herança seja seguida no registo.
Adicionar campos
Quando adiciona novos campos a um modelo, o Odoo cria registos em ir.model.fields que apontam para o ir.model através de model_id. O registo ir.model serve de índice, não de contentor directo dos valores dos campos.
Extensões em Python
Não é prática comum sobrescrever métodos de ir.model. Em vez disso, estende-se os modelos descritos pelo registo. As customizações de comportamento fazem-se nos modelos de aplicação, não no próprio registo do catálogo.
Odoo Studio
O Odoo Studio gera automaticamente ir.model e ir.model.fields quando se criam modelos personalizados, sem necessidade de código. A flag transient distingue modelos temporários; modelos abstractos não geram registos ir.model porque não têm tabela física.
Boas práticas
- Para integrações, consulte ir.model para fazer descoberta de modelos em tempo de execução em vez de codificar nomes estáticos.
- Use o campo model para procurar metadados: é indexado e ideal para pesquisas quando precisa do registo de um modelo específico.
- Antes de estender um modelo, verifique inherited_model_ids para compreender completamente a cadeia de herança e evitar conflitos com campos ou métodos existentes.
- Leia ir.model através da API (XML-RPC/JSON-RPC) quando construir integrações. Evite alterar estes registos diretamente, salvo se estiver a criar ferramentas como o Studio.
- Para análise ao nível de campos, utilize ir.model.fields. A relação field_id devolve toda a informação sobre os campos de um modelo.
Erros comuns
- Modificar ir.model diretamente é arriscado: o registo é gerido pelo Odoo e alterações manuais podem corromper o sistema ou ser sobrescritas em upgrades.
- Não confunda ir.model com a classe Python do modelo: ir.model é um registo na base de dados que descreve o modelo — a classe Python implementa a lógica e o comportamento em runtime.
- Nem todos os modelos têm registos ir.model: classes abstractas não criam tabela nem entrada no registo, porque não são instanciadas diretamente na base de dados.
- Lembre-se de que modelos transitórios são temporários: o Odoo limpa os seus dados. Não os utilize para armazenar informação persistente.
- Ao consultar ir.model, faça pesquisas filtradas: uma instância típica tem centenas de modelos, por isso é habitual usar domínios para limitar os resultados.
Conclusão
O ir.model é, em suma, o inventário dos modelos do Odoo. Guardando metadados sobre cada modelo e, em conjunto com ir.model.fields, forma a base para explorar e gerir a arquitectura de dados do sistema.
Quer seja um consultor a investigar as Configurações Técnicas ou um desenvolvedor a criar integrações, dominar o ir.model ajuda a evitar erros e a poupar tempo em tarefas de configuração e debug.
Precisa de ajuda com a sua implementação Odoo?
A Dasolo ajuda empresas a implementar, personalizar e optimizar o Odoo. Somos especialistas em integrações de API e desenvolvimento Odoo, com experiência aprofundada na arquitectura de dados e em modelos como o ir.model.
Se precisa de apoio na sua implementação Odoo, desenvolvimento de módulos ou integrações, podemos ajudar. Agende uma demonstração para falarmos do seu projecto.