Skip to content

Adicionar app SPS #20

Description

@gitnnolabs

Descrição da tarefa

Adicionar o app Django sps ao repositório scielo-tools

Hoje, a lógica de conformidade SPS (geração de XML, marcação de citações no DOCX, validação packtools, HTML e PDF) está implementada no pacote sps/, mas só é utilizável no monólito quando o app manuscrito e as dependências satélite (rotulagem, docx_parser) estão presentes e corretamente configurados. O objetivo desta issue é tornar o sps uma camada isolada e reutilizável:

  • Sem dependência do app manuscrito, ia ou referencia.
  • Contrato Python estável (sps.xml, sps.xref, sps.utils, sps.exceptions) consumível por qualquer app Django ou script do projeto (manuscrito, spsvalidator, integrações futuras).
  • Auto-suficiente no âmbito da conformidade SPS: registo em INSTALLED_APPS, settings documentados, dependências explícitas em requirements/, smoke tests próprios.
  • Sem modelos de base de dados — módulo de lógica pura (models.py vazio); não exige migrations.

Âmbito:

Módulo Responsabilidade
sps/xml.py Geração de XML SPS a partir de DOCX + estrutura editorial (get_xml)
sps/xref.py Marcação e validação de citações no DOCX (ABNT, Vancouver bracket/superscript)
sps/utils.py Validação packtools (XML e pacote .zip), geração HTML e PDF
sps/exceptions.py Exceções de domínio (XMLFileValidationError, SPSPackageValidationError, etc.)
sps/apps.py Registo Django (SPSConfig)

Fora do âmbito desta issue:

  • Adição do app manuscrito, ia, referencia ou periodico.
  • API REST / JWT (DRF) — contrato inicial é biblioteca Python; API pode ser issue futura.
  • Migração de manuscrito/utils/xml_utils.py para sps/ (melhoria posterior).
  • Integração do pipeline editorial completo (DOCX → artigo → publicação).

Subtarefas

  • Copiar o pacote sps/`` para a raiz de scielo-tools(6 ficheiros:apps.py, exceptions.py, models.py, utils.py, xml.py, xref.py`).

  • Registar "sps" em LOCAL_APPS em config/settings/base.py.

  • Adicionar dependências em requirements/base.txt:

    • lxml==4.9.4
    • python-docx==1.1.2
    • git+https://git@github.com/scieloorg/packtools@4.12.6#egg=packtools
  • Adicionar pacote rotulagem .

  • Adicionar pacote docx_parser e layout docx_parser/layouts/two_cols.docx.

  • Configurar HTML_GENERATION_CONFIG em config/settings/base.py (paths de CSS/JS estáticos compatíveis com o projeto).

  • Garantir LibreOffice (soffice) no container Django local ou documentar instalação manual.

  • Avaliar e, se necessário, tornar opcional o uso de wagtail.images.get_image_model em sps/xml.py (parâmetro image_resolver ou fallback sem Wagtail).

  • Criar testes smoke mínimos em sps/tests/ (imports, validate_zip com fixture, xref.validate_marks com DOCX de exemplo).

  • Executar smoke test no shell Django:

    python manage.py shell
    from sps.xml import get_xml
    from sps import utils as sps_utils
    from sps.xref import is_marked, mark_references, validate_marks

API pública a preservar / expor

Contrato consumido por manuscrito (futuro), spsvalidator e outros apps:

sps.xml

Função Uso
get_xml(article_docx, data_front, data, data_back, xref_map=None) Geração de XML SPS a partir da estrutura editorial

sps.xref

Função Uso
is_marked(doc) Verifica se o DOCX já tem citações marcadas
mark_references(doc) Marca citações e referências no DOCX
validate_marks(doc) Valida consistência hyperlinks ↔ bookmarks
read_marks(doc) Lê marcas existentes
build_text_xref_replacer(doc) Função de substituição de xref em texto
make_text_xref_fn_from_refs(ref_items) Função xref a partir da lista de referências
apply_xml_xrefs_to_docx(doc, xml_tree) Aplica xrefs do XML ao DOCX (pipeline PDF)

sps.utils

Função Uso
validate_xml_document(xml_file_path, output_root_dir, params) Validação SPS de um XML
validate_zip(zip_path) Validação de pacote SPS .zip
generate_html_for_xml_document(xml_file_path, output_root_dir, config, asset_url_map=None) HTML via packtools
generate_pdf_for_xml_document(xml_file_path, output_root_dir, params) PDF via packtools + LibreOffice

sps.exceptions

  • XMLFileParsingError, XMLFileValidationError, XMLFileDocxGenerationError
  • XMLFilePDFGenerationError, XMLFileHTMLGenerationError, SPSPackageValidationError

Critérios de aceite

  • python manage.py check executa sem erros com sps em LOCAL_APPS.
  • Nenhum import de manuscrito, ia ou referencia dentro de sps/.
  • make build resolve dependências (incluindo packtools via git).
  • Imports smoke no django_shell sem ImportError.
  • API pública listada acima disponível com as mesmas assinaturas.
  • HTML_GENERATION_CONFIG acessível via django.conf.settings.
  • generate_pdf_for_xml_document encontra docx_parser/layouts/two_cols.docx.
  • Pelo menos um teste automatizado em sps/tests/ passa no CI.
  • LibreOffice disponível no Docker local para conversão DOCX → PDF (ou documentado como opcional).

Como testar manualmente

  1. Subir ambiente: make build && make up && make django_migrate.

  2. Abrir shell: make django_shell.

  3. Confirmar imports da API pública (sem ImportError).

  4. Validar um pacote SPS .zip existente:

    from sps import utils
    rows, exceptions = utils.validate_zip("/caminho/para/pacote.zip")
    print(len(rows), len(exceptions))
  5. (Opcional) Com DOCX de teste, exercitar marcação xref:

    from docx import Document
    from sps.xref import mark_references, validate_marks
    doc = Document("/caminho/artigo.docx")
    marked = mark_references(doc)
    print(validate_marks(marked))

Considerações e notas

  • Reutilização: o app sps já é logicamente separado do manuscrito
  • Sem testes próprios no initial: cobertura indireta em manuscrito/tests/; esta issue introduz testes mínimos em sps/tests/.
  • packtools via git: CI precisa de acesso a scieloorg/packtools durante o build Docker.
  • LibreOffice é dependência de sistema, não pip — relevante para Docker, produção e CI se testes de PDF forem incluídos.
  • Acoplamento Wagtail: sps/xml.py usa get_image_model() para resolver imagens por PK; para reuso fora de Wagtail, considerar callback injetável na fase de implementação.
  • Nomenclatura RCT vs código: o RCT menciona xml_manager; no initial o equivalente é sps/ + trechos em manuscrito/utils/xml_utils.py. Esta issue cobre apenas sps/.
  • Distinção de fluxos: sps.xref.mark_references(doc) marca citações no DOCX (hyperlinks/bookmarks); referencia + ia marcam bibliografia estruturada (JSON/XML JATS). São complementares, não substitutos.
  • Plano de fragmentação: ver docs/plans/2026-06-28-fragmentar-manuscrito.md (issue chore(deps): bump actions/checkout from 6 to 7 #3 na sequência sugerida).

Referências

  • RCT SciELO Tools v4.0 — conformidade SPS via packtools

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions