Pular para conteúdo

Parceiros e VLANs

Código: backend/apps/parceiros/ · Filtro de acesso: backend/apps/core/escopo.py · Decisão: ADR 0011

Entidades

Model Uso
Parceiro Empresa que usa a rede para atender os próprios clientes (nome, documento, contato, WhatsApp, e-mail, ativo)
Vlan Número (1–4094, único), nome, descrição e dono (parceiro; vazio = VLAN da própria operadora)

O usuário (core.Usuario) tem o campo opcional parceiro. Usuário com parceiro:

  • vê só o que é das VLANs do parceiro (tabela do ADR 0011);
  • só consulta (pode_editar e eh_administrador são sempre falsos);
  • não pode ser is_staff nem superusuário, portanto não entra no admin.

Não existe cadastro de clientes

O cliente é só o nome gravado na ONU (nome_cliente) e na descrição dela na OLT. A ONU pertence a uma VLAN, e a VLAN ao parceiro: Parceiro → VLAN → ONU (cliente).

Como o filtro funciona

Todo model exposto herda de ModeloComEscopo e declara escopo_parceiro:

Valor Efeito para usuário de parceiro Exemplos
"caminho__ate__parceiro" filtra por esse caminho ONU vlan__parceiro; leitura de sinal onu__vlan__parceiro
{"campo": valor} filtro fixo Caixa {"tipo": "cto"} (todas as CTOs, nenhuma CEO/DIO)
NENHUM (padrão) nada cabos, splitters, postes, POPs, OLTs
TODOS tudo (não usado ainda)

Para a equipe interna (usuário sem parceiro) nada é filtrado.

Toda consulta exposta usa Model.objects.visiveis_para(usuario). Na API isso é obrigatório: toda view herda de ViewSetComEscopo (backend/apps/core/api_escopo.py), e o teste tests/test_escopo_api.py percorre todas as rotas logado como parceiro, falhando se aparecer qualquer dado de outro parceiro. Campos que o parceiro não pode ver (OLT, porta PON, poste, quem fez a ação) são removidos pelos serializers (Meta.ocultos_para_parceiro).

Ao criar um model novo: herde de ModeloComEscopo, declare escopo_parceiro e, se ele for para a API, registre a rota em backend/config/api_urls.py — o teste de vazamento passa a cobri-la sozinho.

API

Endpoint Parceiro vê
GET /api/parceiros/ só o próprio cadastro (sem observações)
GET /api/vlans/ (?parceiro=) só as próprias VLANs