Skip to content

Melhora fluxo de criacao e atualizacao de artigo#1455

Open
robertatakenaka wants to merge 6 commits into
scieloorg:mainfrom
robertatakenaka:melhora_fluxo_de_criacao_e_atualizacao_de_artigo
Open

Melhora fluxo de criacao e atualizacao de artigo#1455
robertatakenaka wants to merge 6 commits into
scieloorg:mainfrom
robertatakenaka:melhora_fluxo_de_criacao_e_atualizacao_de_artigo

Conversation

@robertatakenaka

Copy link
Copy Markdown
Member

O que esse PR faz?

Reduz a dependência dos modelos ArticleEvent e XMLEvent, migrando o registro de erros e progresso do pipeline de artigos para UnexpectedEvent (mais genérico) e para o campo article.errors, já existente no modelo Article:

  • Em article/tasks.py (task_export_article_to_articlemeta e task_process_article_pipeline), introduz variáveis de rastreamento (item / unexpected_event_item) atualizadas a cada etapa do fluxo, e padroniza as chamadas a UnexpectedEvent.create(action=..., item=...), enriquecendo detail com mais contexto (collection_acron_list, source_date, auto_solve_pid_conflict, version).
  • Em article/sources/xmlsps.py (load_article):
    • Remove o uso de ArticleEvent (article.add_event(...) / event.finish(...)), eliminando article.events.all().delete() e as ramificações if event: ....
    • Introduz a função finish(article, errors, messages), que grava errors/messages diretamente em article.errors e decide entre mark_as_completed() e save().
    • Substitui logging.info(...) por uma lista messages, persistida via finish(...).
    • Corrige perda de exceção no fluxo de erro (add_error(errors, "load_article", e) antes de finish(...)).
    • Simplifica o tratamento de pp_xml.xml_with_pre e passa a reaproveitar o Article já vinculado ao pp_xml, evitando duplicação.
    • Remove imports não mais usados, incluindo PPXML_STATUS_* e PidProviderXML.
  • Em article/models.py (Article.check_availability), remove totalmente a dependência do event (ArticleEvent), chamando UnexpectedEvent.create(action=..., item=..., detail={"traceback": ...}) incondicionalmente.

Resultado líquido: três pontos do pipeline de artigos que antes dependiam de ArticleEvent agora usam apenas UnexpectedEvent ou article.errors, aproximando o código do objetivo de descontinuar ArticleEvent/XMLEvent como modelos separados.

Onde a revisão poderia começar?

article/sources/xmlsps.py, função load_article e a nova função finish — é onde a remoção de ArticleEvent é mais visível. Em seguida, article/models.py, no bloco except de check_availability. Por fim, article/tasks.py, revisando as novas chamadas a UnexpectedEvent.create(...).

Como este poderia ser testado manualmente?

  1. Rodar task_process_article_pipeline com um pp_xml_id válido e verificar que nenhum ArticleEvent é criado, que article.errors é preenchido com messages (e errors, se houver falha), e que reprocessar o mesmo pp_xml reaproveita o Article existente.
  2. Forçar um erro proposital em load_article (ex.: journal inexistente) e confirmar que nenhum ArticleEvent é criado e que a exceção é registrada em article.errors antes do raise.
  3. Rodar Article.check_availability(force_update=True) provocando uma exceção e verificar que nenhum event (ArticleEvent) é criado e que UnexpectedEvent.create(...) é chamado com action, item e detail={"traceback": ...} corretamente.
  4. Buscar no código (grep -r "add_event\|ArticleEvent\|XMLEvent") para confirmar que os pontos alterados neste PR não deixaram nenhuma referência residual.

Algum cenário de contexto que queira dar?

Esta mudança é parte de um esforço maior para descontinuar os modelos ArticleEvent e XMLEvent, substituindo-os por UnexpectedEvent e por campos já existentes nas próprias entidades (como article.errors). O objetivo de longo prazo é remover esses modelos do banco assim que todos os pontos de uso forem migrados — este PR cobre a parte de article/tasks.py, article/sources/xmlsps.py e article/models.py.

Screenshots

Não aplicável — mudança apenas em código de backend/pipeline, sem interface visual.

Quais são os tickets relevantes?

#1454

Referências

  • article/tasks.py
  • article/sources/xmlsps.py
  • article/models.py

Segurança da informação (NSI.04)

Seção obrigatória. Marque as opções aplicáveis e justifique quando necessário. Referência: NSI.04 - Norma de Desenvolvimento Seguro.

Este PR manipula dados sensíveis ou pessoais (LGPD)?

  • Sim — descreva os controles de proteção aplicados (criptografia, mascaramento, anonimização, etc.):
  • Não

Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?

  • Sim — descreva o que mudou e por quê:
  • Não

Este PR introduz, atualiza ou remove dependências de terceiros?

  • Sim — as novas dependências foram verificadas no SBOM/Trivy sem vulnerabilidades críticas/altas em aberto?
    • Verificado e aprovado
    • Pendente / vulnerabilidade aceita com justificativa:
  • Não

Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?

  • Sim — link do job:
  • Não aplicável a este PR (justifique):
    (preencher conforme resultado do pipeline no CI antes de abrir o PR)

Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?

  • Sim — confirme que há sanitização/parametrização (prepared statements, escaping, etc.):
  • Não

Este PR expõe novos endpoints, telas ou serviços?

  • Sim — HTTPS obrigatório está garantido e o acesso segue o princípio de menor privilégio?
  • Não

Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?

  • Não, nenhum segredo foi commitado
  • Sim (bloquear merge e corrigir antes de prosseguir)

… erro

Propósito:
Melhorar o diagnóstico de falhas em task_export_article_to_articlemeta
e task_process_article_pipeline, permitindo identificar qual entidade
(pid_v3/article, xml_url/article_source/pp_xml/article) estava sendo
processada no momento da exceção.

Solução técnica:
- Introduz variável de rastreamento (item / unexpected_event_item) que
  é atualizada a cada etapa bem-sucedida do fluxo, refletindo sempre o
  estado mais recente do processamento.
- Inclui os novos parâmetros action e item em UnexpectedEvent.create,
  substituindo a chave 'task' do dicionário detail (agora redundante
  com o parâmetro action).
- Amplia o detail de task_process_article_pipeline com campos
  adicionais de contexto (source_date, collection_acron_list,
  auto_solve_pid_conflict, version) para facilitar a reprodução de
  erros a partir dos logs.
…sagens em 'messages'

Propósito:
Padronizar o rastreamento do processamento de load_article, permitindo
que as mensagens de progresso (antes apenas em logging.info) sejam
persistidas junto ao evento, facilitando auditoria e diagnóstico
posterior sem depender de logs externos.

Solução técnica:
- Substitui as chamadas logging.info(...) por append em uma lista
  messages, coletada ao longo de toda a função.
- Inclui messages no detail de pp_xml.add_event(...) nos fluxos de
  erro (falha
ao obter xml_with_pre e exceção não tratada).
- Ajusta event.finish(...) para repassar detail={'messages': messages}
  tanto no fluxo de sucesso quanto no fluxo de exceção, já que
  add_event() ainda não propaga detail para ArticleEvent.create().
- Remove chamada redundante a errors=not errors em event.finish() no
  fluxo de sucesso (agora usa apenas errors=errors).
- Reformata a atualização de Article.objects.filter(...).update(...)
  removendo a variável 'updated' não utilizada.
- Remove comentários obsoletos que não agregavam contexto técnico.
…re e busca artigo por pp_xml

Propósito:
Simplificar o fluxo de obtenção do XML do pp_xml, removendo captura de
exceção desnecessária, e evitar duplicidade de artigos ao priorizar a
busca por artigo já existente vinculado ao pp_xml antes de criar um
novo via Article.create_or_update.

Solução técnica:
- Substitui o bloco try/except em torno de pp_xml.xml_with_pre por uma
  checagem direta (if not xml_with_pre), já que o acesso à propriedade
  não deve mais lançar exceção tratável aqui; simplifica a mensagem de
  ValueError levantada e remove o registro de evento/erro associado
  (pp_xml.add_event), que se torna redundante nesse ponto do fluxo.
- Altera a obtenção do artigo principal: agora tenta primeiro
  Article.objects.get(pp_xml=pp_xml); em caso de
  Article.MultipleObjectsReturned, seleciona o mais recente por
  'updated'; em caso de Article.DoesNotExist, cria/atualiza via
  Article.create_or_update(...) como antes.
- Mantém o registro da mensagem de progresso '...Article {pid_v3}
  {sps_pkg_name}' após a obtenção do artigo.
… finish() e remove imports não utilizados

Propósito:
Corrigir a perda de rastreamento da exceção no fluxo de erro de
load_article (a exceção deixou de ser adicionada a errors quando a
lógica foi migrada para a função finish()) e limpar imports que
ficaram sem uso após as refatorações anteriores.

Solução técnica:
- Remove imports não utilizados: logging, sys, etree (lxml),
  location.models.Location, pid_provider.choices
  (PPXML_STATUS_UNMATCHED_JOURNAL_OR_ISSUE, PPXML_STATUS_INVALID),
  pid_provider.models.PidProviderXML e tracker.models.UnexpectedEvent.
- No bloco except, restaura a chamada add_error(errors, 'load_article',
  e) antes de finish(article, errors, messages), garantindo que a
  exceção seja persistida em article.errors via detail['errors']
  antes do 'raise'.
- Mantém a estrutura introduzida anteriormente: article = None e
  errors = [] inicializados no topo da função, article.data_status =
  choices.DATA_STATUS_PENDING comentado, e a função finish(article,
  errors, messages) centralizando a gravação de detail (errors/
  messages) em article.errors e a chamada a mark_as_completed()
  ou save().
…lability

Propósito:
Simplificar o registro de falhas em Article.check_availability,
eliminando a dependência do objeto event (ArticleEvent) e padronizando
o registro de exceções via UnexpectedEvent.create em todos os casos.

Solução técnica:
- Remove a criação do event (self.add_event(user, _('register urls')))
  e a inicialização/uso da variável event.
- No bloco except, remove a bifurcação if event / else e passa a
  chamar UnexpectedEvent.create(...) incondicionalmente.
- Adiciona o parâmetro action='article.models.Article.check_availability'
  a UnexpectedEvent.create, em substituição à chave 'function' que
  antes estava dentro de detail.
- Move o traceback formatado (traceback.format_exc()) para dentro de
  detail={'traceback': ...}, no lugar do antigo detail apenas com
  'function'.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant