def test_build_extra_filters(self): world_health = db.session.query(Dashboard).filter_by( slug="world_health").one() layout = json.loads(world_health.position_json) filter_ = db.session.query(Slice).filter_by( slice_name="Region Filter").one() world = db.session.query(Slice).filter_by( slice_name="World's Population").one() box_plot = db.session.query(Slice).filter_by( slice_name="Box plot").one() treemap = db.session.query(Slice).filter_by(slice_name="Treemap").one() filter_scopes = { str(filter_.id): { "region": { "scope": ["ROOT_ID"], "immune": [treemap.id] }, "country_name": { "scope": ["ROOT_ID"], "immune": [treemap.id, box_plot.id], }, } } default_filters = { str(filter_.id): { "region": ["North America"], "country_name": ["United States"], } } # immune to all filters assert (build_extra_filters(layout, filter_scopes, default_filters, treemap.id) == []) # in scope assert build_extra_filters(layout, filter_scopes, default_filters, world.id) == [ { "col": "region", "op": "==", "val": "North America" }, { "col": "country_name", "op": "in", "val": ["United States"] }, ] assert build_extra_filters(layout, filter_scopes, default_filters, box_plot.id) == [{ "col": "region", "op": "==", "val": "North America" }]
def get_form_data(chart_id: int, dashboard: Optional[Dashboard] = None) -> Dict[str, Any]: """ Build `form_data` for chart GET request from dashboard's `default_filters`. When a dashboard has `default_filters` they need to be added as extra filters in the GET request for charts. """ form_data: Dict[str, Any] = {"slice_id": chart_id} if dashboard is None or not dashboard.json_metadata: return form_data json_metadata = json.loads(dashboard.json_metadata) default_filters = json.loads(json_metadata.get("default_filters", "null")) if not default_filters: return form_data filter_scopes = json_metadata.get("filter_scopes", {}) layout = json.loads(dashboard.position_json or "{}") if (isinstance(layout, dict) and isinstance(filter_scopes, dict) and isinstance(default_filters, dict)): extra_filters = build_extra_filters(layout, filter_scopes, default_filters, chart_id) if extra_filters: form_data["extra_filters"] = extra_filters return form_data
def test_build_extra_filters(self): layout = { "CHART-2ee52f30": { "children": [], "id": "CHART-2ee52f30", "meta": { "chartId": 1020, "height": 38, "sliceName": "Chart 927", "width": 6, }, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO", "TABS-N1zN4CIZP0", "TAB-asWdJzKmTN", "ROW-i_sG4ccXE", ], "type": "CHART", }, "CHART-36bfc934": { "children": [], "id": "CHART-36bfc934", "meta": { "chartId": 1018, "height": 26, "sliceName": "Region Filter", "width": 2, }, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-W62P60D88", "ROW-1e064e3c", "COLUMN-fe3914b8", ], "type": "CHART", }, "CHART-E_y2cuNHTv": { "children": [], "id": "CHART-E_y2cuNHTv", "meta": {"chartId": 998, "height": 55, "sliceName": "MAP", "width": 6}, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-W62P60D88", "ROW-1e064e3c", ], "type": "CHART", }, "CHART-JNxDOsAfEb": { "children": [], "id": "CHART-JNxDOsAfEb", "meta": { "chartId": 1015, "height": 27, "sliceName": "Population", "width": 4, }, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-W62P60D88", "ROW-1e064e3c", "COLUMN-fe3914b8", ], "type": "CHART", }, "CHART-KoOwqalV80": { "children": [], "id": "CHART-KoOwqalV80", "meta": { "chartId": 927, "height": 20, "sliceName": "Chart 927", "width": 4, }, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO", "TABS-N1zN4CIZP0", "TAB-cHNWcBZC9", "ROW-9b9vrWKPY", ], "type": "CHART", }, "CHART-YCQAPVK7mQ": { "children": [], "id": "CHART-YCQAPVK7mQ", "meta": { "chartId": 1023, "height": 38, "sliceName": "World's Population", "width": 4, }, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO", "ROW-UfxFT36oV5", ], "type": "CHART", }, "COLUMN-fe3914b8": { "children": ["CHART-36bfc934", "CHART-JNxDOsAfEb"], "id": "COLUMN-fe3914b8", "meta": {"background": "BACKGROUND_TRANSPARENT", "width": 6}, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-W62P60D88", "ROW-1e064e3c", ], "type": "COLUMN", }, "DASHBOARD_VERSION_KEY": "v2", "GRID_ID": { "children": [], "id": "GRID_ID", "parents": ["ROOT_ID"], "type": "GRID", }, "HEADER_ID": { "id": "HEADER_ID", "meta": {"text": "Test warmup 1023"}, "type": "HEADER", }, "ROOT_ID": { "children": ["TABS-Qq4sdkANSY"], "id": "ROOT_ID", "type": "ROOT", }, "ROW-1e064e3c": { "children": ["COLUMN-fe3914b8", "CHART-E_y2cuNHTv"], "id": "ROW-1e064e3c", "meta": {"background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-Qq4sdkANSY", "TAB-W62P60D88"], "type": "ROW", }, "ROW-9b9vrWKPY": { "children": ["CHART-KoOwqalV80"], "id": "ROW-9b9vrWKPY", "meta": {"background": "BACKGROUND_TRANSPARENT"}, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO", "TABS-N1zN4CIZP0", "TAB-cHNWcBZC9", ], "type": "ROW", }, "ROW-UfxFT36oV5": { "children": ["CHART-YCQAPVK7mQ"], "id": "ROW-UfxFT36oV5", "meta": {"background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO"], "type": "ROW", }, "ROW-i_sG4ccXE": { "children": ["CHART-2ee52f30"], "id": "ROW-i_sG4ccXE", "meta": {"background": "BACKGROUND_TRANSPARENT"}, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO", "TABS-N1zN4CIZP0", "TAB-asWdJzKmTN", ], "type": "ROW", }, "TAB-VrhTX2WUlO": { "children": ["ROW-UfxFT36oV5", "TABS-N1zN4CIZP0"], "id": "TAB-VrhTX2WUlO", "meta": {"text": "New Tab"}, "parents": ["ROOT_ID", "TABS-Qq4sdkANSY"], "type": "TAB", }, "TAB-W62P60D88": { "children": ["ROW-1e064e3c"], "id": "TAB-W62P60D88", "meta": {"text": "Tab 2"}, "parents": ["ROOT_ID", "TABS-Qq4sdkANSY"], "type": "TAB", }, "TAB-asWdJzKmTN": { "children": ["ROW-i_sG4ccXE"], "id": "TAB-asWdJzKmTN", "meta": {"text": "nested tab 1"}, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO", "TABS-N1zN4CIZP0", ], "type": "TAB", }, "TAB-cHNWcBZC9": { "children": ["ROW-9b9vrWKPY"], "id": "TAB-cHNWcBZC9", "meta": {"text": "test2d tab 2"}, "parents": [ "ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO", "TABS-N1zN4CIZP0", ], "type": "TAB", }, "TABS-N1zN4CIZP0": { "children": ["TAB-asWdJzKmTN", "TAB-cHNWcBZC9"], "id": "TABS-N1zN4CIZP0", "meta": {}, "parents": ["ROOT_ID", "TABS-Qq4sdkANSY", "TAB-VrhTX2WUlO"], "type": "TABS", }, "TABS-Qq4sdkANSY": { "children": ["TAB-VrhTX2WUlO", "TAB-W62P60D88"], "id": "TABS-Qq4sdkANSY", "meta": {}, "parents": ["ROOT_ID"], "type": "TABS", }, } filter_scopes = { "1018": { "region": {"scope": ["TAB-W62P60D88"], "immune": [998]}, "country_name": {"scope": ["ROOT_ID"], "immune": [927, 998]}, } } default_filters = { "1018": {"region": ["North America"], "country_name": ["United States"]} } # immune to all filters slice_id = 998 extra_filters = build_extra_filters( layout, filter_scopes, default_filters, slice_id ) expected = [] self.assertEqual(extra_filters, expected) # in scope slice_id = 1015 extra_filters = build_extra_filters( layout, filter_scopes, default_filters, slice_id ) expected = [ {"col": "region", "op": "in", "val": ["North America"]}, {"col": "country_name", "op": "in", "val": ["United States"]}, ] self.assertEqual(extra_filters, expected) # not in scope slice_id = 927 extra_filters = build_extra_filters( layout, filter_scopes, default_filters, slice_id ) expected = [] self.assertEqual(extra_filters, expected)