diff --git a/superset/config.py b/superset/config.py index af2816fc06d40..85ba10167f793 100644 --- a/superset/config.py +++ b/superset/config.py @@ -1582,7 +1582,8 @@ class ExtraRelatedQueryFilters(TypedDict, total=False): EXTRA_RELATED_QUERY_FILTERS: ExtraRelatedQueryFilters = {} -# Extra dynamic database filter make it possible to limit which databases are shown + +# Extra dynamic query filters make it possible to limit which objects are shown # in the UI before any other filtering is applied. Useful for example when # considering to filter using Feature Flags along with regular role filters # that get applied by default in our base_filters. @@ -1594,8 +1595,12 @@ class ExtraRelatedQueryFilters(TypedDict, total=False): # filter = Database.database_name.startswith('b') # return query.filter(filter) # -# EXTRA_DYNAMIC_DATABASE_FILTER = initial_database_filter -EXTRA_DYNAMIC_DATABASE_FILTER: Callable[[Query], Query] | None = None +# EXTRA_DYNAMIC_QUERY_FILTERS = {"database": initial_database_filter} +class ExtraDynamicQueryFilters(TypedDict, total=False): + databases: Callable[[Query], Query] + + +EXTRA_DYNAMIC_QUERY_FILTERS: ExtraDynamicQueryFilters = {} # ------------------------------------------------------------------- diff --git a/superset/databases/filters.py b/superset/databases/filters.py index 3fc8a13a3804f..384a62c9d3b6f 100644 --- a/superset/databases/filters.py +++ b/superset/databases/filters.py @@ -49,8 +49,9 @@ def apply(self, query: Query, value: Any) -> Query: filtering. """ - if dynamic_filter := current_app.config["EXTRA_DYNAMIC_DATABASE_FILTER"]: - query = dynamic_filter(query) + if dynamic_filters := current_app.config["EXTRA_DYNAMIC_QUERY_FILTERS"]: + if dynamic_databases_filter := dynamic_filters.get("databases"): + query = dynamic_databases_filter(query) # We can proceed with default filtering now if security_manager.can_access_all_databases(): diff --git a/tests/integration_tests/databases/api_tests.py b/tests/integration_tests/databases/api_tests.py index ebdfb71b3fd18..6d6c832abcbc7 100644 --- a/tests/integration_tests/databases/api_tests.py +++ b/tests/integration_tests/databases/api_tests.py @@ -3695,7 +3695,7 @@ def _base_filter(query): with patch.dict( "superset.views.filters.current_app.config", - {"EXTRA_DYNAMIC_DATABASE_FILTER": base_filter_mock}, + {"EXTRA_DYNAMIC_QUERY_FILTERS": {"databases": base_filter_mock}}, ): uri = f"api/v1/database/" rv = self.client.get(uri) diff --git a/tests/unit_tests/databases/api_test.py b/tests/unit_tests/databases/api_test.py index 92eb0708f2c50..71c078f10c414 100644 --- a/tests/unit_tests/databases/api_test.py +++ b/tests/unit_tests/databases/api_test.py @@ -579,7 +579,7 @@ def _base_filter(query): assert base_filter_mock.call_count == 0 original_config = current_app.config.copy() - original_config["EXTRA_DYNAMIC_DATABASE_FILTER"] = base_filter_mock + original_config["EXTRA_DYNAMIC_QUERY_FILTERS"] = {"databases": base_filter_mock} mocker.patch("superset.views.filters.current_app.config", new=original_config) # Get filtered list