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):
- 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.
- 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
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
Como testar manualmente
- Subir o ambiente local (
make build && make up).
- Executar as migrações com sucesso.
- 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'))
- Testar o endpoint REST autenticado enviando uma requisição POST e validando o processamento assíncrono/síncrono.
Descrição da tarefa
Adicionar o app Django
referencia(renomeado do originalreferencesno singular) ao repositórioscielo-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_referencesvia 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:
referencia/models.pyReference(a citação textual) eElementCitation(os dados estruturados retornados e convertidos para XML).referencia/data_utils.pyget_xml) e tarefa Celery assíncrona (get_reference) para processamento via IA.referencia/wagtail_hooks.pyreferencia/api/v1/referencia/apps.pyReferenciaConfig).Decisões de Design para Reusabilidade (Auto-suficiência):
aipara utilizarem o novo appia(singular).referenciadependa apenas do framework Django, Wagtail e do app localia./api/v1/referencia/herdando deGenericViewSeteCreateModelMixin.manuscripts) podem usar a API REST ou importar os modelos diretamente de forma desacoplada.Fora do âmbito desta issue:
manuscripts.manuscripts.Pré-requisitos (blockers)
ia(App Django)referencia/data_utils.pyiadeve estar instalado e configurado no projeto (dependência direta destz_normemark_references).djangorestframeworkreferencia/api/lxmlreferencia/data_utils.pydjango-compressor/wagtail-json-widgetreferencia/models.pySubtarefas
referencia/na raiz do projetoreferencesparareferencia(ex: imports, nome da app, meta options).aiparaiaem todos os arquivos dereferencia/(ex:from ia.utils.normalizers import stz_normefrom ia.references import mark_references)."referencia"na listaLOCAL_APPSemconfig/settings/base.py.requirements/base.txtcaso não estejam presentes:lxmldjangorestframeworkwagtail-json-widgetreferenciano roteador global do DRF emconfig/urls.py.API pública a preservar / expor
Contratos consumidos externamente pelas demais aplicações:
referencia.data_utilsget_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 objetoReference.Endpoints REST API
POST /api/v1/referencia/(ou endpoint associado):{ "references": "Citação textual completa...", "type": "json" // ou "xml" }{ "message": "reference: { ... }" // JSON da citação ou XML JATS }Critérios de aceite
python manage.py checkexecuta sem erros de integridade.POST /api/v1/referencia/responde corretamente a requisições autenticadas.referencia_são criadas com sucesso no banco de dados.Como testar manualmente
make build && make up).python manage.py shell), testar o helper de criação JATS XML: