Skip to content

Adicionar app referencia #19

Description

@gitnnolabs

Descrição da tarefa

Adicionar o app Django referencia (renomeado do original references no singular) ao repositório scielo-tools.

A aplicação de referências é responsável por receber strings de citações textuais (mixed citations), normalizá-las, gerar o checksum e utilizar o serviço da aplicação ia (mark_references via LLMService) para extrair os elementos estruturados (autores, ano, volume, páginas, periódico, etc.) salvando-os em formato JSON e XML.

Esta app deve ser totalmente isolada, conter migrations próprias, suas próprias telas no Wagtail, suas próprias APIs REST (DRF) e ser estruturada de forma a ser reutilizável em outros projetos que dependam apenas do app ia.

Âmbito:

Módulo Responsabilidade
referencia/models.py Modelos Reference (a citação textual) e ElementCitation (os dados estruturados retornados e convertidos para XML).
referencia/data_utils.py Função auxiliar de conversão para XML JATS (get_xml) e tarefa Celery assíncrona (get_reference) para processamento via IA.
referencia/wagtail_hooks.py Painel administrativo no Wagtail para criação de lotes de referências e listagem de citações processadas.
referencia/api/v1/ Endpoints REST (via Django REST Framework) contendo serializers e views para receber submissões externas de citações.
referencia/apps.py Configuração do Django App (ReferenciaConfig).

Decisões de Design para Reusabilidade (Auto-suficiência):

  1. Desacoplamento de dependências globais:
    • Ajustar todos os imports que apontavam para ai para utilizarem o novo app ia (singular).
    • Garantir que o app referencia dependa apenas do framework Django, Wagtail e do app local ia.
  2. REST API Isolada e Reutilizável:
    • O app deve conter sua própria rota de API no padrão /api/v1/referencia/ herdando de GenericViewSet e CreateModelMixin.
    • Outras aplicações no futuro (como manuscripts) podem usar a API REST ou importar os modelos diretamente de forma desacoplada.

Fora do âmbito desta issue:

  • Integração da marcação com o fluxo do app manuscripts.
  • Criação/migração da aplicação manuscripts.

Pré-requisitos (blockers)

Pré-requisito Consumido por Notas
ia (App Django) referencia/data_utils.py O app ia deve estar instalado e configurado no projeto (dependência direta de stz_norm e mark_references).
djangorestframework referencia/api/ Necessário para expor as views DRF de processamento de referências.
lxml referencia/data_utils.py Processamento e manipulação de tags XML do elemento de citação.
django-compressor / wagtail-json-widget referencia/models.py Interface rica do JSONEditorWidget no admin do Wagtail.

Subtarefas

  • Criar a pasta do app referencia/ na raiz do projeto
  • Renomear todas as referências internas de references para referencia (ex: imports, nome da app, meta options).
  • Ajustar imports de ai para ia em todos os arquivos de referencia/ (ex: from ia.utils.normalizers import stz_norm e from ia.references import mark_references).
  • Registrar "referencia" na lista LOCAL_APPS em config/settings/base.py.
  • Adicionar dependências necessárias em requirements/base.txt caso não estejam presentes:
    • lxml
    • djangorestframework
    • wagtail-json-widget
  • Rodar o comando de geração de migrações iniciais para a app:
    python manage.py makemigrations referencia
  • Executar as migrações no banco local:
    python manage.py migrate
  • Registrar o roteamento das APIs REST da app referencia no roteador global do DRF em config/urls.py.
  • Garantir que o painel administrativo do Wagtail exiba a aba "References" no menu de snippets.
  • Realizar smoke test no shell Django:
    python manage.py shell
    from referencia.data_utils import get_xml
    # Garantir que a geração JATS XML baseada no parser lxml funciona sem erros

API pública a preservar / expor

Contratos consumidos externamente pelas demais aplicações:

referencia.data_utils

  • get_xml(json_reference): Converte a estrutura de resposta JSON da IA em um nó XML <element-citation> JATS compatível.
  • get_reference(obj_id): Tarefa Celery (ou chamada direta síncrona) que consome a IA e atualiza o status do objeto Reference.

Endpoints REST API

  • POST /api/v1/referencia/ (ou endpoint associado):
    • Request Payload:
      {
        "references": "Citação textual completa...",
        "type": "json" // ou "xml"
      }
    • Response:
      {
        "message": "reference: { ... }" // JSON da citação ou XML JATS
      }

Critérios de aceite

  • O comando python manage.py check executa sem erros de integridade.
  • A API REST POST /api/v1/referencia/ responde corretamente a requisições autenticadas.
  • As tabelas prefixadas com referencia_ são criadas com sucesso no banco de dados.
  • O snippet administrativo de referências do Wagtail permite criar itens manualmente colando referências textuais e dispara com sucesso o fluxo de marcação.

Como testar manualmente

  1. Subir o ambiente local (make build && make up).
  2. Executar as migrações com sucesso.
  3. No console Django (python manage.py shell), testar o helper de criação JATS XML:
    import json
    from referencia.data_utils import get_xml
    from lxml import etree
    sample_json = json.dumps({"reftype": "journal", "title": "Test Title", "source": "Nature", "date": "2024"})
    xml_node = get_xml(sample_json)
    print(etree.tostring(xml_node, pretty_print=True, encoding='unicode'))
  4. Testar o endpoint REST autenticado enviando uma requisição POST e validando o processamento assíncrono/síncrono.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions