Open turicas opened 3 years ago
Acabei de encontrar um outro problema que não ficou descrito acima: considerei que se uma coluna está ofuscada, todos os registros da tabela estarão e, caso ela não esteja, nenhum registro estará. Acontece que em alguns datasets alguns campos são ofuscados diretamente na fonte de dados (e não temos acesso ao dado completo em nosso backend), porém nem todos os registros são ofuscados.
Essa ofuscação parcial acontece com a coluna cpf_cnpj_socio
da tabela socio
do dataset socios-brasil
: para os casos em que o sócio descrito é uma empresa, o campo aparece com o CNPJ completo (ou seja, sem ofuscação), já no caso de uma pessoa física, o CPF já vem ofuscado da fonte. Nesse caso, para corrigir o problema no cenário A, precisaríamos fazer uma busca OR
: .filter(Q(campo=valor) | Q(campo__contains=valor.replace("*", "")))
(lembrando que idealmente deveríamos usar substring em vez de contains).
O Brasil.IO ofusca parte dos dados que publica, com o objetivo de proteger a privacidade de pessoas eventualmente descritas em nossos datasets. Exemplos:
empresa
(novo nome para a tabelaempresas
) do datasetsocios-brasil
deixamos em branco o endereço caso a empresa seja do tipo "individual" (de acordo com o código da natureza jurídica) - se a empresa é o próprio indivíduo, o endereço dela então provavelmente é o endereço residencial.candidatura
(novo nome para a tabelacandidatos
) do dataseteleicoes-brasil
, ofuscamos o CPF de quem se candidatou, de maneira que o Brasil.IO não publique nenhum CPF completo em conjunto com outros dados como nome completo.No primeiro exemplo acima a ofuscação dos dados é feita durante a conversão dos dados, ou seja, no script que baixa e converte os dados da Receita Federal. Já no segundo exemplo, a ofuscação acontece na hora de servir os dados pelo backend do Brasil.IO, porque precisamos do dado completo na nossa base para fazer alguns cruzamentos (exemplo: identificar todas as candidaturas dessa pessoa) - isso é necessário pois a versão ofuscada desse dado pode aparecer também para outras pessoas e gerar ambiguidades.
O problema relatado nessa issue é relativo ao segundo exemplo, ou seja: o dado está completo em nossa base e ofuscamos na hora de serví-lo (seja via interface ou via API).
Se um determinado
Field
(core.models.Field
) tem o campoobfuscate
comoTrue
, ele não será exibido integralmente (exemplo: o cpf12345678901
seria exibido como***456789**
). Porém, se esseField
possui o campofrontend_filter
comoTrue
, o usuário do site e da API poderá filtrar os registros por esse campo e, aí, temos 2 possíveis cenários:***456789**
)12345678901
)Hoje apenas o cenário B funcionará, dado que o filtro da query-string ignora se o
Field
é ofuscado ou não e faz a consulta equivalente a algo como:X.objects.filter(fieldname="12345678901")
(ondeX
é o model criado dinamicamente para a tabela com os dados).Para contornar esse problema, precisamos:
core.models.DatasetTableModelQuerySet.apply_filters
), verificar se algum dos campos de filtro é ofuscado;.filter(campo=valor)
, mas no caso de valores ofuscados teríamos que aplicar os dois cenários:*
), faz o filtro normalmente;*
), executa um filtro diferente, como:.filter(campo__contains=valor.replace("*", ""))
-- talvez o ideal seja executar substring em vez do__contains
, por conta do desempenho.