Skip to content

Adota modelo DataSource em indicator e centraliza filtros em search-gateway#582

Merged
samuelveigarangel merged 41 commits intomainfrom
impl/centraliza-filtros
Mar 24, 2026
Merged

Adota modelo DataSource em indicator e centraliza filtros em search-gateway#582
samuelveigarangel merged 41 commits intomainfrom
impl/centraliza-filtros

Conversation

@pitangainnovare
Copy link
Copy Markdown
Contributor

@pitangainnovare pitangainnovare commented Mar 23, 2026

Descrição
Este PR consolida a configuração de filtros e formulários no search_gateway e passa a reutilizar essa estrutura nas telas de busca e indicadores.

Principais mudanças:

  • introduz schema canônico de datasource no search_gateway, com migration e comando sync_datasources
  • move a configuração dos formulários/filtros para fixtures de datasource
  • substitui a busca legada por uma UI baseada em datasource
  • adapta a tela de indicadores para usar a sidebar compartilhada
  • refatora journal metrics para usar configuração vinda do datasource, inclusive no ranking setup
  • reorganiza categorias dos datasources journal_metrics, social_production e scientific_production
  • troca o controle Sim / Não / Todos por radios simples
  • corrige remoção de filtros aplicados no journal metrics
  • faz category type repercutir corretamente nas opções de categoria em journal metrics
  • remove assets legados de select2 e ajusta a navegação/menu
  • completa as traduções pt e pt_BR para a nova UI

O Que Fazer Após Pull
Executar nesta ordem:

make django_migrate
make django_sync_datasources

Se estiver rodando sem make:

python manage.py migrate
python manage.py sync_datasources

Observação:

  • o sync_datasources é obrigatório neste PR, porque labels, grupos e formulários passaram a ser sincronizados a partir das fixtures

Como Testar

  1. Aplicar migrations e rodar sync_datasources.
  2. Abrir a busca de produção científica e produção social.
  3. Confirmar que a nova sidebar de filtros renderiza corretamente, aplica filtros e limpa filtros.
  4. Confirmar que os grupos/categorias dos filtros aparecem conforme configurado no datasource.
  5. Abrir a tela de indicadores de produção científica e social e validar a nova sidebar.
  6. Abrir journal metrics e validar:
    • radios Sim / Não / Todos renderizam como seleção exclusiva simples
    • aplicar um filtro funciona
    • remover um filtro pelo x reaplica a busca
    • Ranking setup mostra os valores corretos em Category Type
    • a lista de Category muda de acordo com o Category Type selecionado
  7. Validar que as novas categorias dos datasources aparecem corretamente:
    • journal_metrics
    • social_production
    • scientific_production
  8. Validar links principais de navegação para Busca e Indicadores.

Notas

  • este PR depende do novo fluxo migrate + sync_datasources

Screenshots
image

image image image

Copilot AI review requested due to automatic review settings March 23, 2026 16:38
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Este PR centraliza configuração de filtros/formulários no search_gateway via um schema canônico de DataSource, migrando telas de busca e indicadores para reutilizarem a mesma sidebar/UI baseada em datasource.

Changes:

  • Adiciona migration + comando sync_datasources para sincronizar DataSource via fixture.
  • Troca busca/indicadores para renderização de filtros via search_gateway e atualiza templates/result cards.
  • Remove dependências legadas (Select2/assets antigos) e ajusta settings/rotas/menus para novos nomes de índices.

Reviewed changes

Copilot reviewed 165 out of 195 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
search_gateway/migrations/0003_datasource_form_schema.py Migra field_settings para um schema canônico.
search_gateway/management/commands/sync_datasources.py Adiciona comando para sincronizar DataSource a partir de fixture JSON.
search_gateway/management/commands/init.py Cria pacote de management commands.
search_gateway/management/init.py Cria pacote de management.
search_gateway/lookup.py Implementa lookup options (search + by values) para campos com lookup.
search_gateway/i18n.py Registra msgids usados em fixtures para i18n runtime.
search_gateway/forms.py Gera payload/HTML da sidebar de filtros baseada em datasource.
search_gateway/client.py Troca chaves de settings para OS_* em clientes ES/OpenSearch.
search_gateway/apps.py Renomeia AppConfig.
search/urls.py Simplifica URLs de busca para a nova página por índice e API de resultados.
search/templates/search/search_page.html Migra página de busca para base do search_gateway e injeta sidebar HTML.
search/templates/search/include/results_list.html Reestrutura toolbar/controles/lista/paginação dos resultados.
search/templates/search/include/results.html Ajusta container de resultados para layout SG.
search/templates/search/include/result_items/social_production.html Atualiza card de resultado (social) para novo layout e ações.
search/templates/search/include/result_items/preprint.html Atualiza card de resultado (preprint) e normaliza link DOI.
search/templates/search/include/result_items/journals.html Atualiza card de resultado (journals) e adiciona footer de ações.
search/templates/search/include/result_items/default.html Atualiza card default, autores e ações (DOI/Registro).
search/templates/search/include/result_items/dataset.html Atualiza card dataset e links/ações.
search/templates/search/include/result_items/book.html Atualiza card book e correção de publishers.
search/templates/search/include/result_items/book-chapter.html Atualiza card chapter e agrega páginas.
search/templates/search/include/filters/select2.html Remove template legado de Select2.
search/templates/search/include/filters/range.html Remove template legado de range.
search/templates/search/include/filters.html Remove sidebar de filtros legada.
search/templates/results.html Remove template legado de resultados.
search/templates/indicator/indicator_detail.html Remove template legado de detalhe do indicador.
search/templates/indicator/echarts/echarts_examples/indicator_graphic_evolution_example.html Remove exemplo legado.
search/templates/indicator/echarts/echarts_examples/indicator_graphic_bar-label-rotation_example.html Remove exemplo legado.
search/templates/indicator/echarts/bar-y-category-stack.html Remove template legado do gráfico.
search/templates/indicator/echarts/bar-y-category-stack.decal.html Remove template legado do gráfico.
search/templates/indicator/echarts/bar-y-category-stack.dark.html Remove template legado do gráfico.
search/templates/indicator/echarts/bar-y-category-stack.dark-decal.html Remove template legado do gráfico.
search/templates/indicator/abas.html Remove template legado de abas.
search/templates/include/search_pagination.html Remove paginação legada.
search/templates/include/result_doc_indicator.html Remove cards legados de resultado (indicadores).
search/templates/include/result_doc_directory.html Remove cards legados de resultado (diretórios).
search/templates/include/result_doc.html Remove card legado genérico.
search/templates/csv_template.txt Remove template legado de CSV.
search/templates/cluster.html Remove sidebar de facets legada.
search/graphic_data.py Remove helper legado de dados para gráfico.
policy_directory/scripts/index_opensearch.py Atualiza setting do índice social.
infrastructure_directory/scripts/index_opensearch.py Atualiza setting do índice social.
event_directory/scripts/index_opensearch.py Atualiza setting do índice social.
education_directory/scripts/index_opensearch.py Atualiza setting do índice social.
locale/pt_BR/LC_MESSAGES/django.po Completa traduções para nova UI/labels de datasource.
indicator/wagtail_hooks.py Remove (comentado) registro do ModelAdmin do indicator.
indicator/views.py Migra indicadores/journal metrics para usar DataSource + sidebar compartilhada.
indicator/urls.py Atualiza data_source default da home para scientific_production.
indicator/tests/test_urls.py Remove testes de URL do indicator.
indicator/tests/test_journal_metrics_views.py Remove testes de view de journal metrics.
indicator/tests/test_journal_metrics_controller.py Remove testes do controller de journal metrics.
indicator/tests/test_journal_metrics_config.py Remove testes da config de journal metrics.
indicator/templatetags/indicator_filters.py Refatora ui_value para usar transforms do datasource.
indicator/templates/scope.html Ajusta scope panel e default data_source.
indicator/templates/ranking.html Remove painel “Ranking Overview” legado e ajusta texto.
indicator/templates/menu_ranking.html Remove menu legado do ranking.
indicator/templates/menu.html Remove menu legado de filtros.
indicator/templates/journal_profile.html Troca helpers.js para o do search_gateway e ajusta classe CSS.
indicator/templates/indicator.html Usa sidebar HTML injetada e adiciona assets do search_gateway.
indicator/templates/filters/social_production.html Remove filtros legados (select2/datepicker).
indicator/templates/controls_bar.html Adiciona barra de controles (study unit + breakdown + ranking setup).
indicator/templates/chart.html Insere controls bar e ajusta classe applied filters.
indicator/templates/admin/graph.html Remove template admin legado.
indicator/static/indicator/js/layout.js Ajusta classe de layout para sg-layout--filters-hidden.
indicator/static/indicator/js/journal_profile.js Remove integração Select2 e internaliza helper getConfigAttr.
indicator/static/indicator/js/journal_metrics_common.js Remove helper legado de journal metrics (Select2/config attr).
indicator/static/indicator/js/button.js Remove helpers legados (select2/datepicker/toggle-not).
indicator/search/query.py Remove dependência de data_sources_with_settings e ajusta nomes de data source.
indicator/search/parser.py Usa defaults via datasource (em vez de config estática).
indicator/models.py Altera permanent_link.
indicator/journal_metrics/presentation.py Usa default publication year via datasource.
indicator/journal_metrics/params.py Usa defaults via datasource (category/min pubs).
indicator/journal_metrics/data_source.py Introduz helpers para defaults/normalização via DataSource.
indicator/journal_metrics/config.py Remove config estática (defaults/aliases/source fields).
indicator/journal_metrics/init.py Atualiza exports para data_source.
core/templatetags/string_filters.py Remove tag de menu que dependia de settings antigos.
core/templatetags/menu_context.py Centraliza resolução de páginas de busca/índices no contexto do menu.
core/templates/menus/menu_items_top.html Remove load de string_filters.
core/templates/menus/menu_items_bottom.html Usa menu_context para links/active state e fallback para rota nova.
core/templates/base.html Remove assets JS/CSS do Select2.
core/static/js/i18n/zh-TW.js Remove asset i18n do Select2.
core/static/js/i18n/zh-CN.js Remove asset i18n do Select2.
core/static/js/i18n/vi.js Remove asset i18n do Select2.
core/static/js/i18n/uk.js Remove asset i18n do Select2.
core/static/js/i18n/tr.js Remove asset i18n do Select2.
core/static/js/i18n/tk.js Remove asset i18n do Select2.
core/static/js/i18n/th.js Remove asset i18n do Select2.
core/static/js/i18n/sv.js Remove asset i18n do Select2.
core/static/js/i18n/sr.js Remove asset i18n do Select2.
core/static/js/i18n/sr-Cyrl.js Remove asset i18n do Select2.
core/static/js/i18n/sq.js Remove asset i18n do Select2.
core/static/js/i18n/sl.js Remove asset i18n do Select2.
core/static/js/i18n/sk.js Remove asset i18n do Select2.
core/static/js/i18n/ru.js Remove asset i18n do Select2.
core/static/js/i18n/ro.js Remove asset i18n do Select2.
core/static/js/i18n/pt.js Remove asset i18n do Select2.
core/static/js/i18n/pt-BR.js Remove asset i18n do Select2.
core/static/js/i18n/ps.js Remove asset i18n do Select2.
core/static/js/i18n/pl.js Remove asset i18n do Select2.
core/static/js/i18n/nl.js Remove asset i18n do Select2.
core/static/js/i18n/ne.js Remove asset i18n do Select2.
core/static/js/i18n/nb.js Remove asset i18n do Select2.
core/static/js/i18n/ms.js Remove asset i18n do Select2.
core/static/js/i18n/mk.js Remove asset i18n do Select2.
core/static/js/i18n/lv.js Remove asset i18n do Select2.
core/static/js/i18n/lt.js Remove asset i18n do Select2.
core/static/js/i18n/ko.js Remove asset i18n do Select2.
core/static/js/i18n/km.js Remove asset i18n do Select2.
core/static/js/i18n/ka.js Remove asset i18n do Select2.
core/static/js/i18n/ja.js Remove asset i18n do Select2.
core/static/js/i18n/it.js Remove asset i18n do Select2.
core/static/js/i18n/is.js Remove asset i18n do Select2.
core/static/js/i18n/id.js Remove asset i18n do Select2.
core/static/js/i18n/hy.js Remove asset i18n do Select2.
core/static/js/i18n/hu.js Remove asset i18n do Select2.
core/static/js/i18n/hsb.js Remove asset i18n do Select2.
core/static/js/i18n/hr.js Remove asset i18n do Select2.
core/static/js/i18n/hi.js Remove asset i18n do Select2.
core/static/js/i18n/he.js Remove asset i18n do Select2.
core/static/js/i18n/gl.js Remove asset i18n do Select2.
core/static/js/i18n/fr.js Remove asset i18n do Select2.
core/static/js/i18n/fi.js Remove asset i18n do Select2.
core/static/js/i18n/fa.js Remove asset i18n do Select2.
core/static/js/i18n/eu.js Remove asset i18n do Select2.
core/static/js/i18n/et.js Remove asset i18n do Select2.
core/static/js/i18n/es.js Remove asset i18n do Select2.
core/static/js/i18n/en.js Remove asset i18n do Select2.
core/static/js/i18n/el.js Remove asset i18n do Select2.
core/static/js/i18n/dsb.js Remove asset i18n do Select2.
core/static/js/i18n/de.js Remove asset i18n do Select2.
core/static/js/i18n/da.js Remove asset i18n do Select2.
core/static/js/i18n/cs.js Remove asset i18n do Select2.
core/static/js/i18n/ca.js Remove asset i18n do Select2.
core/static/js/i18n/bs.js Remove asset i18n do Select2.
core/static/js/i18n/bn.js Remove asset i18n do Select2.
core/static/js/i18n/bg.js Remove asset i18n do Select2.
core/static/js/i18n/az.js Remove asset i18n do Select2.
core/static/js/i18n/ar.js Remove asset i18n do Select2.
core/static/js/i18n/af.js Remove asset i18n do Select2.
core/static/css/style.css Ajusta espaçamento global de formulários.
config/settings/base.py Renomeia settings OpenSearch (OS_/OP_INDEX_ novos) e remove aliases antigos.
chart/wagtail_hooks.py Remove (comentado) registro do ModelAdmin do chart.
Makefile Torna SCMS_WEBAPP_VERSION resiliente e adiciona target django_sync_datasources.
Comments suppressed due to low confidence (1)

indicator/tests/test_journal_metrics_views.py:1

  • Os testes de journal metrics/URLs/config foram removidos, mas o PR alterou significativamente as rotas (journal_metrics_by_*), defaults via datasource e comportamento de filtros/sidebar. Recomendo manter (ou recriar) cobertura para: (1) URL canônica de journal metrics e redirecionamentos, (2) defaults vindos do datasource (ranking_metric/category_level etc.), (3) regressão “remover filtro reaplica busca” (mencionada na descrição). Isso ajuda a evitar regressões silenciosas nessa refatoração grande.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread search_gateway/lookup.py Outdated
Comment thread search_gateway/management/commands/sync_datasources.py
Comment thread search_gateway/apps.py
Comment thread indicator/models.py
Comment thread indicator/templatetags/indicator_filters.py
Comment thread indicator/search/query.py
Comment thread indicator/wagtail_hooks.py
Comment thread indicator/wagtail_hooks.py
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 164 out of 196 changed files in this pull request and generated 9 comments.

Comments suppressed due to low confidence (1)

indicator/search/query.py:1

  • O _source foi removido do body de Journal Metrics. Isso tende a aumentar bastante o payload/latência do OpenSearch (retorna documento inteiro), especialmente com size=500. Recomendo (obrigatório) reintroduzir um _source mínimo (ou stored_fields: [] + _source seletivo), alinhado aos campos efetivamente usados no parser/UI.
from indicator.journal_metrics.data_source import (

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread search_gateway/lookup.py Outdated
Comment thread search_gateway/lookup.py Outdated
return options


def search_lookup_options(es, data_source, settings_filter, query_text="", filters=None):
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

O parâmetro filters é aceito por search_lookup_options(...) mas não é aplicado na query enviada ao OpenSearch. Isso pode produzir opções incorretas (ex.: não respeitar filtros já aplicados na UI). Sugestão: (obrigatório) aplicar filters no body[\"query\"] (bool/filter) ou remover o parâmetro caso a API não suporte isso; manter parâmetro ineffectivo é confuso para consumidores.

Copilot uses AI. Check for mistakes.
Comment thread search_gateway/lookup.py
source_fields=source_fields,
sort_field=sort_field,
)

Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

O parâmetro filters é aceito por search_lookup_options(...) mas não é aplicado na query enviada ao OpenSearch. Isso pode produzir opções incorretas (ex.: não respeitar filtros já aplicados na UI). Sugestão: (obrigatório) aplicar filters no body[\"query\"] (bool/filter) ou remover o parâmetro caso a API não suporte isso; manter parâmetro ineffectivo é confuso para consumidores.

Suggested change
if filters:
# Ensure we have a base query to attach filters to
existing_query = body.get("query", {"match_all": {}})
# Normalize existing query into a bool query
if isinstance(existing_query, dict) and "bool" in existing_query:
bool_query = existing_query.get("bool") or {}
else:
bool_query = {"must": existing_query}
# Normalize any existing filters into a list
existing_filters = bool_query.get("filter", [])
if not isinstance(existing_filters, list):
existing_filters = [existing_filters] if existing_filters else []
# Normalize provided filters into a list
if isinstance(filters, list):
new_filters = filters
else:
new_filters = [filters]
bool_query["filter"] = existing_filters + new_filters
body["query"] = {"bool": bool_query}

Copilot uses AI. Check for mistakes.
Comment thread indicator/views.py
return JsonResponse({"error": "Invalid data_source"}, status=404)

cleaned_filters = utils.clean_form_filters(request.GET.dict())
applied_filters = extract_applied_filters(request.GET, data_source, form_key="indicator")
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

A sidebar do indicador está configurada com method=\"post\", mas os filtros são extraídos apenas de request.GET. Na prática, ao submeter o form, os filtros podem não ser aplicados (ou o comportamento fica inconsistente conforme a origem dos params). Correção recomendada (obrigatória): ou mudar sidebar_form_method para get, ou alterar a extração para usar request.POST quando request.method == \"POST\" (e manter coerência também para study_unit/demais leituras).

Copilot uses AI. Check for mistakes.
Comment thread indicator/views.py
Comment on lines +101 to +114
sidebar_payload = render_filter_sidebar(
request,
data_source=data_source,
form_key="indicator",
applied_filters=applied_filters,
exclude_fields=["breakdown_variable"],
sidebar_form_id="indicator-filter-form",
sidebar_form_method="post",
submit_label=_("FILTRAR"),
reset_label=_("LIMPAR"),
submit_id="menu-submit",
reset_id="menu-reset",
reset_type="button",
)
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

A sidebar do indicador está configurada com method=\"post\", mas os filtros são extraídos apenas de request.GET. Na prática, ao submeter o form, os filtros podem não ser aplicados (ou o comportamento fica inconsistente conforme a origem dos params). Correção recomendada (obrigatória): ou mudar sidebar_form_method para get, ou alterar a extração para usar request.POST quando request.method == \"POST\" (e manter coerência também para study_unit/demais leituras).

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +22
def get_journal_metrics_data_source():
try:
return DataSource.get_by_index_name(index_name=JOURNAL_METRICS_DATA_SOURCE)
except Exception:
return None


def _get_resolved_field(field_name):
data_source = get_journal_metrics_data_source()
if not data_source:
return None
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Os helpers (get_default_*, normalize_*, get_index_field_name) chamam get_journal_metrics_data_source() repetidamente, o que pode gerar múltiplas queries ao banco por request (menu + views + parser). Sugestão (obrigatória para evitar regressão de latência): cachear o resultado via functools.lru_cache/cache de processo e, se necessário, invalidar quando sync_datasources rodar (ex.: bump de versão/clear cache).

Copilot uses AI. Check for mistakes.
Comment on lines +19 to +41
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Exportar' %}">
<span class="results-toolbar__icon results-toolbar__icon--download"></span>
</button>
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Citar' %}">
<span class="results-toolbar__icon results-toolbar__icon--quotes"></span>
</button>
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Imprimir' %}">
<span class="results-toolbar__icon results-toolbar__icon--print"></span>
</button>
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Compartilhar' %}">
<span class="results-toolbar__icon results-toolbar__icon--share"></span>
</button>
</div>

<div class="results-toolbar__divider"></div>

<div class="results-toolbar__view-group">
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Lista' %}">
<span class="results-toolbar__icon results-toolbar__icon--list"></span>
</button>
<button type="button" class="results-toolbar__icon-btn results-toolbar__icon-btn--active" tabindex="-1" aria-label="{% trans 'Grade' %}">
<span class="results-toolbar__icon results-toolbar__icon--grid"></span>
</button>
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Há botões interativos dentro de um container com aria-hidden=\"true\" e tabindex=\"-1\". Isso torna os controles inacessíveis para leitores de tela e para navegação por teclado (além de aria-hidden em elementos interativos ser antipadrão). Correção recomendada: remover aria-hidden e tabindex=-1 e implementar as ações, ou (se for somente placeholder visual) trocar button por elementos não interativos (span/div) e manter fora do fluxo semânt ico.

Suggested change
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Exportar' %}">
<span class="results-toolbar__icon results-toolbar__icon--download"></span>
</button>
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Citar' %}">
<span class="results-toolbar__icon results-toolbar__icon--quotes"></span>
</button>
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Imprimir' %}">
<span class="results-toolbar__icon results-toolbar__icon--print"></span>
</button>
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Compartilhar' %}">
<span class="results-toolbar__icon results-toolbar__icon--share"></span>
</button>
</div>
<div class="results-toolbar__divider"></div>
<div class="results-toolbar__view-group">
<button type="button" class="results-toolbar__icon-btn" tabindex="-1" aria-label="{% trans 'Lista' %}">
<span class="results-toolbar__icon results-toolbar__icon--list"></span>
</button>
<button type="button" class="results-toolbar__icon-btn results-toolbar__icon-btn--active" tabindex="-1" aria-label="{% trans 'Grade' %}">
<span class="results-toolbar__icon results-toolbar__icon--grid"></span>
</button>
<span class="results-toolbar__icon-btn">
<span class="results-toolbar__icon results-toolbar__icon--download"></span>
</span>
<span class="results-toolbar__icon-btn">
<span class="results-toolbar__icon results-toolbar__icon--quotes"></span>
</span>
<span class="results-toolbar__icon-btn">
<span class="results-toolbar__icon results-toolbar__icon--print"></span>
</span>
<span class="results-toolbar__icon-btn">
<span class="results-toolbar__icon results-toolbar__icon--share"></span>
</span>
</div>
<div class="results-toolbar__divider"></div>
<div class="results-toolbar__view-group">
<span class="results-toolbar__icon-btn">
<span class="results-toolbar__icon results-toolbar__icon--list"></span>
</span>
<span class="results-toolbar__icon-btn results-toolbar__icon-btn--active">
<span class="results-toolbar__icon results-toolbar__icon--grid"></span>
</span>

Copilot uses AI. Check for mistakes.
Comment thread indicator/views.py
Comment on lines +259 to +267
configuration_payload = build_data_source_form_payload(
data_source,
form_key="journal_metrics",
applied_filters=context["applied_filters"],
)
panel_groups = data_source.get_form_panel_groups("journal_metrics")
if not panel_groups:
panel_groups = _infer_panel_groups_from_payload(configuration_payload)
context["indicator_config_fields"] = _collect_form_group_fields(configuration_payload, panel_groups)
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Foram removidos vários testes de journal_metrics (views/controller/config) e esta refatoração adiciona lógica nova e não-trivial (panel groups inferidos, exclusão dinâmica de fields, composição de sidebar + config fields). Recomendo (obrigatório) reintroduzir testes cobrindo ao menos: (1) defaults vindos do DataSource, (2) geração de indicator_config_fields a partir dos grupos, (3) exclusão correta de campos do sidebar via config_field_names, e (4) comportamento de GET/POST (inclusive remoção de filtro reaplicar busca).

Copilot uses AI. Check for mistakes.
Comment thread indicator/views.py
Comment on lines +276 to +284
sidebar_payload = render_filter_sidebar(
request,
data_source=data_source,
form_key="journal_metrics",
applied_filters=context["applied_filters"],
exclude_fields=config_field_names,
sidebar_form_id="journal-metrics-filter-form",
sidebar_form_method="get",
sidebar_form_action=request.path,
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Foram removidos vários testes de journal_metrics (views/controller/config) e esta refatoração adiciona lógica nova e não-trivial (panel groups inferidos, exclusão dinâmica de fields, composição de sidebar + config fields). Recomendo (obrigatório) reintroduzir testes cobrindo ao menos: (1) defaults vindos do DataSource, (2) geração de indicator_config_fields a partir dos grupos, (3) exclusão correta de campos do sidebar via config_field_names, e (4) comportamento de GET/POST (inclusive remoção de filtro reaplicar busca).

Copilot uses AI. Check for mistakes.
@pitangainnovare
Copy link
Copy Markdown
Contributor Author

@copilot Por favor, analise cuidadosamente o app search-gateway e indica o que pode ser melhorado em termos de simplificação de código-fonte (ainda pode haver duplicidades de normalização de campos e tratamento de formulários). Alguns nomes podem não ser os melhores (veja se é interessante criar um diretório utils/* com módulos específicos e com responsabilidades melhor definidas). Veja models, service e query que atuam como interfaces entre o OpenSearch e os outros módulos da app. A ideia é evitar código defensivo, pois é muito verboso (nossa estrutura de dados - veja a fixture) é precisa e não precisamos de verificações (que chamo aqui de defensivas) ao longo dos códigos.

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 24, 2026

@pitangainnovare I've opened a new pull request, #583, to work on those changes. Once the pull request is ready, I'll request review from you.

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.

4 participants