Adiciona coleta e indexação de artigos SciELO via ArticleMeta#733
Adiciona coleta e indexação de artigos SciELO via ArticleMeta#733samuelveigarangel wants to merge 9 commits into
Conversation
Expõe harvest_scielo_articles com suporte a paginação, filtros de data e coleção. Co-authored-by: Cursor <cursoragent@cursor.com>
Inclui reprocessamento de coletas com falha, reindexação e suporte a article na reconciliação. Co-authored-by: Cursor <cursoragent@cursor.com>
Cria as tabelas necessárias para persistir artigos coletados via ArticleMeta. Co-authored-by: Cursor <cursoragent@cursor.com>
Define ARTICLEMETA_BASE_URL e OS_INDEX_RAW_ARTICLE para a coleta SciELO. Co-authored-by: Cursor <cursoragent@cursor.com>
Adiciona suporte a HarvestedArticle em get_index_name e signals de save/pre_save. Co-authored-by: Cursor <cursoragent@cursor.com>
Inclui comandos de criação de índices raw/bronze e melhora log de erro na transformação. Co-authored-by: Cursor <cursoragent@cursor.com>
Cobre paginação ArticleMeta, persistência, retry incremental e get_index_name. Co-authored-by: Cursor <cursoragent@cursor.com>
Expõe artigos coletados no grupo Harvest com listagem e filtros de status. Co-authored-by: Cursor <cursoragent@cursor.com>
pitangainnovare
left a comment
There was a problem hiding this comment.
Há alguns ajustes finos que podem melhorar a legibilidade. Senti falta da fixture de TransformationScript para já testar a transformação dos dados até o Bronze (ou isso está fora do escopo deste PR?).
| return | ||
|
|
||
| for identifier in failed_identifiers: | ||
| article = HarvestedArticle.objects.filter(identifier=identifier).first() |
There was a problem hiding this comment.
Não seria melhor usar o .get no lugar do .filter.first? Ou isso é uma defesa para o caso de existir mais de um article com o mesmo identifier?
|
|
||
|
|
||
| @celery_app.task(name="Retry failed articles") | ||
| def retry_failed_articles(username, user_id=None): |
There was a problem hiding this comment.
pelo que entendi, ha duas etapas
- harvest
- index
o nome dessa task nao deveria ser algo como harvest_failed_articles? Assim fica mais facil de entender e diferencia bem da outra que é chamada de reindex_failed_articles.
| "verbose_name_plural": "Dados de artigos SciELO", | ||
| }, | ||
| ), | ||
| migrations.CreateModel( |
There was a problem hiding this comment.
Não seria melhor indexar os erros no índice harverst_errors (opensearch) em lugar de termos um modelo pra isso?
| params["collection"] = collection | ||
| url = _build_url("/api/v1/article/", params) | ||
| payload = fetch_data(url, headers=headers, json=True, timeout=60, verify=True) | ||
| payload.pop("citations", None) |
| value = ( | ||
| raw_data.get("processing_date") | ||
| or article_data.get("processing_date") | ||
| or raw_data.get("updated_at") | ||
| or article_data.get("updated_at") | ||
| or raw_data.get("created_at") | ||
| or article_data.get("created_at") | ||
| ) | ||
| if not value: | ||
| return None |
There was a problem hiding this comment.
Diria que apenas o campo processing_date é necessário. Se raw_data for a resposta do articlemeta, então esse campo sempre vai existir.
| }, | ||
| }, | ||
| }, | ||
| "type": {"type": "keyword"}, |
There was a problem hiding this comment.
Precisa confirmar se tbm está assim nos outros casos (book, dataset, preprint), quero dizer, sem subtipo type.keyword.
| "analyzer": "multilingual", | ||
| "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}, | ||
| }, | ||
| "title_with_lang": { |
There was a problem hiding this comment.
Não faltou o copy_to? Ou aqui não é necessário pois fazemos isso no silver?
| ) | ||
|
|
||
|
|
||
| class HarvestErrorLogArticle(BaseHarvestErrorLog): |
There was a problem hiding this comment.
Pode ser mais interessante logar no índice harvest_errors no OpenSearch. É só uma ideia que já conversamos, mas nada que impeça a aprovação. No caso do articles, isso pode ser mais chato de ver os erros via DB Postgres, pois são milhares de registros (pode ser ruim ver via tela Wagtail).
| exc_context.save_to_db() | ||
| exc_context.mark_status_harvest() |
There was a problem hiding this comment.
Está meio estranho de ler, pois primeiro salva e depois marca o status. Olhando o código do ExceptionContext, entendi o porquê.
O que esse PR faz?
Adiciona suporte completo à coleta de artigos SciELO no módulo harvest, integrando a API ArticleMeta ao pipeline já existente (preprints, books, SciELO Data).
Principais entregas:
Onde a revisão poderia começar?
Sugestão de ordem:
Como este poderia ser testado manualmente?
Pré-requisitos
make django_migrateVariáveis de ambiente (ex.: .envs/.local/.django):
Via shell Django/Celery:
Admin Wagtail → Harvest → Articles
Conferir harvest_status, index_status, identifier, datestamp e raw_data
4. Validar indexação raw
Verificar documentos no índice raw_scielo_article no OpenSearch
Confirmar que artigos com harvest_status=success têm index_status=success
5. Testar retry e reindex
Algum cenário de contexto que queira dar?
Indique um contexto onde as modificações se fazem necessárias ou passe informações que contextualizam
o revisor a fim de facilitar o entendimento da funcionalidade.
Screenshots
Quando aplicável e se fizer possível adicione screenshots que remetem a situação gráfica do problema que o pull request resolve.
Quais são tickets relevantes?
CLOSED #631
Referências
Indique as referências utilizadas para a elaboração do pull request.