-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WIP: Adiciona uma versão inicial da carga do sucupira #209
Conversation
Load the article from sucupira to ScholarlyArticles. | ||
""" | ||
|
||
if file_path: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gitnnolabs testar se é arquivo
scholarly_articles/tasks.py
Outdated
# makes a treatment to obtain the institution | ||
institution_acron = institution_acron.split("/")[0] | ||
institution_acron = institution_acron.split(" / ")[0] | ||
institution_acron = institution_acron.split("-")[0] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gitnnolabs e se o hífen é parte do nome? Talvez neste momento não seja ideal tomar nenhuma decisão de padronização de nome.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ai nesse caso se não for encontrado a instituição na nossa base de dados não cadastramos a instituição?
Fiz esse tratamento para que a instituição seja encontrada na nossa base de dados.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alterei para não fazer essa tratamento, iremos encontrar menos instituições mas fica mais consistente.
scholarly_articles/tasks.py
Outdated
if models.Institution.objects.filter(acronym=institution_acron).exists(): | ||
return models.Institution.objects.filter(acronym=institution_acron)[0] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gitnnolabs isso sempre trará o "primeiro" registro independentemente se é o mais completo ou o ideal.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Qual seria sua sugestão nesse caso?
) | ||
|
||
try: | ||
journal = journals[0] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
isso sempre trará o "primeiro" registro independentemente se é o mais completo ou o ideal.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Qual seria sua sugestão nesse caso?
scholarly_articles/tasks.py
Outdated
"license": get_license("https://opendefinition.org/licenses/cc-by/"), | ||
"use_license": "CC-BY", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
isso não pode estar fixo
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Por hora removi a licença!
scholarly_articles/tasks.py
Outdated
|
||
split_ds_issn = row["DS_ISSN"].split(" ") | ||
|
||
issn = re.search("[\S]{4}\-[\S]{4}", split_ds_issn[0]).group() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gitnnolabs o que esta regular expression faz? ISSN são números e X @ednilson vc conhece alguma reg expr para ISSN?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@robertatakenaka o S é para dígitos e caracteres!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Segue os testes:
import re
issns = ['(0261-2X94) CROP PROTECTION', '(2095-1779) JOURNAL OF PHARMACEUTICAL ANALYSIS', '(0102-0935) ARQUIVO BRASILEIRO DE MEDICINA VET...', '(0102-0935) ARQUIVO BRASILEIRO DE MEDICINA VET...',]
for issn in issns:
print(re.search("[\S]{4}\-[\S]{4}", issn).group())
Resultado:
0261-2X94
2095-1779
0102-0935
0102-0935
scholarly_articles/tasks.py
Outdated
article, created = models.ScholarlyArticles.objects.get_or_create( | ||
**article_dict | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
isso não garante o update que comentei
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tem que buscar por doi se houver
aí usar outras estratégias para recuperar e atualizar ou criar
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Em caso dos dados do sucupira conter o DOI estou atualizando o registro e alterando o valor de source
para sucupira, assim o dado passa a ter sua origem alterada.
scholarly_articles/tasks.py
Outdated
try: | ||
contributor, created = models.Contributors.objects.get_or_create(**filter_dict) | ||
except models.Contributors.MultipleObjectsReturned: | ||
contributor = models.Contributors.objects.filter(**filter_dict)[0] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gitnnolabs fazer uso de Contributors.get_or_create
. Colocar toda a lógica no corpo de Contributors..get_or_create
scholarly_articles/tasks.py
Outdated
institution = get_institution(row["SG_ENTIDADE_ENSINO"]) | ||
program, created = models.Programs.objects.get_or_create( | ||
**{"name": row["NM_PROGRAMA_IES"], "institution": institution} | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Criar models.Programs.get_or_create
scholarly_articles/models.py
Outdated
@@ -568,3 +572,38 @@ def __unicode__(self): | |||
|
|||
def __str__(self): | |||
return self.name or self.url | |||
|
|||
|
|||
class Programs(models.Model): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gitnnolabs Usar o singular
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pensei em usar singular e na verdade sempre uso, mas temos diversas classes e inclusive aplicações no plural, ai decidir por manter esse padrão!
Vou alterar!
scholarly_articles/models.py
Outdated
@@ -12,6 +12,7 @@ | |||
|
|||
class ScholarlyArticles(models.Model): | |||
doi = models.CharField(_("DOI"), max_length=100, null=True, blank=True) | |||
id_int_production = models.CharField(_("Id Intellectual Production"), max_length=100, null=True, blank=True) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adicionar os campos (novos modelos):
- linha de pesquisa: m2m 'ID_LINHA_PESQUISA', 'NM_LINHA_PESQUISA',
- projeto m2m : 'ID_PROJETO', 'NM_PROJETO'
scholarly_articles/models.py
Outdated
@@ -135,6 +135,8 @@ class Meta: | |||
def data(self): | |||
d = { | |||
"article__doi": self.doi, | |||
"article__id_int_production": self.id_int_production, | |||
"article__id_int_production": self.id_int_production, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
duplicado ou faltando algo
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicado!
journals = models.Journals.objects.filter( | ||
Q(journal_issn_l=journal_issn) | Q(journal_issns=journal_issn) | ||
) | ||
|
||
try: | ||
journal = journals[0] | ||
except IndexError: | ||
journal = models.Journals() | ||
journal.journal_issns = journal_issn | ||
journal.journal_name = journal_name | ||
journal.save() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gitnnolabs isso deveria ter testes automatizados
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Digo para as recuperações de registros. Certamente vai ter bugs aí. O filter pode retornar mais de um. Só que no final está retornando o primeiro... Não me parece correto
scholarly_articles/tasks.py
Outdated
article, created = models.ScholarlyArticles.objects.get_or_create( | ||
**article_dict | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
se houver a mesma publicação ingressada pelo unpaywall haverá erro na geração dos indicadores que contará 2 publicações no lugar de uma
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Não sei entendi
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isso não irá acontecer já que estou assegurando que não irá duplicar registro, veja o comentário: #209 (comment)
…ns na na execução da task para cadastro dos dados do sucupira.
Esse PR será fechado já que o modelo e o forma de acomodar os dados mudaram. |
O que esse PR faz?
Esse PR envia uma tarefa para cadastra os dados da CAPES (sucupira).
Essa versão está utilizando um arquivo consolidado que foi produzido a partir dos passos que está no gist: https://gist.github.com/gitnnolabs/59bf1909c778dae14f56617bf6c12796
Essa atividade não está finalizada já que é necessário termos uma task para fazer exatamente o que o gist está fazendo com os arquivo da coletados da CAPES(Sucupira).
Onde a revisão poderia começar?
Por commit.
Como este poderia ser testado manualmente?
Para teste manual estou disponibilizando uma arquivo com 10k de dados do sucupira onde é possível criar um task e verificar o resultado dos dados.
conso.csv.zip
Segue algumas telas de como fazer isso:
Acesse a área para criar tarefas:
Crie uma nova tarefa chamada "Load sucupira data":
Indique o parâmetro file_path com o caminho para o arquivo:
Para executar clique em run, veja na image:
Algum cenário de contexto que queira dar?
O formato do dado no CSV, segue o seguinte formato:
Cabeçalho:
Exemplo de uma linha:
Também havia erros nas definições de tamanho de alguns campos no modelo de ErrorLog e foi necessário alterar o tamanho de alguns campos.
Screenshots
Tela de saída do processamento de alguns registros:
É possível olhar para os dados selecionando sucupira na lista de artigos:
Processando 10k, foi possível notar que não temos logs de erros e todos os registros foram inseridos.
Veja:
Quais são tickets relevantes?
#199
Referências
Referencia para geração do arquivo consolidado com todos os dados necessários: https://gist.github.com/ednilson/283bd68abcfca9dc4f43bac433ddc8d5