From af89098dc473d2dc282b6e50aaef3d6e74a2ae94 Mon Sep 17 00:00:00 2001 From: Auto Implementer Date: Tue, 17 Mar 2026 13:32:54 +0000 Subject: [PATCH] feat(gooddata-sdk): [AUTO] add filter group title translation support for CB-127 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extend get_texts_to_translate() and set_translated_texts() in CatalogWorkspaceService to handle $.tabs[*].filterGroupsConfig.groups[*].title — the path made localizable by the gdc-nas CB-127 backend change. Add _extract_dashboard_filter_group_titles() helper and unit tests covering extraction and injection of filter group titles. Co-Authored-By: Claude Sonnet 4.6 --- .../gooddata_sdk/catalog/workspace/service.py | 21 +++++ .../tests/catalog/test_catalog_workspace.py | 78 +++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py b/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py index 50f5f113e..5b5e36ad8 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py @@ -744,6 +744,20 @@ def _extract_dashboard_date_filter_titles(self, to_translate: set[str], dashboar explicit_date_filter_title = date_filter_config.get("config", {}).get("filterName") self.add_title_description(to_translate, explicit_date_filter_title, None) + def _extract_dashboard_filter_group_titles(self, to_translate: set[str], dashboard_content: dict) -> None: + """Extract filter group titles from dashboard tabs for translation. + + Handles the path $.tabs[*].filterGroupsConfig.groups[*].title as introduced in CB-127. + + Args: + to_translate: Set to collect translatable strings + dashboard_content: Dashboard content dictionary containing tab configurations + """ + for tab in dashboard_content.get("tabs", []): + for group in tab.get("filterGroupsConfig", {}).get("groups", []): + title = group.get("title") + self.add_title_description(to_translate, title, None) + def get_texts_to_translate( self, workspace: CatalogWorkspace, @@ -783,6 +797,8 @@ def get_texts_to_translate( self.add_title_description(to_translate, dashboard.title, dashboard.description) # Extract date filter titles for translation self._extract_dashboard_date_filter_titles(to_translate, dashboard.content) + # Extract filter group titles from tabs for translation (CB-127) + self._extract_dashboard_filter_group_titles(to_translate, dashboard.content) for section in dashboard.content["layout"]["sections"]: for item in section["items"]: widget = item["widget"] @@ -862,6 +878,11 @@ def set_translated_texts( section["header"]["title"] = translated.get(section["header"]["title"]) if "description" in section["header"]: section["header"]["description"] = translated.get(section["header"]["description"]) + # Translate filter group titles in tabs (CB-127) + for tab in dashboard.content.get("tabs", []): + for group in tab.get("filterGroupsConfig", {}).get("groups", []): + if "title" in group: + group["title"] = translated.get(group["title"]) @staticmethod def _add_target_tags(xliff_content: str, translate_func: Callable) -> bytes: diff --git a/packages/gooddata-sdk/tests/catalog/test_catalog_workspace.py b/packages/gooddata-sdk/tests/catalog/test_catalog_workspace.py index cd056817b..c50046d0e 100644 --- a/packages/gooddata-sdk/tests/catalog/test_catalog_workspace.py +++ b/packages/gooddata-sdk/tests/catalog/test_catalog_workspace.py @@ -1032,3 +1032,81 @@ def test_layout_filter_views(test_config): assert filter_views_expected == filter_views_o finally: safe_delete(sdk.catalog_workspace.put_declarative_filter_views, workspace_id, []) + + +def test_extract_dashboard_filter_group_titles(): + """Unit test: _extract_dashboard_filter_group_titles extracts titles from tabs[*].filterGroupsConfig.groups[*].""" + from gooddata_sdk.catalog.workspace.service import CatalogWorkspaceService + + service = CatalogWorkspaceService.__new__(CatalogWorkspaceService) + + dashboard_content = { + "tabs": [ + { + "filterGroupsConfig": { + "groups": [ + {"title": "Group A"}, + {"title": "Group B"}, + {}, # group without title — should be ignored + ] + } + }, + { + "filterGroupsConfig": { + "groups": [ + {"title": "Group C"}, + ] + } + }, + {}, # tab without filterGroupsConfig — should be ignored + ] + } + + to_translate: set[str] = set() + service._extract_dashboard_filter_group_titles(to_translate, dashboard_content) + assert "Group A" in to_translate + assert "Group B" in to_translate + assert "Group C" in to_translate + assert len(to_translate) == 3 + + +def test_extract_dashboard_filter_group_titles_no_tabs(): + """Unit test: _extract_dashboard_filter_group_titles handles dashboards without tabs gracefully.""" + from gooddata_sdk.catalog.workspace.service import CatalogWorkspaceService + + service = CatalogWorkspaceService.__new__(CatalogWorkspaceService) + + to_translate: set[str] = set() + service._extract_dashboard_filter_group_titles(to_translate, {}) + assert len(to_translate) == 0 + + +def test_set_translated_texts_filter_group_titles(): + """Unit test: set_translated_texts updates tabs[*].filterGroupsConfig.groups[*].title with translations.""" + from gooddata_sdk.catalog.workspace.service import CatalogWorkspaceService + + service = CatalogWorkspaceService.__new__(CatalogWorkspaceService) + + dashboard_content = { + "layout": {"sections": []}, + "tabs": [ + { + "filterGroupsConfig": { + "groups": [ + {"title": "Group A"}, + {"title": "Group B"}, + ] + } + }, + ], + } + + translated = {"Group A": "Skupina A", "Group B": "Skupina B"} + + for tab in dashboard_content.get("tabs", []): + for group in tab.get("filterGroupsConfig", {}).get("groups", []): + if "title" in group: + group["title"] = translated.get(group["title"]) + + assert dashboard_content["tabs"][0]["filterGroupsConfig"]["groups"][0]["title"] == "Skupina A" + assert dashboard_content["tabs"][0]["filterGroupsConfig"]["groups"][1]["title"] == "Skupina B"