Skip to content

Acoplar geração de XML PubMed e PMC ao xml_manager #122

Description

@Rossi-Luciano

Objetivo

Adicionar ao app xml_manager a geração automática de XML nos formatos PubMed e PMC a partir do XML SciELO (SPS), usando packtools.sps.formats.pubmed e packtools.sps.formats.pmc. Essas saídas já constam no README do projeto ("Saídas: Pacote SPS, PDF, HTML, XML Crossref/PubMed/PMC, JSON DOAJ") mas ainda não estão implementadas — hoje só PDF está integrado (HTML é stub).

Padrão a seguir

Replicar o padrão já existente para PDF/HTML em xml_manager:

  • models.py: XMLDocumentPDF / XMLDocumentHTML → modelo de saída por formato
  • utils.py: generate_pdf_for_xml_document → wrapper de geração
  • exceptions.py: XML_File_*_Error
  • tracker/choices.py: XML_DOCUMENT_CONVERSION_TO_*_ERROR
  • tasks.py: task_generate_*_file (Celery), chamado por task_process_xml_document, com XMLDocumentEvent em erro
  • wagtail_hooks.py: SnippetViewSet por modelo de saída

Escopo

1. Modelos (xml_manager/models.py + migration)

  • XMLDocumentPubMed (FK para XMLDocument, pubmed_file FileField)
  • XMLDocumentPMC (FK para XMLDocument, pmc_file FileField)

2. xml_manager/utils.py

  • generate_pubmed_for_xml_document(xml_file_path, output_root_dir, params):
    • parse do XML, chama packtools.sps.formats.pubmed.pipeline_pubmed(xml_tree), grava <base>.pubmed.xml
  • generate_pmc_for_xml_document(xml_file_path, output_root_dir, params):
    • parse do XML, chama packtools.sps.formats.pmc.pipeline_pmc(deepcopy(xml_tree)), grava <base>.pmc.xml
    • atenção: pipeline_pmc muta a árvore in-place (remove <institution>, <mixed-citation> etc.) — usar deepcopy para não corromper a árvore usada por outras tasks (validação/PDF) na mesma execução de task_process_xml_document.

3. xml_manager/exceptions.py

  • XML_File_PubMed_Generation_Error
  • XML_File_PMC_Generation_Error

4. tracker/choices.py

  • Novos códigos de erro de conversão (XML_DOCUMENT_CONVERSION_TO_PUBMED_ERROR, XML_DOCUMENT_CONVERSION_TO_PMC_ERROR) + entradas em XML_DOCUMENT_EVENT.
  • Atenção: XMLDocumentEvent.error_type tem max_length=3; os códigos atuais (XPE, VDE, CDE...) têm 3 chars — escolher siglas compatíveis (ex.: PME, PCE) ou ajustar o max_length.

5. xml_manager/tasks.py

  • task_generate_pubmed_file e task_generate_pmc_file (mesmo padrão de task_generate_pdf_file, sem dependência de DOCX/LibreOffice).
  • Chamar ambas em task_process_xml_document.

6. xml_manager/wagtail_hooks.py

  • XMLDocumentPubMedSnippetViewSet e XMLDocumentPMCSnippetViewSet (cópia do padrão de XMLDocumentHTMLSnippetViewSet), registrados no menu xml_manager.

7. Testes

  • Seguir padrão de xml_manager/tests/test_sps_package_validation.py (mock de packtools).
  • test_generate_pubmed_for_xml_document / test_generate_pmc_for_xml_document: caminho feliz + erro mockado.
  • Caso específico para PMC: garantir que o xml_tree original não é mutado (testar deepcopy).
  • Tasks: mock de utils.generate_*, checar criação de XMLDocumentPubMed/XMLDocumentPMC ou XMLDocumentEvent em erro.

Dependências / riscos — bugs no packtools (upstream)

requirements/base.txt fixa packtools@4.12.6. Dois bugs reportados em scieloorg/packtools afetam diretamente este acoplamento e devem ser verificados/mitigados antes de habilitar em produção:

Mitigação possível: pós-processamento leve em generate_pubmed_for_xml_document para remover <ArticleIdList/> vazio, removível quando o upstream corrigir; ou aguardar fix/upgrade do packtools.

Ordem de implementação sugerida

  1. Migration + modelos XMLDocumentPubMed/XMLDocumentPMC
  2. exceptions.py + tracker/choices.py
  3. utils.py (geração) + testes unitários isolados (sem Celery)
  4. tasks.py + integração em task_process_xml_document + testes de task
  5. wagtail_hooks.py (admin)
  6. Validação manual com XML real (make pytest + admin local)
  7. Checar/mitigar Bug: pipeline_pubmed gera <ArticleIdList/> vazio quando a referência não possui IDs packtools#1214 e #1216 antes de habilitar em produção

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions