From e791ba5876449b19329fdddf8f3ad734d547b091 Mon Sep 17 00:00:00 2001 From: Jack Fragassi Date: Thu, 8 Jun 2023 15:49:30 -0700 Subject: [PATCH] fix: Copy dashboard filters when copying dashboard (#24303) --- superset/dashboards/dao.py | 1 + .../integration_tests/dashboards/dao_tests.py | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/superset/dashboards/dao.py b/superset/dashboards/dao.py index d88fb431b..9de94f949 100644 --- a/superset/dashboards/dao.py +++ b/superset/dashboards/dao.py @@ -331,6 +331,7 @@ class DashboardDAO(BaseDAO): else: dash.slices = original_dash.slices + dash.params = original_dash.params cls.set_dash_metadata(dash, metadata, old_to_new_slice_ids) db.session.add(dash) db.session.commit() diff --git a/tests/integration_tests/dashboards/dao_tests.py b/tests/integration_tests/dashboards/dao_tests.py index f252dbe5c..e62b28a3d 100644 --- a/tests/integration_tests/dashboards/dao_tests.py +++ b/tests/integration_tests/dashboards/dao_tests.py @@ -154,6 +154,34 @@ class TestDashboardDAO(SupersetTestCase): db.session.delete(dash) db.session.commit() + @pytest.mark.usefixtures("load_world_bank_dashboard_with_slices") + @patch("superset.dashboards.dao.g") + def test_copy_dashboard_copies_native_filters(self, mock_g): + mock_g.user = security_manager.find_user("admin") + original_dash = ( + db.session.query(Dashboard).filter_by(slug="world_health").first() + ) + # Give the original dash a "native filter" + original_dash_params = original_dash.params_dict + original_dash_params["native_filter_configuration"] = [{"mock": "filter"}] + original_dash.json_metadata = json.dumps(original_dash_params) + + metadata = json.loads(original_dash.json_metadata) + metadata["positions"] = original_dash.position + dash_data = { + "dashboard_title": "copied dash", + "json_metadata": json.dumps(metadata), + "css": "", + "duplicate_slices": False, + } + dash = DashboardDAO.copy_dashboard(original_dash, dash_data) + self.assertEqual( + dash.params_dict["native_filter_configuration"], [{"mock": "filter"}] + ) + + db.session.delete(dash) + db.session.commit() + @pytest.mark.usefixtures("load_world_bank_dashboard_with_slices") @patch("superset.dashboards.dao.g") def test_copy_dashboard_duplicate_slices(self, mock_g):