Skip to content

Cria mapa de acessos por país de origem e tabelas de acessos gerais e por idioma - #263

Merged
pitangainnovare merged 59 commits into
scieloorg:masterfrom
pitangainnovare:impl/replace-data-with-sushi
Oct 11, 2024
Merged

Cria mapa de acessos por país de origem e tabelas de acessos gerais e por idioma#263
pitangainnovare merged 59 commits into
scieloorg:masterfrom
pitangainnovare:impl/replace-data-with-sushi

Conversation

@pitangainnovare

Copy link
Copy Markdown
Contributor

O que esse PR faz?

Este PR cria telas para exibir mapa de acessos por país de origem e tabelas de acessos gerais e por idioma de documento acessado. É uma substituição a algumas rotas frequentemente usadas para visualizar acessos das coleções.

Também faz algumas correções em traduções.

E remove tudo que se refere ao termo "Issues".

Onde a revisão poderia começar?

Por commits.

Como este poderia ser testado manualmente?

Instalar a app localmente e acessar o menus

  1. Acessos/Periódicos
  2. Acessos/Periódicos por idioma
  3. Gráficos

Algum cenário de contexto que queira dar?

Este é um primeiro PR que visa atualizar o SciELO Analytics com os dados SciELO SUSHI API. O próximo PR incluirá novos dados como as tabelas Top100.

Falta preencher um pouco mais os arquivos *.PO e gerar novos arquivos *.MO.
Percebi uma falta de padrão ao marcar alguns textos para tradução (às vezes foram marcados em Inglês, às vezes em Português, que parece ser o padrão nesta app).

Screenshots

Tela com mapa de acessos por país de origem (para um periódico selecionado)
Screenshot_20240614_000414

Tela com tabela de acessos por idioma de documento (para um periódico selecionado)
Screenshot_20240613_203419

Tela com tabela de acessos por idioma de documento para uma coleção
Screenshot_20240614_000556

Tela com tabela de acessos para uma coleção
Screenshot_20240614_000534

Tela com tabela de acessos para um periódico
Screenshot_20240614_000428

Quais são tickets relevantes?

N/A

Referências

N/A

…ocale/analytics.pot -D analytics -d analytics/locale
@pitangainnovare

Copy link
Copy Markdown
ContributorAuthor

@robertatakenaka, não tenho permissão para marcar pessoas para revisar o PR.

Comment threadanalytics/controller.py Outdated
data = []

for i in json_results.get('Report_Items', [{},]):
if i.get('Title', '') == '':

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare talvez o que vc quer é i.get('Title') or '' no lugar de i.get('Title', '')

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No caso `x.get('chave', 'valor default'), só é usado o valor default na ausência da chave.

No caso sugerido, para valores considerados ausentes por padrão se usa o valor fornecido.

x.get('chave') or5

O resultado é 5 se o resultado de x.get('chave') é [] ou None ou '' ou {} ou set()

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exato. Passou.

Comment threadanalytics/controller.py Outdated

i_res = {
'title': i['Title'],
'article_language': choices.ISO_639_1.get(i.get('Article_Language', '').upper(), 'Undefined'),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare verificar o comentário anterior... aqui não sei dizer se está correto ou não

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sim, o mais correto seria algo como isso aqui:

# x pode ser algo comox= {'dado': None}
# Então, temos que isso falhax.get('dado', '').upper()
# E isso não
(x.get('dado') or'').upper()

Farei a atualização. Obrigado.

Comment threadanalytics/controller.py Outdated
@@ -1078,7 +1078,7 @@ def get_usage_report(self, issn, collection, begin_date, end_date, granularity='
self._clean_url_params(params, report_code)

response = requests.get(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare procure no core / upload o módulo que estamos usando fetch_data e post_data como a funcionalidade de retry


return chart_data

def _title_report_to_table_data(self, json_results):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare seria bom colocar testes automáticos. Também me parece que seria uma função no repo do sushi. Será que já não existe uma biblioteca / função pronta para isso?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O SUSHI entrega JSON. Aqui estamos convertendo esse JSON para um formato que o Highcharts entende/exige, que é a lib de gráficos usada no Analytics. Existe alguma compatibilidade entre essas libs js de gráfico (c3, d3, charts, highcharts, etc), mas não saberia dizer se é perfeita.

Caso seja algo implementado no repo SUSHI, provavelmente seria algo como:
_to_c3()
_to_d3()
to...

E isso também dependeria do gráfico a ser povoado em si. Às vezes é uma lista de pontos, às vezes é uma lista de listas, um dict, enfim.

No meu entendimento, mudando highcharts para outra versão ou outra lib, o JSON entregue permanece inalterado, bastando atualizar esse conversor de dados.

Mas podemos verificar se há um padrão. No fim, é só um pequeno processamento.

Quanto aos testes, sim. Vou avaliar aqui o que é possível e interessante.

Comment threadanalytics/controller.py Outdated
@@ -983,22 +983,78 @@ class UsageStats():
def __init__(self, usage_api_base_url=None):
self.base_url = usage_api_base_url or 'http://usage.apis.scielo.org/'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

É http mesmo. Https retorna ``default backend - 404'', ou seja, não está configurado no nginx.

Comment threadanalytics/controller.py Outdated
for p in i.get('Performance', {}):
p_metric_label = p.get('Instance', {}).get('Metric_Type', '')
for i in json_results.get('Report_Items') or []:
for p in i.get('Performance') or {}:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare acho que isso está estranho

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare talvez, se entendi bem a estrutura e a lógica, serial:

foriinjson_results.get('Report_Items') or [{}]:
forpini.get('Performance'):

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Report_Items é uma lista de dicionários, exatamente. Dentro de cada dicionário, espera-se haver um campo "Performance". Isso é a estrutura do JSON sugerido do COUNTER:

image

Para mais informações, vide aqui há uma maneira de visualizar o JSON completo para todas as rotas: https://app.swaggerhub.com/apis/COUNTER/counter-sushi_5_0_api/5.0.3#/default/getReportsTRJ1

Comment threadanalytics/controller.py Outdated
for i in json_results.get('Report_Items', [{},]):
if i.get('Title') or '' == '':
for i in json_results.get('Report_Items') or []:
if (i.get('Title') or '') == '':

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare não seria fazer simplesmente: if no i.get('Title'):?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sim.

Comment threadanalytics/controller.py Outdated
PAGE_SIZE = 20


FETCH_DATA_TIMEOUT = 100

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare muito alto... geralmente 2 é padrão. A lógica do fetch_data, se não me engano vai aumentando exponencialmente o timeout

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sim, verdade, lá no retry tá configurado o wait_exponential.

Comment on lines +1092 to +1095
{'title': 'Psicologia & Sociedade', 'article_language': 'Portuguese', 'unique_item_requests': 1000, 'total_item_requests': 1250},
{'title': 'Psicologia & Sociedade', 'article_language': 'Spanish', 'unique_item_requests': 500, 'total_item_requests': 650},
{'title': 'Revista do Departamento de Psicologia. UFF', 'article_language': 'Portuguese', 'unique_item_requests': 341, 'total_item_requests': 409},
{'title': 'Revista do Departamento de Psicologia. UFF', 'article_language': 'English', 'unique_item_requests': 200, 'total_item_requests': 233},

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitangainnovare não se usa o valor de código iso?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui não, pois é daqui para a tabela HTML. O código ISO é anterior a esse passo.

@pitangainnovare

pitangainnovare commented Jun 17, 2024

Copy link
Copy Markdown
ContributorAuthor

@robertatakenaka, Fiz algumas simplificações e corrigi os timeouts, como indicado.

@pitangainnovare

Copy link
Copy Markdown
ContributorAuthor

@robertatakenaka Fiz as modificações necessárias para termos dados por documento.

analytics-paper2

Posso fazer merge e pedir a atualização da app? Esta nova seria a versão 2.2.0.

Caso necessário, temos a versão 2.1.0 funcional.

@pitangainnovare
pitangainnovare merged commit 95bb965 into scieloorg:masterOct 11, 2024
@pitangainnovare
pitangainnovare deleted the impl/replace-data-with-sushi branch October 11, 2024 20:57
Sign up for freeto 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.

3 participants

@pitangainnovare@robertatakenaka@rafaelpezzuto