Adota modelo DataSource em indicator e centraliza filtros em search-gateway#582
Adota modelo DataSource em indicator e centraliza filtros em search-gateway#582samuelveigarangel merged 41 commits intomainfrom
Conversation
There was a problem hiding this comment.
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_datasourcespara sincronizarDataSourcevia fixture. - Troca busca/indicadores para renderização de filtros via
search_gatewaye 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.
- request_filters.py: parsing e composição de filtros - form_options.py: carregamento de opções runtime - forms.py: montagem de estado do formulário - ui.py: agrupamento/render-state
There was a problem hiding this comment.
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
_sourcefoi removido do body de Journal Metrics. Isso tende a aumentar bastante o payload/latência do OpenSearch (retorna documento inteiro), especialmente comsize=500. Recomendo (obrigatório) reintroduzir um_sourcemínimo (oustored_fields: []+_sourceseletivo), 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.
| return options | ||
|
|
||
|
|
||
| def search_lookup_options(es, data_source, settings_filter, query_text="", filters=None): |
There was a problem hiding this comment.
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.
| source_fields=source_fields, | ||
| sort_field=sort_field, | ||
| ) | ||
|
|
There was a problem hiding this comment.
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.
| 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} |
| 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") |
There was a problem hiding this comment.
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).
| 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", | ||
| ) |
There was a problem hiding this comment.
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).
| 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 |
There was a problem hiding this comment.
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).
| <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> |
There was a problem hiding this comment.
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.
| <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> |
| 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) |
There was a problem hiding this comment.
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).
| 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, |
There was a problem hiding this comment.
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).
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
- indicator usa DataSource, mas ainda não é baseado em Page
|
@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. |
|
@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. |
…g/scms-oca into impl/centraliza-filtros
Descrição
Este PR consolida a configuração de filtros e formulários no
search_gatewaye passa a reutilizar essa estrutura nas telas de busca e indicadores.Principais mudanças:
search_gateway, com migration e comandosync_datasourcesjournal metricspara usar configuração vinda do datasource, inclusive no ranking setupjournal_metrics,social_productionescientific_productionSim / Não / Todospor radios simplesjournal metricscategory typerepercutir corretamente nas opções de categoria emjournal metricsselect2e ajusta a navegação/menuptept_BRpara a nova UIO Que Fazer Após Pull
Executar nesta ordem:
Se estiver rodando sem
make:Observação:
sync_datasourcesé obrigatório neste PR, porque labels, grupos e formulários passaram a ser sincronizados a partir das fixturesComo Testar
sync_datasources.journal metricse validar:Sim / Não / Todosrenderizam como seleção exclusiva simplesxreaplica a buscaRanking setupmostra os valores corretos emCategory TypeCategorymuda de acordo com oCategory Typeselecionadojournal_metricssocial_productionscientific_productionNotas
migrate + sync_datasourcesScreenshots
