Skip to content

Unificar as mudanças no pid_provider do scms-upload e do core: auditoria de registro, aprimoramento de matching/persistência e otimizações de query #1447

Description

@robertatakenaka

Descrição:

O app pid_provider é compartilhado entre core e upload, e de tempos em tempos é preciso sincronizar os avanços feitos em paralelo nos dois lados. Nesta rodada, o lado upload avançou em pontos que valem a pena trazer para o core:

1. Auditoria de falhas no fluxo de registro

Hoje, quando PidProviderXML.register() falha antes de existir um registro (unmatched, conflito, bad_request, erro inesperado), a única rastreabilidade é via UnexpectedEvent, sem padronização de status nem filtro fácil no admin. Precisamos de um modelo de auditoria que grave sempre o resultado do fluxo (created/updated/skipped/forbidden/conflict/unmatched/bad_request/error), inclusive quando não há PidProviderXML associado.

2. Matching de XML por soma de pontos fixos é frágil

O matching atual (best_matches/match/title_similarity) soma pontos fixos por campo batido (+100 aqui, +10 ali) sem um critério comparável entre as diferentes estratégias de busca (por ids / por journal+issue+artigo / por journal+artigo). Isso dificulta calibrar o corte de aceitação e entender por que um documento foi ou não considerado "o mesmo".

3. Bugs encontrados na revisão

  • fix_duplicated_pkg_name acessa other_pid.current_version, campo que não existe em OtherPid (o campo correto é version) — isso lançaria AttributeError em produção sempre que houver deduplicação com other_pid do tipo pid_v3.
  • mark_items_as_invalid calcula invalid = bool(item.xml_with_pre) mas nunca persiste o resultado — o método hoje não tem efeito nenhum no banco.

4. Falta de rastreio estruturado de falhas por URL (XMLURL)

XMLURL guarda só uma string de exceptions truncada manualmente (_truncate_traceback), sem status padronizado (choices) nem campo estruturado pra guardar a resposta completa do registro. Isso dificulta investigar falhas de fetch/registro em lote.

5. Repetição de select_related("current_version")

Vários classmethods de PidProviderXML repetem manualmente select_related("current_version") — candidato natural a manager customizado.

Critério de aceite:

  • Novo modelo PidProviderXMLRegistration grava o resultado de todo register(), com FK nullable para PidProviderXML.
  • Matching reescrito com score percentual comparável (compare()/get_best_match()), documentando o formato de retorno.
  • Bug do other_pid.version corrigido.
  • mark_items_as_invalid passa a persistir via bulk_update.
  • XMLURL ganha status com choices, campo detail (JSON) e método record() centralizando a gravação.
  • PidProviderXMLManager aplica select_related("current_version") por padrão.
  • Novos ViewSets de admin para XMLURL e PidProviderXMLRegistration.
  • XMLEvent (já em produção no core) não é alterado nem unificado com PidProviderXMLRegistration — são domínios de falha diferentes (registro de PID vs. consumo do XML para gerar Article) e a diferença de nullability/cascade é proposital.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions