Repository navigation
fix: modal de Importar Colunas, erros silenciosos no upload e reorganização de admin_data_tools - #1090
Merged
Conversation
- Remove </div> sobrando no change_form.html que quebrava a árvore DOM e deixava os labels do modal em branco pra alguns usuários/navegadores. - Botão de fechar e área de resultado ganham id/estrutura únicos, no mesmo padrão já usado por Checar Metadados e Sincronizar com o BigQuery. - upload_columns agora sempre responde em JSON (nunca deixa vazar traceback HTML), envolve a substituição de colunas em uma transação (falha no meio do import não apaga as colunas existentes) e valida nome de coluna e directory_column contra as regras de identificador do BigQuery antes de gravar qualquer coisa.
Move o endpoint de /upload_columns/ (api/v1) pra /admin-tools/upload-columns/ (UploadColumnsView), no mesmo padrão de classe já usado por CheckMetadadosView e SyncUpdateLatestView. Os helpers de leitura/validação da planilha viram funções privadas do módulo, junto das demais. Aproveita pra trocar o desempacotamento posicional de request.POST.values() por acesso nomeado aos campos.
views.py tinha 690 linhas misturando 3 assuntos sem relação direta. Divide em arquivos irmãos, no mesmo padrão já usado por _prefect3_client.py: - flow_monitoring.py: SyncDeploymentsView, FlowFailedWebhookView e helpers de monitoramento/auto-disable de flow no Prefect. - bigquery_sync.py: CheckMetadadosView, SyncUpdateLatestView e helpers de comparação/sincronização de Table contra o BigQuery. - column_import.py: UploadColumnsView, ColumnImportError e helpers de leitura/validação da planilha de arquitetura. urls.py passa a importar direto de cada módulo (único arquivo que importava de .views). Nenhuma lógica mudou, só o arquivo onde vive.
github-actions Bot
added a commit
that referenced
this pull request
Sep 17, 2026
chore: sync staging and main - (PRs: #1090)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Corrige modal de Importar Colunas, erros silenciosos no upload e reorganiza admin_data_tools
Resolve: #1089
Contexto
O botão "Importar Colunas" na página de admin de uma
Tableabre uma modal que, para alguns usuários, carregava com os labels dos campos em branco. Investigando isso, apareceram mais dois problemas na mesma view (upload_columns): erros viravam uma página HTML de traceback em vez de JSON (quebrando oresponse.json()do front) e uma falha no meio do processamento apagava as colunas existentes da tabela sem recriar nenhuma.Esse PR resolve os três problemas e aproveita pra migrar o endpoint pra
admin_data_tools, junto dos outros botões da mesma página (Checar Metadados,Sincronizar com o BigQuery), e dividir oadmin_data_tools/views.py(que já estava com 690 linhas) por domínio.Diagnóstico
</div>sobrando emchange_form.html, fechando uma<div>da página base do admin/Jazzmin e quebrando a árvore DOM do resto da página — navegadores recuperam de HTML malformado de formas diferentes, o que explica variar por usuário/navegadorSyntaxError: JSON.parse: unexpected character...no navegadorupload_columnsnão tinha tratamento de exceção — qualquer erro virava uma página HTML de traceback (500)selected_table.columns.all().delete()rodava antes de processar a planilha, sem transaçãoErro real reproduzido durante o desenvolvimento, usado como caso de teste: a planilha de arquitetura tinha
directory_columncom o nome da coluna duplicado (br_bd_diretorios_mundo.pais.sigla_pais_iso3:sigla_pais_iso3em vez debr_bd_diretorios_mundo.pais:sigla_pais_iso3) — o formato esperado édataset.tabela:coluna.O que mudou
change_form.html/ferramentas.js/main.css— modal</div>sobrando removidodadosModalclassduplicado no botão "Processar" removidoclassno mesmo elementoidúnico (dadosCloseButton)document.querySelector('.close-button'), que dependia da ordem no DOM (a mesma classe existe nos outros dois modais)#dadosResultado)alert()por uma renderização no mesmo estilo já usado pelo "Checar Metadados" (badge + nome da coluna em<code>+ detalhe)modal-content--wide)overflow-wrap: break-wordem.metadados-sucesso/.metadados-erro-geraldirectory_columnextenso) estourava a largura fixa da modalupload_columns— tratamento de erro e proteção de dadosselected_table.columns.all().delete()e a recriação das colunas agora rodam dentro de umatransaction.atomic()— se qualquer linha da planilha falhar, nada é perdido._validar_identificador_bq) aplicada ao nome da coluna e a cada pedaço dodirectory_column(dataset, tabela, coluna) — rejeita espaço, ponto a mais ou qualquer caractere fora de[A-Za-z0-9_], com mensagem apontando exatamente qual pedaço e por quê.{"status": "erro", "erro": "...", "coluna": "..."}), permitindo a UI destacar qual coluna da planilha causou o problema.Migração pra
admin_data_tools+ reorganizaçãoupload_columns(função solta emapi/v1/views.py, rota/upload_columns/) virouUploadColumnsView(classe, rota/admin-tools/upload-columns/), no mesmo padrão das outras views da página de admin deTable. Aproveitado pra trocar o desempacotamento posicional derequest.POST.values()(frágil, dependia da ordem exata dos campos do form) por acesso nomeado.admin_data_tools/views.pytinha 690 linhas misturando 3 assuntos sem relação direta. Dividido em arquivos irmãos, no mesmo padrão já usado por_prefect3_client.py:flow_monitoring.pySyncDeploymentsView,FlowFailedWebhookViewe helpers de monitoramento/auto-disable de flow no Prefectbigquery_sync.pyCheckMetadadosView,SyncUpdateLatestViewe helpers de comparação/sincronização deTablecontra o BigQuerycolumn_import.pyUploadColumnsView,ColumnImportErrore helpers de leitura/validação da planilha de arquiteturaurls.pypassa a importar direto de cada módulo (era o único arquivo que importava de.views). Nenhuma lógica mudou nessa etapa, só o arquivo onde vive.Testes
Sem suíte de testes automatizados rodável neste ambiente (sem infra de banco/Django test configurada) — validação feita com o ambiente local de verdade (
docker compose, banco real, servidor Django rodando) viacurl/manage.py shell, além deruff check/ruff format/py_compile/manage.py checkem todos os arquivos tocados.'country id')directory_columnsem:directory_columncom segmento extra (o erro real da planilha)directory_primary_keyresolvidotable_idinexistente / link de planilha inválido/upload_columns//admin-tools/upload-columns/CheckMetadadosView/SyncUpdateLatestView(não alteradas nesse PR, só movidas)SyncDeploymentsView/FlowFailedWebhookView(não alteradas, só movidas)