Melhora fluxo de criacao e atualizacao de artigo#1455
Open
robertatakenaka wants to merge 6 commits into
Open
Conversation
… 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'.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que esse PR faz?
Reduz a dependência dos modelos
ArticleEventeXMLEvent, migrando o registro de erros e progresso do pipeline de artigos paraUnexpectedEvent(mais genérico) e para o campoarticle.errors, já existente no modeloArticle:article/tasks.py(task_export_article_to_articlemetaetask_process_article_pipeline), introduz variáveis de rastreamento (item/unexpected_event_item) atualizadas a cada etapa do fluxo, e padroniza as chamadas aUnexpectedEvent.create(action=..., item=...), enriquecendodetailcom mais contexto (collection_acron_list,source_date,auto_solve_pid_conflict,version).article/sources/xmlsps.py(load_article):ArticleEvent(article.add_event(...)/event.finish(...)), eliminandoarticle.events.all().delete()e as ramificaçõesif event: ....finish(article, errors, messages), que gravaerrors/messagesdiretamente emarticle.errorse decide entremark_as_completed()esave().logging.info(...)por uma listamessages, persistida viafinish(...).add_error(errors, "load_article", e)antes definish(...)).pp_xml.xml_with_pree passa a reaproveitar oArticlejá vinculado aopp_xml, evitando duplicação.PPXML_STATUS_*ePidProviderXML.article/models.py(Article.check_availability), remove totalmente a dependência doevent(ArticleEvent), chamandoUnexpectedEvent.create(action=..., item=..., detail={"traceback": ...})incondicionalmente.Resultado líquido: três pontos do pipeline de artigos que antes dependiam de
ArticleEventagora usam apenasUnexpectedEventouarticle.errors, aproximando o código do objetivo de descontinuarArticleEvent/XMLEventcomo modelos separados.Onde a revisão poderia começar?
article/sources/xmlsps.py, funçãoload_articlee a nova funçãofinish— é onde a remoção deArticleEventé mais visível. Em seguida,article/models.py, no blocoexceptdecheck_availability. Por fim,article/tasks.py, revisando as novas chamadas aUnexpectedEvent.create(...).Como este poderia ser testado manualmente?
task_process_article_pipelinecom umpp_xml_idválido e verificar que nenhumArticleEventé criado, quearticle.errorsé preenchido commessages(eerrors, se houver falha), e que reprocessar o mesmopp_xmlreaproveita oArticleexistente.load_article(ex.: journal inexistente) e confirmar que nenhumArticleEventé criado e que a exceção é registrada emarticle.errorsantes doraise.Article.check_availability(force_update=True)provocando uma exceção e verificar que nenhumevent(ArticleEvent) é criado e queUnexpectedEvent.create(...)é chamado comaction,itemedetail={"traceback": ...}corretamente.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
ArticleEventeXMLEvent, substituindo-os porUnexpectedEvente por campos já existentes nas próprias entidades (comoarticle.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 dearticle/tasks.py,article/sources/xmlsps.pyearticle/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.pyarticle/sources/xmlsps.pyarticle/models.pySegurança da informação (NSI.04)
Este PR manipula dados sensíveis ou pessoais (LGPD)?
Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?
Este PR introduz, atualiza ou remove dependências de terceiros?
Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?
(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?
Este PR expõe novos endpoints, telas ou serviços?
Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?