Skip to content

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

@Rossi-Luciano

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions