You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by mi...@apache.org on 2023/08/17 19:39:44 UTC

[superset] branch 3.0 updated (387549f69c -> f63cb47f35)

This is an automated email from the ASF dual-hosted git repository.

michaelsmolina pushed a change to branch 3.0
in repository https://gitbox.apache.org/repos/asf/superset.git


    from 387549f69c fix(snowflake): opt-in denormalization of column names (#24982)
     new e20c2967c4 fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (#24995)
     new ea27cf13d3 fix: update permalink schema (#24970)
     new c2c5f232c8 chore: isolate examples database by default (#25003)
     new f63cb47f35 fix: Date column in Heatmap is displayed as unix timestamp (#25009)

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 docker-compose.yml                                 |    1 +
 docker/.env                                        |    6 +
 docker/docker-entrypoint-initdb.d/examples-init.sh |   15 +
 docker/pythonpath_dev/superset_config.py           |   24 +-
 docs/static/resources/openapi.json                 | 9522 ++++++++++++++------
 .../legacy-plugin-chart-heatmap/src/Heatmap.js     |    9 +-
 .../src/controlPanel.tsx                           |   11 +
 .../src/transformProps.js                          |   22 +-
 .../src/Timeseries/transformProps.ts               |   15 +-
 superset/config.py                                 |    2 +-
 superset/explore/permalink/api.py                  |    2 +-
 superset/utils/database.py                         |    6 +-
 12 files changed, 6617 insertions(+), 3018 deletions(-)
 create mode 100755 docker/docker-entrypoint-initdb.d/examples-init.sh


[superset] 02/04: fix: update permalink schema (#24970)

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

michaelsmolina pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/superset.git

commit ea27cf13d3197a0c205f82cb5ddf63269e3ca738
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Wed Aug 16 09:56:20 2023 -0700

    fix: update permalink schema (#24970)
    
    (cherry picked from commit bc1c5c2f845af98879d7ef626b67f7587ea662c2)
---
 docs/static/resources/openapi.json | 9522 +++++++++++++++++++++++++-----------
 superset/explore/permalink/api.py  |    2 +-
 2 files changed, 6536 insertions(+), 2988 deletions(-)

diff --git a/docs/static/resources/openapi.json b/docs/static/resources/openapi.json
index 94dca800c3..6ad0be5756 100644
--- a/docs/static/resources/openapi.json
+++ b/docs/static/resources/openapi.json
@@ -124,7 +124,11 @@
                         "type": "object"
                       },
                       "level": {
-                        "enum": ["info", "warning", "error"],
+                        "enum": [
+                          "info",
+                          "warning",
+                          "error"
+                        ],
                         "type": "string"
                       },
                       "message": {
@@ -206,7 +210,12 @@
         "properties": {
           "annotationType": {
             "description": "Type of annotation layer",
-            "enum": ["FORMULA", "INTERVAL", "EVENT", "TIME_SERIES"],
+            "enum": [
+              "FORMULA",
+              "INTERVAL",
+              "EVENT",
+              "TIME_SERIES"
+            ],
             "type": "string"
           },
           "color": {
@@ -237,7 +246,12 @@
           },
           "opacity": {
             "description": "Opacity of layer",
-            "enum": ["", "opacityLow", "opacityMedium", "opacityHigh"],
+            "enum": [
+              "",
+              "opacityLow",
+              "opacityMedium",
+              "opacityHigh"
+            ],
             "nullable": true,
             "type": "string"
           },
@@ -264,12 +278,22 @@
           },
           "sourceType": {
             "description": "Type of source for annotation data",
-            "enum": ["", "line", "NATIVE", "table"],
+            "enum": [
+              "",
+              "line",
+              "NATIVE",
+              "table"
+            ],
             "type": "string"
           },
           "style": {
             "description": "Line style. Only applies to time-series annotations",
-            "enum": ["dashed", "dotted", "solid", "longDashed"],
+            "enum": [
+              "dashed",
+              "dotted",
+              "solid",
+              "longDashed"
+            ],
             "type": "string"
           },
           "timeColumn": {
@@ -287,12 +311,16 @@
           },
           "width": {
             "description": "Width of annotation line",
-            "format": "float",
-            "minimum": 0,
+            "minimum": 0.0,
             "type": "number"
           }
         },
-        "required": ["name", "show", "showMarkers", "value"],
+        "required": [
+          "name",
+          "show",
+          "showMarkers",
+          "value"
+        ],
         "type": "object"
       },
       "AnnotationLayerRestApi.get": {
@@ -302,7 +330,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -316,7 +343,7 @@
       "AnnotationLayerRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User"
+            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User1"
           },
           "changed_on": {
             "format": "date-time",
@@ -327,7 +354,7 @@
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User1"
+            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User"
           },
           "created_on": {
             "format": "date-time",
@@ -339,7 +366,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -361,7 +387,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "AnnotationLayerRestApi.get_list.User1": {
@@ -375,7 +404,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "AnnotationLayerRestApi.post": {
@@ -392,7 +424,9 @@
             "type": "string"
           }
         },
-        "required": ["name"],
+        "required": [
+          "name"
+        ],
         "type": "object"
       },
       "AnnotationLayerRestApi.put": {
@@ -418,7 +452,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -443,13 +476,14 @@
             "type": "string"
           }
         },
-        "required": ["layer"],
+        "required": [
+          "layer"
+        ],
         "type": "object"
       },
       "AnnotationRestApi.get.AnnotationLayer": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -463,13 +497,13 @@
       "AnnotationRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User"
+            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User1"
           },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User1"
+            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User"
           },
           "end_dttm": {
             "format": "date-time",
@@ -477,7 +511,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "long_descr": {
@@ -504,11 +537,12 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["first_name"],
+        "required": [
+          "first_name"
+        ],
         "type": "object"
       },
       "AnnotationRestApi.get_list.User1": {
@@ -518,11 +552,12 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["first_name"],
+        "required": [
+          "first_name"
+        ],
         "type": "object"
       },
       "AnnotationRestApi.post": {
@@ -554,7 +589,11 @@
             "type": "string"
           }
         },
-        "required": ["end_dttm", "short_descr", "start_dttm"],
+        "required": [
+          "end_dttm",
+          "short_descr",
+          "start_dttm"
+        ],
         "type": "object"
       },
       "AnnotationRestApi.put": {
@@ -621,7 +660,6 @@
       "CacheRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -630,7 +668,6 @@
       "CacheRestApi.get_list": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -639,7 +676,6 @@
       "CacheRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -648,7 +684,6 @@
       "CacheRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -671,11 +706,67 @@
         },
         "type": "object"
       },
+      "ChartCacheWarmUpRequestSchema": {
+        "properties": {
+          "chart_id": {
+            "description": "The ID of the chart to warm up cache for",
+            "type": "integer"
+          },
+          "dashboard_id": {
+            "description": "The ID of the dashboard to get filters for when warming cache",
+            "type": "integer"
+          },
+          "extra_filters": {
+            "description": "Extra filters to apply when warming up cache",
+            "type": "string"
+          }
+        },
+        "required": [
+          "chart_id"
+        ],
+        "type": "object"
+      },
+      "ChartCacheWarmUpResponseSchema": {
+        "properties": {
+          "result": {
+            "description": "A list of each chart's warmup status and errors if any",
+            "items": {
+              "$ref": "#/components/schemas/ChartCacheWarmUpResponseSingle"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "ChartCacheWarmUpResponseSingle": {
+        "properties": {
+          "chart_id": {
+            "description": "The ID of the chart the status belongs to",
+            "type": "integer"
+          },
+          "viz_error": {
+            "description": "Error that occurred when warming cache for chart",
+            "type": "string"
+          },
+          "viz_status": {
+            "description": "Status of the underlying query for the viz",
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
       "ChartDataAdhocMetricSchema": {
         "properties": {
           "aggregate": {
-            "description": "Aggregation operator. Only required for simple expression types.",
-            "enum": ["AVG", "COUNT", "COUNT_DISTINCT", "MAX", "MIN", "SUM"],
+            "description": "Aggregation operator.Only required for simple expression types.",
+            "enum": [
+              "AVG",
+              "COUNT",
+              "COUNT_DISTINCT",
+              "MAX",
+              "MIN",
+              "SUM"
+            ],
             "type": "string"
           },
           "column": {
@@ -683,7 +774,10 @@
           },
           "expressionType": {
             "description": "Simple or SQL metric",
-            "enum": ["SIMPLE", "SQL"],
+            "enum": [
+              "SIMPLE",
+              "SQL"
+            ],
             "example": "SQL",
             "type": "string"
           },
@@ -697,12 +791,12 @@
             "type": "boolean"
           },
           "label": {
-            "description": "Label for the metric. Is automatically generated unless hasCustomLabel is true, in which case label must be defined.",
+            "description": "Label for the metric. Is automatically generated unlesshasCustomLabel is true, in which case label must be defined.",
             "example": "Weighted observations",
             "type": "string"
           },
           "optionName": {
-            "description": "Unique identifier. Can be any string value, as long as all metrics have a unique identifier. If undefined, a random name will be generated.",
+            "description": "Unique identifier. Can be any string value, as long as all metrics have a unique identifier. If undefined, a random namewill be generated.",
             "example": "metric_aec60732-fac0-4b17-b736-93f1a5c93e30",
             "type": "string"
           },
@@ -717,7 +811,9 @@
             "type": "string"
           }
         },
-        "required": ["expressionType"],
+        "required": [
+          "expressionType"
+        ],
         "type": "object"
       },
       "ChartDataAggregateOptionsSchema": {
@@ -782,16 +878,25 @@
           },
           "percentiles": {
             "description": "Upper and lower percentiles for percentile whisker type.",
-            "example": [1, 99]
+            "example": [
+              1,
+              99
+            ]
           },
           "whisker_type": {
             "description": "Whisker type. Any numpy function will work.",
-            "enum": ["tukey", "min/max", "percentile"],
+            "enum": [
+              "tukey",
+              "min/max",
+              "percentile"
+            ],
             "example": "tukey",
             "type": "string"
           }
         },
-        "required": ["whisker_type"],
+        "required": [
+          "whisker_type"
+        ],
         "type": "object"
       },
       "ChartDataColumn": {
@@ -813,19 +918,23 @@
         "properties": {
           "orientation": {
             "description": "Should cell values be calculated across the row or column.",
-            "enum": ["row", "column"],
+            "enum": [
+              "row",
+              "column"
+            ],
             "example": "row",
             "type": "string"
           }
         },
-        "required": ["orientation"],
+        "required": [
+          "orientation"
+        ],
         "type": "object"
       },
       "ChartDataDatasource": {
         "properties": {
           "id": {
             "description": "Datasource id",
-            "format": "int32",
             "type": "integer"
           },
           "type": {
@@ -841,7 +950,9 @@
             "type": "string"
           }
         },
-        "required": ["id"],
+        "required": [
+          "id"
+        ],
         "type": "object"
       },
       "ChartDataExtras": {
@@ -852,12 +963,18 @@
           },
           "relative_end": {
             "description": "End time for relative time deltas. Default: `config[\"DEFAULT_RELATIVE_START_TIME\"]`",
-            "enum": ["today", "now"],
+            "enum": [
+              "today",
+              "now"
+            ],
             "type": "string"
           },
           "relative_start": {
             "description": "Start time for relative time deltas. Default: `config[\"DEFAULT_RELATIVE_START_TIME\"]`",
-            "enum": ["today", "now"],
+            "enum": [
+              "today",
+              "now"
+            ],
             "type": "string"
           },
           "time_grain_sqla": {
@@ -881,7 +998,12 @@
               "1969-12-28T00:00:00Z/P1W",
               "1969-12-29T00:00:00Z/P1W",
               "P1W/1970-01-03T00:00:00Z",
-              "P1W/1970-01-04T00:00:00Z"
+              "P1W/1970-01-04T00:00:00Z",
+              "PT2H",
+              "PT4H",
+              "PT8H",
+              "PT10H",
+              "PT12H"
             ],
             "example": "P1D",
             "nullable": true,
@@ -924,7 +1046,6 @@
               "IS NOT NULL",
               "IN",
               "NOT IN",
-              "REGEX",
               "IS TRUE",
               "IS FALSE",
               "TEMPORAL_RANGE"
@@ -934,11 +1055,18 @@
           },
           "val": {
             "description": "The value or values to compare against. Can be a string, integer, decimal, None or list, depending on the operator.",
-            "example": ["China", "France", "Japan"],
+            "example": [
+              "China",
+              "France",
+              "Japan"
+            ],
             "nullable": true
           }
         },
-        "required": ["col", "op"],
+        "required": [
+          "col",
+          "op"
+        ],
         "type": "object"
       },
       "ChartDataGeodeticParseOptionsSchema": {
@@ -960,7 +1088,11 @@
             "type": "string"
           }
         },
-        "required": ["geodetic", "latitude", "longitude"],
+        "required": [
+          "geodetic",
+          "latitude",
+          "longitude"
+        ],
         "type": "object"
       },
       "ChartDataGeohashDecodeOptionsSchema": {
@@ -978,7 +1110,11 @@
             "type": "string"
           }
         },
-        "required": ["geohash", "latitude", "longitude"],
+        "required": [
+          "geohash",
+          "latitude",
+          "longitude"
+        ],
         "type": "object"
       },
       "ChartDataGeohashEncodeOptionsSchema": {
@@ -996,7 +1132,11 @@
             "type": "string"
           }
         },
-        "required": ["geohash", "latitude", "longitude"],
+        "required": [
+          "geohash",
+          "latitude",
+          "longitude"
+        ],
         "type": "object"
       },
       "ChartDataPivotOptionsSchema": {
@@ -1088,12 +1228,17 @@
                   }
                 }
               },
-              "groupby": ["country", "gender"]
+              "groupby": [
+                "country",
+                "gender"
+              ]
             },
             "type": "object"
           }
         },
-        "required": ["operation"],
+        "required": [
+          "operation"
+        ],
         "type": "object"
       },
       "ChartDataProphetOptionsSchema": {
@@ -1101,9 +1246,8 @@
           "confidence_interval": {
             "description": "Width of predicted confidence interval",
             "example": 0.8,
-            "format": "float",
-            "maximum": 1,
-            "minimum": 0,
+            "maximum": 1.0,
+            "minimum": 0.0,
             "type": "number"
           },
           "monthly_seasonality": {
@@ -1113,7 +1257,6 @@
           "periods": {
             "description": "Time periods (in units of `time_grain`) to predict into the future",
             "example": 7,
-            "format": "int32",
             "type": "integer"
           },
           "time_grain": {
@@ -1137,7 +1280,12 @@
               "1969-12-28T00:00:00Z/P1W",
               "1969-12-29T00:00:00Z/P1W",
               "P1W/1970-01-03T00:00:00Z",
-              "P1W/1970-01-04T00:00:00Z"
+              "P1W/1970-01-04T00:00:00Z",
+              "PT2H",
+              "PT4H",
+              "PT8H",
+              "PT10H",
+              "PT12H"
             ],
             "example": "P1D",
             "type": "string"
@@ -1151,14 +1299,17 @@
             "example": false
           }
         },
-        "required": ["confidence_interval", "periods", "time_grain"],
+        "required": [
+          "confidence_interval",
+          "periods",
+          "time_grain"
+        ],
         "type": "object"
       },
       "ChartDataQueryContextSchema": {
         "properties": {
           "custom_cache_timeout": {
             "description": "Override the default cache timeout",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1179,8 +1330,25 @@
             },
             "type": "array"
           },
-          "result_format": {},
-          "result_type": {}
+          "result_format": {
+            "enum": [
+              "csv",
+              "json",
+              "xlsx"
+            ]
+          },
+          "result_type": {
+            "enum": [
+              "columns",
+              "full",
+              "query",
+              "results",
+              "samples",
+              "timegrains",
+              "post_processed",
+              "drill_detail"
+            ]
+          }
         },
         "type": "object"
       },
@@ -1238,11 +1406,12 @@
             "type": "array"
           },
           "granularity": {
-            "description": "Name of temporal column used for time filtering.",
+            "description": "Name of temporal column used for time filtering. ",
             "nullable": true,
             "type": "string"
           },
           "granularity_sqla": {
+            "deprecated": true,
             "description": "Name of temporal column used for time filtering for SQL datasources. This field is deprecated, use `granularity` instead.",
             "nullable": true,
             "type": "string"
@@ -1254,6 +1423,7 @@
             "type": "array"
           },
           "having": {
+            "deprecated": true,
             "description": "HAVING clause to be added to aggregate queries using AND operator. This field is deprecated and should be passed to `extras`.",
             "nullable": true,
             "type": "string"
@@ -1282,8 +1452,14 @@
           "orderby": {
             "description": "Expects a list of lists where the first element is the column name which to sort by, and the second element is a boolean.",
             "example": [
-              ["my_col_1", false],
-              ["my_col_2", true]
+              [
+                "my_col_1",
+                false
+              ],
+              [
+                "my_col_2",
+                true
+              ]
             ],
             "items": {},
             "nullable": true,
@@ -1303,18 +1479,26 @@
             "type": "array"
           },
           "result_type": {
+            "enum": [
+              "columns",
+              "full",
+              "query",
+              "results",
+              "samples",
+              "timegrains",
+              "post_processed",
+              "drill_detail"
+            ],
             "nullable": true
           },
           "row_limit": {
             "description": "Maximum row count (0=disabled). Default: `config[\"ROW_LIMIT\"]`",
-            "format": "int32",
             "minimum": 0,
             "nullable": true,
             "type": "integer"
           },
           "row_offset": {
             "description": "Number of rows to skip. Default: `0`",
-            "format": "int32",
             "minimum": 0,
             "nullable": true,
             "type": "integer"
@@ -1327,7 +1511,6 @@
           },
           "series_limit": {
             "description": "Maximum number of series. Requires `series` and `series_limit_metric` to be set.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1355,7 +1538,6 @@
           },
           "timeseries_limit": {
             "description": "Maximum row count for timeseries queries. This field is deprecated, use `series_limit` instead.Default: `0`",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1368,11 +1550,12 @@
               "description": "The value of the query parameter",
               "type": "string"
             },
-            "description": "Optional query parameters passed to a dashboard or Explore view",
+            "description": "Optional query parameters passed to a dashboard or Explore  view",
             "nullable": true,
             "type": "object"
           },
           "where": {
+            "deprecated": true,
             "description": "WHERE clause to be added to queries using AND operator.This field is deprecated and should be passed to `extras`.",
             "nullable": true,
             "type": "string"
@@ -1407,7 +1590,6 @@
           },
           "cache_timeout": {
             "description": "Cache timeout in following order: custom timeout, datasource timeout, cache default timeout, config default cache timeout.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1426,7 +1608,6 @@
           "coltypes": {
             "description": "A list of generic data types of each column",
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -1445,7 +1626,6 @@
           },
           "from_dttm": {
             "description": "Start timestamp of time range",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1466,7 +1646,6 @@
           },
           "rowcount": {
             "description": "Amount of rows in result set",
-            "format": "int32",
             "type": "integer"
           },
           "stacktrace": {
@@ -1489,7 +1668,6 @@
           },
           "to_dttm": {
             "description": "End timestamp of time range",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
@@ -1518,7 +1696,6 @@
       "ChartDataRestApi.get": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1541,7 +1718,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -1563,6 +1739,9 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartDataRestApi.get.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -1585,7 +1764,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -1595,6 +1773,27 @@
         },
         "type": "object"
       },
+      "ChartDataRestApi.get.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "ChartDataRestApi.get.User": {
         "properties": {
           "first_name": {
@@ -1602,25 +1801,22 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
-        "required": ["first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ChartDataRestApi.get_list": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1633,14 +1829,11 @@
             "type": "string"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User"
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User3"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
-            "readOnly": true
-          },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
@@ -1651,14 +1844,11 @@
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User2"
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User"
           },
           "created_by_name": {
             "readOnly": true
           },
-          "created_by_url": {
-            "readOnly": true
-          },
           "created_on_delta_humanized": {
             "readOnly": true
           },
@@ -1666,7 +1856,6 @@
             "$ref": "#/components/schemas/ChartDataRestApi.get_list.Dashboard"
           },
           "datasource_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1695,7 +1884,6 @@
             "readOnly": true
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -1707,10 +1895,10 @@
             "type": "string"
           },
           "last_saved_by": {
-            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User1"
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User2"
           },
           "owners": {
-            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User3"
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User1"
           },
           "params": {
             "nullable": true,
@@ -1727,6 +1915,9 @@
           "table": {
             "$ref": "#/components/schemas/ChartDataRestApi.get_list.SqlaTable"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -1749,7 +1940,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -1766,7 +1956,30 @@
             "type": "string"
           }
         },
-        "required": ["table_name"],
+        "required": [
+          "table_name"
+        ],
+        "type": "object"
+      },
+      "ChartDataRestApi.get_list.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
         "type": "object"
       },
       "ChartDataRestApi.get_list.User": {
@@ -1775,12 +1988,18 @@
             "maxLength": 64,
             "type": "string"
           },
+          "id": {
+            "type": "integer"
+          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ChartDataRestApi.get_list.User1": {
@@ -1790,7 +2009,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -1798,7 +2016,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ChartDataRestApi.get_list.User2": {
@@ -1808,7 +2029,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -1816,7 +2036,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ChartDataRestApi.get_list.User3": {
@@ -1825,27 +2048,21 @@
             "maxLength": 64,
             "type": "string"
           },
-          "id": {
-            "format": "int32",
-            "type": "integer"
-          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
-        "required": ["first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ChartDataRestApi.post": {
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1862,14 +2079,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_name": {
@@ -1905,7 +2120,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -1933,20 +2147,27 @@
           },
           "viz_type": {
             "description": "The type of chart visualization used.",
-            "example": ["bar", "area", "table"],
+            "example": [
+              "bar",
+              "area",
+              "table"
+            ],
             "maxLength": 250,
             "minLength": 0,
             "type": "string"
           }
         },
-        "required": ["datasource_id", "datasource_type", "slice_name"],
+        "required": [
+          "datasource_id",
+          "datasource_type",
+          "slice_name"
+        ],
         "type": "object"
       },
       "ChartDataRestApi.put": {
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1963,14 +2184,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2003,7 +2222,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2030,9 +2248,19 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "items": {
+              "$ref": "#/components/schemas/Tag"
+            },
+            "type": "array"
+          },
           "viz_type": {
             "description": "The type of chart visualization used.",
-            "example": ["bar", "area", "table"],
+            "example": [
+              "bar",
+              "area",
+              "table"
+            ],
             "maxLength": 250,
             "minLength": 0,
             "nullable": true,
@@ -2044,14 +2272,13 @@
       "ChartDataRollingOptionsSchema": {
         "properties": {
           "center": {
-            "description": "Should the label be at the center of the window. Default: `false`",
+            "description": "Should the label be at the center of the window.Default: `false`",
             "example": false,
             "type": "boolean"
           },
           "min_periods": {
             "description": "The minimum amount of periods required for a row to be included in the result set.",
             "example": 7,
-            "format": "int32",
             "type": "integer"
           },
           "rolling_type": {
@@ -2088,7 +2315,7 @@
             "type": "object"
           },
           "win_type": {
-            "description": "Type of window function. See [SciPy window functions](https://docs.scipy.org/doc/scipy/reference/signal.windows.html#module-scipy.signal.windows) for more details. Some window functions require passing additional parameters to `rolling_type_options`. For instance, to use `gaussian`, the parameter `std` needs to be provided.",
+            "description": "Type of window function. See [SciPy window functions](https://docs.scipy.org/doc/scipy/reference /signal.windows.html#module-scipy.signal.windows) for more details. Some window functions require passing additional parameters to `rolling_type_options`. For instance, to use `gaussian`, the parameter `std` needs to be provided.",
             "enum": [
               "boxcar",
               "triang",
@@ -2111,18 +2338,24 @@
           "window": {
             "description": "Size of the rolling window in days.",
             "example": 7,
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["rolling_type", "window"],
+        "required": [
+          "rolling_type",
+          "window"
+        ],
         "type": "object"
       },
       "ChartDataSelectOptionsSchema": {
         "properties": {
           "columns": {
             "description": "Columns which to select from the input data, in the desired order. If columns are renamed, the original column name should be referenced here.",
-            "example": ["country", "gender", "age"],
+            "example": [
+              "country",
+              "gender",
+              "age"
+            ],
             "items": {
               "type": "string"
             },
@@ -2130,7 +2363,9 @@
           },
           "exclude": {
             "description": "Columns to exclude from selection.",
-            "example": ["my_temp_column"],
+            "example": [
+              "my_temp_column"
+            ],
             "items": {
               "type": "string"
             },
@@ -2175,14 +2410,15 @@
             "type": "object"
           }
         },
-        "required": ["columns"],
+        "required": [
+          "columns"
+        ],
         "type": "object"
       },
       "ChartEntityResponseSchema": {
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "type": "integer"
           },
           "certification_details": {
@@ -2195,6 +2431,7 @@
           },
           "changed_on": {
             "description": "The ISO date that the chart was last changed.",
+            "format": "date-time",
             "type": "string"
           },
           "description": {
@@ -2211,7 +2448,6 @@
           },
           "id": {
             "description": "The id of the chart.",
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -2229,7 +2465,6 @@
         "properties": {
           "id": {
             "description": "The Chart id",
-            "format": "int32",
             "type": "integer"
           },
           "value": {
@@ -2243,12 +2478,10 @@
         "properties": {
           "datasource_id": {
             "description": "The datasource identifier",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_type": {
             "description": "The datasource type",
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -2270,7 +2503,6 @@
         "properties": {
           "count": {
             "description": "The total number of datasources",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -2282,7 +2514,6 @@
       "ChartRestApi.get": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2305,7 +2536,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -2327,6 +2557,9 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartRestApi.get.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -2349,7 +2582,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -2359,6 +2591,27 @@
         },
         "type": "object"
       },
+      "ChartRestApi.get.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "ChartRestApi.get.User": {
         "properties": {
           "first_name": {
@@ -2366,25 +2619,22 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
-        "required": ["first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ChartRestApi.get_list": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2397,14 +2647,11 @@
             "type": "string"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/ChartRestApi.get_list.User"
+            "$ref": "#/components/schemas/ChartRestApi.get_list.User3"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
-            "readOnly": true
-          },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
@@ -2415,14 +2662,11 @@
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/ChartRestApi.get_list.User2"
+            "$ref": "#/components/schemas/ChartRestApi.get_list.User"
           },
           "created_by_name": {
             "readOnly": true
           },
-          "created_by_url": {
-            "readOnly": true
-          },
           "created_on_delta_humanized": {
             "readOnly": true
           },
@@ -2430,7 +2674,6 @@
             "$ref": "#/components/schemas/ChartRestApi.get_list.Dashboard"
           },
           "datasource_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2459,7 +2702,6 @@
             "readOnly": true
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -2471,10 +2713,10 @@
             "type": "string"
           },
           "last_saved_by": {
-            "$ref": "#/components/schemas/ChartRestApi.get_list.User1"
+            "$ref": "#/components/schemas/ChartRestApi.get_list.User2"
           },
           "owners": {
-            "$ref": "#/components/schemas/ChartRestApi.get_list.User3"
+            "$ref": "#/components/schemas/ChartRestApi.get_list.User1"
           },
           "params": {
             "nullable": true,
@@ -2491,6 +2733,9 @@
           "table": {
             "$ref": "#/components/schemas/ChartRestApi.get_list.SqlaTable"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartRestApi.get_list.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -2513,7 +2758,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -2530,31 +2774,39 @@
             "type": "string"
           }
         },
-        "required": ["table_name"],
+        "required": [
+          "table_name"
+        ],
         "type": "object"
       },
-      "ChartRestApi.get_list.User": {
+      "ChartRestApi.get_list.Tag": {
         "properties": {
-          "first_name": {
-            "maxLength": 64,
-            "type": "string"
+          "id": {
+            "type": "integer"
           },
-          "last_name": {
-            "maxLength": 64,
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
             "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
           }
         },
-        "required": ["first_name", "last_name"],
         "type": "object"
       },
-      "ChartRestApi.get_list.User1": {
+      "ChartRestApi.get_list.User": {
         "properties": {
           "first_name": {
             "maxLength": 64,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -2562,17 +2814,19 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
-      "ChartRestApi.get_list.User2": {
+      "ChartRestApi.get_list.User1": {
         "properties": {
           "first_name": {
             "maxLength": 64,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -2580,36 +2834,53 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
-      "ChartRestApi.get_list.User3": {
+      "ChartRestApi.get_list.User2": {
         "properties": {
           "first_name": {
             "maxLength": 64,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
+          }
+        },
+        "required": [
+          "first_name",
+          "last_name"
+        ],
+        "type": "object"
+      },
+      "ChartRestApi.get_list.User3": {
+        "properties": {
+          "first_name": {
+            "maxLength": 64,
+            "type": "string"
           },
-          "username": {
+          "last_name": {
             "maxLength": 64,
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ChartRestApi.post": {
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2626,14 +2897,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_name": {
@@ -2669,7 +2938,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2697,20 +2965,27 @@
           },
           "viz_type": {
             "description": "The type of chart visualization used.",
-            "example": ["bar", "area", "table"],
+            "example": [
+              "bar",
+              "area",
+              "table"
+            ],
             "maxLength": 250,
             "minLength": 0,
             "type": "string"
           }
         },
-        "required": ["datasource_id", "datasource_type", "slice_name"],
+        "required": [
+          "datasource_id",
+          "datasource_type",
+          "slice_name"
+        ],
         "type": "object"
       },
       "ChartRestApi.put": {
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2727,14 +3002,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2767,7 +3040,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2794,9 +3066,19 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "items": {
+              "$ref": "#/components/schemas/Tag"
+            },
+            "type": "array"
+          },
           "viz_type": {
             "description": "The type of chart visualization used.",
-            "example": ["bar", "area", "table"],
+            "example": [
+              "bar",
+              "area",
+              "table"
+            ],
             "maxLength": 250,
             "minLength": 0,
             "nullable": true,
@@ -2815,7 +3097,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "template_name": {
@@ -2833,7 +3114,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -2841,19 +3121,22 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "CssTemplateRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User"
+            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User1"
           },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User1"
+            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User"
           },
           "created_on": {
             "format": "date-time",
@@ -2865,7 +3148,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "template_name": {
@@ -2883,7 +3165,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -2891,7 +3172,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "CssTemplateRestApi.get_list.User1": {
@@ -2901,7 +3185,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -2909,7 +3192,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "CssTemplateRestApi.post": {
@@ -2940,10 +3226,36 @@
         },
         "type": "object"
       },
+      "DashboardCopySchema": {
+        "properties": {
+          "css": {
+            "description": "Override CSS for the dashboard.",
+            "type": "string"
+          },
+          "dashboard_title": {
+            "description": "A title for the dashboard.",
+            "maxLength": 500,
+            "minLength": 0,
+            "nullable": true,
+            "type": "string"
+          },
+          "duplicate_slices": {
+            "description": "Whether or not to also copy all charts on the dashboard",
+            "type": "boolean"
+          },
+          "json_metadata": {
+            "description": "This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter  specific parameters.",
+            "type": "string"
+          }
+        },
+        "required": [
+          "json_metadata"
+        ],
+        "type": "object"
+      },
       "DashboardDatasetSchema": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "type": "integer"
           },
           "column_formats": {
@@ -2951,7 +3263,6 @@
           },
           "column_types": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2962,6 +3273,9 @@
             },
             "type": "array"
           },
+          "currency_formats": {
+            "type": "object"
+          },
           "database": {
             "$ref": "#/components/schemas/Database"
           },
@@ -2996,7 +3310,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_sqllab_view": {
@@ -3015,7 +3328,6 @@
             "type": "string"
           },
           "offset": {
-            "format": "int32",
             "type": "integer"
           },
           "order_by_choices": {
@@ -3094,9 +3406,6 @@
           "changed_by_name": {
             "type": "string"
           },
-          "changed_by_url": {
-            "type": "string"
-          },
           "changed_on": {
             "format": "date-time",
             "type": "string"
@@ -3120,7 +3429,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -3153,6 +3461,12 @@
           "slug": {
             "type": "string"
           },
+          "tags": {
+            "items": {
+              "$ref": "#/components/schemas/Tag1"
+            },
+            "type": "array"
+          },
           "thumbnail_url": {
             "type": "string"
           },
@@ -3162,7 +3476,7 @@
         },
         "type": "object"
       },
-      "DashboardPermalinkPostSchema": {
+      "DashboardPermalinkStateSchema": {
         "properties": {
           "activeTabs": {
             "description": "Current active dashboard tabs",
@@ -3197,7 +3511,6 @@
       "DashboardRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -3214,14 +3527,11 @@
             "type": "string"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/DashboardRestApi.get_list.User"
+            "$ref": "#/components/schemas/DashboardRestApi.get_list.User2"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
-            "readOnly": true
-          },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
@@ -3229,7 +3539,7 @@
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/DashboardRestApi.get_list.User1"
+            "$ref": "#/components/schemas/DashboardRestApi.get_list.User"
           },
           "created_on_delta_humanized": {
             "readOnly": true
@@ -3244,7 +3554,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -3255,7 +3564,7 @@
             "type": "string"
           },
           "owners": {
-            "$ref": "#/components/schemas/DashboardRestApi.get_list.User2"
+            "$ref": "#/components/schemas/DashboardRestApi.get_list.User1"
           },
           "position_json": {
             "nullable": true,
@@ -3276,6 +3585,9 @@
           "status": {
             "readOnly": true
           },
+          "tags": {
+            "$ref": "#/components/schemas/DashboardRestApi.get_list.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -3288,7 +3600,6 @@
       "DashboardRestApi.get_list.Role": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -3296,7 +3607,30 @@
             "type": "string"
           }
         },
-        "required": ["name"],
+        "required": [
+          "name"
+        ],
+        "type": "object"
+      },
+      "DashboardRestApi.get_list.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
         "type": "object"
       },
       "DashboardRestApi.get_list.User": {
@@ -3306,19 +3640,17 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
-        "required": ["first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DashboardRestApi.get_list.User1": {
@@ -3328,7 +3660,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -3336,33 +3667,30 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DashboardRestApi.get_list.User2": {
         "properties": {
-          "email": {
-            "maxLength": 64,
-            "type": "string"
-          },
           "first_name": {
             "maxLength": 64,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
-        "required": ["email", "first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DashboardRestApi.post": {
@@ -3378,6 +3706,7 @@
             "type": "string"
           },
           "css": {
+            "description": "Override CSS for the dashboard.",
             "type": "string"
           },
           "dashboard_title": {
@@ -3402,7 +3731,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this dashboard. If left empty you will be one of the owners of the dashboard.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -3418,7 +3746,6 @@
           "roles": {
             "items": {
               "description": "Roles is a list which defines access to the dashboard. These roles are always applied in addition to restrictions on dataset level access. If no roles defined then the dashboard is available to all roles.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -3473,7 +3800,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this dashboard. If left empty you will be one of the owners of the dashboard.",
-              "format": "int32",
               "nullable": true,
               "type": "integer"
             },
@@ -3492,7 +3818,6 @@
           "roles": {
             "items": {
               "description": "Roles is a list which defines access to the dashboard. These roles are always applied in addition to restrictions on dataset level access. If no roles defined then the dashboard is available to all roles.",
-              "format": "int32",
               "nullable": true,
               "type": "integer"
             },
@@ -3526,11 +3851,9 @@
             "type": "boolean"
           },
           "explore_database_id": {
-            "format": "int32",
             "type": "integer"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -3547,6 +3870,125 @@
         },
         "type": "object"
       },
+      "DatabaseConnectionSchema": {
+        "properties": {
+          "allow_ctas": {
+            "description": "Allow CREATE TABLE AS option in SQL Lab",
+            "type": "boolean"
+          },
+          "allow_cvas": {
+            "description": "Allow CREATE VIEW AS option in SQL Lab",
+            "type": "boolean"
+          },
+          "allow_dml": {
+            "description": "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab",
+            "type": "boolean"
+          },
+          "allow_file_upload": {
+            "description": "Allow to upload CSV file data into this databaseIf selected, please set the schemas allowed for csv upload in Extra.",
+            "type": "boolean"
+          },
+          "allow_run_async": {
+            "description": "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.",
+            "type": "boolean"
+          },
+          "backend": {
+            "description": "SQLAlchemy engine to use",
+            "nullable": true,
+            "type": "string"
+          },
+          "cache_timeout": {
+            "description": "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.",
+            "nullable": true,
+            "type": "integer"
+          },
+          "configuration_method": {
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "type": "string"
+          },
+          "database_name": {
+            "description": "A database name to identify this connection.",
+            "maxLength": 250,
+            "minLength": 1,
+            "nullable": true,
+            "type": "string"
+          },
+          "driver": {
+            "description": "SQLAlchemy driver to use",
+            "nullable": true,
+            "type": "string"
+          },
+          "engine_information": {
+            "additionalProperties": {},
+            "type": "object"
+          },
+          "expose_in_sqllab": {
+            "description": "Expose this database to SQLLab",
+            "type": "boolean"
+          },
+          "extra": {
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
+            "type": "string"
+          },
+          "force_ctas_schema": {
+            "description": "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema",
+            "maxLength": 250,
+            "minLength": 0,
+            "nullable": true,
+            "type": "string"
+          },
+          "id": {
+            "description": "Database ID (for updates)",
+            "type": "integer"
+          },
+          "impersonate_user": {
+            "description": "If Presto, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.",
+            "type": "boolean"
+          },
+          "is_managed_externally": {
+            "nullable": true,
+            "type": "boolean"
+          },
+          "masked_encrypted_extra": {
+            "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>",
+            "nullable": true,
+            "type": "string"
+          },
+          "parameters": {
+            "additionalProperties": {},
+            "description": "DB-specific parameters for configuration",
+            "type": "object"
+          },
+          "parameters_schema": {
+            "additionalProperties": {},
+            "description": "JSONSchema for configuring the database by parameters instead of SQLAlchemy URI",
+            "type": "object"
+          },
+          "server_cert": {
+            "description": "<p>Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.</p>",
+            "nullable": true,
+            "type": "string"
+          },
+          "sqlalchemy_uri": {
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "maxLength": 1024,
+            "minLength": 1,
+            "type": "string"
+          },
+          "ssh_tunnel": {
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/DatabaseSSHTunnel"
+              }
+            ],
+            "nullable": true
+          },
+          "uuid": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
       "DatabaseFunctionNamesResponse": {
         "properties": {
           "function_names": {
@@ -3561,7 +4003,6 @@
       "DatabaseRelatedChart": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -3577,7 +4018,6 @@
         "properties": {
           "count": {
             "description": "Chart count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -3593,7 +4033,6 @@
       "DatabaseRelatedDashboard": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -3612,7 +4051,6 @@
         "properties": {
           "count": {
             "description": "Dashboard count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -3662,7 +4100,6 @@
             "readOnly": true
           },
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -3685,17 +4122,12 @@
             "nullable": true,
             "type": "boolean"
           },
-          "extra": {
-            "nullable": true,
-            "type": "string"
-          },
           "force_ctas_schema": {
             "maxLength": 250,
             "nullable": true,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "impersonate_user": {
@@ -3705,31 +4137,16 @@
           "is_managed_externally": {
             "type": "boolean"
           },
-          "masked_encrypted_extra": {
-            "readOnly": true
-          },
-          "parameters": {
-            "readOnly": true
-          },
-          "parameters_schema": {
-            "readOnly": true
-          },
-          "server_cert": {
-            "nullable": true,
-            "type": "string"
-          },
-          "sqlalchemy_uri": {
-            "maxLength": 1024,
-            "type": "string"
-          },
           "uuid": {
             "format": "uuid",
             "nullable": true,
             "type": "string"
           }
         },
-        "required": ["database_name", "sqlalchemy_uri"],
-        "type": "object"
+        "required": [
+          "database_name"
+        ],
+        "type": "object"
       },
       "DatabaseRestApi.get_list": {
         "properties": {
@@ -3803,7 +4220,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "uuid": {
@@ -3812,7 +4228,9 @@
             "type": "string"
           }
         },
-        "required": ["database_name"],
+        "required": [
+          "database_name"
+        ],
         "type": "object"
       },
       "DatabaseRestApi.get_list.User": {
@@ -3826,7 +4244,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DatabaseRestApi.post": {
@@ -3853,13 +4274,16 @@
           },
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "configuration_method": {
             "default": "sqlalchemy_form",
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -3886,7 +4310,7 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "force_ctas_schema": {
@@ -3920,7 +4344,7 @@
             "type": "string"
           },
           "sqlalchemy_uri": {
-            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
             "maxLength": 1024,
             "minLength": 1,
             "type": "string"
@@ -3937,7 +4361,9 @@
             "type": "string"
           }
         },
-        "required": ["database_name"],
+        "required": [
+          "database_name"
+        ],
         "type": "object"
       },
       "DatabaseRestApi.put": {
@@ -3964,13 +4390,16 @@
           },
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "configuration_method": {
             "default": "sqlalchemy_form",
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -3998,7 +4427,7 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "force_ctas_schema": {
@@ -4032,7 +4461,7 @@
             "type": "string"
           },
           "sqlalchemy_uri": {
-            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
             "maxLength": 1024,
             "minLength": 0,
             "type": "string"
@@ -4044,6 +4473,9 @@
               }
             ],
             "nullable": true
+          },
+          "uuid": {
+            "type": "string"
           }
         },
         "type": "object"
@@ -4052,7 +4484,6 @@
         "properties": {
           "id": {
             "description": "SSH Tunnel ID (for updates)",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -4069,7 +4500,6 @@
             "type": "string"
           },
           "server_port": {
-            "format": "int32",
             "type": "integer"
           },
           "username": {
@@ -4111,7 +4541,11 @@
         "properties": {
           "configuration_method": {
             "default": "sqlalchemy_form",
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -4131,7 +4565,7 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "impersonate_user": {
@@ -4154,7 +4588,7 @@
             "type": "string"
           },
           "sqlalchemy_uri": {
-            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
             "maxLength": 1024,
             "minLength": 1,
             "type": "string"
@@ -4180,7 +4614,11 @@
             "type": "object"
           },
           "configuration_method": {
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -4199,12 +4637,11 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "id": {
             "description": "Database ID (for updates)",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -4230,14 +4667,16 @@
             "type": "string"
           }
         },
-        "required": ["configuration_method", "engine"],
+        "required": [
+          "configuration_method",
+          "engine"
+        ],
         "type": "object"
       },
       "Dataset": {
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this dataset.",
-            "format": "int32",
             "type": "integer"
           },
           "column_formats": {
@@ -4251,6 +4690,10 @@
             },
             "type": "array"
           },
+          "currency_formats": {
+            "description": "Currency formats.",
+            "type": "object"
+          },
           "database": {
             "description": "Database associated with the dataset.",
             "type": "object"
@@ -4303,7 +4746,6 @@
           },
           "id": {
             "description": "Dataset ID.",
-            "format": "int32",
             "type": "integer"
           },
           "is_sqllab_view": {
@@ -4327,7 +4769,6 @@
           },
           "offset": {
             "description": "Dataset offset.",
-            "format": "int32",
             "type": "integer"
           },
           "order_by_choices": {
@@ -4343,7 +4784,6 @@
           "owners": {
             "description": "List of owners identifiers",
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -4401,6 +4841,60 @@
         },
         "type": "object"
       },
+      "DatasetCacheWarmUpRequestSchema": {
+        "properties": {
+          "dashboard_id": {
+            "description": "The ID of the dashboard to get filters for when warming cache",
+            "type": "integer"
+          },
+          "db_name": {
+            "description": "The name of the database where the table is located",
+            "type": "string"
+          },
+          "extra_filters": {
+            "description": "Extra filters to apply when warming up cache",
+            "type": "string"
+          },
+          "table_name": {
+            "description": "The name of the table to warm up cache for",
+            "type": "string"
+          }
+        },
+        "required": [
+          "db_name",
+          "table_name"
+        ],
+        "type": "object"
+      },
+      "DatasetCacheWarmUpResponseSchema": {
+        "properties": {
+          "result": {
+            "description": "A list of each chart's warmup status and errors if any",
+            "items": {
+              "$ref": "#/components/schemas/DatasetCacheWarmUpResponseSingle"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "DatasetCacheWarmUpResponseSingle": {
+        "properties": {
+          "chart_id": {
+            "description": "The ID of the chart the status belongs to",
+            "type": "integer"
+          },
+          "viz_error": {
+            "description": "Error that occurred when warming cache for chart",
+            "type": "string"
+          },
+          "viz_status": {
+            "description": "Status of the underlying query for the viz",
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
       "DatasetColumnsPut": {
         "properties": {
           "advanced_data_type": {
@@ -4433,13 +4927,14 @@
             "type": "boolean"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_active": {
+            "nullable": true,
             "type": "boolean"
           },
           "is_dttm": {
+            "nullable": true,
             "type": "boolean"
           },
           "python_date_format": {
@@ -4462,13 +4957,14 @@
             "type": "string"
           }
         },
-        "required": ["column_name"],
+        "required": [
+          "column_name"
+        ],
         "type": "object"
       },
       "DatasetColumnsRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4477,7 +4973,6 @@
       "DatasetColumnsRestApi.get_list": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4486,7 +4981,6 @@
       "DatasetColumnsRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4495,7 +4989,6 @@
       "DatasetColumnsRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4504,7 +4997,6 @@
       "DatasetDuplicateSchema": {
         "properties": {
           "base_model_id": {
-            "format": "int32",
             "type": "integer"
           },
           "table_name": {
@@ -4513,13 +5005,15 @@
             "type": "string"
           }
         },
-        "required": ["base_model_id", "table_name"],
+        "required": [
+          "base_model_id",
+          "table_name"
+        ],
         "type": "object"
       },
       "DatasetMetricRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4528,7 +5022,6 @@
       "DatasetMetricRestApi.get_list": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4537,7 +5030,6 @@
       "DatasetMetricRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4546,7 +5038,6 @@
       "DatasetMetricRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4554,6 +5045,12 @@
       },
       "DatasetMetricsPut": {
         "properties": {
+          "currency": {
+            "maxLength": 128,
+            "minLength": 1,
+            "nullable": true,
+            "type": "string"
+          },
           "d3format": {
             "maxLength": 128,
             "minLength": 1,
@@ -4572,7 +5069,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "metric_name": {
@@ -4600,13 +5096,15 @@
             "type": "string"
           }
         },
-        "required": ["expression", "metric_name"],
+        "required": [
+          "expression",
+          "metric_name"
+        ],
         "type": "object"
       },
       "DatasetRelatedChart": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -4622,7 +5120,6 @@
         "properties": {
           "count": {
             "description": "Chart count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -4638,7 +5135,6 @@
       "DatasetRelatedDashboard": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -4657,7 +5153,6 @@
         "properties": {
           "count": {
             "description": "Dashboard count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -4684,12 +5179,11 @@
       "DatasetRestApi.get": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/DatasetRestApi.get.User"
+            "$ref": "#/components/schemas/DatasetRestApi.get.User2"
           },
           "changed_on": {
             "format": "date-time",
@@ -4699,11 +5193,14 @@
           "changed_on_humanized": {
             "readOnly": true
           },
+          "column_formats": {
+            "readOnly": true
+          },
           "columns": {
             "$ref": "#/components/schemas/DatasetRestApi.get.TableColumn"
           },
           "created_by": {
-            "$ref": "#/components/schemas/DatasetRestApi.get.User1"
+            "$ref": "#/components/schemas/DatasetRestApi.get.User"
           },
           "created_on": {
             "format": "date-time",
@@ -4713,9 +5210,15 @@
           "created_on_humanized": {
             "readOnly": true
           },
+          "currency_formats": {
+            "readOnly": true
+          },
           "database": {
             "$ref": "#/components/schemas/DatasetRestApi.get.Database"
           },
+          "datasource_name": {
+            "readOnly": true
+          },
           "datasource_type": {
             "readOnly": true
           },
@@ -4739,8 +5242,10 @@
             "nullable": true,
             "type": "boolean"
           },
+          "granularity_sqla": {
+            "readOnly": true
+          },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -4761,13 +5266,18 @@
           "metrics": {
             "$ref": "#/components/schemas/DatasetRestApi.get.SqlMetric"
           },
+          "name": {
+            "readOnly": true
+          },
           "offset": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
+          "order_by_choices": {
+            "readOnly": true
+          },
           "owners": {
-            "$ref": "#/components/schemas/DatasetRestApi.get.User2"
+            "$ref": "#/components/schemas/DatasetRestApi.get.User1"
           },
           "schema": {
             "maxLength": 255,
@@ -4789,11 +5299,25 @@
             "nullable": true,
             "type": "string"
           },
+          "time_grain_sqla": {
+            "readOnly": true
+          },
+          "uid": {
+            "readOnly": true
+          },
           "url": {
             "readOnly": true
+          },
+          "verbose_map": {
+            "readOnly": true
           }
         },
-        "required": ["columns", "database", "metrics", "table_name"],
+        "required": [
+          "columns",
+          "database",
+          "metrics",
+          "table_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get.Database": {
@@ -4806,11 +5330,12 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["database_name"],
+        "required": [
+          "database_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get.SqlMetric": {
@@ -4825,6 +5350,11 @@
             "nullable": true,
             "type": "string"
           },
+          "currency": {
+            "maxLength": 128,
+            "nullable": true,
+            "type": "string"
+          },
           "d3format": {
             "maxLength": 128,
             "nullable": true,
@@ -4842,7 +5372,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "metric_name": {
@@ -4864,7 +5393,10 @@
             "type": "string"
           }
         },
-        "required": ["expression", "metric_name"],
+        "required": [
+          "expression",
+          "metric_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get.TableColumn": {
@@ -4909,7 +5441,6 @@
             "type": "boolean"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_active": {
@@ -4943,7 +5474,9 @@
             "type": "string"
           }
         },
-        "required": ["column_name"],
+        "required": [
+          "column_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get.User": {
@@ -4957,7 +5490,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get.User1": {
@@ -4966,12 +5502,18 @@
             "maxLength": 64,
             "type": "string"
           },
+          "id": {
+            "type": "integer"
+          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get.User2": {
@@ -4980,33 +5522,25 @@
             "maxLength": 64,
             "type": "string"
           },
-          "id": {
-            "format": "int32",
-            "type": "integer"
-          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
-        "required": ["first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/DatasetRestApi.get_list.User"
+            "$ref": "#/components/schemas/DatasetRestApi.get_list.User1"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
-            "readOnly": true
-          },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
@@ -5035,14 +5569,13 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "kind": {
             "readOnly": true
           },
           "owners": {
-            "$ref": "#/components/schemas/DatasetRestApi.get_list.User1"
+            "$ref": "#/components/schemas/DatasetRestApi.get_list.User"
           },
           "schema": {
             "maxLength": 255,
@@ -5058,7 +5591,10 @@
             "type": "string"
           }
         },
-        "required": ["database", "table_name"],
+        "required": [
+          "database",
+          "table_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get_list.Database": {
@@ -5068,11 +5604,12 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["database_name"],
+        "required": [
+          "database_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get_list.User": {
@@ -5081,12 +5618,18 @@
             "maxLength": 64,
             "type": "string"
           },
-          "username": {
+          "id": {
+            "type": "integer"
+          },
+          "last_name": {
             "maxLength": 64,
             "type": "string"
           }
         },
-        "required": ["first_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.get_list.User1": {
@@ -5095,26 +5638,20 @@
             "maxLength": 64,
             "type": "string"
           },
-          "id": {
-            "format": "int32",
-            "type": "integer"
-          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
-        "required": ["first_name", "last_name", "username"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.post": {
         "properties": {
           "database": {
-            "format": "int32",
             "type": "integer"
           },
           "external_url": {
@@ -5127,7 +5664,6 @@
           },
           "owners": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -5135,6 +5671,7 @@
           "schema": {
             "maxLength": 250,
             "minLength": 0,
+            "nullable": true,
             "type": "string"
           },
           "sql": {
@@ -5147,13 +5684,15 @@
             "type": "string"
           }
         },
-        "required": ["database", "table_name"],
+        "required": [
+          "database",
+          "table_name"
+        ],
         "type": "object"
       },
       "DatasetRestApi.put": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5164,7 +5703,6 @@
             "type": "array"
           },
           "database_id": {
-            "format": "int32",
             "type": "integer"
           },
           "default_endpoint": {
@@ -5212,13 +5750,11 @@
             "type": "array"
           },
           "offset": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "owners": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -5273,14 +5809,15 @@
             "type": "string"
           }
         },
-        "required": ["datasource_type"],
+        "required": [
+          "datasource_type"
+        ],
         "type": "object"
       },
       "DistincResponseSchema": {
         "properties": {
           "count": {
             "description": "The total number of distinct values",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -5310,7 +5847,9 @@
             "type": "array"
           }
         },
-        "required": ["allowed_domains"],
+        "required": [
+          "allowed_domains"
+        ],
         "type": "object"
       },
       "EmbeddedDashboardResponseSchema": {
@@ -5322,7 +5861,7 @@
             "type": "array"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/User"
+            "$ref": "#/components/schemas/User1"
           },
           "changed_on": {
             "format": "date-time",
@@ -5373,6 +5912,32 @@
         },
         "type": "object"
       },
+      "EstimateQueryCostSchema": {
+        "properties": {
+          "database_id": {
+            "description": "The database id",
+            "type": "integer"
+          },
+          "schema": {
+            "description": "The database schema",
+            "nullable": true,
+            "type": "string"
+          },
+          "sql": {
+            "description": "The SQL query to estimate",
+            "type": "string"
+          },
+          "template_params": {
+            "description": "The SQL query template params",
+            "type": "object"
+          }
+        },
+        "required": [
+          "database_id",
+          "sql"
+        ],
+        "type": "object"
+      },
       "ExecutePayloadSchema": {
         "properties": {
           "client_id": {
@@ -5384,7 +5949,6 @@
             "type": "string"
           },
           "database_id": {
-            "format": "int32",
             "type": "integer"
           },
           "expand_data": {
@@ -5396,7 +5960,6 @@
             "type": "boolean"
           },
           "queryLimit": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5432,7 +5995,10 @@
             "type": "string"
           }
         },
-        "required": ["database_id", "sql"],
+        "required": [
+          "database_id",
+          "sql"
+        ],
         "type": "object"
       },
       "ExploreContextSchema": {
@@ -5454,7 +6020,7 @@
         },
         "type": "object"
       },
-      "ExplorePermalinkPostSchema": {
+      "ExplorePermalinkStateSchema": {
         "properties": {
           "formData": {
             "description": "Chart form data",
@@ -5470,13 +6036,14 @@
             "type": "array"
           }
         },
-        "required": ["formData"],
+        "required": [
+          "formData"
+        ],
         "type": "object"
       },
       "FilterSetRestApi.get": {
         "properties": {
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5485,7 +6052,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -5493,7 +6059,6 @@
             "type": "string"
           },
           "owner_id": {
-            "format": "int32",
             "type": "integer"
           },
           "owner_type": {
@@ -5504,13 +6069,16 @@
             "readOnly": true
           }
         },
-        "required": ["name", "owner_id", "owner_type"],
+        "required": [
+          "name",
+          "owner_id",
+          "owner_type"
+        ],
         "type": "object"
       },
       "FilterSetRestApi.get_list": {
         "properties": {
           "changed_by_fk": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5520,7 +6088,6 @@
             "type": "string"
           },
           "created_by_fk": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5530,7 +6097,6 @@
             "type": "string"
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5539,7 +6105,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -5547,7 +6112,6 @@
             "type": "string"
           },
           "owner_id": {
-            "format": "int32",
             "type": "integer"
           },
           "owner_type": {
@@ -5558,7 +6122,11 @@
             "readOnly": true
           }
         },
-        "required": ["name", "owner_id", "owner_type"],
+        "required": [
+          "name",
+          "owner_id",
+          "owner_type"
+        ],
         "type": "object"
       },
       "FilterSetRestApi.post": {
@@ -5578,15 +6146,21 @@
             "type": "string"
           },
           "owner_id": {
-            "format": "int32",
             "type": "integer"
           },
           "owner_type": {
-            "enum": ["User", "Dashboard"],
+            "enum": [
+              "User",
+              "Dashboard"
+            ],
             "type": "string"
           }
         },
-        "required": ["json_metadata", "name", "owner_type"],
+        "required": [
+          "json_metadata",
+          "name",
+          "owner_type"
+        ],
         "type": "object"
       },
       "FilterSetRestApi.put": {
@@ -5605,7 +6179,9 @@
             "type": "string"
           },
           "owner_type": {
-            "enum": ["Dashboard"],
+            "enum": [
+              "Dashboard"
+            ],
             "type": "string"
           }
         },
@@ -5615,12 +6191,10 @@
         "properties": {
           "chart_id": {
             "description": "The chart ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_id": {
             "description": "The datasource ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_type": {
@@ -5640,19 +6214,21 @@
             "type": "string"
           }
         },
-        "required": ["datasource_id", "datasource_type", "form_data"],
+        "required": [
+          "datasource_id",
+          "datasource_type",
+          "form_data"
+        ],
         "type": "object"
       },
       "FormDataPutSchema": {
         "properties": {
           "chart_id": {
             "description": "The chart ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_id": {
             "description": "The datasource ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_type": {
@@ -5672,7 +6248,11 @@
             "type": "string"
           }
         },
-        "required": ["datasource_id", "datasource_type", "form_data"],
+        "required": [
+          "datasource_id",
+          "datasource_type",
+          "form_data"
+        ],
         "type": "object"
       },
       "GetFavStarIdsSchema": {
@@ -5687,6 +6267,34 @@
         },
         "type": "object"
       },
+      "GetOrCreateDatasetSchema": {
+        "properties": {
+          "database_id": {
+            "description": "ID of database table belongs to",
+            "type": "integer"
+          },
+          "schema": {
+            "description": "The schema the table belongs to",
+            "maxLength": 250,
+            "minLength": 0,
+            "nullable": true,
+            "type": "string"
+          },
+          "table_name": {
+            "description": "Name of table",
+            "type": "string"
+          },
+          "template_params": {
+            "description": "Template params for the table",
+            "type": "string"
+          }
+        },
+        "required": [
+          "database_id",
+          "table_name"
+        ],
+        "type": "object"
+      },
       "GuestTokenCreate": {
         "properties": {
           "resources": {
@@ -5702,10 +6310,13 @@
             "type": "array"
           },
           "user": {
-            "$ref": "#/components/schemas/User1"
+            "$ref": "#/components/schemas/User2"
           }
         },
-        "required": ["resources", "rls"],
+        "required": [
+          "resources",
+          "rls"
+        ],
         "type": "object"
       },
       "LogRestApi.get": {
@@ -5716,7 +6327,6 @@
             "type": "string"
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5726,7 +6336,6 @@
             "type": "string"
           },
           "duration_ms": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5740,7 +6349,6 @@
             "type": "string"
           },
           "slice_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5748,7 +6356,6 @@
             "$ref": "#/components/schemas/LogRestApi.get.User"
           },
           "user_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
@@ -5762,7 +6369,9 @@
             "type": "string"
           }
         },
-        "required": ["username"],
+        "required": [
+          "username"
+        ],
         "type": "object"
       },
       "LogRestApi.get_list": {
@@ -5773,7 +6382,6 @@
             "type": "string"
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5783,7 +6391,6 @@
             "type": "string"
           },
           "duration_ms": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5797,7 +6404,6 @@
             "type": "string"
           },
           "slice_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5805,7 +6411,6 @@
             "$ref": "#/components/schemas/LogRestApi.get_list.User"
           },
           "user_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
@@ -5819,13 +6424,14 @@
             "type": "string"
           }
         },
-        "required": ["username"],
+        "required": [
+          "username"
+        ],
         "type": "object"
       },
       "LogRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -5877,7 +6483,6 @@
             "$ref": "#/components/schemas/QueryResult"
           },
           "query_id": {
-            "format": "int32",
             "type": "integer"
           },
           "selected_columns": {
@@ -5923,16 +6528,13 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "limit": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "progress": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5942,7 +6544,6 @@
             "type": "string"
           },
           "rows": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6004,13 +6605,15 @@
             "readOnly": true
           }
         },
-        "required": ["client_id", "database"],
+        "required": [
+          "client_id",
+          "database"
+        ],
         "type": "object"
       },
       "QueryRestApi.get.Database": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6026,18 +6629,15 @@
             "$ref": "#/components/schemas/Database1"
           },
           "end_time": {
-            "format": "float",
             "type": "number"
           },
           "executed_sql": {
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "rows": {
-            "format": "int32",
             "type": "integer"
           },
           "schema": {
@@ -6050,7 +6650,6 @@
             "readOnly": true
           },
           "start_time": {
-            "format": "float",
             "type": "number"
           },
           "status": {
@@ -6074,7 +6673,6 @@
       "QueryRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6083,7 +6681,6 @@
       "QueryRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6091,11 +6688,8 @@
       },
       "QueryResult": {
         "properties": {
-          "changedOn": {
-            "format": "date-time",
-            "type": "string"
-          },
           "changed_on": {
+            "format": "date-time",
             "type": "string"
           },
           "ctas": {
@@ -6105,11 +6699,9 @@
             "type": "string"
           },
           "dbId": {
-            "format": "int32",
             "type": "integer"
           },
           "endDttm": {
-            "format": "float",
             "type": "number"
           },
           "errorMessage": {
@@ -6126,32 +6718,27 @@
             "type": "string"
           },
           "limit": {
-            "format": "int32",
             "type": "integer"
           },
           "limitingFactor": {
             "type": "string"
           },
           "progress": {
-            "format": "int32",
             "type": "integer"
           },
           "queryId": {
-            "format": "int32",
             "type": "integer"
           },
           "resultsKey": {
             "type": "string"
           },
           "rows": {
-            "format": "int32",
             "type": "integer"
           },
           "schema": {
             "type": "string"
           },
           "serverId": {
-            "format": "int32",
             "type": "integer"
           },
           "sql": {
@@ -6161,7 +6748,6 @@
             "type": "string"
           },
           "startDttm": {
-            "format": "float",
             "type": "number"
           },
           "state": {
@@ -6186,37 +6772,230 @@
             "type": "string"
           },
           "userId": {
-            "format": "int32",
             "type": "integer"
           }
         },
         "type": "object"
       },
-      "RecentActivity": {
+      "RLSRestApi.get": {
         "properties": {
-          "action": {
-            "description": "Action taken describing type of activity",
+          "clause": {
+            "description": "clause_description",
             "type": "string"
           },
-          "item_title": {
-            "description": "Title of item",
+          "description": {
+            "description": "description_description",
             "type": "string"
           },
-          "item_type": {
-            "description": "Type of item, e.g. slice or dashboard",
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
             "type": "string"
           },
-          "item_url": {
-            "description": "URL to item",
+          "group_key": {
+            "description": "group_key_description",
             "type": "string"
           },
-          "time": {
-            "description": "Time of activity, in epoch milliseconds",
-            "format": "float",
-            "type": "number"
+          "id": {
+            "description": "id_description",
+            "type": "integer"
           },
-          "time_delta_humanized": {
-            "description": "Human-readable description of how long ago activity took place",
+          "name": {
+            "description": "name_description",
+            "type": "string"
+          },
+          "roles": {
+            "items": {
+              "$ref": "#/components/schemas/Roles1"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "items": {
+              "$ref": "#/components/schemas/Tables"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "RLSRestApi.get_list": {
+        "properties": {
+          "changed_on_delta_humanized": {
+            "readOnly": true
+          },
+          "clause": {
+            "description": "clause_description",
+            "type": "string"
+          },
+          "description": {
+            "description": "description_description",
+            "type": "string"
+          },
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
+            "type": "string"
+          },
+          "group_key": {
+            "description": "group_key_description",
+            "type": "string"
+          },
+          "id": {
+            "description": "id_description",
+            "type": "integer"
+          },
+          "name": {
+            "description": "name_description",
+            "type": "string"
+          },
+          "roles": {
+            "items": {
+              "$ref": "#/components/schemas/Roles1"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "items": {
+              "$ref": "#/components/schemas/Tables"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "RLSRestApi.post": {
+        "properties": {
+          "clause": {
+            "description": "clause_description",
+            "type": "string"
+          },
+          "description": {
+            "description": "description_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
+            "type": "string"
+          },
+          "group_key": {
+            "description": "group_key_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "name": {
+            "description": "name_description",
+            "maxLength": 255,
+            "minLength": 1,
+            "type": "string"
+          },
+          "roles": {
+            "description": "roles_description",
+            "items": {
+              "type": "integer"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "description": "tables_description",
+            "items": {
+              "type": "integer"
+            },
+            "minItems": 1,
+            "type": "array"
+          }
+        },
+        "required": [
+          "clause",
+          "filter_type",
+          "name",
+          "roles",
+          "tables"
+        ],
+        "type": "object"
+      },
+      "RLSRestApi.put": {
+        "properties": {
+          "clause": {
+            "description": "clause_description",
+            "type": "string"
+          },
+          "description": {
+            "description": "description_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
+            "type": "string"
+          },
+          "group_key": {
+            "description": "group_key_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "name": {
+            "description": "name_description",
+            "maxLength": 255,
+            "minLength": 1,
+            "type": "string"
+          },
+          "roles": {
+            "description": "roles_description",
+            "items": {
+              "type": "integer"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "description": "tables_description",
+            "items": {
+              "type": "integer"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "RecentActivity": {
+        "properties": {
+          "action": {
+            "description": "Action taken describing type of activity",
+            "type": "string"
+          },
+          "item_title": {
+            "description": "Title of item",
+            "type": "string"
+          },
+          "item_type": {
+            "description": "Type of item, e.g. slice or dashboard",
+            "type": "string"
+          },
+          "item_url": {
+            "description": "URL to item",
+            "type": "string"
+          },
+          "time": {
+            "description": "Time of activity, in epoch milliseconds",
+            "type": "number"
+          },
+          "time_delta_humanized": {
+            "description": "Human-readable description of how long ago activity took place.",
             "type": "string"
           }
         },
@@ -6254,11 +7033,10 @@
           },
           "time": {
             "description": "Time of activity, in epoch milliseconds",
-            "format": "float",
             "type": "number"
           },
           "time_delta_humanized": {
-            "description": "Human-readable description of how long ago activity took place",
+            "description": "Human-readable description of how long ago activity took place.",
             "type": "string"
           }
         },
@@ -6268,7 +7046,6 @@
         "properties": {
           "count": {
             "description": "The total number of related values",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -6292,7 +7069,6 @@
           },
           "value": {
             "description": "The related item identifier",
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6310,7 +7086,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "scheduled_dttm": {
@@ -6332,7 +7107,6 @@
             "type": "string"
           },
           "value": {
-            "format": "float",
             "nullable": true,
             "type": "number"
           },
@@ -6341,7 +7115,10 @@
             "type": "string"
           }
         },
-        "required": ["scheduled_dttm", "state"],
+        "required": [
+          "scheduled_dttm",
+          "state"
+        ],
         "type": "object"
       },
       "ReportExecutionLogRestApi.get_list": {
@@ -6356,7 +7133,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "scheduled_dttm": {
@@ -6378,7 +7154,6 @@
             "type": "string"
           },
           "value": {
-            "format": "float",
             "nullable": true,
             "type": "number"
           },
@@ -6387,13 +7162,15 @@
             "type": "string"
           }
         },
-        "required": ["scheduled_dttm", "state"],
+        "required": [
+          "scheduled_dttm",
+          "state"
+        ],
         "type": "object"
       },
       "ReportExecutionLogRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6402,7 +7179,6 @@
       "ReportExecutionLogRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6415,11 +7191,16 @@
           },
           "type": {
             "description": "The recipient type, check spec for valid options",
-            "enum": ["Email", "Slack"],
+            "enum": [
+              "Email",
+              "Slack"
+            ],
             "type": "string"
           }
         },
-        "required": ["type"],
+        "required": [
+          "type"
+        ],
         "type": "object"
       },
       "ReportRecipientConfigJSON": {
@@ -6452,6 +7233,10 @@
             "maxLength": 1000,
             "type": "string"
           },
+          "custom_width": {
+            "nullable": true,
+            "type": "integer"
+          },
           "dashboard": {
             "$ref": "#/components/schemas/ReportScheduleRestApi.get.Dashboard"
           },
@@ -6470,12 +7255,10 @@
             "type": "boolean"
           },
           "grace_period": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_eval_dttm": {
@@ -6489,7 +7272,6 @@
             "type": "string"
           },
           "last_value": {
-            "format": "float",
             "nullable": true,
             "type": "number"
           },
@@ -6498,7 +7280,6 @@
             "type": "string"
           },
           "log_retention": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6539,12 +7320,16 @@
             "type": "string"
           },
           "working_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
         },
-        "required": ["crontab", "name", "recipients", "type"],
+        "required": [
+          "crontab",
+          "name",
+          "recipients",
+          "type"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get.Dashboard": {
@@ -6555,7 +7340,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6568,17 +7352,17 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["database_name"],
+        "required": [
+          "database_name"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get.ReportRecipients": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "recipient_config_json": {
@@ -6590,13 +7374,14 @@
             "type": "string"
           }
         },
-        "required": ["type"],
+        "required": [
+          "type"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get.Slice": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -6619,7 +7404,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -6627,7 +7411,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get_list": {
@@ -6637,7 +7424,7 @@
             "type": "boolean"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User"
+            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User2"
           },
           "changed_on": {
             "format": "date-time",
@@ -6648,12 +7435,11 @@
             "readOnly": true
           },
           "chart_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "created_by": {
-            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User1"
+            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User"
           },
           "created_on": {
             "format": "date-time",
@@ -6673,7 +7459,6 @@
             "readOnly": true
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6685,7 +7470,6 @@
             "readOnly": true
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_eval_dttm": {
@@ -6703,7 +7487,7 @@
             "type": "string"
           },
           "owners": {
-            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User2"
+            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User1"
           },
           "recipients": {
             "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.ReportRecipients"
@@ -6717,13 +7501,17 @@
             "type": "string"
           }
         },
-        "required": ["crontab", "name", "recipients", "type"],
+        "required": [
+          "crontab",
+          "name",
+          "recipients",
+          "type"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get_list.ReportRecipients": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "type": {
@@ -6731,7 +7519,9 @@
             "type": "string"
           }
         },
-        "required": ["type"],
+        "required": [
+          "type"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get_list.User": {
@@ -6745,7 +7535,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get_list.User1": {
@@ -6754,12 +7547,18 @@
             "maxLength": 64,
             "type": "string"
           },
+          "id": {
+            "type": "integer"
+          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.get_list.User2": {
@@ -6768,16 +7567,15 @@
             "maxLength": 64,
             "type": "string"
           },
-          "id": {
-            "format": "int32",
-            "type": "integer"
-          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.post": {
@@ -6786,7 +7584,6 @@
             "type": "boolean"
           },
           "chart": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6796,7 +7593,12 @@
             "type": "string"
           },
           "creation_method": {
-            "description": "Creation method is used to inform the frontend whether the report/alert was created in the dashboard, chart, or alerts and reports UI."
+            "description": "Creation method is used to inform the frontend whether the report/alert was created in the dashboard, chart, or alerts and reports UI.",
+            "enum": [
+              "charts",
+              "dashboards",
+              "alerts_reports"
+            ]
           },
           "crontab": {
             "description": "A CRON expression.[Crontab Guru](https://crontab.guru/) is a helpful resource that can help you craft a CRON expression.",
@@ -6805,13 +7607,17 @@
             "minLength": 1,
             "type": "string"
           },
+          "custom_width": {
+            "description": "Custom width of the screenshot in pixels",
+            "example": 1000,
+            "nullable": true,
+            "type": "integer"
+          },
           "dashboard": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "database": {
-            "format": "int32",
             "type": "integer"
           },
           "description": {
@@ -6829,14 +7635,12 @@
           "grace_period": {
             "description": "Once an alert is triggered, how long, in seconds, before Superset nags you again. (in seconds)",
             "example": 14400,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
           "log_retention": {
             "description": "How long to keep the logs around for this report (in days)",
             "example": 90,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
@@ -6850,7 +7654,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this report. If left empty you will be one of the owners of the report.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -6862,12 +7665,15 @@
             "type": "array"
           },
           "report_format": {
-            "enum": ["PNG", "CSV", "TEXT"],
+            "enum": [
+              "PNG",
+              "CSV",
+              "TEXT"
+            ],
             "type": "string"
           },
           "selected_tabs": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "nullable": true,
@@ -7480,7 +8286,10 @@
           },
           "type": {
             "description": "The report schedule type",
-            "enum": ["Alert", "Report"],
+            "enum": [
+              "Alert",
+              "Report"
+            ],
             "type": "string"
           },
           "validator_config_json": {
@@ -7488,18 +8297,24 @@
           },
           "validator_type": {
             "description": "Determines when to trigger alert based off value from alert query. Alerts will be triggered with these validator types:\n- Not Null - When the return value is Not NULL, Empty, or 0\n- Operator - When `sql_return_value comparison_operator threshold` is True e.g. `50 <= 75`<br>Supports the comparison operators <, <=, >, >=, ==, and !=",
-            "enum": ["not null", "operator"],
+            "enum": [
+              "not null",
+              "operator"
+            ],
             "type": "string"
           },
           "working_timeout": {
             "description": "If an alert is staled at a working state, how long until it's state is reseted to error",
             "example": 3600,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           }
         },
-        "required": ["crontab", "name", "type"],
+        "required": [
+          "crontab",
+          "name",
+          "type"
+        ],
         "type": "object"
       },
       "ReportScheduleRestApi.put": {
@@ -7508,7 +8323,6 @@
             "type": "boolean"
           },
           "chart": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -7519,6 +8333,11 @@
           },
           "creation_method": {
             "description": "Creation method is used to inform the frontend whether the report/alert was created in the dashboard, chart, or alerts and reports UI.",
+            "enum": [
+              "charts",
+              "dashboards",
+              "alerts_reports"
+            ],
             "nullable": true
           },
           "crontab": {
@@ -7527,13 +8346,17 @@
             "minLength": 1,
             "type": "string"
           },
+          "custom_width": {
+            "description": "Custom width of the screenshot in pixels",
+            "example": 1000,
+            "nullable": true,
+            "type": "integer"
+          },
           "dashboard": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "database": {
-            "format": "int32",
             "type": "integer"
           },
           "description": {
@@ -7551,14 +8374,12 @@
           "grace_period": {
             "description": "Once an alert is triggered, how long, in seconds, before Superset nags you again. (in seconds)",
             "example": 14400,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
           "log_retention": {
             "description": "How long to keep the logs around for this report (in days)",
             "example": 90,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
@@ -7571,7 +8392,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this report. If left empty you will be one of the owners of the report.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -7583,7 +8403,11 @@
             "type": "array"
           },
           "report_format": {
-            "enum": ["PNG", "CSV", "TEXT"],
+            "enum": [
+              "PNG",
+              "CSV",
+              "TEXT"
+            ],
             "type": "string"
           },
           "sql": {
@@ -8194,7 +9018,10 @@
           },
           "type": {
             "description": "The report schedule type",
-            "enum": ["Alert", "Report"],
+            "enum": [
+              "Alert",
+              "Report"
+            ],
             "type": "string"
           },
           "validator_config_json": {
@@ -8202,14 +9029,16 @@
           },
           "validator_type": {
             "description": "Determines when to trigger alert based off value from alert query. Alerts will be triggered with these validator types:\n- Not Null - When the return value is Not NULL, Empty, or 0\n- Operator - When `sql_return_value comparison_operator threshold` is True e.g. `50 <= 75`<br>Supports the comparison operators <, <=, >, >=, ==, and !=",
-            "enum": ["not null", "operator"],
+            "enum": [
+              "not null",
+              "operator"
+            ],
             "nullable": true,
             "type": "string"
           },
           "working_timeout": {
             "description": "If an alert is staled at a working state, how long until it's state is reseted to error",
             "example": 3600,
-            "format": "int32",
             "minimum": 1,
             "nullable": true,
             "type": "integer"
@@ -8222,9 +9051,16 @@
           "id": {
             "type": "string"
           },
-          "type": {}
+          "type": {
+            "enum": [
+              "dashboard"
+            ]
+          }
         },
-        "required": ["id", "type"],
+        "required": [
+          "id",
+          "type"
+        ],
         "type": "object"
       },
       "RlsRule": {
@@ -8233,17 +9069,28 @@
             "type": "string"
           },
           "dataset": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["clause"],
+        "required": [
+          "clause"
+        ],
         "type": "object"
       },
       "Roles": {
         "properties": {
           "id": {
-            "format": "int32",
+            "type": "integer"
+          },
+          "name": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "Roles1": {
+        "properties": {
+          "id": {
             "type": "integer"
           },
           "name": {
@@ -8268,7 +9115,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "label": {
@@ -8302,11 +9148,12 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["database_name"],
+        "required": [
+          "database_name"
+        ],
         "type": "object"
       },
       "SavedQueryRestApi.get.User": {
@@ -8316,7 +9163,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -8324,7 +9170,10 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "SavedQueryRestApi.get_list": {
@@ -8344,7 +9193,6 @@
             "$ref": "#/components/schemas/SavedQueryRestApi.get_list.Database"
           },
           "db_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8356,7 +9204,6 @@
             "readOnly": true
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "label": {
@@ -8368,7 +9215,6 @@
             "readOnly": true
           },
           "rows": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8383,6 +9229,9 @@
           },
           "sql_tables": {
             "readOnly": true
+          },
+          "tags": {
+            "$ref": "#/components/schemas/SavedQueryRestApi.get_list.Tag"
           }
         },
         "type": "object"
@@ -8394,11 +9243,33 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
-        "required": ["database_name"],
+        "required": [
+          "database_name"
+        ],
+        "type": "object"
+      },
+      "SavedQueryRestApi.get_list.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
         "type": "object"
       },
       "SavedQueryRestApi.get_list.User": {
@@ -8408,7 +9279,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -8416,13 +9286,15 @@
             "type": "string"
           }
         },
-        "required": ["first_name", "last_name"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
       "SavedQueryRestApi.post": {
         "properties": {
           "db_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8454,7 +9326,6 @@
       "SavedQueryRestApi.put": {
         "properties": {
           "db_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8508,7 +9379,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart.",
-            "format": "int32",
             "type": "integer"
           },
           "certification_details": {
@@ -8521,6 +9391,7 @@
           },
           "changed_on": {
             "description": "Timestamp of the last modification.",
+            "format": "date-time",
             "type": "string"
           },
           "changed_on_humanized": {
@@ -8558,7 +9429,6 @@
           "owners": {
             "description": "Owners identifiers.",
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -8569,7 +9439,6 @@
           },
           "slice_id": {
             "description": "The slice ID.",
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -8636,7 +9505,7 @@
         "properties": {
           "column_names": {
             "items": {
-              "description": "A list of column names that compose the foreign key or index",
+              "description": "A list of column names that compose the foreign key or  index",
               "type": "string"
             },
             "type": "array"
@@ -8747,221 +9616,538 @@
         },
         "type": "object"
       },
-      "TemporaryCachePostSchema": {
+      "Tables": {
         "properties": {
-          "value": {
-            "description": "Any type of JSON supported text.",
+          "id": {
+            "type": "integer"
+          },
+          "schema": {
+            "type": "string"
+          },
+          "table_name": {
             "type": "string"
           }
         },
-        "required": ["value"],
         "type": "object"
       },
-      "TemporaryCachePutSchema": {
+      "Tag": {
         "properties": {
-          "value": {
-            "description": "Any type of JSON supported text.",
+          "id": {
+            "type": "integer"
+          },
+          "name": {
             "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
           }
         },
-        "required": ["value"],
         "type": "object"
       },
-      "User": {
+      "Tag1": {
         "properties": {
-          "first_name": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
             "type": "string"
           },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
+      "TagGetResponseSchema": {
+        "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
-          "last_name": {
+          "name": {
             "type": "string"
           },
-          "username": {
+          "type": {
             "type": "string"
           }
         },
         "type": "object"
       },
-      "User1": {
+      "TagRestApi.get": {
         "properties": {
-          "first_name": {
-            "type": "string"
+          "changed_by": {
+            "$ref": "#/components/schemas/TagRestApi.get.User1"
           },
-          "last_name": {
-            "type": "string"
+          "changed_on_delta_humanized": {
+            "readOnly": true
           },
-          "username": {
+          "created_by": {
+            "$ref": "#/components/schemas/TagRestApi.get.User"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
             "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
           }
         },
         "type": "object"
       },
-      "UserResponseSchema": {
+      "TagRestApi.get.User": {
         "properties": {
+          "active": {
+            "nullable": true,
+            "type": "boolean"
+          },
+          "changed_on": {
+            "format": "date-time",
+            "nullable": true,
+            "type": "string"
+          },
+          "created_on": {
+            "format": "date-time",
+            "nullable": true,
+            "type": "string"
+          },
           "email": {
+            "maxLength": 64,
             "type": "string"
           },
+          "fail_login_count": {
+            "nullable": true,
+            "type": "integer"
+          },
           "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
-          "is_active": {
-            "type": "boolean"
-          },
-          "is_anonymous": {
-            "type": "boolean"
+          "last_login": {
+            "format": "date-time",
+            "nullable": true,
+            "type": "string"
           },
           "last_name": {
+            "maxLength": 64,
+            "type": "string"
+          },
+          "login_count": {
+            "nullable": true,
+            "type": "integer"
+          },
+          "password": {
+            "maxLength": 256,
+            "nullable": true,
             "type": "string"
           },
           "username": {
+            "maxLength": 64,
             "type": "string"
           }
         },
+        "required": [
+          "email",
+          "first_name",
+          "last_name",
+          "username"
+        ],
         "type": "object"
       },
-      "ValidateSQLRequest": {
+      "TagRestApi.get.User1": {
         "properties": {
-          "schema": {
-            "nullable": true,
+          "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
-          "sql": {
-            "description": "SQL statement to validate",
+          "last_name": {
+            "maxLength": 64,
             "type": "string"
-          },
-          "template_params": {
-            "nullable": true,
-            "type": "object"
           }
         },
-        "required": ["sql"],
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
-      "ValidateSQLResponse": {
+      "TagRestApi.get_list": {
         "properties": {
-          "end_column": {
-            "format": "int32",
-            "type": "integer"
+          "changed_by": {
+            "$ref": "#/components/schemas/TagRestApi.get_list.User1"
           },
-          "line_number": {
-            "format": "int32",
+          "changed_on_delta_humanized": {
+            "readOnly": true
+          },
+          "created_by": {
+            "$ref": "#/components/schemas/TagRestApi.get_list.User"
+          },
+          "id": {
             "type": "integer"
           },
-          "message": {
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
             "type": "string"
           },
-          "start_column": {
-            "format": "int32",
-            "type": "integer"
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
           }
         },
         "type": "object"
       },
-      "ValidatorConfigJSON": {
+      "TagRestApi.get_list.User": {
         "properties": {
-          "op": {
-            "description": "The operation to compare with a threshold to apply to the SQL output\n",
-            "enum": ["<", "<=", ">", ">=", "==", "!="],
+          "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
-          "threshold": {
-            "format": "float",
-            "type": "number"
+          "last_name": {
+            "maxLength": 64,
+            "type": "string"
           }
         },
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
-      "advanced_data_type_convert_schema": {
+      "TagRestApi.get_list.User1": {
         "properties": {
-          "type": {
-            "default": "port",
+          "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
-          "values": {
+          "last_name": {
+            "maxLength": 64,
+            "type": "string"
+          }
+        },
+        "required": [
+          "first_name",
+          "last_name"
+        ],
+        "type": "object"
+      },
+      "TagRestApi.post": {
+        "properties": {
+          "tags": {
             "items": {
-              "default": "http"
+              "type": "string"
             },
-            "minItems": 1,
             "type": "array"
           }
         },
-        "required": ["type", "values"],
         "type": "object"
       },
-      "database_schemas_query_schema": {
+      "TagRestApi.put": {
         "properties": {
-          "force": {
-            "type": "boolean"
+          "id": {
+            "type": "integer"
           }
         },
         "type": "object"
       },
-      "database_tables_query_schema": {
+      "TaggedObjectEntityResponseSchema": {
         "properties": {
-          "force": {
-            "type": "boolean"
+          "changed_on": {
+            "format": "date-time",
+            "type": "string"
           },
-          "schema_name": {
+          "created_by": {
+            "$ref": "#/components/schemas/User"
+          },
+          "creator": {
+            "type": "string"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "type": "string"
+          },
+          "type": {
+            "type": "string"
+          },
+          "url": {
             "type": "string"
           }
         },
-        "required": ["schema_name"],
         "type": "object"
       },
-      "get_delete_ids_schema": {
-        "items": {
-          "type": "integer"
+      "TemporaryCachePostSchema": {
+        "properties": {
+          "value": {
+            "description": "Any type of JSON supported text.",
+            "type": "string"
+          }
         },
-        "type": "array"
+        "required": [
+          "value"
+        ],
+        "type": "object"
       },
-      "get_export_ids_schema": {
-        "items": {
-          "type": "integer"
+      "TemporaryCachePutSchema": {
+        "properties": {
+          "value": {
+            "description": "Any type of JSON supported text.",
+            "type": "string"
+          }
         },
-        "type": "array"
+        "required": [
+          "value"
+        ],
+        "type": "object"
       },
-      "get_fav_star_ids_schema": {
-        "items": {
-          "type": "integer"
+      "User": {
+        "properties": {
+          "first_name": {
+            "type": "string"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "last_name": {
+            "type": "string"
+          }
         },
-        "type": "array"
+        "type": "object"
       },
-      "get_info_schema": {
+      "User1": {
         "properties": {
-          "add_columns": {
-            "additionalProperties": {
-              "properties": {
-                "page": {
-                  "type": "integer"
-                },
-                "page_size": {
-                  "type": "integer"
-                }
-              },
-              "type": "object"
-            },
-            "type": "object"
+          "first_name": {
+            "type": "string"
           },
-          "edit_columns": {
-            "additionalProperties": {
-              "properties": {
-                "page": {
-                  "type": "integer"
-                },
-                "page_size": {
-                  "type": "integer"
-                }
-              },
-              "type": "object"
-            },
-            "type": "object"
+          "id": {
+            "type": "integer"
+          },
+          "last_name": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "User2": {
+        "properties": {
+          "first_name": {
+            "type": "string"
+          },
+          "last_name": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "UserResponseSchema": {
+        "properties": {
+          "email": {
+            "type": "string"
+          },
+          "first_name": {
+            "type": "string"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "is_active": {
+            "type": "boolean"
+          },
+          "is_anonymous": {
+            "type": "boolean"
+          },
+          "last_name": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "ValidateSQLRequest": {
+        "properties": {
+          "schema": {
+            "nullable": true,
+            "type": "string"
+          },
+          "sql": {
+            "description": "SQL statement to validate",
+            "type": "string"
+          },
+          "template_params": {
+            "nullable": true,
+            "type": "object"
+          }
+        },
+        "required": [
+          "sql"
+        ],
+        "type": "object"
+      },
+      "ValidateSQLResponse": {
+        "properties": {
+          "end_column": {
+            "type": "integer"
+          },
+          "line_number": {
+            "type": "integer"
+          },
+          "message": {
+            "type": "string"
+          },
+          "start_column": {
+            "type": "integer"
+          }
+        },
+        "type": "object"
+      },
+      "ValidatorConfigJSON": {
+        "properties": {
+          "op": {
+            "description": "The operation to compare with a threshold to apply to the SQL output\n",
+            "enum": [
+              "<",
+              "<=",
+              ">",
+              ">=",
+              "==",
+              "!="
+            ],
+            "type": "string"
+          },
+          "threshold": {
+            "type": "number"
+          }
+        },
+        "type": "object"
+      },
+      "advanced_data_type_convert_schema": {
+        "properties": {
+          "type": {
+            "default": "port",
+            "type": "string"
+          },
+          "values": {
+            "items": {
+              "default": "http"
+            },
+            "minItems": 1,
+            "type": "array"
+          }
+        },
+        "required": [
+          "type",
+          "values"
+        ],
+        "type": "object"
+      },
+      "database_schemas_query_schema": {
+        "properties": {
+          "force": {
+            "type": "boolean"
+          }
+        },
+        "type": "object"
+      },
+      "database_tables_query_schema": {
+        "properties": {
+          "force": {
+            "type": "boolean"
+          },
+          "schema_name": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "schema_name"
+        ],
+        "type": "object"
+      },
+      "delete_tags_schema": {
+        "items": {
+          "type": "string"
+        },
+        "type": "array"
+      },
+      "get_delete_ids_schema": {
+        "items": {
+          "type": "integer"
+        },
+        "type": "array"
+      },
+      "get_export_ids_schema": {
+        "items": {
+          "type": "integer"
+        },
+        "type": "array"
+      },
+      "get_fav_star_ids_schema": {
+        "items": {
+          "type": "integer"
+        },
+        "type": "array"
+      },
+      "get_info_schema": {
+        "properties": {
+          "add_columns": {
+            "additionalProperties": {
+              "properties": {
+                "page": {
+                  "type": "integer"
+                },
+                "page_size": {
+                  "type": "integer"
+                }
+              },
+              "type": "object"
+            },
+            "type": "object"
+          },
+          "edit_columns": {
+            "additionalProperties": {
+              "properties": {
+                "page": {
+                  "type": "integer"
+                },
+                "page_size": {
+                  "type": "integer"
+                }
+              },
+              "type": "object"
+            },
+            "type": "object"
           },
           "keys": {
             "items": {
@@ -9039,7 +10225,11 @@
                   ]
                 }
               },
-              "required": ["col", "opr", "value"],
+              "required": [
+                "col",
+                "opr",
+                "value"
+              ],
               "type": "object"
             },
             "type": "array"
@@ -9062,7 +10252,10 @@
             "type": "string"
           },
           "order_direction": {
-            "enum": ["asc", "desc"],
+            "enum": [
+              "asc",
+              "desc"
+            ],
             "type": "string"
           },
           "page": {
@@ -9120,7 +10313,9 @@
             "type": "number"
           }
         },
-        "required": ["last_updated_ms"],
+        "required": [
+          "last_updated_ms"
+        ],
         "type": "object"
       },
       "screenshot_query_schema": {
@@ -9149,7 +10344,9 @@
             "type": "string"
           }
         },
-        "required": ["key"],
+        "required": [
+          "key"
+        ],
         "type": "object"
       },
       "thumbnail_query_schema": {
@@ -9226,7 +10423,9 @@
           }
         ],
         "summary": "Returns a AdvancedDataTypeResponse object populated with the passed in args.",
-        "tags": ["Advanced Data Type"]
+        "tags": [
+          "Advanced Data Type"
+        ]
       }
     },
     "/api/v1/advanced_data_type/types": {
@@ -9266,7 +10465,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Advanced Data Type"]
+        "tags": [
+          "Advanced Data Type"
+        ]
       }
     },
     "/api/v1/annotation_layer/": {
@@ -9319,7 +10520,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "get": {
         "description": "Get a list of Annotation layers, use Rison or JSON query parameters for filtering, sorting, pagination and for selecting specific columns and metadata.",
@@ -9424,7 +10627,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "post": {
         "description": "Create an Annotation layer",
@@ -9476,7 +10681,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       }
     },
     "/api/v1/annotation_layer/_info": {
@@ -9560,7 +10767,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       }
     },
     "/api/v1/annotation_layer/related/{column_name}": {
@@ -9615,7 +10824,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       }
     },
     "/api/v1/annotation_layer/{pk}": {
@@ -9663,7 +10874,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "get": {
         "description": "Get an Annotation layer",
@@ -9761,7 +10974,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "put": {
         "description": "Update an Annotation layer",
@@ -9824,7 +11039,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       }
     },
     "/api/v1/annotation_layer/{pk}/annotation/": {
@@ -9886,7 +11103,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "get": {
         "description": "Get a list of Annotation layers, use Rison or JSON query parameters for filtering, sorting, pagination and for selecting specific columns and metadata.",
@@ -9961,7 +11180,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "post": {
         "description": "Create an Annotation layer",
@@ -10024,7 +11245,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       }
     },
     "/api/v1/annotation_layer/{pk}/annotation/{annotation_id}": {
@@ -10081,7 +11304,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "get": {
         "description": "Get an Annotation layer",
@@ -10157,7 +11382,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       },
       "put": {
         "description": "Update an Annotation layer",
@@ -10229,7 +11456,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Annotation Layers"]
+        "tags": [
+          "Annotation Layers"
+        ]
       }
     },
     "/api/v1/assets/export/": {
@@ -10262,7 +11491,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Import/export"]
+        "tags": [
+          "Import/export"
+        ]
       }
     },
     "/api/v1/assets/import/": {
@@ -10285,12 +11516,12 @@
                     "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keys": {
-                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keyspasswords": {
-                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key_password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
                     "type": "string"
                   }
                 },
@@ -10334,7 +11565,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Import/export"]
+        "tags": [
+          "Import/export"
+        ]
       }
     },
     "/api/v1/async_event/": {
@@ -10407,7 +11640,9 @@
             "jwt": []
           }
         ],
-        "tags": ["AsyncEventsRestApi"]
+        "tags": [
+          "AsyncEventsRestApi"
+        ]
       }
     },
     "/api/v1/available_domains/": {
@@ -10441,7 +11676,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Available Domains"]
+        "tags": [
+          "Available Domains"
+        ]
       }
     },
     "/api/v1/cachekey/invalidate": {
@@ -10474,7 +11711,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CacheRestApi"]
+        "tags": [
+          "CacheRestApi"
+        ]
       }
     },
     "/api/v1/chart/": {
@@ -10530,7 +11769,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       },
       "get": {
         "description": "Get a list of charts, use Rison or JSON query parameters for filtering, sorting, pagination and  for selecting specific columns and metadata.",
@@ -10635,7 +11876,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       },
       "post": {
         "description": "Create a new Chart.",
@@ -10675,6 +11918,9 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -10687,7 +11933,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/_info": {
@@ -10771,7 +12019,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/data": {
@@ -10824,7 +12074,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/data/{cache_key}": {
@@ -10872,7 +12124,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/export/": {
@@ -10921,7 +12175,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/favorite_status/": {
@@ -10969,7 +12225,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/import/": {
@@ -10996,12 +12254,12 @@
                     "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keys": {
-                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keyspasswords": {
-                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key_password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
                     "type": "string"
                   }
                 },
@@ -11045,7 +12303,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/related/{column_name}": {
@@ -11101,7 +12361,55 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
+      }
+    },
+    "/api/v1/chart/warm_up_cache": {
+      "put": {
+        "description": "Warms up the cache for the chart. Note for slices a force refresh occurs. In terms of the `extra_filters` these can be obtained from records in the JSON encoded `logs.json` column associated with the `explore_json` action.",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ChartCacheWarmUpRequestSchema"
+              }
+            }
+          },
+          "description": "Identifies the chart to warm up cache for, and any additional dashboard or filter context to use.",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ChartCacheWarmUpResponseSchema"
+                }
+              }
+            },
+            "description": "Each chart's warmup status"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Warms up the cache for the chart",
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/{pk}": {
@@ -11154,7 +12462,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       },
       "get": {
         "description": "Get a chart detail information.",
@@ -11252,7 +12562,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       },
       "put": {
         "description": "Changes a Chart.",
@@ -11320,7 +12632,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/{pk}/cache_screenshot/": {
@@ -11376,7 +12690,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/{pk}/data/": {
@@ -11453,12 +12769,14 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
-    "/api/v1/chart/{pk}/screenshot/{digest}/": {
-      "get": {
-        "description": "Get a computed screenshot from cache.",
+    "/api/v1/chart/{pk}/favorites/": {
+      "delete": {
+        "description": "Remove the chart from the user favorite list",
         "parameters": [
           {
             "in": "path",
@@ -11467,10 +12785,106 @@
             "schema": {
               "type": "integer"
             }
-          },
-          {
-            "in": "path",
-            "name": "digest",
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Chart removed from favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Charts"
+        ]
+      },
+      "post": {
+        "description": "Marks the chart as favorite for the current user",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Chart added to favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Charts"
+        ]
+      }
+    },
+    "/api/v1/chart/{pk}/screenshot/{digest}/": {
+      "get": {
+        "description": "Get a computed screenshot from cache.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "path",
+            "name": "digest",
             "required": true,
             "schema": {
               "type": "string"
@@ -11507,7 +12921,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/chart/{pk}/thumbnail/{digest}/": {
@@ -11564,7 +12980,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Charts"]
+        "tags": [
+          "Charts"
+        ]
       }
     },
     "/api/v1/css_template/": {
@@ -11617,7 +13035,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       },
       "get": {
         "description": "Get a list of CSS templates, use Rison or JSON query parameters for filtering, sorting, pagination and for selecting specific columns and metadata.",
@@ -11722,7 +13142,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       },
       "post": {
         "description": "Create a CSS template",
@@ -11774,7 +13196,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       }
     },
     "/api/v1/css_template/_info": {
@@ -11858,7 +13282,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       }
     },
     "/api/v1/css_template/related/{column_name}": {
@@ -11913,7 +13339,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       }
     },
     "/api/v1/css_template/{pk}": {
@@ -11960,7 +13388,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       },
       "get": {
         "description": "Get a CSS template",
@@ -12058,7 +13488,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       },
       "put": {
         "description": "Update a CSS template",
@@ -12120,7 +13552,9 @@
             "jwt": []
           }
         ],
-        "tags": ["CSS Templates"]
+        "tags": [
+          "CSS Templates"
+        ]
       }
     },
     "/api/v1/dashboard/": {
@@ -12176,7 +13610,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       },
       "get": {
         "description": "Get a list of dashboards, use Rison or JSON query parameters for filtering, sorting, pagination and  for selecting specific columns and metadata.",
@@ -12281,7 +13717,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       },
       "post": {
         "description": "Create a new Dashboard.",
@@ -12333,7 +13771,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/_info": {
@@ -12417,7 +13857,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/export/": {
@@ -12468,7 +13910,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/favorite_status/": {
@@ -12516,7 +13960,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/import/": {
@@ -12543,12 +13989,12 @@
                     "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keys": {
-                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keyspasswords": {
-                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key_password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
                     "type": "string"
                   }
                 },
@@ -12592,7 +14038,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/permalink/{key}": {
@@ -12646,7 +14094,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboard Permanent Link"]
+        "tags": [
+          "Dashboard Permanent Link"
+        ]
       }
     },
     "/api/v1/dashboard/related/{column_name}": {
@@ -12702,7 +14152,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/{dashboard_id}/filtersets": {
@@ -12776,7 +14228,9 @@
             "jwt": []
           }
         ],
-        "tags": ["FilterSetRestApi"]
+        "tags": [
+          "FilterSetRestApi"
+        ]
       },
       "post": {
         "description": "Create a new Dashboard's Filter Set.",
@@ -12842,7 +14296,9 @@
             "jwt": []
           }
         ],
-        "tags": ["FilterSetRestApi"]
+        "tags": [
+          "FilterSetRestApi"
+        ]
       }
     },
     "/api/v1/dashboard/{dashboard_id}/filtersets/{pk}": {
@@ -12903,7 +14359,9 @@
             "jwt": []
           }
         ],
-        "tags": ["FilterSetRestApi"]
+        "tags": [
+          "FilterSetRestApi"
+        ]
       },
       "put": {
         "description": "Changes a Dashboard's Filter set.",
@@ -12979,7 +14437,9 @@
             "jwt": []
           }
         ],
-        "tags": ["FilterSetRestApi"]
+        "tags": [
+          "FilterSetRestApi"
+        ]
       }
     },
     "/api/v1/dashboard/{id_or_slug}": {
@@ -13030,7 +14490,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/{id_or_slug}/charts": {
@@ -13083,7 +14545,78 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
+      }
+    },
+    "/api/v1/dashboard/{id_or_slug}/copy/": {
+      "post": {
+        "parameters": [
+          {
+            "description": "The dashboard id or slug",
+            "in": "path",
+            "name": "id_or_slug",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DashboardCopySchema"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "number"
+                    },
+                    "last_modified_time": {
+                      "type": "number"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Id of new dashboard and last modified time"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Makes a copy of an existing dashboard",
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/{id_or_slug}/datasets": {
@@ -13137,7 +14670,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/{id_or_slug}/embedded": {
@@ -13182,7 +14717,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       },
       "get": {
         "description": "Returns the dashboard's embedded configuration",
@@ -13225,7 +14762,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       },
       "post": {
         "description": "Sets a dashboard's embedded configuration.",
@@ -13279,7 +14818,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       },
       "put": {
         "description": "Sets a dashboard's embedded configuration.",
@@ -13333,7 +14874,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/{pk}": {
@@ -13386,7 +14929,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       },
       "put": {
         "description": "Changes a Dashboard.",
@@ -13457,7 +15002,105 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
+      }
+    },
+    "/api/v1/dashboard/{pk}/favorites/": {
+      "delete": {
+        "description": "Remove the dashboard from the user favorite list",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dashboard removed from favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Dashboards"
+        ]
+      },
+      "post": {
+        "description": "Marks the dashboard as favorite for the current user",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dashboard added to favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/dashboard/{pk}/filter_state": {
@@ -13525,7 +15168,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboard Filter State"]
+        "tags": [
+          "Dashboard Filter State"
+        ]
       }
     },
     "/api/v1/dashboard/{pk}/filter_state/{key}": {
@@ -13588,7 +15233,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboard Filter State"]
+        "tags": [
+          "Dashboard Filter State"
+        ]
       },
       "get": {
         "description": "Retrives a value.",
@@ -13648,7 +15295,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboard Filter State"]
+        "tags": [
+          "Dashboard Filter State"
+        ]
       },
       "put": {
         "description": "Updates an existing value.",
@@ -13725,7 +15374,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboard Filter State"]
+        "tags": [
+          "Dashboard Filter State"
+        ]
       }
     },
     "/api/v1/dashboard/{pk}/permalink": {
@@ -13745,7 +15396,7 @@
           "content": {
             "application/json": {
               "schema": {
-                "$ref": "#/components/schemas/DashboardPermalinkPostSchema"
+                "$ref": "#/components/schemas/DashboardPermalinkStateSchema"
               }
             }
           },
@@ -13790,7 +15441,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboard Permanent Link"]
+        "tags": [
+          "Dashboard Permanent Link"
+        ]
       }
     },
     "/api/v1/dashboard/{pk}/thumbnail/{digest}/": {
@@ -13874,7 +15527,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Dashboards"]
+        "tags": [
+          "Dashboards"
+        ]
       }
     },
     "/api/v1/database/": {
@@ -13981,7 +15636,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Database"
+        ]
       },
       "post": {
         "description": "Create a new Database.",
@@ -14033,7 +15690,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Database"
+        ]
       }
     },
     "/api/v1/database/_info": {
@@ -14117,7 +15776,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Database"
+        ]
       }
     },
     "/api/v1/database/available/": {
@@ -14196,7 +15857,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Database"
+        ]
       }
     },
     "/api/v1/database/export/": {
@@ -14242,7 +15905,9 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Database"
+        ]
       }
     },
     "/api/v1/database/import/": {
@@ -14269,12 +15934,12 @@
                     "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keys": {
-                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
                     "type": "string"
                   },
-                  "ssh_tunnel_private_keyspasswords": {
-                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key_password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
                     "type": "string"
                   }
                 },
@@ -14318,44 +15983,2164 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/test_connection/": {
+      "post": {
+        "description": "Tests a database connection",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatabaseTestConnectionSchema"
+              }
+            }
+          },
+          "description": "Database schema",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Database Test Connection"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/validate_parameters/": {
+      "post": {
+        "description": "Validates parameters used to connect to a database",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatabaseValidateParametersSchema"
+              }
+            }
+          },
+          "description": "DB-specific parameters",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Database Test Connection"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}": {
+      "delete": {
+        "description": "Deletes a Database.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Database deleted"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      },
+      "get": {
+        "description": "Get a database",
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Database"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      },
+      "put": {
+        "description": "Changes a Database.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatabaseRestApi.put"
+              }
+            }
+          },
+          "description": "Database schema",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "number"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/DatabaseRestApi.put"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Database changed"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/connection": {
+      "get": {
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseConnectionSchema"
+                }
+              }
+            },
+            "description": "Database with connection info"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Get a database connection info",
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/function_names/": {
+      "get": {
+        "description": "Get function names supported by a database",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseFunctionNamesResponse"
+                }
+              }
+            },
+            "description": "Query result"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/related_objects/": {
+      "get": {
+        "description": "Get charts and dashboards count associated to a database",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseRelatedObjectsResponse"
+                }
+              }
+            },
+            "description": "Query result"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/schemas/": {
+      "get": {
+        "description": "Get all schemas from a database",
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/database_schemas_query_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/SchemasResponseSchema"
+                }
+              }
+            },
+            "description": "A List of all schemas from the database"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/schemas_access_for_file_upload/": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseSchemaAccessForFileUploadResponse"
+                }
+              }
+            },
+            "description": "The list of the database schemas where to upload information"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "The list of the database schemas where to upload information",
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/select_star/{table_name}/": {
+      "get": {
+        "description": "Get database select star for table",
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "Table name",
+            "in": "path",
+            "name": "table_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "description": "Table schema",
+            "in": "path",
+            "name": "schema_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/SelectStarResponseSchema"
+                }
+              }
+            },
+            "description": "SQL statement for a select star for table"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/select_star/{table_name}/{schema_name}/": {
+      "get": {
+        "description": "Get database select star for table",
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "Table name",
+            "in": "path",
+            "name": "table_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "description": "Table schema",
+            "in": "path",
+            "name": "schema_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/SelectStarResponseSchema"
+                }
+              }
+            },
+            "description": "SQL statement for a select star for table"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/ssh_tunnel/": {
+      "delete": {
+        "description": "Deletes a SSH Tunnel.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "SSH Tunnel deleted"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/table/{table_name}/{schema_name}/": {
+      "get": {
+        "description": "Get database table metadata",
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "Table name",
+            "in": "path",
+            "name": "table_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "description": "Table schema",
+            "in": "path",
+            "name": "schema_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/TableMetadataResponseSchema"
+                }
+              }
+            },
+            "description": "Table metadata information"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/table_extra/{table_name}/{schema_name}/": {
+      "get": {
+        "description": "Response depends on each DB engine spec normally focused on partitions",
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "Table name",
+            "in": "path",
+            "name": "table_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "description": "Table schema",
+            "in": "path",
+            "name": "schema_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/TableExtraMetadataResponseSchema"
+                }
+              }
+            },
+            "description": "Table extra metadata information"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Get table extra metadata",
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/tables/": {
+      "get": {
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/database_tables_query_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "count": {
+                      "type": "integer"
+                    },
+                    "result": {
+                      "description": "A List of tables for given database",
+                      "items": {
+                        "$ref": "#/components/schemas/DatabaseTablesResponse"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Tables list"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Get a list of tables for given database",
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/database/{pk}/validate_sql/": {
+      "post": {
+        "description": "Validates arbitrary SQL.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ValidateSQLRequest"
+              }
+            }
+          },
+          "description": "Validate SQL request",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "description": "A List of SQL errors found on the statement",
+                      "items": {
+                        "$ref": "#/components/schemas/ValidateSQLResponse"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Validation result"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Validates that arbitrary sql is acceptable for the given database",
+        "tags": [
+          "Database"
+        ]
+      }
+    },
+    "/api/v1/dataset/": {
+      "delete": {
+        "description": "Deletes multiple Datasets in a bulk operation.",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_delete_ids_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset bulk delete"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      },
+      "get": {
+        "description": "Get a list of models",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_list_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "count": {
+                      "description": "The total record count on the backend",
+                      "type": "number"
+                    },
+                    "description_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The description for the column name. Will be translated by babel",
+                          "example": "A Nice description for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "ids": {
+                      "description": "A list of item ids, useful when you don't know the column id",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "label_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The label for the column name. Will be translated by babel",
+                          "example": "A Nice label for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "list_columns": {
+                      "description": "A list of columns",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "list_title": {
+                      "description": "A title to render. Will be translated by babel",
+                      "example": "List Items",
+                      "type": "string"
+                    },
+                    "order_columns": {
+                      "description": "A list of allowed columns to sort",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "result": {
+                      "description": "The result from the get list query",
+                      "items": {
+                        "$ref": "#/components/schemas/DatasetRestApi.get_list"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Items from Model"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      },
+      "post": {
+        "description": "Create a new Dataset",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatasetRestApi.post"
+              }
+            }
+          },
+          "description": "Dataset schema",
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "number"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/DatasetRestApi.post"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset added"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/_info": {
+      "get": {
+        "description": "Get metadata information about this API resource",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_info_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "add_columns": {
+                      "type": "object"
+                    },
+                    "edit_columns": {
+                      "type": "object"
+                    },
+                    "filters": {
+                      "properties": {
+                        "column_name": {
+                          "items": {
+                            "properties": {
+                              "name": {
+                                "description": "The filter name. Will be translated by babel",
+                                "type": "string"
+                              },
+                              "operator": {
+                                "description": "The filter operation key to use on list filters",
+                                "type": "string"
+                              }
+                            },
+                            "type": "object"
+                          },
+                          "type": "array"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "permissions": {
+                      "description": "The user permissions for this API resource",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Item from Model"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/distinct/{column_name}": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "column_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_related_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DistincResponseSchema"
+                }
+              }
+            },
+            "description": "Distinct field data"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/duplicate": {
+      "post": {
+        "description": "Duplicates a Dataset",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatasetDuplicateSchema"
+              }
+            }
+          },
+          "description": "Dataset schema",
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "number"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/DatasetDuplicateSchema"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset duplicated"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/export/": {
+      "get": {
+        "description": "Exports multiple datasets and downloads them as YAML files",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_export_ids_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "text/plain": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            },
+            "description": "Dataset export"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/get_or_create/": {
+      "post": {
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/GetOrCreateDatasetSchema"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "properties": {
+                        "table_id": {
+                          "type": "integer"
+                        }
+                      },
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "The ID of the table"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Retrieve a table by name, or create it if it does not exist",
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/import/": {
+      "post": {
+        "requestBody": {
+          "content": {
+            "multipart/form-data": {
+              "schema": {
+                "properties": {
+                  "formData": {
+                    "description": "upload file (ZIP or YAML)",
+                    "format": "binary",
+                    "type": "string"
+                  },
+                  "overwrite": {
+                    "description": "overwrite existing datasets?",
+                    "type": "boolean"
+                  },
+                  "passwords": {
+                    "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_passwords": {
+                    "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                    "type": "string"
+                  },
+                  "sync_columns": {
+                    "description": "sync columns?",
+                    "type": "boolean"
+                  },
+                  "sync_metrics": {
+                    "description": "sync metrics?",
+                    "type": "boolean"
+                  }
+                },
+                "type": "object"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset import result"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/related/{column_name}": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "column_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_related_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RelatedResponseSchema"
+                }
+              }
+            },
+            "description": "Related column data"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/warm_up_cache": {
+      "put": {
+        "description": "Warms up the cache for the table. Note for slices a force refresh occurs. In terms of the `extra_filters` these can be obtained from records in the JSON encoded `logs.json` column associated with the `explore_json` action.",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatasetCacheWarmUpRequestSchema"
+              }
+            }
+          },
+          "description": "Identifies the database and table to warm up cache for, and any additional dashboard or filter context to use.",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatasetCacheWarmUpResponseSchema"
+                }
+              }
+            },
+            "description": "Each chart's warmup status"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Warms up the cache for each chart powered by the given table",
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/{pk}": {
+      "delete": {
+        "description": "Deletes a Dataset",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset delete"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      },
+      "get": {
+        "description": "Get an item model",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_item_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "description_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The description for the column name. Will be translated by babel",
+                          "example": "A Nice description for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "id": {
+                      "description": "The item id",
+                      "type": "string"
+                    },
+                    "label_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The label for the column name. Will be translated by babel",
+                          "example": "A Nice label for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/DatasetRestApi.get"
+                    },
+                    "show_columns": {
+                      "description": "A list of columns",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "show_title": {
+                      "description": "A title to render. Will be translated by babel",
+                      "example": "Show Item Details",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Item from Model"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      },
+      "put": {
+        "description": "Changes a Dataset",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "query",
+            "name": "override_columns",
+            "schema": {
+              "type": "boolean"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatasetRestApi.put"
+              }
+            }
+          },
+          "description": "Dataset schema",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "number"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/DatasetRestApi.put"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset changed"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/{pk}/column/{column_id}": {
+      "delete": {
+        "description": "Delete a Dataset column",
+        "parameters": [
+          {
+            "description": "The dataset pk for this column",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "The column id for this dataset",
+            "in": "path",
+            "name": "column_id",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Column deleted"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/{pk}/metric/{metric_id}": {
+      "delete": {
+        "description": "Delete a Dataset metric",
+        "parameters": [
+          {
+            "description": "The dataset pk for this column",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "The metric id for this dataset",
+            "in": "path",
+            "name": "metric_id",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Metric deleted"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/{pk}/refresh": {
+      "put": {
+        "description": "Refreshes and updates columns of a dataset",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset delete"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
       }
     },
-    "/api/v1/database/test_connection/": {
-      "post": {
-        "description": "Tests a database connection",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/DatabaseTestConnectionSchema"
-              }
+    "/api/v1/dataset/{pk}/related_objects": {
+      "get": {
+        "description": "Get charts and dashboards count associated to a dataset",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
             }
-          },
-          "description": "Database schema",
-          "required": true
-        },
+          }
+        ],
         "responses": {
           "200": {
             "content": {
               "application/json": {
                 "schema": {
-                  "properties": {
-                    "message": {
-                      "type": "string"
-                    }
-                  },
-                  "type": "object"
+                  "$ref": "#/components/schemas/DatasetRelatedObjectsResponse"
                 }
               }
             },
-            "description": "Database Test Connection"
+            "description": "Query result"
           },
-          "400": {
-            "$ref": "#/components/responses/400"
+          "401": {
+            "$ref": "#/components/responses/401"
           },
-          "422": {
-            "$ref": "#/components/responses/422"
+          "404": {
+            "$ref": "#/components/responses/404"
           },
           "500": {
             "$ref": "#/components/responses/500"
@@ -14366,44 +18151,88 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Datasets"
+        ]
       }
     },
-    "/api/v1/database/validate_parameters/": {
-      "post": {
-        "description": "Validates parameters used to connect to a database",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/DatabaseValidateParametersSchema"
-              }
+    "/api/v1/datasource/{datasource_type}/{datasource_id}/column/{column_name}/values/": {
+      "get": {
+        "parameters": [
+          {
+            "description": "The type of datasource",
+            "in": "path",
+            "name": "datasource_type",
+            "required": true,
+            "schema": {
+              "type": "string"
             }
           },
-          "description": "DB-specific parameters",
-          "required": true
-        },
+          {
+            "description": "The id of the datasource",
+            "in": "path",
+            "name": "datasource_id",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "The name of the column to get values for",
+            "in": "path",
+            "name": "column_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
         "responses": {
           "200": {
             "content": {
               "application/json": {
                 "schema": {
                   "properties": {
-                    "message": {
-                      "type": "string"
+                    "result": {
+                      "items": {
+                        "oneOf": [
+                          {
+                            "type": "string"
+                          },
+                          {
+                            "type": "integer"
+                          },
+                          {
+                            "type": "number"
+                          },
+                          {
+                            "type": "boolean"
+                          },
+                          {
+                            "type": "object"
+                          }
+                        ]
+                      },
+                      "type": "array"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Database Test Connection"
+            "description": "A List of distinct values for the column"
           },
           "400": {
             "$ref": "#/components/responses/400"
           },
-          "422": {
-            "$ref": "#/components/responses/422"
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
           },
           "500": {
             "$ref": "#/components/responses/500"
@@ -14414,19 +18243,23 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "summary": "Get possible values for a datasource column",
+        "tags": [
+          "Datasources"
+        ]
       }
     },
-    "/api/v1/database/{pk}": {
-      "delete": {
-        "description": "Deletes a Database.",
+    "/api/v1/embedded_dashboard/{uuid}": {
+      "get": {
+        "description": "Get a report schedule log",
         "parameters": [
           {
+            "description": "The embedded configuration uuid",
             "in": "path",
-            "name": "pk",
+            "name": "uuid",
             "required": true,
             "schema": {
-              "type": "integer"
+              "type": "string"
             }
           }
         ],
@@ -14436,28 +18269,22 @@
               "application/json": {
                 "schema": {
                   "properties": {
-                    "message": {
-                      "type": "string"
+                    "result": {
+                      "$ref": "#/components/schemas/EmbeddedDashboardResponseSchema"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Database deleted"
+            "description": "Result contains the embedded dashboard configuration"
           },
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "403": {
-            "$ref": "#/components/responses/403"
-          },
           "404": {
             "$ref": "#/components/responses/404"
           },
-          "422": {
-            "$ref": "#/components/responses/422"
-          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -14467,19 +18294,49 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
-      },
+        "tags": [
+          "Embedded Dashboard"
+        ]
+      }
+    },
+    "/api/v1/explore/": {
       "get": {
-        "description": "Get a database",
+        "description": "Assembles Explore related information (form_data, slice, dataset)\\n in a single endpoint.<br/><br/>\\nThe information can be assembled from:<br/> - The cache using a form_data_key<br/> - The metadata database using a permalink_key<br/> - Build from scratch using dataset or slice identifiers.",
         "parameters": [
           {
-            "description": "The database id",
-            "in": "path",
-            "name": "pk",
-            "required": true,
+            "in": "query",
+            "name": "form_data_key",
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "in": "query",
+            "name": "permalink_key",
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "in": "query",
+            "name": "slice_id",
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "query",
+            "name": "datasource_id",
             "schema": {
               "type": "integer"
             }
+          },
+          {
+            "in": "query",
+            "name": "datasource_type",
+            "schema": {
+              "type": "string"
+            }
           }
         ],
         "responses": {
@@ -14487,11 +18344,11 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "type": "object"
+                  "$ref": "#/components/schemas/ExploreContextSchema"
                 }
               }
             },
-            "description": "Database"
+            "description": "Returns the initial context."
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -14499,6 +18356,9 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -14511,15 +18371,19 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
-      },
-      "put": {
-        "description": "Changes a Database.",
+        "summary": "Assembles Explore related information (form_data, slice, dataset)\\n in a single endpoint.",
+        "tags": [
+          "Explore"
+        ]
+      }
+    },
+    "/api/v1/explore/form_data": {
+      "post": {
+        "description": "Stores a new form_data.",
         "parameters": [
           {
-            "in": "path",
-            "name": "pk",
-            "required": true,
+            "in": "query",
+            "name": "tab_id",
             "schema": {
               "type": "integer"
             }
@@ -14529,31 +18393,28 @@
           "content": {
             "application/json": {
               "schema": {
-                "$ref": "#/components/schemas/DatabaseRestApi.put"
+                "$ref": "#/components/schemas/FormDataPostSchema"
               }
             }
           },
-          "description": "Database schema",
           "required": true
         },
         "responses": {
-          "200": {
+          "201": {
             "content": {
               "application/json": {
                 "schema": {
                   "properties": {
-                    "id": {
-                      "type": "number"
-                    },
-                    "result": {
-                      "$ref": "#/components/schemas/DatabaseRestApi.put"
+                    "key": {
+                      "description": "The key to retrieve the form_data.",
+                      "type": "string"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Database changed"
+            "description": "The form_data was stored successfully."
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -14561,12 +18422,6 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "403": {
-            "$ref": "#/components/responses/403"
-          },
-          "404": {
-            "$ref": "#/components/responses/404"
-          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -14579,19 +18434,22 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Explore Form Data"
+        ]
       }
     },
-    "/api/v1/database/{pk}/function_names/": {
-      "get": {
-        "description": "Get function names supported by a database",
+    "/api/v1/explore/form_data/{key}": {
+      "delete": {
+        "description": "Deletes a form_data.",
         "parameters": [
           {
+            "description": "The form_data key.",
             "in": "path",
-            "name": "pk",
+            "name": "key",
             "required": true,
             "schema": {
-              "type": "integer"
+              "type": "string"
             }
           }
         ],
@@ -14600,11 +18458,20 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/DatabaseFunctionNamesResponse"
+                  "properties": {
+                    "message": {
+                      "description": "The result of the operation",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "Query result"
+            "description": "Deleted the stored form_data."
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
           },
           "401": {
             "$ref": "#/components/responses/401"
@@ -14612,6 +18479,9 @@
           "404": {
             "$ref": "#/components/responses/404"
           },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -14621,19 +18491,19 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
-      }
-    },
-    "/api/v1/database/{pk}/related_objects/": {
+        "tags": [
+          "Explore Form Data"
+        ]
+      },
       "get": {
-        "description": "Get charts and dashboards count associated to a database",
+        "description": "Retrives a form_data.",
         "parameters": [
           {
             "in": "path",
-            "name": "pk",
+            "name": "key",
             "required": true,
             "schema": {
-              "type": "integer"
+              "type": "string"
             }
           }
         ],
@@ -14642,11 +18512,20 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/DatabaseRelatedObjectsResponse"
+                  "properties": {
+                    "form_data": {
+                      "description": "The stored form_data",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "Query result"
+            "description": "Returns the stored form_data."
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
           },
           "401": {
             "$ref": "#/components/responses/401"
@@ -14654,6 +18533,9 @@
           "404": {
             "$ref": "#/components/responses/404"
           },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -14663,44 +18545,55 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
-      }
-    },
-    "/api/v1/database/{pk}/schemas/": {
-      "get": {
-        "description": "Get all schemas from a database",
+        "tags": [
+          "Explore Form Data"
+        ]
+      },
+      "put": {
+        "description": "Updates an existing form_data.",
         "parameters": [
           {
-            "description": "The database id",
             "in": "path",
-            "name": "pk",
+            "name": "key",
             "required": true,
             "schema": {
-              "type": "integer"
+              "type": "string"
             }
           },
           {
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/database_schemas_query_schema"
-                }
-              }
-            },
             "in": "query",
-            "name": "q"
+            "name": "tab_id",
+            "schema": {
+              "type": "integer"
+            }
           }
         ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/FormDataPutSchema"
+              }
+            }
+          },
+          "required": true
+        },
         "responses": {
           "200": {
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/SchemasResponseSchema"
+                  "properties": {
+                    "key": {
+                      "description": "The key to retrieve the form_data.",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "A List of all schemas from the database"
+            "description": "The form_data was stored successfully."
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -14711,6 +18604,9 @@
           "404": {
             "$ref": "#/components/responses/404"
           },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -14720,37 +18616,53 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Explore Form Data"
+        ]
       }
     },
-    "/api/v1/database/{pk}/schemas_access_for_file_upload/": {
-      "get": {
-        "parameters": [
-          {
-            "in": "path",
-            "name": "pk",
-            "required": true,
-            "schema": {
-              "type": "integer"
+    "/api/v1/explore/permalink": {
+      "post": {
+        "description": "Stores a new permanent link.",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ExplorePermalinkStateSchema"
+              }
             }
-          }
-        ],
+          },
+          "required": true
+        },
         "responses": {
-          "200": {
+          "201": {
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/DatabaseSchemaAccessForFileUploadResponse"
+                  "properties": {
+                    "key": {
+                      "description": "The key to retrieve the permanent link data.",
+                      "type": "string"
+                    },
+                    "url": {
+                      "description": "permanent link.",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "The list of the database schemas where to upload information"
+            "description": "The permanent link was stored successfully."
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
           },
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "404": {
-            "$ref": "#/components/responses/404"
+          "422": {
+            "$ref": "#/components/responses/422"
           },
           "500": {
             "$ref": "#/components/responses/500"
@@ -14761,36 +18673,18 @@
             "jwt": []
           }
         ],
-        "summary": "The list of the database schemas where to upload information",
-        "tags": ["Database"]
+        "tags": [
+          "Explore Permanent Link"
+        ]
       }
     },
-    "/api/v1/database/{pk}/select_star/{table_name}/": {
+    "/api/v1/explore/permalink/{key}": {
       "get": {
-        "description": "Get database select star for table",
+        "description": "Retrives chart state associated with a permanent link.",
         "parameters": [
           {
-            "description": "The database id",
-            "in": "path",
-            "name": "pk",
-            "required": true,
-            "schema": {
-              "type": "integer"
-            }
-          },
-          {
-            "description": "Table name",
-            "in": "path",
-            "name": "table_name",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          },
-          {
-            "description": "Table schema",
             "in": "path",
-            "name": "schema_name",
+            "name": "key",
             "required": true,
             "schema": {
               "type": "string"
@@ -14802,11 +18696,17 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/SelectStarResponseSchema"
+                  "properties": {
+                    "state": {
+                      "description": "The stored state",
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "SQL statement for a select star for table"
+            "description": "Returns the stored form_data."
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -14829,39 +18729,25 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
+        "tags": [
+          "Explore Permanent Link"
+        ]
       }
     },
-    "/api/v1/database/{pk}/select_star/{table_name}/{schema_name}/": {
+    "/api/v1/log/": {
       "get": {
-        "description": "Get database select star for table",
+        "description": "Get a list of models",
         "parameters": [
           {
-            "description": "The database id",
-            "in": "path",
-            "name": "pk",
-            "required": true,
-            "schema": {
-              "type": "integer"
-            }
-          },
-          {
-            "description": "Table name",
-            "in": "path",
-            "name": "table_name",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          },
-          {
-            "description": "Table schema",
-            "in": "path",
-            "name": "schema_name",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_list_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
           }
         ],
         "responses": {
@@ -14869,11 +18755,70 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/SelectStarResponseSchema"
+                  "properties": {
+                    "count": {
+                      "description": "The total record count on the backend",
+                      "type": "number"
+                    },
+                    "description_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The description for the column name. Will be translated by babel",
+                          "example": "A Nice description for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "ids": {
+                      "description": "A list of item ids, useful when you don't know the column id",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "label_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The label for the column name. Will be translated by babel",
+                          "example": "A Nice label for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "list_columns": {
+                      "description": "A list of columns",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "list_title": {
+                      "description": "A title to render. Will be translated by babel",
+                      "example": "List Items",
+                      "type": "string"
+                    },
+                    "order_columns": {
+                      "description": "A list of allowed columns to sort",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "result": {
+                      "description": "The result from the get list query",
+                      "items": {
+                        "$ref": "#/components/schemas/LogRestApi.get_list"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "SQL statement for a select star for table"
+            "description": "Items from Model"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -14881,9 +18826,6 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "404": {
-            "$ref": "#/components/responses/404"
-          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -14896,47 +18838,47 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
-      }
-    },
-    "/api/v1/database/{pk}/ssh_tunnel/": {
-      "delete": {
-        "description": "Deletes a SSH Tunnel.",
-        "parameters": [
-          {
-            "in": "path",
-            "name": "pk",
-            "required": true,
-            "schema": {
-              "type": "integer"
+        "tags": [
+          "LogRestApi"
+        ]
+      },
+      "post": {
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/LogRestApi.post"
+              }
             }
-          }
-        ],
+          },
+          "description": "Model schema",
+          "required": true
+        },
         "responses": {
-          "200": {
+          "201": {
             "content": {
               "application/json": {
                 "schema": {
                   "properties": {
-                    "message": {
+                    "id": {
                       "type": "string"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/LogRestApi.post"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "SSH Tunnel deleted"
+            "description": "Item inserted"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
           },
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "403": {
-            "$ref": "#/components/responses/403"
-          },
-          "404": {
-            "$ref": "#/components/responses/404"
-          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -14949,106 +18891,33 @@
             "jwt": []
           }
         ],
-        "tags": ["Database"]
... 5438 lines suppressed ...


[superset] 04/04: fix: Date column in Heatmap is displayed as unix timestamp (#25009)

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

michaelsmolina pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/superset.git

commit f63cb47f35000488985626e72efde5d164573134
Author: Michael S. Molina <70...@users.noreply.github.com>
AuthorDate: Thu Aug 17 11:24:40 2023 -0300

    fix: Date column in Heatmap is displayed as unix timestamp (#25009)
---
 .../legacy-plugin-chart-heatmap/src/Heatmap.js     |  9 ++++++++-
 .../src/controlPanel.tsx                           | 11 +++++++++++
 .../src/transformProps.js                          | 22 +++++++++++++++++++---
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js
index 7d62622313..a6967301c6 100644
--- a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js
+++ b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js
@@ -99,9 +99,16 @@ function Heatmap(element, props) {
     xScaleInterval,
     yScaleInterval,
     yAxisBounds,
+    xAxisFormatter,
+    yAxisFormatter,
   } = props;
 
-  const { records, extents } = data;
+  const { extents } = data;
+  const records = data.records.map(record => ({
+    ...record,
+    x: xAxisFormatter(record.x),
+    y: yAxisFormatter(record.y),
+  }));
 
   const margin = {
     top: 10,
diff --git a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx
index 3032654ba2..520c92018c 100644
--- a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx
+++ b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx
@@ -31,6 +31,7 @@ import {
   sections,
   sharedControls,
   getStandardizedControls,
+  D3_TIME_FORMAT_DOCS,
 } from '@superset-ui/chart-controls';
 
 const sortAxisChoices = [
@@ -257,6 +258,16 @@ const config: ControlPanelConfig = {
           },
         ],
         ['y_axis_format'],
+        [
+          {
+            name: 'time_format',
+            config: {
+              ...sharedControls.x_axis_time_format,
+              default: '%d/%m/%Y',
+              description: `${D3_TIME_FORMAT_DOCS}.`,
+            },
+          },
+        ],
         [
           {
             name: 'sort_x_axis',
diff --git a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/transformProps.js b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/transformProps.js
index a6adf5f8b8..9ad6edaafd 100644
--- a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/transformProps.js
+++ b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/transformProps.js
@@ -1,5 +1,3 @@
-import { getValueFormatter } from '@superset-ui/core';
-
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,12 @@ import { getValueFormatter } from '@superset-ui/core';
  * specific language governing permissions and limitations
  * under the License.
  */
+import {
+  GenericDataType,
+  getTimeFormatter,
+  getValueFormatter,
+} from '@superset-ui/core';
+
 export default function transformProps(chartProps) {
   const { width, height, formData, queriesData, datasource } = chartProps;
   const {
@@ -38,7 +42,9 @@ export default function transformProps(chartProps) {
     yscaleInterval,
     yAxisBounds,
     yAxisFormat,
+    timeFormat,
   } = formData;
+  const { data = [], coltypes = [] } = queriesData[0];
   const { columnFormats = {}, currencyFormats = {} } = datasource;
   const valueFormatter = getValueFormatter(
     metric,
@@ -46,10 +52,18 @@ export default function transformProps(chartProps) {
     columnFormats,
     yAxisFormat,
   );
+  const xAxisFormatter =
+    coltypes[0] === GenericDataType.TEMPORAL
+      ? getTimeFormatter(timeFormat)
+      : String;
+  const yAxisFormatter =
+    coltypes[1] === GenericDataType.TEMPORAL
+      ? getTimeFormatter(timeFormat)
+      : String;
   return {
     width,
     height,
-    data: queriesData[0].data,
+    data,
     bottomMargin,
     canvasImageRendering,
     colorScheme: linearColorScheme,
@@ -67,5 +81,7 @@ export default function transformProps(chartProps) {
     yScaleInterval: parseInt(yscaleInterval, 10),
     yAxisBounds,
     valueFormatter,
+    xAxisFormatter,
+    yAxisFormatter,
   };
 }


[superset] 01/04: fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (#24995)

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

michaelsmolina pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/superset.git

commit e20c2967c4d136629913392db947a26584386c31
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Wed Aug 16 09:51:00 2023 -0700

    fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (#24995)
    
    (cherry picked from commit 2b63577046887f982a8b3a56b335f0c11288f829)
---
 .../plugin-chart-echarts/src/Timeseries/transformProps.ts | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
index 64aafc0237..e46c50331a 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
@@ -20,7 +20,6 @@
 import { invert } from 'lodash';
 import {
   AnnotationLayer,
-  AxisType,
   CategoricalColorNamespace,
   ensureIsArray,
   GenericDataType,
@@ -442,23 +441,13 @@ export default function transformProps(
       rotate: xAxisLabelRotation,
     },
     minInterval:
-      xAxisType === AxisType.time && timeGrainSqla
+      xAxisType === 'time' && timeGrainSqla
         ? TIMEGRAIN_TO_TIMESTAMP[timeGrainSqla]
         : 0,
   };
-
-  if (xAxisType === AxisType.time) {
-    /**
-     * Overriding default behavior (false) for time axis regardless of the granilarity.
-     * Not including this in the initial declaration above so if echarts changes the default
-     * behavior for other axist types we won't unintentionally override it
-     */
-    xAxis.axisLabel.showMaxLabel = null;
-  }
-
   let yAxis: any = {
     ...defaultYAxis,
-    type: logAxis ? AxisType.log : AxisType.value,
+    type: logAxis ? 'log' : 'value',
     min,
     max,
     minorTick: { show: true },


[superset] 03/04: chore: isolate examples database by default (#25003)

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

michaelsmolina pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/superset.git

commit c2c5f232c87c0ce4e9e755f5e84e79e5309e66e7
Author: Daniel Vaz Gaspar <da...@gmail.com>
AuthorDate: Thu Aug 17 11:50:24 2023 +0100

    chore: isolate examples database by default (#25003)
    
    (cherry picked from commit 269c99293f42089958dc98b5d6e5899509fc3111)
---
 docker-compose.yml                                 |  1 +
 docker/.env                                        |  6 ++++++
 docker/docker-entrypoint-initdb.d/examples-init.sh | 15 ++++++++++++++
 docker/pythonpath_dev/superset_config.py           | 24 +++++++++++++++-------
 superset/config.py                                 |  2 +-
 superset/utils/database.py                         |  6 +-----
 6 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index bd965f156a..3f9c99f21f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -47,6 +47,7 @@ services:
       - "127.0.0.1:5432:5432"
     volumes:
       - db_home:/var/lib/postgresql/data
+      - ./docker/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
 
   superset:
     env_file: docker/.env
diff --git a/docker/.env b/docker/.env
index a2e9faeacd..25bdac0ab7 100644
--- a/docker/.env
+++ b/docker/.env
@@ -22,6 +22,12 @@ DATABASE_HOST=db
 DATABASE_PASSWORD=superset
 DATABASE_USER=superset
 
+EXAMPLES_DB=examples
+EXAMPLES_HOST=db
+EXAMPLES_USER=examples
+EXAMPLES_PASSWORD=examples
+EXAMPLES_PORT=5432
+
 # database engine specific environment variables
 # change the below if you prefer another database engine
 DATABASE_PORT=5432
diff --git a/docker/docker-entrypoint-initdb.d/examples-init.sh b/docker/docker-entrypoint-initdb.d/examples-init.sh
new file mode 100755
index 0000000000..9a72907823
--- /dev/null
+++ b/docker/docker-entrypoint-initdb.d/examples-init.sh
@@ -0,0 +1,15 @@
+# ------------------------------------------------------------------------
+# Creates the examples database and repective user. This database location
+# and access credentials are defined on the environment variables
+# ------------------------------------------------------------------------
+set -e
+
+psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" <<-EOSQL
+  CREATE USER ${EXAMPLES_USER} WITH PASSWORD '${EXAMPLES_PASSWORD}';
+  CREATE DATABASE ${EXAMPLES_DB};
+  GRANT ALL PRIVILEGES ON DATABASE ${EXAMPLES_DB} TO ${EXAMPLES_USER};
+EOSQL
+
+psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" -d "${EXAMPLES_DB}" <<-EOSQL
+   GRANT ALL ON SCHEMA public TO ${EXAMPLES_USER};
+EOSQL
diff --git a/docker/pythonpath_dev/superset_config.py b/docker/pythonpath_dev/superset_config.py
index 199e79f66e..2e3c1fdda4 100644
--- a/docker/pythonpath_dev/superset_config.py
+++ b/docker/pythonpath_dev/superset_config.py
@@ -51,14 +51,24 @@ DATABASE_HOST = get_env_variable("DATABASE_HOST")
 DATABASE_PORT = get_env_variable("DATABASE_PORT")
 DATABASE_DB = get_env_variable("DATABASE_DB")
 
+EXAMPLES_USER = get_env_variable("EXAMPLES_USER")
+EXAMPLES_PASSWORD = get_env_variable("EXAMPLES_PASSWORD")
+EXAMPLES_HOST = get_env_variable("EXAMPLES_HOST")
+EXAMPLES_PORT = get_env_variable("EXAMPLES_PORT")
+EXAMPLES_DB = get_env_variable("EXAMPLES_DB")
+
+
 # The SQLAlchemy connection string.
-SQLALCHEMY_DATABASE_URI = "{}://{}:{}@{}:{}/{}".format(
-    DATABASE_DIALECT,
-    DATABASE_USER,
-    DATABASE_PASSWORD,
-    DATABASE_HOST,
-    DATABASE_PORT,
-    DATABASE_DB,
+SQLALCHEMY_DATABASE_URI = (
+    f"{DATABASE_DIALECT}://"
+    f"{DATABASE_USER}:{DATABASE_PASSWORD}@"
+    f"{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_DB}"
+)
+
+SQLALCHEMY_EXAMPLES_URI = (
+    f"{DATABASE_DIALECT}://"
+    f"{EXAMPLES_USER}:{EXAMPLES_PASSWORD}@"
+    f"{EXAMPLES_HOST}:{EXAMPLES_PORT}/{EXAMPLES_DB}"
 )
 
 REDIS_HOST = get_env_variable("REDIS_HOST")
diff --git a/superset/config.py b/superset/config.py
index 93cef69ba8..17f5bb72a2 100644
--- a/superset/config.py
+++ b/superset/config.py
@@ -1450,7 +1450,7 @@ SEND_FILE_MAX_AGE_DEFAULT = int(timedelta(days=365).total_seconds())
 
 # URI to database storing the example data, points to
 # SQLALCHEMY_DATABASE_URI by default if set to `None`
-SQLALCHEMY_EXAMPLES_URI = None
+SQLALCHEMY_EXAMPLES_URI = "sqlite:///" + os.path.join(DATA_DIR, "examples.db")
 
 # Optional prefix to be added to all static asset paths when rendering the UI.
 # This is useful for hosting assets in an external CDN, for example
diff --git a/superset/utils/database.py b/superset/utils/database.py
index 70730554f3..b34dda1164 100644
--- a/superset/utils/database.py
+++ b/superset/utils/database.py
@@ -65,11 +65,7 @@ def get_or_create_db(
 
 
 def get_example_database() -> Database:
-    db_uri = (
-        current_app.config.get("SQLALCHEMY_EXAMPLES_URI")
-        or current_app.config["SQLALCHEMY_DATABASE_URI"]
-    )
-    return get_or_create_db("examples", db_uri)
+    return get_or_create_db("examples", current_app.config["SQLALCHEMY_EXAMPLES_URI"])
 
 
 def get_main_database() -> Database: