From 0487b490c8d81d6f4405a31aeffd3db81c561153 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:53:11 -0300 Subject: [PATCH 01/15] Permite consultar a disponibilidade de dados dos artigos por ano MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- report/data_availability.py | 150 ++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 report/data_availability.py diff --git a/report/data_availability.py b/report/data_availability.py new file mode 100644 index 000000000..db289d2b4 --- /dev/null +++ b/report/data_availability.py @@ -0,0 +1,150 @@ +from django.db.models import Count, Exists, OuterRef +from django.utils.translation import gettext_lazy as _ + +from article import choices +from article.models import Article +from journal.models import Journal, SciELOJournal + +GROUP_BY_ISSUE_YEAR = "issue_year" +GROUP_BY_PUB_YEAR = "pub_year" + +GROUP_BY_OPTIONS = ( + (GROUP_BY_ISSUE_YEAR, _("Issue year (bibliographic strip)")), + (GROUP_BY_PUB_YEAR, _("Online publication year")), +) + +GROUP_BY_FIELDS = { + GROUP_BY_ISSUE_YEAR: "issue__year", + GROUP_BY_PUB_YEAR: "pub_date_year", +} + + +def status_columns(): + return list(choices.DATA_AVAILABILITY_STATUS) + + +def filter_articles(collection=None, journal=None, year_from=None, year_to=None): + """ + Artigos considerados no relatório. + + year_from / year_to referem-se ao ano de publicação online (pub_date_year), + independente do ano do fascículo. + """ + qs = Article.objects.exclude(data_status__in=choices.DATA_STATUS_EXCLUSION_LIST) + if collection: + # Exists evita contagem duplicada de periódicos em mais de uma coleção + qs = qs.filter( + Exists( + SciELOJournal.objects.filter( + journal_id=OuterRef("journal_id"), + collection=collection, + ) + ) + ) + if journal: + qs = qs.filter(journal=journal) + if year_from: + qs = qs.filter(pub_date_year__gte=year_from) + if year_to: + qs = qs.filter(pub_date_year__lte=year_to) + return qs + + +def journals_for(collection=None): + journals = Journal.objects.all() + if collection: + journals = journals.filter( + Exists( + SciELOJournal.objects.filter( + journal_id=OuterRef("pk"), + collection=collection, + ) + ) + ) + return journals.order_by("title") + + +def pub_years_for(collection=None, journal=None): + """Anos de publicação online disponíveis, em ordem decrescente.""" + return list( + filter_articles(collection=collection, journal=journal) + .filter(pub_date_year__regex=r"^\d{4}$") + .order_by("-pub_date_year") + .values_list("pub_date_year", flat=True) + .distinct() + ) + + +def filter_options(collection=None, journal=None): + """Opções dependentes: coleção -> periódicos; coleção + periódico -> anos.""" + return { + "journals": [ + {"id": item.pk, "label": str(item)} for item in journals_for(collection) + ], + "years": pub_years_for(collection, journal), + } + + +def percent(value, total): + return round(value * 100 / total, 2) if total else 0 + + +def _make_row(year, counts, columns): + total = sum(counts.values()) + return { + "year": year, + "total": total, + "cells": [ + { + "status": status, + "count": counts.get(status, 0), + "percent": percent(counts.get(status, 0), total), + } + for status, _label in columns + ], + } + + +def build_report(queryset, group_by=GROUP_BY_ISSUE_YEAR): + """ + Contabiliza Article.data_availability_status por ano. + + Retorna dict com: + columns: [(status, label), ...] + rows: [{"year", "total", "cells": [{"status", "count", "percent"}]}] + totals: {"year": None, "total", "cells": [...]} + """ + year_field = GROUP_BY_FIELDS.get(group_by, GROUP_BY_FIELDS[GROUP_BY_ISSUE_YEAR]) + data = ( + queryset.order_by() + .values(year_field, "data_availability_status") + .annotate(n=Count("pk")) + ) + + columns = status_columns() + by_year = {} + for item in data: + year = item[year_field] or None + status = ( + item["data_availability_status"] + or choices.DATA_AVAILABILITY_STATUS_NOT_PROCESSED + ) + counts = by_year.setdefault(year, {}) + counts[status] = counts.get(status, 0) + item["n"] + + # anos em ordem decrescente; sem ano por último + years = sorted((year for year in by_year if year), reverse=True) + if None in by_year: + years.append(None) + rows = [_make_row(year, by_year[year], columns) for year in years] + + all_counts = {} + for counts in by_year.values(): + for status, n in counts.items(): + all_counts[status] = all_counts.get(status, 0) + n + + return { + "columns": columns, + "rows": rows, + "totals": _make_row(None, all_counts, columns), + } From b7151016fc760fdc24f488b229750941f1336b83 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:53:11 -0300 Subject: [PATCH 02/15] =?UTF-8?q?Garante=20a=20consist=C3=AAncia=20dos=20n?= =?UTF-8?q?=C3=BAmeros=20do=20relat=C3=B3rio=20de=20disponibilidade=20de?= =?UTF-8?q?=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- report/test_data_availability.py | 365 +++++++++++++++++++++++++++++++ 1 file changed, 365 insertions(+) create mode 100644 report/test_data_availability.py diff --git a/report/test_data_availability.py b/report/test_data_availability.py new file mode 100644 index 000000000..3cbc49f0f --- /dev/null +++ b/report/test_data_availability.py @@ -0,0 +1,365 @@ +from django.contrib.auth import get_user_model +from django.core.cache import cache +from django.test import TestCase +from django.urls import reverse +from django.utils import translation + +from article import choices +from article.models import Article +from collection.models import Collection +from issue.models import Issue +from journal.models import Journal, SciELOJournal +from report import data_availability +from report.forms import DataAvailabilityFilterForm +from report.views import PUBLIC_REPORTS + +User = get_user_model() + +NOT_PROCESSED = choices.DATA_AVAILABILITY_STATUS_NOT_PROCESSED + + +class DataAvailabilityDataMixin: + """ + Artigos: + 1. data-available, fascículo 2023, online 2022, periódico X (coleções scl e arg) + 2. absent, fascículo 2023, online 2023, periódico X (coleções scl e arg) + 3. data-available, fascículo 2024, online 2023, periódico Y (coleção scl) + 4. not-processed, fascículo 2024, online 2024, periódico Z (coleção arg) + 5. data-available, fascículo 2024, online 2024, periódico Z, DELETED (ignorado) + """ + + @classmethod + def setUpTestData(cls): + cls.user = User.objects.create_user(username="das-report-user", password="x") + cls.col_scl = Collection.objects.create(acron3="scl", creator=cls.user) + cls.col_arg = Collection.objects.create(acron3="arg", creator=cls.user) + cls.journal_x = Journal.objects.create(title="Journal X", creator=cls.user) + cls.journal_y = Journal.objects.create(title="Journal Y", creator=cls.user) + cls.journal_z = Journal.objects.create(title="Journal Z", creator=cls.user) + for journal, collections in ( + (cls.journal_x, [cls.col_scl, cls.col_arg]), + (cls.journal_y, [cls.col_scl]), + (cls.journal_z, [cls.col_arg]), + ): + for collection in collections: + SciELOJournal.objects.create( + journal=journal, + collection=collection, + journal_acron=journal.title[-1].lower(), + creator=cls.user, + ) + cls.issue_2023 = Issue.objects.create(year="2023", creator=cls.user) + cls.issue_2024 = Issue.objects.create(year="2024", creator=cls.user) + + def make(pid, status, issue, pub_year, journal, data_status=None): + return Article.objects.create( + pid_v3=pid, + creator=cls.user, + issue=issue, + journal=journal, + pub_date_year=pub_year, + data_availability_status=status, + data_status=data_status or choices.DATA_STATUS_PUBLIC, + ) + + cls.articles = [ + make("das-1", choices.DATA_AVAILABILITY_STATUS_AVAILABLE, cls.issue_2023, "2022", cls.journal_x), + make("das-2", choices.DATA_AVAILABILITY_STATUS_ABSENT, cls.issue_2023, "2023", cls.journal_x), + make("das-3", choices.DATA_AVAILABILITY_STATUS_AVAILABLE, cls.issue_2024, "2023", cls.journal_y), + make("das-4", NOT_PROCESSED, cls.issue_2024, "2024", cls.journal_z), + make( + "das-5", + choices.DATA_AVAILABILITY_STATUS_AVAILABLE, + cls.issue_2024, + "2024", + cls.journal_z, + data_status=choices.DATA_STATUS_DELETED, + ), + ] + + def setUp(self): + cache.clear() + + @staticmethod + def cell(row, status): + return next(c for c in row["cells"] if c["status"] == status) + + +class PercentTest(TestCase): + def test_percent(self): + self.assertEqual(33.33, data_availability.percent(1, 3)) + + def test_zero_total(self): + self.assertEqual(0, data_availability.percent(0, 0)) + + +class BuildReportTest(DataAvailabilityDataMixin, TestCase): + def test_group_by_issue_year(self): + report = data_availability.build_report(data_availability.filter_articles()) + self.assertEqual(["2024", "2023"], [r["year"] for r in report["rows"]]) + + row_2023 = report["rows"][1] + self.assertEqual(2, row_2023["total"]) + available = self.cell(row_2023, choices.DATA_AVAILABILITY_STATUS_AVAILABLE) + self.assertEqual(1, available["count"]) + self.assertEqual(50, available["percent"]) + self.assertEqual( + 50, self.cell(row_2023, choices.DATA_AVAILABILITY_STATUS_ABSENT)["percent"] + ) + self.assertEqual(1, self.cell(report["rows"][0], NOT_PROCESSED)["count"]) + + def test_excludes_deleted_articles(self): + report = data_availability.build_report(data_availability.filter_articles()) + self.assertEqual(4, report["totals"]["total"]) + + def test_totals(self): + totals = data_availability.build_report( + data_availability.filter_articles() + )["totals"] + available = self.cell(totals, choices.DATA_AVAILABILITY_STATUS_AVAILABLE) + self.assertEqual(2, available["count"]) + self.assertEqual(50, available["percent"]) + self.assertEqual(25, self.cell(totals, NOT_PROCESSED)["percent"]) + self.assertEqual( + 0, self.cell(totals, choices.DATA_AVAILABILITY_STATUS_INVALID)["count"] + ) + + def test_columns_follow_choices(self): + report = data_availability.build_report(data_availability.filter_articles()) + self.assertEqual( + [status for status, _label in choices.DATA_AVAILABILITY_STATUS], + [cell["status"] for cell in report["totals"]["cells"]], + ) + + def test_null_status_counts_as_not_processed(self): + Article.objects.filter(pk=self.articles[3].pk).update( + data_availability_status=None + ) + totals = data_availability.build_report( + data_availability.filter_articles() + )["totals"] + self.assertEqual(1, self.cell(totals, NOT_PROCESSED)["count"]) + + def test_group_by_pub_year(self): + report = data_availability.build_report( + data_availability.filter_articles(), + group_by=data_availability.GROUP_BY_PUB_YEAR, + ) + self.assertEqual( + ["2024", "2023", "2022"], [r["year"] for r in report["rows"]] + ) + self.assertEqual(2, report["rows"][1]["total"]) + + def test_without_year_goes_last(self): + Article.objects.filter(pk=self.articles[0].pk).update(issue=None) + report = data_availability.build_report(data_availability.filter_articles()) + self.assertEqual(["2024", "2023", None], [r["year"] for r in report["rows"]]) + + def test_collection_does_not_duplicate(self): + report = data_availability.build_report( + data_availability.filter_articles(collection=self.col_scl) + ) + self.assertEqual(3, report["totals"]["total"]) + + def test_journal(self): + report = data_availability.build_report( + data_availability.filter_articles(journal=self.journal_z) + ) + self.assertEqual(1, report["totals"]["total"]) + + def test_pub_year_range_is_independent_of_issue_year(self): + report = data_availability.build_report( + data_availability.filter_articles(year_from="2023", year_to="2023") + ) + self.assertEqual(2, report["totals"]["total"]) + self.assertEqual(["2024", "2023"], [r["year"] for r in report["rows"]]) + + def test_empty(self): + report = data_availability.build_report(Article.objects.none()) + self.assertEqual([], report["rows"]) + self.assertEqual(0, report["totals"]["total"]) + + +class FilterOptionsTest(DataAvailabilityDataMixin, TestCase): + def test_journals_all(self): + titles = [j.title for j in data_availability.journals_for()] + for title in ("Journal X", "Journal Y", "Journal Z"): + self.assertIn(title, titles) + + def test_journals_by_collection(self): + self.assertEqual( + ["Journal X", "Journal Y"], + [j.title for j in data_availability.journals_for(self.col_scl)], + ) + self.assertEqual( + ["Journal X", "Journal Z"], + [j.title for j in data_availability.journals_for(self.col_arg)], + ) + + def test_pub_years(self): + self.assertEqual(["2024", "2023", "2022"], data_availability.pub_years_for()) + self.assertEqual( + ["2023", "2022"], data_availability.pub_years_for(self.col_scl) + ) + self.assertEqual( + ["2023", "2022"], + data_availability.pub_years_for(self.col_arg, self.journal_x), + ) + + def test_filter_options(self): + options = data_availability.filter_options(self.col_arg, self.journal_z) + self.assertEqual( + [ + {"id": self.journal_x.pk, "label": "Journal X"}, + {"id": self.journal_z.pk, "label": "Journal Z"}, + ], + options["journals"], + ) + self.assertEqual(["2024"], options["years"]) + + +class DataAvailabilityFilterFormTest(DataAvailabilityDataMixin, TestCase): + def test_valid(self): + filters = DataAvailabilityFilterForm( + { + "collection": self.col_scl.pk, + "journal": self.journal_x.pk, + "year_from": "2022", + "year_to": "2023", + "group_by": data_availability.GROUP_BY_PUB_YEAR, + } + ).filters() + self.assertEqual(self.col_scl, filters["collection"]) + self.assertEqual(self.journal_x, filters["journal"]) + self.assertEqual("2022", filters["year_from"]) + self.assertEqual(data_availability.GROUP_BY_PUB_YEAR, filters["group_by"]) + + def test_invalid_fields_are_ignored(self): + filters = DataAvailabilityFilterForm( + { + "collection": self.col_scl.pk, + "journal": "abc", + "year_from": "20x", + "group_by": "x", + } + ).filters() + self.assertEqual(self.col_scl, filters["collection"]) + self.assertIsNone(filters["journal"]) + self.assertIsNone(filters["year_from"]) + self.assertEqual(data_availability.GROUP_BY_ISSUE_YEAR, filters["group_by"]) + + +class DataAvailabilityViewTest(DataAvailabilityDataMixin, TestCase): + def url(self): + return reverse("report_data_availability") + + def test_is_public(self): + response = self.client.get(self.url()) + self.assertEqual(200, response.status_code) + self.assertTemplateUsed(response, "report/data_availability.html") + self.assertEqual(4, response.context["report"]["totals"]["total"]) + + def test_filters(self): + response = self.client.get( + self.url(), + { + "collection": self.col_scl.pk, + "year_from": "2023", + "year_to": "2023", + "group_by": data_availability.GROUP_BY_PUB_YEAR, + }, + ) + report = response.context["report"] + self.assertEqual(2, report["totals"]["total"]) + self.assertEqual(["2023"], [r["year"] for r in report["rows"]]) + self.assertEqual( + ["Journal X", "Journal Y"], [j.title for j in response.context["journals"]] + ) + self.assertEqual(["2023", "2022"], response.context["years"]) + + def test_invalid_params(self): + response = self.client.get( + self.url(), {"journal": "abc", "year_from": "x", "group_by": "x"} + ) + self.assertEqual(200, response.status_code) + self.assertEqual(4, response.context["report"]["totals"]["total"]) + + def test_empty_result(self): + response = self.client.get(self.url(), {"year_from": "2099"}) + self.assertEqual(200, response.status_code) + self.assertContains(response, 'class="empty"') + + def test_csv(self): + response = self.client.get(self.url(), {"format": "csv"}) + self.assertEqual(200, response.status_code) + self.assertIn("text/csv", response["Content-Type"]) + lines = response.content.decode().strip().splitlines() + self.assertTrue(lines[0].startswith("year;total;data-available;")) + self.assertTrue(lines[1].startswith("2024;2;")) + self.assertTrue(lines[-1].startswith("total;4;")) + + def test_csv_link_does_not_repeat_format(self): + response = self.client.get(self.url(), {"year_from": "2023"}) + self.assertEqual("year_from=2023", response.context["query_string"]) + + def test_options_url_in_page(self): + response = self.client.get(self.url()) + self.assertContains( + response, + f'data-options-url="{reverse("report_data_availability_options")}"', + ) + + +class DataAvailabilityOptionsViewTest(DataAvailabilityDataMixin, TestCase): + def url(self): + return reverse("report_data_availability_options") + + def test_is_public_json(self): + response = self.client.get(self.url()) + self.assertEqual(200, response.status_code) + self.assertEqual("application/json", response["Content-Type"]) + self.assertEqual(["2024", "2023", "2022"], response.json()["years"]) + + def test_collection_and_journal(self): + data = self.client.get( + self.url(), {"collection": self.col_scl.pk, "journal": self.journal_y.pk} + ).json() + self.assertEqual( + ["Journal X", "Journal Y"], [j["label"] for j in data["journals"]] + ) + self.assertEqual(["2023"], data["years"]) + + +class ReportIndexViewTest(TestCase): + def test_is_public(self): + response = self.client.get(reverse("report_index")) + self.assertEqual(200, response.status_code) + self.assertTemplateUsed(response, "report/index.html") + + def test_unprefixed_url_redirects_to_language(self): + response = self.client.get("/report/", follow=True) + self.assertEqual(200, response.status_code) + self.assertTemplateUsed(response, "report/index.html") + + def test_lists_all_reports(self): + response = self.client.get(reverse("report_index")) + for report in PUBLIC_REPORTS: + self.assertContains(response, f'href="{reverse(report["url_name"])}"') + self.assertContains(response, str(report["title"])) + + def test_report_page_links_back_to_index(self): + cache.clear() + response = self.client.get(reverse("report_data_availability")) + self.assertContains(response, f'href="{reverse("report_index")}"') + + +class DataAvailabilityTranslationTest(TestCase): + def setUp(self): + cache.clear() + + def test_clear_button_in_portuguese(self): + with translation.override("pt-br"): + url = reverse("report_data_availability") + response = self.client.get(url) + self.assertContains(response, ">Limpar") + self.assertNotContains(response, "Claro") From 2eae8b7f6fbb71f27b0117aa2465963923e1ab9b Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:53:11 -0300 Subject: [PATCH 03/15] =?UTF-8?q?Cria=20layout=20base=20para=20relat=C3=B3?= =?UTF-8?q?rios=20p=C3=BAblicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- report/templates/report/public_base.html | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 report/templates/report/public_base.html diff --git a/report/templates/report/public_base.html b/report/templates/report/public_base.html new file mode 100644 index 000000000..9b5648ef6 --- /dev/null +++ b/report/templates/report/public_base.html @@ -0,0 +1,68 @@ +{% load i18n %} +{% get_current_language as LANGUAGE_CODE %} + + + + + {% block title %}{% translate "Reports" %}{% endblock %} + + + +
+ {% block breadcrumb %} + + {% endblock %} + {% block content %}{% endblock %} +
+{% block extra_js %}{% endblock %} + + From 5975d29d513e0fcdb5bfbde6041be8282a6a6166 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:53:11 -0300 Subject: [PATCH 04/15] =?UTF-8?q?Oferece=20uma=20p=C3=A1gina=20de=20entrad?= =?UTF-8?q?a=20para=20os=20relat=C3=B3rios=20p=C3=BAblicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- report/templates/report/index.html | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 report/templates/report/index.html diff --git a/report/templates/report/index.html b/report/templates/report/index.html new file mode 100644 index 000000000..a9744e29a --- /dev/null +++ b/report/templates/report/index.html @@ -0,0 +1,23 @@ +{% extends "report/public_base.html" %} +{% load i18n %} + +{% block breadcrumb %}{% endblock %} + +{% block content %} +

{% translate "Reports" %}

+

{% translate "Public reports about the content managed by SciELO Content Manager." %}

+ {% if reports %} + + {% else %} +
{% translate "No reports available." %}
+ {% endif %} +{% endblock %} From 59e0ef17b549898de3471d6c2be4fa22530ba2d6 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:53:12 -0300 Subject: [PATCH 05/15] =?UTF-8?q?Exibe=20o=20relat=C3=B3rio=20p=C3=BAblico?= =?UTF-8?q?=20de=20disponibilidade=20de=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../templates/report/data_availability.html | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 report/templates/report/data_availability.html diff --git a/report/templates/report/data_availability.html b/report/templates/report/data_availability.html new file mode 100644 index 000000000..7cba927d9 --- /dev/null +++ b/report/templates/report/data_availability.html @@ -0,0 +1,160 @@ +{% extends "report/public_base.html" %} +{% load i18n %} + +{% block title %}{% translate "Data availability report" %}{% endblock %} + +{% block content %} +

{% translate "Data availability report" %}

+

+ {% translate "Articles by data availability status, per year. The online publication year filter applies to the year the article was published on the website, which may differ from the issue year shown in the bibliographic strip." %} +

+ +
+ + + + + + + {% translate "Clear" context "filters" %} + {% translate "Download CSV" %} +
+ + {% if report.totals.total %} +
+ + + + + {% for status, label in report.columns %} + + {% endfor %} + + + + {% for status, label in report.columns %} + + {% endfor %} + + + + {% for row in report.rows %} + + + {% for cell in row.cells %} + + {% endfor %} + + + {% endfor %} + + + {% for cell in report.totals.cells %} + + {% endfor %} + + + +
{% translate "Year" %}{{ status }}{% translate "Total" %}
n%
{{ row.year|default:_("No year") }}{{ cell.count }}{{ cell.percent|floatformat:2 }}{{ row.total }}
{% translate "Total" %}{{ cell.count }}{{ cell.percent|floatformat:2 }}{{ report.totals.total }}
+
+ {% else %} +
{% translate "No articles found for the selected filters." %}
+ {% endif %} + +

{% translate "Status legend" %}

+
+ {% for status, label in report.columns %} +
{{ status }}
{{ label }}
+ {% endfor %} +
+{% endblock %} + +{% block extra_js %} + +{% endblock %} From 4e13b8eda6a2a57c1a92cbfb7a5ad3ba600ca22d Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:53:12 -0300 Subject: [PATCH 06/15] =?UTF-8?q?Torna=20acess=C3=ADveis=20as=20rotas=20p?= =?UTF-8?q?=C3=BAblicas=20de=20relat=C3=B3rios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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/. --- report/urls.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 report/urls.py diff --git a/report/urls.py b/report/urls.py new file mode 100644 index 000000000..82bb1159f --- /dev/null +++ b/report/urls.py @@ -0,0 +1,21 @@ +from django.urls import path + +from report.views import ( + data_availability_options_view, + data_availability_view, + report_index_view, +) + +urlpatterns = [ + path("", report_index_view, name="report_index"), + path( + "data-availability/", + data_availability_view, + name="report_data_availability", + ), + path( + "data-availability/options/", + data_availability_options_view, + name="report_data_availability_options", + ), +] From 6ee28e4e0fe14c170a2a52345f462319835d771c Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:39 -0300 Subject: [PATCH 07/15] =?UTF-8?q?Permite=20filtrar=20o=20relat=C3=B3rio=20?= =?UTF-8?q?de=20disponibilidade=20de=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- report/forms.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/report/forms.py b/report/forms.py index 35e9bf3ad..05bc56894 100644 --- a/report/forms.py +++ b/report/forms.py @@ -3,6 +3,7 @@ from collection.models import Collection from journal.models import Journal +from report.data_availability import GROUP_BY_ISSUE_YEAR, GROUP_BY_OPTIONS from thematic_areas.models import ThematicArea @@ -36,3 +37,48 @@ def __init__(self, *args, **kwargs): self.fields["journal"].queryset = Journal.objects.order_by("title").prefetch_related( "scielojournal_set" ) + + +class DataAvailabilityFilterForm(forms.Form): + collection = forms.ModelChoiceField( + queryset=Collection.objects.order_by("acron3"), + required=False, + label=_("Collection"), + empty_label=_("All"), + ) + journal = forms.ModelChoiceField( + queryset=Journal.objects.order_by("title"), + required=False, + label=_("Journal"), + empty_label=_("All"), + ) + year_from = forms.RegexField( + regex=r"^\d{4}$", + required=False, + label=_("Online publication from"), + ) + year_to = forms.RegexField( + regex=r"^\d{4}$", + required=False, + label=_("Online publication to"), + ) + group_by = forms.ChoiceField( + choices=GROUP_BY_OPTIONS, + required=False, + label=_("Group by"), + ) + + def filters(self): + """ + Filtros válidos; campos inválidos são ignorados em vez de + invalidar o relatório inteiro. + """ + self.is_valid() + data = getattr(self, "cleaned_data", {}) + return { + "collection": data.get("collection"), + "journal": data.get("journal"), + "year_from": data.get("year_from") or None, + "year_to": data.get("year_to") or None, + "group_by": data.get("group_by") or GROUP_BY_ISSUE_YEAR, + } From 304cc4b8c616b4ddcf5e8e2dce06df4281064177 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:40 -0300 Subject: [PATCH 08/15] =?UTF-8?q?Disponibiliza=20publicamente=20o=20relat?= =?UTF-8?q?=C3=B3rio=20de=20disponibilidade=20de=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- report/views.py | 93 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/report/views.py b/report/views.py index 5eab9cd25..1d2f48f67 100644 --- a/report/views.py +++ b/report/views.py @@ -1,10 +1,12 @@ import csv -from django.http import HttpResponse +from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.utils.translation import gettext_lazy as _ +from django.views.decorators.cache import cache_page -from report.forms import VisualElementTotalsFilterForm +from report import data_availability +from report.forms import DataAvailabilityFilterForm, VisualElementTotalsFilterForm from report.visual_element_totals import ( filtered_article_ids, spreadsheet_rows, @@ -72,3 +74,90 @@ def visual_element_totals_csv_view(request): ] ) return response + + +# Relatórios públicos listados em /report/. +# Para adicionar um relatório: inclua o path em report/urls.py e uma entrada aqui. +PUBLIC_REPORTS = [ + { + "url_name": "report_data_availability", + "title": _("Data availability"), + "description": _( + "Articles by data availability status per year, with totals and " + "percentages. Filters: collection, journal and online publication year." + ), + }, +] + + +def report_index_view(request): + return render(request, "report/index.html", {"reports": PUBLIC_REPORTS}) + + +# relatório público consulta toda a tabela Article; evita recalcular a cada acesso +DATA_AVAILABILITY_CACHE_SECONDS = 60 * 60 + + +@cache_page(DATA_AVAILABILITY_CACHE_SECONDS) +def data_availability_view(request): + """ + Relatório público: Article.data_availability_status por ano, + com total e porcentagem, filtrável por coleção, periódico e + ano de publicação online. + """ + form = DataAvailabilityFilterForm(request.GET) + filters = form.filters() + queryset = data_availability.filter_articles( + collection=filters["collection"], + journal=filters["journal"], + year_from=filters["year_from"], + year_to=filters["year_to"], + ) + report = data_availability.build_report(queryset, group_by=filters["group_by"]) + + if request.GET.get("format") == "csv": + return _data_availability_csv(report) + + query = request.GET.copy() + query.pop("format", None) + return render( + request, + "report/data_availability.html", + { + "form": form, + "filters": filters, + "report": report, + "journals": data_availability.journals_for(filters["collection"]), + "years": data_availability.pub_years_for( + filters["collection"], filters["journal"] + ), + "query_string": query.urlencode(), + }, + ) + + +@cache_page(DATA_AVAILABILITY_CACHE_SECONDS) +def data_availability_options_view(request): + """Opções dos filtros dependentes (JSON): periódicos e anos disponíveis.""" + filters = DataAvailabilityFilterForm(request.GET).filters() + return JsonResponse( + data_availability.filter_options(filters["collection"], filters["journal"]) + ) + + +def _data_availability_csv(report): + response = HttpResponse(content_type="text/csv; charset=utf-8") + response["Content-Disposition"] = ( + 'attachment; filename="data_availability.csv"' + ) + writer = csv.writer(response, delimiter=";") + header = ["year", "total"] + for status, _label in report["columns"]: + header.extend([status, f"{status} (%)"]) + writer.writerow(header) + for row in report["rows"] + [dict(report["totals"], year="total")]: + line = [row["year"] or "", row["total"]] + for cell in row["cells"]: + line.extend([cell["count"], cell["percent"]]) + writer.writerow(line) + return response From 2f5140d2005612568dba00e7c97c6b20d3653531 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:40 -0300 Subject: [PATCH 09/15] =?UTF-8?q?Publica=20os=20relat=C3=B3rios=20no=20sit?= =?UTF-8?q?e=20sob=20/report/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- config/urls.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/urls.py b/config/urls.py index c9fe1f8cd..364207213 100755 --- a/config/urls.py +++ b/config/urls.py @@ -71,6 +71,8 @@ path("api/v2/", api_router.urls), path("users/", include("core.users.urls", namespace="users")), path("i18n/", include("django.conf.urls.i18n")), + # Public reports + path("report/", include("report.urls")), path("", include("allauth.urls")), path("", include(wagtail_urls)), ) From 5ab9c2d8619098581426876b429bb8c29e4c41e2 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:40 -0300 Subject: [PATCH 10/15] =?UTF-8?q?Traduz=20os=20textos=20dos=20relat=C3=B3r?= =?UTF-8?q?ios=20p=C3=BAblicos=20para=20ingl=C3=AAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- locale/en/LC_MESSAGES/django.po | 81 +++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 24e9a47e7..66fdc3c5b 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -5406,3 +5406,84 @@ msgstr "" #~ msgid "Home" #~ msgstr "Home" + +#: report +msgctxt "filters" +msgid "Clear" +msgstr "Clear" + +#: report +msgid "Reports" +msgstr "Reports" + +#: report +msgid "Data availability report" +msgstr "Data availability report" + +#: report +msgid "Data availability" +msgstr "Data availability" + +#: report +msgid "Articles by data availability status, per year. The online publication year filter applies to the year the article was published on the website, which may differ from the issue year shown in the bibliographic strip." +msgstr "Articles by data availability status, per year. The online publication year filter applies to the year the article was published on the website, which may differ from the issue year shown in the bibliographic strip." + +#: report +msgid "Articles by data availability status per year, with totals and percentages. Filters: collection, journal and online publication year." +msgstr "Articles by data availability status per year, with totals and percentages. Filters: collection, journal and online publication year." + +#: report +msgid "Filter" +msgstr "Filter" + +#: report +msgid "Download CSV" +msgstr "Download CSV" + +#: report +msgid "Total" +msgstr "Total" + +#: report +msgid "No year" +msgstr "No year" + +#: report +msgid "No articles found for the selected filters." +msgstr "No articles found for the selected filters." + +#: report +msgid "Status legend" +msgstr "Status legend" + +#: report +msgid "Public reports about the content managed by SciELO Content Manager." +msgstr "Public reports about the content managed by SciELO Content Manager." + +#: report +msgid "No reports available." +msgstr "No reports available." + +#: report +msgid "Online publication from" +msgstr "Online publication from" + +#: report +msgid "Online publication to" +msgstr "Online publication to" + +#: report +msgid "Group by" +msgstr "Group by" + +#: report +msgid "Issue year (bibliographic strip)" +msgstr "Issue year (bibliographic strip)" + +#: report +msgid "Online publication year" +msgstr "Online publication year" + +#: report/templates/report/visual_element_totals.html +msgid "Clear" +msgstr "Clear" From ed6b76f24bcabd1691e6a64f5c17b9bd3ef0bb18 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:40 -0300 Subject: [PATCH 11/15] =?UTF-8?q?Atualiza=20as=20tradu=C3=A7=C3=B5es=20com?= =?UTF-8?q?piladas=20em=20ingl=C3=AAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recompila locale/en/LC_MESSAGES/django.po com as mensagens dos relatórios públicos. --- locale/en/LC_MESSAGES/django.mo | Bin 59873 -> 61743 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 9e46af4b1987f2985e8cbeff9231ea74d20d4d75..5ea6b1ef5ef1b146941837daa30bb6f164087583 100644 GIT binary patch delta 21641 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 delta 19784 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 Rr1#Xhzr)`X_&Cnz{{Wd}!iE3< From b300bf9d3713ffe5d2048c8d1ac2a959365b64f2 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:40 -0300 Subject: [PATCH 12/15] =?UTF-8?q?Traduz=20os=20textos=20dos=20relat=C3=B3r?= =?UTF-8?q?ios=20p=C3=BAblicos=20para=20espanhol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- locale/es/LC_MESSAGES/django.po | 81 +++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index eeade342a..b003d9d02 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -6054,3 +6054,84 @@ msgstr "Esquema de Publicación de SciELO" #~ msgid "Message type" #~ msgstr "Tipo de mensaje" + +#: report +msgctxt "filters" +msgid "Clear" +msgstr "Limpiar" + +#: report +msgid "Reports" +msgstr "Informes" + +#: report +msgid "Data availability report" +msgstr "Informe de disponibilidad de datos" + +#: report +msgid "Data availability" +msgstr "Disponibilidad de datos" + +#: report +msgid "Articles by data availability status, per year. The online publication year filter applies to the year the article was published on the website, which may differ from the issue year shown in the bibliographic strip." +msgstr "Artículos por estado de disponibilidad de datos, por año. El filtro de año de publicación en línea se aplica al año en que el artículo fue publicado en el sitio, que puede ser diferente del año del número indicado en la leyenda bibliográfica." + +#: report +msgid "Articles by data availability status per year, with totals and percentages. Filters: collection, journal and online publication year." +msgstr "Artículos por estado de disponibilidad de datos por año, con totales y porcentajes. Filtros: colección, revista y año de publicación en línea." + +#: report +msgid "Filter" +msgstr "Filtrar" + +#: report +msgid "Download CSV" +msgstr "Descargar CSV" + +#: report +msgid "Total" +msgstr "Total" + +#: report +msgid "No year" +msgstr "Sin año" + +#: report +msgid "No articles found for the selected filters." +msgstr "No se encontraron artículos para los filtros seleccionados." + +#: report +msgid "Status legend" +msgstr "Leyenda de los estados" + +#: report +msgid "Public reports about the content managed by SciELO Content Manager." +msgstr "Informes públicos sobre el contenido gestionado por SciELO Content Manager." + +#: report +msgid "No reports available." +msgstr "No hay informes disponibles." + +#: report +msgid "Online publication from" +msgstr "Publicación en línea desde" + +#: report +msgid "Online publication to" +msgstr "Publicación en línea hasta" + +#: report +msgid "Group by" +msgstr "Agrupar por" + +#: report +msgid "Issue year (bibliographic strip)" +msgstr "Año del número (leyenda bibliográfica)" + +#: report +msgid "Online publication year" +msgstr "Año de publicación en línea" + +#: report/templates/report/visual_element_totals.html +msgid "Clear" +msgstr "Limpiar" From 4daf61aa5ea1594205ecb65793414cd4ef88a7db Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:40 -0300 Subject: [PATCH 13/15] =?UTF-8?q?Atualiza=20as=20tradu=C3=A7=C3=B5es=20com?= =?UTF-8?q?piladas=20em=20espanhol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recompila locale/es/LC_MESSAGES/django.po com as mensagens dos relatórios públicos. --- locale/es/LC_MESSAGES/django.mo | Bin 92373 -> 94385 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo index d039b314dde1e46319675086d5cd89e1e21decae..9a52271c09a8af307bc2f4990b2a21fd0d6e0bee 100644 GIT binary patch delta 30818 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 From 0af445cde19e54cea3ab8e63c006db6566f4876d Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:40 -0300 Subject: [PATCH 14/15] =?UTF-8?q?Traduz=20os=20textos=20dos=20relat=C3=B3r?= =?UTF-8?q?ios=20p=C3=BAblicos=20para=20portugu=C3=AAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- locale/pt_BR/LC_MESSAGES/django.po | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index bfc77c4d7..44c33575e 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -6068,3 +6068,84 @@ msgstr "Esquema de Publicação SciELO" #~ msgid "Message type" #~ msgstr "Tipo de mensagem" + +#: report +msgctxt "filters" +msgid "Clear" +msgstr "Limpar" + +#: report +msgid "Reports" +msgstr "Relatórios" + +#: report +msgid "Data availability report" +msgstr "Relatório de disponibilidade de dados" + +#: report +msgid "Data availability" +msgstr "Disponibilidade de dados" + +#: report +msgid "Articles by data availability status, per year. The online publication year filter applies to the year the article was published on the website, which may differ from the issue year shown in the bibliographic strip." +msgstr "Artigos por status de disponibilidade de dados, por ano. O filtro de ano de publicação online se aplica ao ano em que o artigo foi publicado no site, que pode ser diferente do ano do fascículo indicado na legenda bibliográfica." + +#: report +msgid "Articles by data availability status per year, with totals and percentages. Filters: collection, journal and online publication year." +msgstr "Artigos por status de disponibilidade de dados por ano, com totais e porcentagens. Filtros: coleção, periódico e ano de publicação online." + +#: report +msgid "Filter" +msgstr "Filtrar" + +#: report +msgid "Download CSV" +msgstr "Baixar CSV" + +#: report +msgid "Total" +msgstr "Total" + +#: report +msgid "No year" +msgstr "Sem ano" + +#: report +msgid "No articles found for the selected filters." +msgstr "Nenhum artigo encontrado para os filtros selecionados." + +#: report +msgid "Status legend" +msgstr "Legenda dos status" + +#: report +msgid "Public reports about the content managed by SciELO Content Manager." +msgstr "Relatórios públicos sobre o conteúdo gerenciado pelo SciELO Content Manager." + +#: report +msgid "No reports available." +msgstr "Nenhum relatório disponível." + +#: report +msgid "Online publication from" +msgstr "Publicação online de" + +#: report +msgid "Online publication to" +msgstr "Publicação online até" + +#: report +msgid "Group by" +msgstr "Agrupar por" + +#: report +msgid "Issue year (bibliographic strip)" +msgstr "Ano do fascículo (legenda bibliográfica)" + +#: report +msgid "Online publication year" +msgstr "Ano de publicação online" + +#: report/templates/report/visual_element_totals.html +msgid "Clear" +msgstr "Limpar" From 3445f1dc4906a7ea8ab1135cb5250d14b0c9b230 Mon Sep 17 00:00:00 2001 From: Roberta Takenaka Date: Wed, 7 Oct 2026 10:54:41 -0300 Subject: [PATCH 15/15] =?UTF-8?q?Atualiza=20as=20tradu=C3=A7=C3=B5es=20com?= =?UTF-8?q?piladas=20em=20portugu=C3=AAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recompila locale/pt_BR/LC_MESSAGES/django.po com as mensagens dos relatórios públicos. --- locale/pt_BR/LC_MESSAGES/django.mo | Bin 92035 -> 94028 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index fe6ef859faa4e6885c1b571b794aad23c169fa7c..7cb5b7d50ae1ad167d140e1fe6941f15889fa98d 100644 GIT binary patch delta 31316 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