Skip to content

Esteira de Matching XML Otimizada, Eventos de Auditoria (Wagtail) e corrige parâmetros de Forçar Reprocessamento em Lote#1013

Draft
robertatakenaka wants to merge 12 commits into
scieloorg:mainfrom
robertatakenaka:tk_1006_2
Draft

Esteira de Matching XML Otimizada, Eventos de Auditoria (Wagtail) e corrige parâmetros de Forçar Reprocessamento em Lote#1013
robertatakenaka wants to merge 12 commits into
scieloorg:mainfrom
robertatakenaka:tk_1006_2

Conversation

@robertatakenaka

@robertatakenaka robertatakenaka commented Jun 27, 2026

Copy link
Copy Markdown
Member

📋 Descrição

Este PR eleva a versão do sistema para v2.12.3 e introduz melhorias profundas de performance e rastreabilidade no ecossistema de identificação de documentos (pid_provider). Além disso, traz flexibilidade operacional para a re-migração forçada de artigos e fascículos controlados pelo app proc.


🚀 Principais Mudanças

1. Novo Modelo de Auditoria e Logs Estruturados

  • PidProviderXMLRegistration: Acoplamento de uma nova tabela e modelo de dados para registrar, de forma resiliente, cada transação síncrona ou assíncrona da esteira de PIDs. Os eventos salvos assumem status granulares (created, updated, skipped, forbidden, conflict, unmatched, bad_request, error).
  • Interface Administrativa (Wagtail): Integração do novo modelo em wagtail_hooks.py sob a aba PID Registration Events, disponibilizado como visualização em modo Read-Only, com paginação de 50 itens, barramento de pesquisa por PID v3/pacote e filtros dinâmicos por tipo de erro.
  • Database Migration: Inclusão da migração nativa 0014_pidproviderxml_readable_data_and_more.py gerada para o Django 5.2, contendo os índices de performance para buscas rápidas por status e data de criação.

2. Otimização de Performance, Redução de I/O e Nova Busca Cascata

  • readable_data: Campo JSONField adicionado ao PidProviderXML para atuar como cache local estruturado dos principais metadados textuais do XML (títulos, autores, links, corpo resumido), mitigando leituras custosas e recorrentes de disco ou S3.
  • Estratégia Multicamadas de Fallback: O algoritmo de localização do método get_records foi redesenhado para varrer candidatos em 3 etapas sequenciais baseadas em escopos lógicos (1. Identificadores diretos; 2. Periódico + Fascículo + Dados textuais; 3. Periódico + Dados textuais).
  • Eficiência no ORM: Aplicação de .select_related("current_version") e materialização de querysets avaliados para evitar requisições redundantes ($N+1$). Otimização do loop de invalidação em mark_items_as_invalid para gravação síncrona via bulk_update.

3. Refatoração e Modularização da Suíte de Testes 🧪

  • O arquivo centralizador de testes legado foi removido da raiz do app.
  • Criação do pacote encapsulado pid_provider/tests/ isolando testes por unidades funcionais:
  • test_register.py: Garante os contratos de comportamento do orquestrador register() analisando o retorno do dicionário e a gravação correspondente em PidProviderXMLRegistration.
  • test_get_records.py: Valida o funcionamento rigoroso das 3 camadas de busca e estratégias de fallback.
  • test_best_matches.py: Cobre os critérios de desempate por ordenação de data e linhas de corte de similaridade (percentual_score).

4. Ajustes Operacionais e Rollout de Migração (proc)

  • Forçar Reprocessamento de Documentos/Arquivos: Alteração nas assinaturas de IssueProc.select_items e nas tarefas assíncronas do Celery (task_migrate_and_publish_articles_by_journal), adicionando as flags explícitas force_migrate_document_records e force_migrate_document_files. Se ativas, atualizam em lote o progresso de status dos registros de documentos/arquivos para PROGRESS_STATUS_REPROC.
  • Wagtail Hardening: Campo pid_status da visualização do ArticleProc alterado para read_only=True na interface visual do painel.

🛠️ Como Testar?

  1. Rodar Migrações do Banco de Dados:
python manage.py migrate
  1. Executar a Nova Suite de Testes:
python manage.py test pid_provider.tests
  1. Validar Eventos no Admin: Execute a migração de artigos. Abra a interface do Wagtail, navegue até PID Registration Events e verifique se as requisições idênticas geraram corretamente eventos estruturados com o status skipped contendo os detalhes do payload JSON mapeados.

…ders de query

* Centralização da lógica de comparação: Criação das funções 'compare', 'compare_lists' e 'compare_items' para isolar a responsabilidade de matching de dados e cálculo de score percentual.
* Otimização do 'identifier_queries': Ativação do filtro por 'main_doi' que estava comentado e inclusão da busca otimizada de 'other_pids' utilizando o operador '__in' em um conjunto ('set') coletado dinamicamente.
* Segregação de parâmetros de busca: Desacoplamento dos parâmetros de paginação do artigo ('article_location_params') dos dados gerais do fascículo ('issue_params'), permitindo buscas granulares no banco de dados.

Por que: Melhora a manutenibilidade ao remover o acoplamento de cálculos estatísticos dentro da classe do modelo e otimiza a performance das consultas iniciais por identificadores únicos no banco.
…e propriedade

* Otimização de Performance com Cache: Aplicação do decorador '@cached_property' na propriedade 'xml_with_pre' para evitar leituras redundantes e reprocessamento do XML.
* Nova Estratégia de Curto-Circuito (Short-Circuit Queries): Reformulação do método 'get_records' para realizar buscas em cascata (IDs diretos -> Journal + Issue + Article -> Journal + Article), retornando os resultados imediatamente ao encontrar um match ideal, mitigando queries pesadas desnecessárias.
* Simplificação e Limpeza do Modelo: Remoção dos métodos depreciados 'article_pid_suffix_source', 'get_article_pid_suffix', 'match' e 'title_similarity' (agora delegados ao 'query_params').
* Ajuste no Fluxo de Exceções: Substituição do método 'get_record' por um mapeamento direto através do 'best_matches', tratando de forma transparente erros de 'MultipleObjectsReturned' e unificando as respostas de erro para o client.

Por que: Reduz drasticamente o consumo de CPU e acessos ao banco de dados através do cache de propriedades e impede a execução de queries complexas de fallback quando uma correspondência exata por ID já foi estabelecida.
* Corrige lookup de 'other_pids' para utilizar o operador '__in', evitando erros de query quando múltiplos PIDs são fornecidos.
* Simplifica e otimiza a lógica do método 'article_data_query': remove blocos condicionais redundantes e limpa o fluxo de checagem dos campos de texto (surnames, collab, links, partial_body).
* Melhora a legibilidade do código reduzindo aninhamentos desnecessários na construção do objeto Q.
…oviderXML

* Desempenho e Memória: Modifica 'get_records' e 'best_matches' para materializar QuerySets em listas e utilizar 'select_related("current_version")', eliminando consultas redundantes ao banco de dados durante loops.
* Desempenho e Redundância: Substitui iterações individuais por 'bulk_update' com batch_size em 'mark_items_as_invalid'. Otimiza '_add_other_pid' para salvar apenas o campo modificado utilizando 'update_fields=["other_pid_count"]'.
* Desempenho e Cache: Introduz o campo 'readable_data' (JSON) no 'PidProviderXML' para armazenar metadados cacheados (sobrenomes, títulos, links), evitando a leitura custosa de arquivos XML em disco no método 'data_to_compare'.
* Robustez e Arquitetura: Simplifica a busca por '.latest()', removendo condicionais obsoletas de tratamento de exceção. Refatora o método 'add_collections' para inferir dinamicamente o path do campo via 'FieldError', isolando regras legadas de prefixo.
* Auditoria: Cria o modelo 'PidProviderXMLRegistration' e integra-o via bloco 'finally' no método 'register', garantindo que todo histórico de importação (sucessos, pulados, conflitos e falhas) seja persistido de forma resiliente.
* Adiciona o 'PidProviderXMLRegistrationViewSet' ao ecossistema do Wagtail.
* Configura colunas de exibição (list_display), filtros laterais (list_filter) e campos de busca por nome do pacote, tipo de erro e v3 do PID.
* Otimiza o desempenho da listagem administrativa forçando o uso de 'select_related("pid_provider_xml")' no queryset para mitigar problemas de query N+1 na UI.
…o input_data

- Substituida a busca direta por chave por 'input_data.get(label)' dentro da funcao de comparacao.
- Otimizacao/Seguranca: Evita falhas de execucao (KeyError) caso o dicionario de entrada nao contenha todas as chaves esperadas, tornando o codigo mais resiliente sem a necessidade de blocos try/except adicionais.
…os e adiciona telemetria

- Removida a redundancia de escopo 'PidProviderXML.PARTIAL_BODY_MAX' para 'PARTIAL_BODY_MAX' na propriedade partial, otimizando o acesso ao atributo.
- Adicionados logs de depuracao (print) para rastreamento do fluxo de dados das variaveis 'response' e 'readable_input'.
- Refatorado o bloco except para capturar o traceback via 'sys.exc_info()', registrar a excecao nativamente com 'logging.exception(exc)' e tratar de forma explicita cenarios onde o status do evento e 'skipped' ou 'unmatched'.
- Atualizada a regra de negocio de correspondencia (score minimo) de 0.5 para 0.6 para aumentar a precisao dos resultados homologados.
- Injetado o ID do item diretamente no dicionario de resposta para facilitar o mapeamento reverso.
- Removido o bloco de codigo obsoleto que disparava o evento 'UnexpectedEvent', centralizando a regra de negocio no fluxo do 'PidProviderXMLRegistration' conforme arquitetura planejada.
…egiveis do XML

- Gerada a migracao 0014 para refletir as alteracoes de campos e metadados necessarios a persistencia do 'readable_data' no modelo 'PidProviderXML'.
- Garante a integridade e sincronismo entre a definicao da classe de negocio e o esquema do banco de dados relacional.
…os fluxos

- Adicionada a estrutura de testes dentro de 'pid_provider/tests/' cobrindo os modulos cruciais do sistema.
- Incluidos testes especificos para 'test_best_matches.py', 'test_controller.py', 'test_get_records.py', 'test_models.py' e 'test_register.py'.
- Garante a cobertura de codigo, consistencia das novas regras de score (0.6) e previne regressoes no comportamento do motor de busca e registro de PIDs.
@robertatakenaka robertatakenaka requested a review from patymori June 27, 2026 20:20
@robertatakenaka robertatakenaka self-assigned this Jun 27, 2026
…ondencia

- Removida a multiplicacao por 100 no calculo do 'percentual_score'.
- Otimizacao/Correcao: Ajusta o retorno para uma escala decimal (0 a 1) em vez de percentual (0 a 100), compatibilizando o resultado com a nova regra de corte de score estabelecida em 0.6.
@robertatakenaka robertatakenaka changed the title Refactor: Otimização de matching de XMLs, auditoria estruturada (Registration Events) e reestruturação de testes Esteira de Matching XML Otimizada, Eventos de Auditoria (Wagtail) e corrige parâmetros de Forçar Reprocessamento em Lote Jun 27, 2026
@robertatakenaka robertatakenaka marked this pull request as draft June 27, 2026 22:09
…snippets

- Comentado o metodo 'get_queryset' antigo e incorreto que quebrava a assinatura do Wagtail/Django.
- Adicionado o 'PidProviderXMLRegistrationViewSet' a tupla de viewsets do 'PidProviderViewSetGroup'.
- Melhora o gerenciamento e a visibilidade dos logs de auditoria de registros XML diretamente na interface administrativa.
… diretorios

- Concluida a remocao dos arquivos 'test_controller.py' e 'test_models.py' da raiz do modulo pid_provider.
- Organizacao: Conecta a delecao no antigo escopo com a migracao dos arquivos para dentro da pasta consolidada 'pid_provider/tests/', finalizando a reestruturacao da suite de testes automatizados.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant