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
Draft
Conversation
…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.
…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.
…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.
cce180f to
68777c9
Compare
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.
📋 Descrição
Este PR eleva a versão do sistema para
v2.12.3e 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 appproc.🚀 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).wagtail_hooks.pysob 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.0014_pidproviderxml_readable_data_and_more.pygerada 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: CampoJSONFieldadicionado aoPidProviderXMLpara 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.get_recordsfoi 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)..select_related("current_version")e materialização de querysets avaliados para evitar requisições redundantes (mark_items_as_invalidpara gravação síncrona viabulk_update.3. Refatoração e Modularização da Suíte de Testes 🧪
pid_provider/tests/isolando testes por unidades funcionais:test_register.py: Garante os contratos de comportamento do orquestradorregister()analisando o retorno do dicionário e a gravação correspondente emPidProviderXMLRegistration.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)IssueProc.select_itemse nas tarefas assíncronas do Celery (task_migrate_and_publish_articles_by_journal), adicionando as flags explícitasforce_migrate_document_recordseforce_migrate_document_files. Se ativas, atualizam em lote o progresso de status dos registros de documentos/arquivos paraPROGRESS_STATUS_REPROC.pid_statusda visualização doArticleProcalterado pararead_only=Truena interface visual do painel.🛠️ Como Testar?
python manage.py test pid_provider.testsskippedcontendo os detalhes do payload JSON mapeados.