mirror of
https://github.com/apache/superset.git
synced 2026-04-12 20:57:55 +00:00
576 lines
15 KiB
Python
576 lines
15 KiB
Python
# 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-statements
|
|
import json
|
|
|
|
from superset import db
|
|
from .helpers import (
|
|
Dash,
|
|
get_slice_json,
|
|
merge_slice,
|
|
Slice,
|
|
TBL,
|
|
update_slice_ids,
|
|
)
|
|
|
|
COLOR_RED = {
|
|
'r': 205,
|
|
'g': 0,
|
|
'b': 3,
|
|
'a': 0.82,
|
|
}
|
|
POSITION_JSON = """\
|
|
{
|
|
"CHART-3afd9d70": {
|
|
"meta": {
|
|
"chartId": 66,
|
|
"width": 6,
|
|
"height": 50
|
|
},
|
|
"type": "CHART",
|
|
"id": "CHART-3afd9d70",
|
|
"children": []
|
|
},
|
|
"CHART-2ee7fa5e": {
|
|
"meta": {
|
|
"chartId": 67,
|
|
"width": 6,
|
|
"height": 50
|
|
},
|
|
"type": "CHART",
|
|
"id": "CHART-2ee7fa5e",
|
|
"children": []
|
|
},
|
|
"CHART-201f7715": {
|
|
"meta": {
|
|
"chartId": 68,
|
|
"width": 6,
|
|
"height": 50
|
|
},
|
|
"type": "CHART",
|
|
"id": "CHART-201f7715",
|
|
"children": []
|
|
},
|
|
"CHART-d02f6c40": {
|
|
"meta": {
|
|
"chartId": 69,
|
|
"width": 6,
|
|
"height": 50
|
|
},
|
|
"type": "CHART",
|
|
"id": "CHART-d02f6c40",
|
|
"children": []
|
|
},
|
|
"CHART-2673431d": {
|
|
"meta": {
|
|
"chartId": 70,
|
|
"width": 6,
|
|
"height": 50
|
|
},
|
|
"type": "CHART",
|
|
"id": "CHART-2673431d",
|
|
"children": []
|
|
},
|
|
"CHART-85265a60": {
|
|
"meta": {
|
|
"chartId": 71,
|
|
"width": 6,
|
|
"height": 50
|
|
},
|
|
"type": "CHART",
|
|
"id": "CHART-85265a60",
|
|
"children": []
|
|
},
|
|
"CHART-2b87513c": {
|
|
"meta": {
|
|
"chartId": 72,
|
|
"width": 6,
|
|
"height": 50
|
|
},
|
|
"type": "CHART",
|
|
"id": "CHART-2b87513c",
|
|
"children": []
|
|
},
|
|
"GRID_ID": {
|
|
"type": "GRID",
|
|
"id": "GRID_ID",
|
|
"children": [
|
|
"ROW-a7b16cb5",
|
|
"ROW-72c218a5",
|
|
"ROW-957ba55b",
|
|
"ROW-af041bdd"
|
|
]
|
|
},
|
|
"HEADER_ID": {
|
|
"meta": {
|
|
"text": "deck.gl Demo"
|
|
},
|
|
"type": "HEADER",
|
|
"id": "HEADER_ID"
|
|
},
|
|
"ROOT_ID": {
|
|
"type": "ROOT",
|
|
"id": "ROOT_ID",
|
|
"children": [
|
|
"GRID_ID"
|
|
]
|
|
},
|
|
"ROW-72c218a5": {
|
|
"meta": {
|
|
"background": "BACKGROUND_TRANSPARENT"
|
|
},
|
|
"type": "ROW",
|
|
"id": "ROW-72c218a5",
|
|
"children": [
|
|
"CHART-d02f6c40",
|
|
"CHART-201f7715"
|
|
]
|
|
},
|
|
"ROW-957ba55b": {
|
|
"meta": {
|
|
"background": "BACKGROUND_TRANSPARENT"
|
|
},
|
|
"type": "ROW",
|
|
"id": "ROW-957ba55b",
|
|
"children": [
|
|
"CHART-2673431d",
|
|
"CHART-85265a60"
|
|
]
|
|
},
|
|
"ROW-a7b16cb5": {
|
|
"meta": {
|
|
"background": "BACKGROUND_TRANSPARENT"
|
|
},
|
|
"type": "ROW",
|
|
"id": "ROW-a7b16cb5",
|
|
"children": [
|
|
"CHART-3afd9d70",
|
|
"CHART-2ee7fa5e"
|
|
]
|
|
},
|
|
"ROW-af041bdd": {
|
|
"meta": {
|
|
"background": "BACKGROUND_TRANSPARENT"
|
|
},
|
|
"type": "ROW",
|
|
"id": "ROW-af041bdd",
|
|
"children": [
|
|
"CHART-2b87513c"
|
|
]
|
|
},
|
|
"DASHBOARD_VERSION_KEY": "v2"
|
|
}"""
|
|
|
|
|
|
def load_deck_dash():
|
|
print('Loading deck.gl dashboard')
|
|
slices = []
|
|
tbl = db.session.query(TBL).filter_by(table_name='long_lat').first()
|
|
slice_data = {
|
|
'spatial': {
|
|
'type': 'latlong',
|
|
'lonCol': 'LON',
|
|
'latCol': 'LAT',
|
|
},
|
|
'color_picker': COLOR_RED,
|
|
'datasource': '5__table',
|
|
'filters': [],
|
|
'granularity_sqla': None,
|
|
'groupby': [],
|
|
'having': '',
|
|
'mapbox_style': 'mapbox://styles/mapbox/light-v9',
|
|
'multiplier': 10,
|
|
'point_radius_fixed': {'type': 'metric', 'value': 'count'},
|
|
'point_unit': 'square_m',
|
|
'min_radius': 1,
|
|
'row_limit': 5000,
|
|
'time_range': ' : ',
|
|
'size': 'count',
|
|
'time_grain_sqla': None,
|
|
'viewport': {
|
|
'bearing': -4.952916738791771,
|
|
'latitude': 37.78926922909199,
|
|
'longitude': -122.42613341901688,
|
|
'pitch': 4.750411100577438,
|
|
'zoom': 12.729132798697304,
|
|
},
|
|
'viz_type': 'deck_scatter',
|
|
'where': '',
|
|
}
|
|
|
|
print('Creating Scatterplot slice')
|
|
slc = Slice(
|
|
slice_name='Scatterplot',
|
|
viz_type='deck_scatter',
|
|
datasource_type='table',
|
|
datasource_id=tbl.id,
|
|
params=get_slice_json(slice_data),
|
|
)
|
|
merge_slice(slc)
|
|
slices.append(slc)
|
|
|
|
slice_data = {
|
|
'point_unit': 'square_m',
|
|
'filters': [],
|
|
'row_limit': 5000,
|
|
'spatial': {
|
|
'type': 'latlong',
|
|
'lonCol': 'LON',
|
|
'latCol': 'LAT',
|
|
},
|
|
'mapbox_style': 'mapbox://styles/mapbox/dark-v9',
|
|
'granularity_sqla': None,
|
|
'size': 'count',
|
|
'viz_type': 'deck_screengrid',
|
|
'time_range': 'No filter',
|
|
'point_radius': 'Auto',
|
|
'color_picker': {
|
|
'a': 1,
|
|
'r': 14,
|
|
'b': 0,
|
|
'g': 255,
|
|
},
|
|
'grid_size': 20,
|
|
'where': '',
|
|
'having': '',
|
|
'viewport': {
|
|
'zoom': 14.161641703941438,
|
|
'longitude': -122.41827069521386,
|
|
'bearing': -4.952916738791771,
|
|
'latitude': 37.76024135844065,
|
|
'pitch': 4.750411100577438,
|
|
},
|
|
'point_radius_fixed': {'type': 'fix', 'value': 2000},
|
|
'datasource': '5__table',
|
|
'time_grain_sqla': None,
|
|
'groupby': [],
|
|
}
|
|
print('Creating Screen Grid slice')
|
|
slc = Slice(
|
|
slice_name='Screen grid',
|
|
viz_type='deck_screengrid',
|
|
datasource_type='table',
|
|
datasource_id=tbl.id,
|
|
params=get_slice_json(slice_data),
|
|
)
|
|
merge_slice(slc)
|
|
slices.append(slc)
|
|
|
|
slice_data = {
|
|
'spatial': {
|
|
'type': 'latlong',
|
|
'lonCol': 'LON',
|
|
'latCol': 'LAT',
|
|
},
|
|
'filters': [],
|
|
'row_limit': 5000,
|
|
'mapbox_style': 'mapbox://styles/mapbox/streets-v9',
|
|
'granularity_sqla': None,
|
|
'size': 'count',
|
|
'viz_type': 'deck_hex',
|
|
'time_range': 'No filter',
|
|
'point_radius_unit': 'Pixels',
|
|
'point_radius': 'Auto',
|
|
'color_picker': {
|
|
'a': 1,
|
|
'r': 14,
|
|
'b': 0,
|
|
'g': 255,
|
|
},
|
|
'grid_size': 40,
|
|
'extruded': True,
|
|
'having': '',
|
|
'viewport': {
|
|
'latitude': 37.789795085160335,
|
|
'pitch': 54.08961642447763,
|
|
'zoom': 13.835465702403654,
|
|
'longitude': -122.40632230075536,
|
|
'bearing': -2.3984797349335167,
|
|
},
|
|
'where': '',
|
|
'point_radius_fixed': {'type': 'fix', 'value': 2000},
|
|
'datasource': '5__table',
|
|
'time_grain_sqla': None,
|
|
'groupby': [],
|
|
}
|
|
print('Creating Hex slice')
|
|
slc = Slice(
|
|
slice_name='Hexagons',
|
|
viz_type='deck_hex',
|
|
datasource_type='table',
|
|
datasource_id=tbl.id,
|
|
params=get_slice_json(slice_data),
|
|
)
|
|
merge_slice(slc)
|
|
slices.append(slc)
|
|
|
|
slice_data = {
|
|
'spatial': {
|
|
'type': 'latlong',
|
|
'lonCol': 'LON',
|
|
'latCol': 'LAT',
|
|
},
|
|
'filters': [],
|
|
'row_limit': 5000,
|
|
'mapbox_style': 'mapbox://styles/mapbox/satellite-streets-v9',
|
|
'granularity_sqla': None,
|
|
'size': 'count',
|
|
'viz_type': 'deck_grid',
|
|
'point_radius_unit': 'Pixels',
|
|
'point_radius': 'Auto',
|
|
'time_range': 'No filter',
|
|
'color_picker': {
|
|
'a': 1,
|
|
'r': 14,
|
|
'b': 0,
|
|
'g': 255,
|
|
},
|
|
'grid_size': 120,
|
|
'extruded': True,
|
|
'having': '',
|
|
'viewport': {
|
|
'longitude': -122.42066918995666,
|
|
'bearing': 155.80099696026355,
|
|
'zoom': 12.699690845482069,
|
|
'latitude': 37.7942314882596,
|
|
'pitch': 53.470800300695146,
|
|
},
|
|
'where': '',
|
|
'point_radius_fixed': {'type': 'fix', 'value': 2000},
|
|
'datasource': '5__table',
|
|
'time_grain_sqla': None,
|
|
'groupby': [],
|
|
}
|
|
print('Creating Grid slice')
|
|
slc = Slice(
|
|
slice_name='Grid',
|
|
viz_type='deck_grid',
|
|
datasource_type='table',
|
|
datasource_id=tbl.id,
|
|
params=get_slice_json(slice_data),
|
|
)
|
|
merge_slice(slc)
|
|
slices.append(slc)
|
|
|
|
polygon_tbl = db.session.query(TBL) \
|
|
.filter_by(table_name='sf_population_polygons').first()
|
|
slice_data = {
|
|
'datasource': '11__table',
|
|
'viz_type': 'deck_polygon',
|
|
'slice_id': 41,
|
|
'granularity_sqla': None,
|
|
'time_grain_sqla': None,
|
|
'time_range': ' : ',
|
|
'line_column': 'contour',
|
|
'metric': None,
|
|
'line_type': 'json',
|
|
'mapbox_style': 'mapbox://styles/mapbox/light-v9',
|
|
'viewport': {
|
|
'longitude': -122.43388541747726,
|
|
'latitude': 37.752020331384834,
|
|
'zoom': 11.133995608594631,
|
|
'bearing': 37.89506450385642,
|
|
'pitch': 60,
|
|
'width': 667,
|
|
'height': 906,
|
|
'altitude': 1.5,
|
|
'maxZoom': 20,
|
|
'minZoom': 0,
|
|
'maxPitch': 60,
|
|
'minPitch': 0,
|
|
'maxLatitude': 85.05113,
|
|
'minLatitude': -85.05113,
|
|
},
|
|
'reverse_long_lat': False,
|
|
'fill_color_picker': {
|
|
'r': 3,
|
|
'g': 65,
|
|
'b': 73,
|
|
'a': 1,
|
|
},
|
|
'stroke_color_picker': {
|
|
'r': 0,
|
|
'g': 122,
|
|
'b': 135,
|
|
'a': 1,
|
|
},
|
|
'filled': True,
|
|
'stroked': False,
|
|
'extruded': True,
|
|
'point_radius_scale': 100,
|
|
'js_columns': [
|
|
'population',
|
|
'area',
|
|
],
|
|
'js_datapoint_mutator':
|
|
'(d) => {\n d.elevation = d.extraProps.population/d.extraProps.area/10\n \
|
|
d.fillColor = [d.extraProps.population/d.extraProps.area/60,140,0]\n \
|
|
return d;\n}',
|
|
'js_tooltip': '',
|
|
'js_onclick_href': '',
|
|
'where': '',
|
|
'having': '',
|
|
'filters': [],
|
|
}
|
|
|
|
print('Creating Polygon slice')
|
|
slc = Slice(
|
|
slice_name='Polygons',
|
|
viz_type='deck_polygon',
|
|
datasource_type='table',
|
|
datasource_id=polygon_tbl.id,
|
|
params=get_slice_json(slice_data),
|
|
)
|
|
merge_slice(slc)
|
|
slices.append(slc)
|
|
|
|
slice_data = {
|
|
'datasource': '10__table',
|
|
'viz_type': 'deck_arc',
|
|
'slice_id': 42,
|
|
'granularity_sqla': None,
|
|
'time_grain_sqla': None,
|
|
'time_range': ' : ',
|
|
'start_spatial': {
|
|
'type': 'latlong',
|
|
'latCol': 'LATITUDE',
|
|
'lonCol': 'LONGITUDE',
|
|
},
|
|
'end_spatial': {
|
|
'type': 'latlong',
|
|
'latCol': 'LATITUDE_DEST',
|
|
'lonCol': 'LONGITUDE_DEST',
|
|
},
|
|
'row_limit': 5000,
|
|
'mapbox_style': 'mapbox://styles/mapbox/light-v9',
|
|
'viewport': {
|
|
'altitude': 1.5,
|
|
'bearing': 8.546256357301871,
|
|
'height': 642,
|
|
'latitude': 44.596651438714254,
|
|
'longitude': -91.84340711201104,
|
|
'maxLatitude': 85.05113,
|
|
'maxPitch': 60,
|
|
'maxZoom': 20,
|
|
'minLatitude': -85.05113,
|
|
'minPitch': 0,
|
|
'minZoom': 0,
|
|
'pitch': 60,
|
|
'width': 997,
|
|
'zoom': 2.929837070560775,
|
|
},
|
|
'color_picker': {
|
|
'r': 0,
|
|
'g': 122,
|
|
'b': 135,
|
|
'a': 1,
|
|
},
|
|
'stroke_width': 1,
|
|
'where': '',
|
|
'having': '',
|
|
'filters': [],
|
|
}
|
|
|
|
print('Creating Arc slice')
|
|
slc = Slice(
|
|
slice_name='Arcs',
|
|
viz_type='deck_arc',
|
|
datasource_type='table',
|
|
datasource_id=db.session.query(TBL).filter_by(table_name='flights').first().id,
|
|
params=get_slice_json(slice_data),
|
|
)
|
|
merge_slice(slc)
|
|
slices.append(slc)
|
|
|
|
slice_data = {
|
|
'datasource': '12__table',
|
|
'slice_id': 43,
|
|
'viz_type': 'deck_path',
|
|
'time_grain_sqla': None,
|
|
'time_range': ' : ',
|
|
'line_column': 'path_json',
|
|
'line_type': 'json',
|
|
'row_limit': 5000,
|
|
'mapbox_style': 'mapbox://styles/mapbox/light-v9',
|
|
'viewport': {
|
|
'longitude': -122.18885402582598,
|
|
'latitude': 37.73671752604488,
|
|
'zoom': 9.51847667620428,
|
|
'bearing': 0,
|
|
'pitch': 0,
|
|
'width': 669,
|
|
'height': 1094,
|
|
'altitude': 1.5,
|
|
'maxZoom': 20,
|
|
'minZoom': 0,
|
|
'maxPitch': 60,
|
|
'minPitch': 0,
|
|
'maxLatitude': 85.05113,
|
|
'minLatitude': -85.05113,
|
|
},
|
|
'color_picker': {
|
|
'r': 0,
|
|
'g': 122,
|
|
'b': 135,
|
|
'a': 1,
|
|
},
|
|
'line_width': 150,
|
|
'reverse_long_lat': False,
|
|
'js_columns': [
|
|
'color',
|
|
],
|
|
'js_datapoint_mutator': 'd => {\n return {\n ...d,\n color: \
|
|
colors.hexToRGB(d.extraProps.color),\n }\n}',
|
|
'js_tooltip': '',
|
|
'js_onclick_href': '',
|
|
'where': '',
|
|
'having': '',
|
|
'filters': [],
|
|
}
|
|
|
|
print('Creating Path slice')
|
|
slc = Slice(
|
|
slice_name='Path',
|
|
viz_type='deck_path',
|
|
datasource_type='table',
|
|
datasource_id=db.session.query(TBL).filter_by(table_name='bart_lines').first().id,
|
|
params=get_slice_json(slice_data),
|
|
)
|
|
merge_slice(slc)
|
|
slices.append(slc)
|
|
slug = 'deck'
|
|
|
|
print('Creating a dashboard')
|
|
title = 'deck.gl Demo'
|
|
dash = db.session.query(Dash).filter_by(slug=slug).first()
|
|
|
|
if not dash:
|
|
dash = Dash()
|
|
js = POSITION_JSON
|
|
pos = json.loads(js)
|
|
update_slice_ids(pos, slices)
|
|
dash.position_json = json.dumps(pos, indent=4)
|
|
dash.dashboard_title = title
|
|
dash.slug = slug
|
|
dash.slices = slices
|
|
db.session.merge(dash)
|
|
db.session.commit()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
load_deck_dash()
|