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"
                                   }]
Beispiel #2
0
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)