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_editareeh_administradorsão sempre falsos); - não pode ser
is_staffnem 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 |