You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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).
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.
Objetivo
Adicionar ao app
xml_managera geração automática de XML nos formatos PubMed e PMC a partir do XML SciELO (SPS), usandopacktools.sps.formats.pubmedepacktools.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 formatoutils.py:generate_pdf_for_xml_document→ wrapper de geraçãoexceptions.py:XML_File_*_Errortracker/choices.py:XML_DOCUMENT_CONVERSION_TO_*_ERRORtasks.py:task_generate_*_file(Celery), chamado portask_process_xml_document, comXMLDocumentEventem errowagtail_hooks.py:SnippetViewSetpor modelo de saídaEscopo
1. Modelos (
xml_manager/models.py+ migration)XMLDocumentPubMed(FK paraXMLDocument,pubmed_fileFileField)XMLDocumentPMC(FK paraXMLDocument,pmc_fileFileField)2.
xml_manager/utils.pygenerate_pubmed_for_xml_document(xml_file_path, output_root_dir, params):packtools.sps.formats.pubmed.pipeline_pubmed(xml_tree), grava<base>.pubmed.xmlgenerate_pmc_for_xml_document(xml_file_path, output_root_dir, params):packtools.sps.formats.pmc.pipeline_pmc(deepcopy(xml_tree)), grava<base>.pmc.xmlpipeline_pmcmuta a árvore in-place (remove<institution>,<mixed-citation>etc.) — usardeepcopypara não corromper a árvore usada por outras tasks (validação/PDF) na mesma execução detask_process_xml_document.3.
xml_manager/exceptions.pyXML_File_PubMed_Generation_ErrorXML_File_PMC_Generation_Error4.
tracker/choices.pyXML_DOCUMENT_CONVERSION_TO_PUBMED_ERROR,XML_DOCUMENT_CONVERSION_TO_PMC_ERROR) + entradas emXML_DOCUMENT_EVENT.XMLDocumentEvent.error_typetemmax_length=3; os códigos atuais (XPE,VDE,CDE...) têm 3 chars — escolher siglas compatíveis (ex.:PME,PCE) ou ajustar omax_length.5.
xml_manager/tasks.pytask_generate_pubmed_fileetask_generate_pmc_file(mesmo padrão detask_generate_pdf_file, sem dependência de DOCX/LibreOffice).task_process_xml_document.6.
xml_manager/wagtail_hooks.pyXMLDocumentPubMedSnippetViewSeteXMLDocumentPMCSnippetViewSet(cópia do padrão deXMLDocumentHTMLSnippetViewSet), registrados no menuxml_manager.7. Testes
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.xml_treeoriginal não é mutado (testardeepcopy).utils.generate_*, checar criação deXMLDocumentPubMed/XMLDocumentPMCouXMLDocumentEventem erro.Dependências / riscos — bugs no packtools (upstream)
requirements/base.txtfixapacktools@4.12.6. Dois bugs reportados emscieloorg/packtoolsafetam diretamente este acoplamento e devem ser verificados/mitigados antes de habilitar em produção:pipeline_pubmedgera<ArticleIdList/>vazio para referências sem PMID/DOI/PMCID, produzindo XML PubMed tecnicamente inválido. Esse caminho é exercitado diretamente porgenerate_pubmed_for_xml_document.mml/xlink) emsps_xml/*dependem de estado global do lxml e da ordem de chamadas no processo; pode afetar XML PubMed/PMC se outras conversões (ex.:markup_doc/pkg_zip_builder.py, que usasps_xml.article) já rodaram no mesmo worker Celery.Mitigação possível: pós-processamento leve em
generate_pubmed_for_xml_documentpara remover<ArticleIdList/>vazio, removível quando o upstream corrigir; ou aguardar fix/upgrade do packtools.Ordem de implementação sugerida
XMLDocumentPubMed/XMLDocumentPMCexceptions.py+tracker/choices.pyutils.py(geração) + testes unitários isolados (sem Celery)tasks.py+ integração emtask_process_xml_document+ testes de taskwagtail_hooks.py(admin)make pytest+ admin local)