-
Capítulo 1 — Visão Geral do Boardkit
-
Capítulo 2 — Dashboard CRM Pipeline
-
- Questionário
-
-
Capítulo 3 — Filtros do Dashboard
-
- Questionário
-
- Capítulo 4 — Formulário de item
- Capítulo 5 — Reorganização do Dashboard
-
Capítulo 6 — Templates de Dashboard
-
- Questionário
-
-
Capítulo 7 — Settings do Boardkit
-
- Questionário
-
-
Capítulo 8 — Como Instalar o Boardkit
-
Capítulo 9 — Erros Comuns e Troubleshooting
-
- Questionário
-
-
Capítulo 10 — Checklist Final
-
Capítulo 12 — Quiz Final
-
4.8 - Aba Domain: filtros estáticos e ad-hoc
Aba Domain — filtros estáticos e ad-hoc
A aba Domain aparece sempre que há model_id configurado. Ela é onde você define um filtro estático que restringe os registros do item, sem afetar os outros itens do dashboard. É construída com o widget domain nativo do Odoo. Veja nos prints abaixo.
O campo domain
Um único campo domain (tipo Char) com 3 camadas de informação: filtros estáticos, filtros ad-hoc e regras.
| Aspecto | O que faz |
|---|---|
| Tipo do campo | Char armazenado como string serializada (ex.: "[('is_company', '=', True)]"). |
| Widget | domain nativo do Odoo — renderiza campos/operadores/valores em vez de texto bruto. |
| Default | "[]" — sem filtro, todos os registros do model_id. |
| Aplicação | search_count(domain) ou search_read(domain) — combinado com o filtro de data do dashboard. |
Print 1 — aba Domínio com widget visual (E-mail não está... + E-mail = ""):
Note que o widget mostra "11 record(s)" logo abaixo — é a query ao vivo que confirma o filtro está produzindo o resultado esperado.
Como o widget domain funciona
Cada linha é uma regra com 3 campos visuais:
Campo
Dropdown com todos os campos do model_id. Mostra field_description (label humano) e armazena name técnico.
Operador
Dropdown com operadores: =, !=, <, >, <=, >=, like, ilike, in, not in, =, != (set), child_of, etc.
Valor
Texto livre, datetime picker, ou many2one autocomplete (depende do tipo do campo). Suporta tokens dinâmicos: uid, context_today(), etc.
3 tipos de filtro visual
O widget domain suporta 3 níveis lógicos combináveis:
| Tipo | Botão | Quando usar | Tradução para domain |
|---|---|---|---|
| Normal | Acumula regras com AND implícito entre elas. | ['&', rule1, rule2, rule3] |
|
| OR | (múltiplos) | Cria um grupo OR com as próximas regras adicionadas. | ['|', rule1, rule2] |
| Avançado | (clique em enquanto OR ativo) | Aninha OR dentro de AND para lógicas complexas: (A OR B) AND C. |
['&', '|', rule1, rule2, rule3] |
Print 2 — domain Individuals com filtro simples (is_company = False):
A regra mais simples: 1 campo, 1 operador, 1 valor. Conta apenas contatos que não são empresas.
Campos dinâmicos: uid e context_today()
O widget domain suporta 2 tokens dinâmicos especiais que são resolvidos em tempo de execução:
uid
ID do usuário logado. Quando você coloca uid como valor, o boardkit resolve para env.uid antes de aplicar o filtro.
Uso clássico: ('user_id', '=', uid) → mostra apenas registros do usuário atual.
context_today()
Data de hoje no timezone do usuário. Você pode passar parâmetros para ajustar: context_today(), context_today()-7, etc.
Uso clássico: ('date_deadline', '<', context_today()) → atividades atrasadas.
Print 3 — domain Open Activities com uid e filtros compostos:
3 regras: user_id = uid, active = definido, e date_deadline = definido — todas combinadas com AND implícito.
Os avisos "O domínio não deve envolver não literais" e "Domínio inválido"
São mensagens nativas do widget domain do Odoo. Elas aparecem quando você usa tokens dinâmicos como uid, context_today(), datetime.timedelta(...) ou referências a many2one pelo id.
O motivo: o widget tenta avaliar o domínio para mostrar o preview "N record(s)". Como valores dinâmicos só podem ser resolvidos em tempo de execução (com o env real), a query prévia falha e o widget mostra o aviso.
Na prática, isso é inofensivo: o boardkit resolve os tokens corretamente quando renderiza o dashboard, e o filtro funciona como esperado. Você pode ignorar os avisos — eles não bloqueiam o salvamento.
Quando o aviso não aparece
O aviso só some quando o domínio tem apenas literais puros:
[('is_company', '=', True)]✓ sem aviso — literal booleano.[('country_id', '=', False)]✓ sem aviso — literal Python.['|', ('email', '=', False), ('email', '=', '')]✓ sem aviso — OR com literais.[('user_id', '=', uid)]⚠️ com aviso — token dinâmico.[('date_deadline', '<', context_today())]⚠️ com aviso — chamada de função.
Por trás do widget
Cada regra vira uma tupla (campo, operador, valor) e o widget junta tudo numa lista Python. Não precisa decorar a sintaxe — basta montar pelo editor visual e o sistema cuida do resto.
Domain estático vs filtros do dashboard
São camadas independentes que se combinam:
Pipeline de filtragem
- Domain do item (esta aba) — aplicado primeiro, define o escopo do item.
- Date filter do item (aba Value) — restringe por janela de tempo.
- Dashboard filter (Capítulo 3) — restringe ainda mais por contexto do dashboard.
- Drill (aba Drill Down) — adiciona filtros à medida que o usuário clica.
Tudo se combina com AND. O resultado final é sempre a interseção.
Validação e erros comuns
Sintaxe válida
Cada regra é uma tupla (field, op, value). O widget garante a sintaxe básica.
Campo inexistente
Se você digitar manualmente um campo que não existe no model_id, o filtro vira 0 records (sem erro). Cheque sempre o preview.
Operador inválido
Cada ttype aceita operadores diferentes (ex.: like não funciona em integer). O widget filtra automaticamente.
Dica: debugar com o preview
O widget mostra "N record(s)" em tempo real. Se você alterou o filtro e o número caiu para zero, algo quebrou — reverta e teste passo a passo.
Receitas prontas de domain
Os filtros mais comuns em dashboards reais:
| Caso | Filtro | Quando usar |
|---|---|---|
| Apenas empresas | [('is_company', '=', True)] | Tiles de "Total Clientes". |
| Apenas pessoas | [('is_company', '=', False)] | Tiles de "Total Leads". |
| Sem e-mail | ['|', ('email', '=', False), ('email', '=', '')] | Tile de qualidade de dados. |
| Sem país | [('country_id', '=', False)] | Tile de completeness. |
| Geolocalizados | [('partner_latitude', '!=', 0), ('partner_longitude', '!=', 0)] | Pré-filtro para mapas. |
| Atividades do usuário | [('user_id', '=', uid), ('active', '=', True)] | Tile "Minhas Atividades". |
| Atrasadas | [('user_id', '=', uid), ('date_deadline', '<', context_today())] | Tile "Atrasadas". |
| Últimos 30 dias | [('create_date', '>=', (context_today() - datetime.timedelta(days=30)).strftime('%Y-%m-%d'))] | Funil de captação. |
Domain configurado, próximo passo
Com a aba Domain pronta, vamos para a aba Appearance — onde você dá vida visual aos cards com ícones, cores e paletas.
Agora que você domina a aba Domain, vamos para a aba Appearance — onde ícones, cores e paletas transformam dados em comunicação visual.
Detalhe da aba Domain: campo único domain com widget domain nativo, 3 tipos de filtro (Normal/OR/Avançado), tokens dinâmicos (uid, context_today), notação prefix-polish, validação e receitas prontas.
Por enquanto não há comentários.
Compartilhar este conteúdo
Compartilhar link
Compartilhar nas Redes Sociais
Compartilhar por e-mail
Por favor login compartilhar isto Artigo por e-mail.