Contexto
Table.Update.latest às vezes fica desatualizado, e corrigir isso exigia acesso direto ao banco de produção (psql via kubectl exec). Foi adicionado no admin de uma Table um botão "Sincronizar com o BigQuery": lê o last_modified real da tabela no BigQuery e grava em Update.latest — qualquer admin roda direto da UI, sem precisar de acesso ao banco.
De carona nessa mesma branch, o botão "Checar Metadados" (já existente, PRs #1066/#1067) também foi melhorado: em vez de um alert() com texto solto, o resultado aparece num modal com uma linha por discrepância.
CheckMetadadosView: passa a devolver discrepâncias estruturadas ({coluna, tipo, bigquery?, api?}) em vez de uma string já formatada; corrige também um falso-positivo de tipo (INTEGER do BigQuery vs INT64 da API — nomes legacy vs standard SQL).
SyncUpdateLatestView (nova): resolve o único Update vinculado à Table (recusa se houver 0 ou mais de 1, pra não gravar no lugar errado), consulta get_gbq_client().get_table(gbq_slug).modified e grava em Update.latest.
_gbq_slug_for_table(): helper compartilhado entre as duas views pra escolher o projeto do BigQuery certo por ambiente (basedosdados-dev fora de prod, basedosdados em prod), via is_prd().
ferramentas.js/change_form.html/main.css: modais novos com spinner pros dois fluxos, evitando clique duplicado enquanto a requisição está em andamento.
Test plan
Contexto
Table.Update.latestàs vezes fica desatualizado, e corrigir isso exigia acesso direto ao banco de produção (psqlviakubectl exec). Foi adicionado no admin de umaTableum botão "Sincronizar com o BigQuery": lê olast_modifiedreal da tabela no BigQuery e grava emUpdate.latest— qualquer admin roda direto da UI, sem precisar de acesso ao banco.De carona nessa mesma branch, o botão "Checar Metadados" (já existente, PRs #1066/#1067) também foi melhorado: em vez de um
alert()com texto solto, o resultado aparece num modal com uma linha por discrepância.O que tem nos PRs #1066/#1068
CheckMetadadosView: passa a devolver discrepâncias estruturadas ({coluna, tipo, bigquery?, api?}) em vez de uma string já formatada; corrige também um falso-positivo de tipo (INTEGERdo BigQuery vsINT64da API — nomes legacy vs standard SQL).SyncUpdateLatestView(nova): resolve o únicoUpdatevinculado àTable(recusa se houver 0 ou mais de 1, pra não gravar no lugar errado), consultaget_gbq_client().get_table(gbq_slug).modifiede grava emUpdate.latest._gbq_slug_for_table(): helper compartilhado entre as duas views pra escolher o projeto do BigQuery certo por ambiente (basedosdados-devfora de prod,basedosdadosem prod), viais_prd().ferramentas.js/change_form.html/main.css: modais novos com spinner pros dois fluxos, evitando clique duplicado enquanto a requisição está em andamento.Test plan
ruff check/ruff formatlimposmanage.py checksem issuesdocker compose up(com credencial real do BigQuery prabasedosdados-dev): Checar Metadados mostra discrepâncias reais no modal; Sincronizar grava olast_modifiedde verdade emUpdate.latestTableTabletem 0 ou mais de 1Updatevinculado