Skip to content

Adiciona uma área de relatórios públicos ao site, acessível em /report/, e o primeiro relatório dessa área: **Disponibilidade de dados** - #1488

Open
robertatakenaka wants to merge 15 commits into
scieloorg:mainfrom
robertatakenaka:relatorio_data_availability_v2
Open

robertatakenaka wants to merge 15 commits into
scieloorg:mainfrom
robertatakenaka:relatorio_data_availability_v2

Conversation

@robertatakenaka

Copy link
Copy Markdown
Member

O que esse PR faz?

Adiciona uma área de relatórios públicos ao site, acessível em /report/, e o primeiro relatório dessa área: Disponibilidade de dados, que mostra a quantidade de artigos por status de disponibilidade de dados (Article.data_availability_status), por ano, com totais e porcentagens.

Funcionalidades:

  • Página inicial de relatórios públicos, que lista os relatórios disponíveis a partir de um registro único (PUBLIC_REPORTS)
  • Relatório de disponibilidade de dados com filtros por coleção, periódico e intervalo de ano de publicação online
  • Agrupamento por ano do fascículo (legenda bibliográfica) ou por ano de publicação online
  • Filtros dependentes: os periódicos e anos oferecidos se ajustam à coleção/periódico selecionados, via endpoint JSON
  • Exportação em CSV preservando os filtros aplicados
  • Cache de 1 hora nas views do relatório e das opções, já que a consulta percorre toda a tabela Article
  • Traduções em inglês, espanhol e português

Onde a revisão poderia começar?

Indique o caminho do arquivo e o arquivo onde o revisor deve iniciar a leitura do código.

  1. report/data_availability.py — lógica do relatório (filtros, agrupamento, totais e porcentagens)
  2. report/test_data_availability.py — testes do módulo
  3. report/forms.py — DataAvailabilityFilterForm
  4. report/views.py — report_index_view, data_availability_view, data_availability_options_view e exportação CSV
  5. report/urls.py e config/urls.py — rotas
  6. report/templates/report/ — public_base.html, index.html e data_availability.html

Como este poderia ser testado manualmente?

Estabeleça os passos necessários para que a funcionalidade seja testada manualmente pelo revisor.

  1. Executar os testes: python manage.py test report.test_data_availability
  2. Compilar as traduções: python manage.py compilemessages
  3. Acessar /report/ sem estar autenticado e verificar se o relatório "Disponibilidade de dados" aparece na lista
  4. Abrir o relatório e conferir a tabela por ano, com colunas de contagem e porcentagem por status e a linha de total
  5. Selecionar uma coleção e verificar se as listas de periódicos e de anos são atualizadas
  6. Aplicar filtros de periódico e de intervalo de ano de publicação online e conferir os números
  7. Alternar o agrupamento entre "Ano do fascículo (legenda bibliográfica)" e "Ano de publicação online"
  8. Informar um ano inválido (ex.: 20a5) e verificar se o relatório continua sendo exibido, ignorando apenas esse filtro
  9. Clicar em "Baixar CSV" e verificar se o arquivo respeita os filtros aplicados e usa ; como separador
  10. Aplicar filtros que não retornem artigos e verificar a mensagem "Nenhum artigo encontrado para os filtros selecionados."
  11. Trocar o idioma da interface (pt_BR, es, en) e conferir as traduções

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.

O relatório responde à necessidade de acompanhar a adoção da declaração de disponibilidade de dados nos artigos publicados, por coleção e por periódico, sem exigir acesso à área administrativa.

O ano do fascículo (legenda bibliográfica) e o ano de publicação online podem divergir, por exemplo em publicação contínua ou ahead of print. Por isso o filtro de intervalo se aplica sempre ao ano de publicação online, enquanto o agrupamento das linhas pode usar qualquer um dos dois anos. Essa distinção está explicada na própria página do relatório.

Para adicionar novos relatórios públicos, basta incluir a rota em report/urls.py e uma entrada em PUBLIC_REPORTS em report/views.py.

Como o relatório é público e consulta toda a tabela Article, as views usam cache_page com validade de 1 hora; alterações recentes nos artigos podem levar até esse tempo para aparecer.

Screenshots

Quando aplicável e se fizer possível, adicione screenshots que remetem à situação gráfica do problema que o pull request resolve.

Quais são os tickets relevantes?

Indique uma issue à qual o pull request faz relacionamento.

Referências

Indique as referências utilizadas para a elaboração do pull request.


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):

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? Expõe as telas /report/ e do relatório de disponibilidade de dados, além do endpoint JSON de opções dos filtros. São públicos por definição, somente leitura (GET) e retornam apenas contagens agregadas de artigos e listas de periódicos/anos, sem dados pessoais. Os parâmetros de entrada são validados pelo formulário e usados apenas via ORM. Servidos sob o mesmo HTTPS do site.
  • 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)

Concentra a lógica do relatório de disponibilidade de dados em um módulo próprio, separado da camada web, para que possa ser reutilizado e testado de forma isolada.

Detalhes de implementação:
- filter_articles: filtra Article por coleção, periódico e intervalo de ano de publicação online
- build_report: agrupa por ano (do fascículo ou de publicação online) e por data_availability_status, com contagens, porcentagens e linha de totais
- journals_for, pub_years_for e filter_options: alimentam os filtros dependentes
- GROUP_BY_ISSUE_YEAR e GROUP_BY_OPTIONS: opções de agrupamento usadas pelo formulário
… dados

Adiciona testes para o módulo report/data_availability.py, cobrindo filtros, agrupamento por ano, cálculo de totais e porcentagens e opções dos filtros dependentes.
Define o template base compartilhado pelas páginas públicas de relatórios, para que novos relatórios mantenham a mesma estrutura e aparência.
Lista os relatórios públicos disponíveis com título e descrição, a partir de PUBLIC_REPORTS em report/views.py. Estende report/public_base.html.
Apresenta a tabela de artigos por status de disponibilidade de dados e por ano, com filtros e exportação em CSV.

Detalhes de implementação:
- Filtros por coleção, periódico, intervalo de ano de publicação online e tipo de agrupamento
- Periódicos e anos atualizados conforme a coleção/periódico escolhidos, via endpoint JSON de opções
- Link 'Baixar CSV' preserva os filtros aplicados (query_string sem o parâmetro format)
- Legenda dos status e mensagem quando não há artigos para os filtros
- Estende report/public_base.html
Registra as URLs da página inicial de relatórios, do relatório de disponibilidade de dados e do endpoint de opções dos filtros dependentes, incluídas em config/urls.py sob /report/.
Adiciona o formulário de filtros do relatório de disponibilidade de dados, tolerante a valores inválidos para que um filtro mal preenchido não impeça a exibição do relatório.

Detalhes de implementação:
- DataAvailabilityFilterForm com os campos collection, journal, year_from, year_to e group_by
- year_from e year_to validados como ano de 4 dígitos (RegexField)
- group_by usa GROUP_BY_OPTIONS de report/data_availability.py
- filters(): retorna apenas os valores válidos, ignorando campos inválidos, com group_by padrão GROUP_BY_ISSUE_YEAR
Cria as views da página inicial de relatórios públicos e do relatório de disponibilidade de dados, com exportação em CSV e cache para evitar recalcular sobre toda a tabela Article a cada acesso.

Detalhes de implementação:
- PUBLIC_REPORTS: registro dos relatórios listados em /report/
- report_index_view: renderiza report/index.html
- data_availability_view: aplica os filtros, monta o relatório e responde em HTML ou CSV (format=csv)
- data_availability_options_view: retorna em JSON os periódicos e anos disponíveis para os filtros dependentes
- _data_availability_csv: CSV com separador ';', colunas de contagem e porcentagem por status e linha de total
- cache_page de 1 hora (DATA_AVAILABILITY_CACHE_SECONDS) nas views do relatório e de opções
Inclui report.urls em i18n_patterns, antes das rotas do allauth e do Wagtail, para que as páginas de relatórios sejam servidas com prefixo de idioma.
Adiciona as mensagens da página inicial de relatórios e do relatório de disponibilidade de dados (títulos, descrições, filtros, legenda e mensagens de estado vazio).
Recompila locale/en/LC_MESSAGES/django.po com as mensagens dos relatórios públicos.
Adiciona as mensagens da página inicial de relatórios e do relatório de disponibilidade de dados (títulos, descrições, filtros, legenda e mensagens de estado vazio).
Recompila locale/es/LC_MESSAGES/django.po com as mensagens dos relatórios públicos.
Adiciona as mensagens da página inicial de relatórios e do relatório de disponibilidade de dados (títulos, descrições, filtros, legenda e mensagens de estado vazio).
Recompila locale/pt_BR/LC_MESSAGES/django.po com as mensagens dos relatórios públicos.
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.

2 participants