blob: 49141eb73cf62696d38ff46a8a4565c22fae372d [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# pylint: disable=too-many-lines
import textwrap
from sqlalchemy import inspect
from superset import db
from superset.connectors.sqla.models import SqlaTable
from superset.models.dashboard import Dashboard
from superset.models.slice import Slice
from superset.sql_parse import Table
from superset.utils import json
from superset.utils.core import DatasourceType
from ..utils.database import get_example_database
from .helpers import (
get_slice_json,
get_table_connector_registry,
merge_slice,
update_slice_ids,
)
DASH_SLUG = "supported_charts_dash"
def create_slices(tbl: SqlaTable) -> list[Slice]:
slice_kwargs = {
"datasource_id": tbl.id,
"datasource_type": DatasourceType.TABLE,
"owners": [],
}
defaults = {
"limit": "25",
"time_range": "100 years ago : now",
"granularity_sqla": "ds",
"row_limit": "50000",
"viz_type": "echarts_timeseries_bar",
}
slices = [
# ---------------------
# TIER 1
# ---------------------
Slice(
**slice_kwargs,
slice_name="Big Number",
viz_type="big_number_total",
params=get_slice_json(
defaults,
viz_type="big_number_total",
metric="sum__num",
),
),
Slice(
**slice_kwargs,
slice_name="Big Number with Trendline",
viz_type="big_number",
params=get_slice_json(
defaults,
viz_type="big_number",
metric="sum__num",
),
),
Slice(
**slice_kwargs,
slice_name="Table",
viz_type="table",
params=get_slice_json(
defaults,
viz_type="table",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Pivot Table",
viz_type="pivot_table_v2",
params=get_slice_json(
defaults,
viz_type="pivot_table_v2",
metrics=["sum__num"],
groupbyColumns=["gender"],
groupbyRows=["state"],
),
),
Slice(
**slice_kwargs,
slice_name="Line Chart",
viz_type="echarts_timeseries_line",
params=get_slice_json(
defaults,
viz_type="echarts_timeseries_line",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Area Chart",
viz_type="echarts_area",
params=get_slice_json(
defaults,
viz_type="echarts_area",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Bar Chart V2",
viz_type="echarts_timeseries_bar",
params=get_slice_json(
defaults,
viz_type="echarts_timeseries_bar",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Scatter Chart",
viz_type="echarts_timeseries_scatter",
params=get_slice_json(
defaults,
viz_type="echarts_timeseries_scatter",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Pie Chart",
viz_type="pie",
params=get_slice_json(
defaults,
viz_type="pie",
metric="sum__num",
groupby=["gender"],
adhoc_filters=[],
),
),
Slice(
**slice_kwargs,
slice_name="Bar Chart",
viz_type="dist_bar",
params=get_slice_json(
defaults,
viz_type="dist_bar",
metrics=["sum__num"],
groupby=["gender"],
),
),
# ---------------------
# TIER 2
# ---------------------
Slice(
**slice_kwargs,
slice_name="Box Plot Chart",
viz_type="box_plot",
params=get_slice_json(
defaults,
viz_type="box_plot",
metrics=["sum__num"],
groupby=["gender"],
columns=["name"],
),
),
Slice(
**slice_kwargs,
slice_name="Bubble Chart",
viz_type="bubble",
params=get_slice_json(
defaults,
viz_type="bubble",
size="count",
series="state",
entity="gender",
x={
"expressionType": "SIMPLE",
"column": {
"column_name": "num_boys",
},
"aggregate": "SUM",
"label": "SUM(num_boys)",
"optionName": "metric_353e7rjj84m_cirsi2o2s1",
},
y={
"expressionType": "SIMPLE",
"column": {
"column_name": "num_girls",
},
"aggregate": "SUM",
"label": "SUM(num_girls)",
"optionName": "metric_n8rvsr2ysmr_cb3eybtoe5f",
},
),
),
Slice(
**slice_kwargs,
slice_name="Calendar Heatmap",
viz_type="cal_heatmap",
params=get_slice_json(
defaults,
viz_type="cal_heatmap",
metrics=["sum__num"],
time_range="2008-01-01 : 2008-02-01",
),
),
Slice(
**slice_kwargs,
slice_name="Chord Chart",
viz_type="chord",
params=get_slice_json(
defaults,
viz_type="chord",
metric="sum__num",
groupby="gender",
columns="state",
),
),
Slice(
**slice_kwargs,
slice_name="Percent Change Chart",
viz_type="compare",
params=get_slice_json(
defaults,
viz_type="compare",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Generic Chart",
viz_type="echarts_timeseries",
params=get_slice_json(
defaults,
viz_type="echarts_timeseries",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Smooth Line Chart",
viz_type="echarts_timeseries_smooth",
params=get_slice_json(
defaults,
viz_type="echarts_timeseries_smooth",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Step Line Chart",
viz_type="echarts_timeseries_step",
params=get_slice_json(
defaults,
viz_type="echarts_timeseries_step",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Funnel Chart",
viz_type="funnel",
params=get_slice_json(
defaults,
viz_type="funnel",
metric="sum__num",
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Gauge Chart",
viz_type="gauge_chart",
params=get_slice_json(
defaults,
viz_type="gauge_chart",
metric="sum__num",
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Heatmap Chart",
viz_type="heatmap",
params=get_slice_json(
defaults,
viz_type="funnel",
metric="sum__num",
all_columns_x="gender",
all_columns_y="state",
),
),
Slice(
**slice_kwargs,
slice_name="Line Chart",
viz_type="echarts_timeseries_line",
params=get_slice_json(
defaults,
viz_type="echarts_timeseries_line",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Mixed Chart",
viz_type="mixed_timeseries",
params=get_slice_json(
defaults,
viz_type="mixed_timeseries",
metrics=["sum__num"],
groupby=["gender"],
metrics_b=["sum__num"],
groupby_b=["state"],
),
),
Slice(
**slice_kwargs,
slice_name="Partition Chart",
viz_type="partition",
params=get_slice_json(
defaults,
viz_type="partition",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Radar Chart",
viz_type="radar",
params=get_slice_json(
defaults,
viz_type="radar",
metrics=[
"sum__num",
"count",
{
"expressionType": "SIMPLE",
"column": {
"column_name": "num_boys",
},
"aggregate": "SUM",
"label": "SUM(num_boys)",
"optionName": "metric_353e7rjj84m_cirsi2o2s1",
},
],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Nightingale Chart",
viz_type="rose",
params=get_slice_json(
defaults,
viz_type="rose",
metrics=["sum__num"],
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Sankey Chart",
viz_type="sankey",
params=get_slice_json(
defaults,
viz_type="sankey",
metric="sum__num",
groupby=["gender", "state"],
),
),
Slice(
**slice_kwargs,
slice_name="Sunburst Chart",
viz_type="sunburst_v2",
params=get_slice_json(
defaults,
viz_type="sunburst_v2",
metric="sum__num",
columns=["gender", "state"],
),
),
Slice(
**slice_kwargs,
slice_name="Treemap V2 Chart",
viz_type="treemap_v2",
params=get_slice_json(
defaults,
viz_type="treemap_v2",
metric="sum__num",
groupby=["gender"],
),
),
Slice(
**slice_kwargs,
slice_name="Word Cloud Chart",
viz_type="word_cloud",
params=get_slice_json(
defaults,
viz_type="word_cloud",
metric="sum__num",
series="state",
),
),
]
for slc in slices:
merge_slice(slc)
return slices
def load_supported_charts_dashboard() -> None:
"""Loading a dashboard featuring supported charts"""
database = get_example_database()
with database.get_sqla_engine() as engine:
schema = inspect(engine).default_schema_name
tbl_name = "birth_names"
table_exists = database.has_table(Table(tbl_name, schema))
if table_exists:
table = get_table_connector_registry()
obj = (
db.session.query(table)
.filter_by(table_name=tbl_name, schema=schema)
.first()
)
create_slices(obj)
print("Creating the dashboard")
db.session.expunge_all()
dash = db.session.query(Dashboard).filter_by(slug=DASH_SLUG).first()
if not dash:
dash = Dashboard()
js = textwrap.dedent(
"""
{
"CHART-1": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-1"
],
"id": "CHART-1",
"meta": {
"chartId": 1,
"height": 50,
"sliceName": "Big Number",
"width": 4
},
"type": "CHART"
},
"CHART-2": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-1"
],
"id": "CHART-2",
"meta": {
"chartId": 2,
"height": 50,
"sliceName": "Big Number with Trendline",
"width": 4
},
"type": "CHART"
},
"CHART-3": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-1"
],
"id": "CHART-3",
"meta":{
"chartId": 3,
"height": 50,
"sliceName": "Table",
"width": 4
},
"type": "CHART"
},
"CHART-4": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-2"
],
"id": "CHART-4",
"meta": {
"chartId": 4,
"height": 50,
"sliceName": "Pivot Table",
"width": 4
},
"type": "CHART"
},
"CHART-5": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-2"
],
"id": "CHART-5",
"meta": {
"chartId": 5,
"height": 50,
"sliceName": "Line Chart",
"width": 4
},
"type": "CHART"
},
"CHART-6": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-2"
],
"id": "CHART-6",
"meta": {
"chartId": 6,
"height": 50,
"sliceName": "Bar Chart V2",
"width": 4
},
"type": "CHART"
},
"CHART-7": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-3"
],
"id": "CHART-7",
"meta": {
"chartId": 7,
"height": 50,
"sliceName": "Area Chart",
"width": 4
},
"type": "CHART"
},
"CHART-8": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-3"
],
"id": "CHART-8",
"meta": {
"chartId": 8,
"height": 50,
"sliceName": "Scatter Chart",
"width": 4
},
"type": "CHART"
},
"CHART-9": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-3"
],
"id": "CHART-9",
"meta": {
"chartId": 9,
"height": 50,
"sliceName": "Pie Chart",
"width": 4
},
"type": "CHART"
},
"CHART-10": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-4"
],
"id": "CHART-10",
"meta": {
"chartId": 10,
"height": 50,
"sliceName": "Bar Chart",
"width": 4
},
"type": "CHART"
},
"CHART-11": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1",
"ROW-4"
],
"id": "CHART-11",
"meta": {
"chartId": 11,
"height": 50,
"sliceName": "% Rural",
"width": 4
},
"type": "CHART"
},
"CHART-12": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-5"
],
"id": "CHART-12",
"meta": {
"chartId": 12,
"height": 50,
"sliceName": "Box Plot Chart",
"width": 4
},
"type": "CHART"
},
"CHART-13": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-5"
],
"id": "CHART-13",
"meta": {
"chartId": 13,
"height": 50,
"sliceName": "Bubble Chart",
"width": 4
},
"type": "CHART"
},
"CHART-14": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-5"
],
"id": "CHART-14",
"meta": {
"chartId": 14,
"height": 50,
"sliceName": "Calendar Heatmap",
"width": 4
},
"type": "CHART"
},
"CHART-15": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-6"
],
"id": "CHART-15",
"meta": {
"chartId": 15,
"height": 50,
"sliceName": "Chord Chart",
"width": 4
},
"type": "CHART"
},
"CHART-16": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-6"
],
"id": "CHART-16",
"meta": {
"chartId": 16,
"height": 50,
"sliceName": "Percent Change Chart",
"width": 4
},
"type": "CHART"
},
"CHART-17": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-6"
],
"id": "CHART-17",
"meta": {
"chartId": 17,
"height": 50,
"sliceName": "Generic Chart",
"width": 4
},
"type": "CHART"
},
"CHART-18": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-7"
],
"id": "CHART-18",
"meta": {
"chartId": 18,
"height": 50,
"sliceName": "Smooth Line Chart",
"width": 4
},
"type": "CHART"
},
"CHART-19": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-7"
],
"id": "CHART-19",
"meta": {
"chartId": 19,
"height": 50,
"sliceName": "Step Line Chart",
"width": 4
},
"type": "CHART"
},
"CHART-20": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-7"
],
"id": "CHART-20",
"meta": {
"chartId": 20,
"height": 50,
"sliceName": "Funnel Chart",
"width": 4
},
"type": "CHART"
},
"CHART-21": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-8"
],
"id": "CHART-21",
"meta": {
"chartId": 21,
"height": 50,
"sliceName": "Gauge Chart",
"width": 4
},
"type": "CHART"
},
"CHART-22": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-8"
],
"id": "CHART-22",
"meta": {
"chartId": 22,
"height": 50,
"sliceName": "Heatmap Chart",
"width": 4
},
"type": "CHART"
},
"CHART-23": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-8"
],
"id": "CHART-23",
"meta": {
"chartId": 23,
"height": 50,
"sliceName": "Line Chart",
"width": 4
},
"type": "CHART"
},
"CHART-24": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-9"
],
"id": "CHART-24",
"meta": {
"chartId": 24,
"height": 50,
"sliceName": "Mixed Chart",
"width": 4
},
"type": "CHART"
},
"CHART-25": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-9"
],
"id": "CHART-25",
"meta": {
"chartId": 25,
"height": 50,
"sliceName": "Partition Chart",
"width": 4
},
"type": "CHART"
},
"CHART-26": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-9"
],
"id": "CHART-26",
"meta": {
"chartId": 26,
"height": 50,
"sliceName": "Radar Chart",
"width": 4
},
"type": "CHART"
},
"CHART-27": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-10"
],
"id": "CHART-27",
"meta": {
"chartId": 27,
"height": 50,
"sliceName": "Nightingale Chart",
"width": 4
},
"type": "CHART"
},
"CHART-28": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-10"
],
"id": "CHART-28",
"meta": {
"chartId": 28,
"height": 50,
"sliceName": "Sankey Chart",
"width": 4
},
"type": "CHART"
},
"CHART-29": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-10"
],
"id": "CHART-29",
"meta": {
"chartId": 29,
"height": 50,
"sliceName": "Sunburst Chart",
"width": 4
},
"type": "CHART"
},
"CHART-30": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-11"
],
"id": "CHART-30",
"meta": {
"chartId": 30,
"height": 50,
"sliceName": "Treemap Chart",
"width": 4
},
"type": "CHART"
},
"CHART-31": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-11"
],
"id": "CHART-31",
"meta": {
"chartId": 31,
"height": 50,
"sliceName": "Treemap V2 Chart",
"width": 4
},
"type": "CHART"
},
"CHART-32": {
"children": [],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2",
"ROW-11"
],
"id": "CHART-32",
"meta": {
"chartId": 32,
"height": 50,
"sliceName": "Word Cloud Chart",
"width": 4
},
"type": "CHART"
},
"GRID_ID": {
"children": [],
"id": "GRID_ID",
"type": "GRID"
},
"HEADER_ID": {
"id": "HEADER_ID",
"meta": {
"text": "Supported Charts"
},
"type": "HEADER"
},
"TABS-TOP": {
"children": [
"TAB-TOP-1",
"TAB-TOP-2"
],
"id": "TABS-TOP",
"type": "TABS"
},
"TAB-TOP-1": {
"id": "TAB_TOP-1",
"type": "TAB",
"meta": {
"text": "Tier 1",
"defaultText": "Tab title",
"placeholder": "Tab title"
},
"parents": [
"ROOT_ID",
"TABS-TOP"
],
"children": [
"ROW-1",
"ROW-2",
"ROW-3",
"ROW-4"
]
},
"TAB-TOP-2": {
"id": "TAB_TOP-2",
"type": "TAB",
"meta": {
"text": "Tier 2",
"defaultText": "Tab title",
"placeholder": "Tab title"
},
"parents": [
"ROOT_ID",
"TABS-TOP"
],
"children": [
"ROW-5",
"ROW-6",
"ROW-7",
"ROW-8",
"ROW-9",
"ROW-10",
"ROW-11"
]
},
"ROOT_ID": {
"children": [
"TABS-TOP"
],
"id": "ROOT_ID",
"type": "ROOT"
},
"ROW-1": {
"children": [
"CHART-1",
"CHART-2",
"CHART-3"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1"
],
"id": "ROW-1",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-2": {
"children": [
"CHART-4",
"CHART-5",
"CHART-6"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1"
],
"id": "ROW-2",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-3": {
"children": [
"CHART-7",
"CHART-8",
"CHART-9"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1"
],
"id": "ROW-3",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-4": {
"children": [
"CHART-10",
"CHART-11"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-1"
],
"id": "ROW-4",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-5": {
"children": [
"CHART-12",
"CHART-13",
"CHART-14"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2"
],
"id": "ROW-5",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-6": {
"children": [
"CHART-15",
"CHART-16",
"CHART-17"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2"
],
"id": "ROW-6",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-7": {
"children": [
"CHART-18",
"CHART-19",
"CHART-20"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2"
],
"id": "ROW-7",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-8": {
"children": [
"CHART-21",
"CHART-22",
"CHART-23"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2"
],
"id": "ROW-8",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-9": {
"children": [
"CHART-24",
"CHART-25",
"CHART-26"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2"
],
"id": "ROW-9",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-10": {
"children": [
"CHART-27",
"CHART-28",
"CHART-29"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2"
],
"id": "ROW-10",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"ROW-11": {
"children": [
"CHART-30",
"CHART-31",
"CHART-32"
],
"parents": [
"ROOT_ID",
"TABS-TOP",
"TAB-TOP-2"
],
"id": "ROW-11",
"meta": {
"background": "BACKGROUND_TRANSPARENT"
},
"type": "ROW"
},
"DASHBOARD_VERSION_KEY": "v2"
}
"""
)
pos = json.loads(js)
dash.slices = update_slice_ids(pos)
dash.dashboard_title = "Supported Charts Dashboard"
dash.position_json = json.dumps(pos, indent=2)
dash.slug = DASH_SLUG
db.session.commit()