diff --git a/superset/viz.py b/superset/viz.py index 050e8bcc26b..d605b8b0068 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -131,6 +131,7 @@ class BaseViz: # pylint: disable=too-many-public-methods cache_type = "df" enforce_numerical_metrics = True + @deprecated(deprecated_in="3.0") def __init__( self, datasource: "BaseDatasource", @@ -170,9 +171,11 @@ class BaseViz: # pylint: disable=too-many-public-methods self.rejected_filters: List[Dict[str, str]] = [] @property + @deprecated(deprecated_in="3.0") def force_cached(self) -> bool: return self._force_cached + @deprecated(deprecated_in="3.0") def process_metrics(self) -> None: # metrics in Viz is order sensitive, so metric_dict should be # OrderedDict @@ -191,6 +194,7 @@ class BaseViz: # pylint: disable=too-many-public-methods self.metric_labels = list(self.metric_dict.keys()) @staticmethod + @deprecated(deprecated_in="3.0") def handle_js_int_overflow( data: Dict[str, List[Dict[str, Any]]] ) -> Dict[str, List[Dict[str, Any]]]: @@ -203,6 +207,7 @@ class BaseViz: # pylint: disable=too-many-public-methods record[k] = str(v) return data + @deprecated(deprecated_in="3.0") def run_extra_queries(self) -> None: """Lifecycle method to use when more than one query is needed @@ -225,6 +230,7 @@ class BaseViz: # pylint: disable=too-many-public-methods the underlying query(ies). """ + @deprecated(deprecated_in="3.0") def apply_rolling(self, df: pd.DataFrame) -> pd.DataFrame: rolling_type = self.form_data.get("rolling_type") rolling_periods = int(self.form_data.get("rolling_periods") or 0) @@ -252,6 +258,7 @@ class BaseViz: # pylint: disable=too-many-public-methods ) return df + @deprecated(deprecated_in="3.0") def get_samples(self) -> Dict[str, Any]: query_obj = self.query_obj() query_obj.update( @@ -273,6 +280,7 @@ class BaseViz: # pylint: disable=too-many-public-methods "coltypes": payload.get("coltypes"), } + @deprecated(deprecated_in="3.0") def get_df(self, query_obj: Optional[QueryObjectDict] = None) -> pd.DataFrame: """Returns a pandas dataframe based on the query object""" if not query_obj: @@ -322,6 +330,7 @@ class BaseViz: # pylint: disable=too-many-public-methods df.replace([np.inf, -np.inf], np.nan, inplace=True) return df + @deprecated(deprecated_in="3.0") def df_metrics_to_num(self, df: pd.DataFrame) -> None: """Converting metrics to numeric when pandas.read_sql cannot""" metrics = self.metric_labels @@ -329,12 +338,14 @@ class BaseViz: # pylint: disable=too-many-public-methods if dtype.type == np.object_ and col in metrics: df[col] = pd.to_numeric(df[col], errors="coerce") + @deprecated(deprecated_in="3.0") def process_query_filters(self) -> None: utils.convert_legacy_filters_into_adhoc(self.form_data) merge_extra_filters(self.form_data) utils.split_adhoc_filters_into_base_filters(self.form_data) @staticmethod + @deprecated(deprecated_in="3.0") def dedup_columns(*columns_args: Optional[List[Column]]) -> List[Column]: # dedup groupby and columns while preserving order labels: List[str] = [] @@ -346,6 +357,7 @@ class BaseViz: # pylint: disable=too-many-public-methods deduped_columns.append(column) return deduped_columns + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: # pylint: disable=too-many-locals """Building a query object""" self.process_query_filters() @@ -428,6 +440,7 @@ class BaseViz: # pylint: disable=too-many-public-methods } @property + @deprecated(deprecated_in="3.0") def cache_timeout(self) -> int: if self.form_data.get("cache_timeout") is not None: return int(self.form_data["cache_timeout"]) @@ -442,11 +455,13 @@ class BaseViz: # pylint: disable=too-many-public-methods return config["DATA_CACHE_CONFIG"]["CACHE_DEFAULT_TIMEOUT"] return config["CACHE_DEFAULT_TIMEOUT"] + @deprecated(deprecated_in="3.0") def get_json(self) -> str: return json.dumps( self.get_payload(), default=utils.json_int_dttm_ser, ignore_nan=True ) + @deprecated(deprecated_in="3.0") def cache_key(self, query_obj: QueryObjectDict, **extra: Any) -> str: """ The cache key is made out of the key/values in `query_obj`, plus any @@ -475,6 +490,7 @@ class BaseViz: # pylint: disable=too-many-public-methods json_data = self.json_dumps(cache_dict, sort_keys=True) return md5_sha_from_str(json_data) + @deprecated(deprecated_in="3.0") def get_payload(self, query_obj: Optional[QueryObjectDict] = None) -> VizPayload: """Returns a payload of metadata and data""" @@ -515,6 +531,7 @@ class BaseViz: # pylint: disable=too-many-public-methods payload["colnames"] = list(df.columns) return payload + @deprecated(deprecated_in="3.0") def get_df_payload( # pylint: disable=too-many-statements self, query_obj: Optional[QueryObjectDict] = None, **kwargs: Any ) -> Dict[str, Any]: @@ -639,6 +656,7 @@ class BaseViz: # pylint: disable=too-many-public-methods } @staticmethod + @deprecated(deprecated_in="3.0") def json_dumps(query_obj: Any, sort_keys: bool = False) -> str: return json.dumps( query_obj, @@ -648,6 +666,7 @@ class BaseViz: # pylint: disable=too-many-public-methods ) @staticmethod + @deprecated(deprecated_in="3.0") def has_error(payload: VizPayload) -> bool: return ( payload.get("status") == QueryStatus.FAILED @@ -655,10 +674,12 @@ class BaseViz: # pylint: disable=too-many-public-methods or bool(payload.get("errors")) ) + @deprecated(deprecated_in="3.0") def payload_json_and_has_error(self, payload: VizPayload) -> Tuple[str, bool]: return self.json_dumps(payload), self.has_error(payload) @property + @deprecated(deprecated_in="3.0") def data(self) -> Dict[str, Any]: """This is the data object serialized to the js layer""" content = { @@ -669,18 +690,22 @@ class BaseViz: # pylint: disable=too-many-public-methods } return content + @deprecated(deprecated_in="3.0") def get_csv(self) -> Optional[str]: df = self.get_df_payload()["df"] # leverage caching logic include_index = not isinstance(df.index, pd.RangeIndex) return csv.df_to_escaped_csv(df, index=include_index, **config["CSV_EXPORT"]) + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=no-self-use return df.to_dict(orient="records") @property + @deprecated(deprecated_in="3.0") def json_data(self) -> str: return json.dumps(self.data) + @deprecated(deprecated_in="3.0") def raise_for_access(self) -> None: """ Raise an exception if the user cannot access the resource. @@ -701,6 +726,7 @@ class TableViz(BaseViz): is_timeseries = False enforce_numerical_metrics = False + @deprecated(deprecated_in="3.0") def process_metrics(self) -> None: """Process form data and store parsed column configs. 1. Determine query mode based on form_data params. @@ -756,6 +782,7 @@ class TableViz(BaseViz): self.percent_columns = percent_columns self.is_timeseries = self.should_be_timeseries() + @deprecated(deprecated_in="3.0") def should_be_timeseries(self) -> bool: # TODO handle datasource-type-specific code in datasource conditions_met = ( @@ -771,6 +798,7 @@ class TableViz(BaseViz): ) return bool(self.form_data.get("include_time")) + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() if self.query_mode == QueryMode.RAW: @@ -801,6 +829,7 @@ class TableViz(BaseViz): ] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: """ Transform the query result to the table representation. @@ -833,6 +862,7 @@ class TableViz(BaseViz): ) @staticmethod + @deprecated(deprecated_in="3.0") def json_dumps(query_obj: Any, sort_keys: bool = False) -> str: return json.dumps( query_obj, @@ -851,6 +881,7 @@ class TimeTableViz(BaseViz): credits = 'a Superset original' is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() @@ -868,6 +899,7 @@ class TimeTableViz(BaseViz): return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -897,6 +929,7 @@ class PivotTableViz(BaseViz): is_timeseries = False enforce_numerical_metrics = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() groupby = self.form_data.get("groupby") @@ -938,6 +971,7 @@ class PivotTableViz(BaseViz): return query_obj @staticmethod + @deprecated(deprecated_in="3.0") def get_aggfunc( metric: str, df: pd.DataFrame, form_data: Dict[str, Any] ) -> Union[str, Callable[[Any], Any]]: @@ -950,6 +984,7 @@ class PivotTableViz(BaseViz): return aggfunc if aggfunc in ("min", "max") else "max" @staticmethod + @deprecated(deprecated_in="3.0") def _format_datetime(value: Union[pd.Timestamp, datetime, date, str]) -> str: """ Format a timestamp in such a way that the viz will be able to apply @@ -974,6 +1009,7 @@ class PivotTableViz(BaseViz): # fallback in case something incompatible is returned return cast(str, value) + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1038,6 +1074,7 @@ class TreemapViz(BaseViz): credits = 'd3.js' is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() sort_by = self.form_data.get("timeseries_limit_metric") @@ -1051,6 +1088,7 @@ class TreemapViz(BaseViz): ] return query_obj + @deprecated(deprecated_in="3.0") def _nest(self, metric: str, df: pd.DataFrame) -> List[Dict[str, Any]]: nlevels = df.index.nlevels if nlevels == 1: @@ -1062,6 +1100,7 @@ class TreemapViz(BaseViz): ] return result + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1083,6 +1122,7 @@ class CalHeatmapViz(BaseViz): credits = "cal-heatmap" is_timeseries = True + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=too-many-locals if df.empty: return None @@ -1136,6 +1176,7 @@ class CalHeatmapViz(BaseViz): "range": range_, } + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["metrics"] = self.form_data.get("metrics") @@ -1173,6 +1214,7 @@ class BubbleViz(NVD3Viz): verbose_name = _("Bubble Chart") is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["groupby"] = [self.form_data.get("entity")] @@ -1197,6 +1239,7 @@ class BubbleViz(NVD3Viz): raise QueryObjectValidationError(_("Pick a metric for x, y and size")) return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1224,6 +1267,7 @@ class BulletViz(NVD3Viz): verbose_name = _("Bullet Chart") is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: form_data = self.form_data query_obj = super().query_obj() @@ -1236,6 +1280,7 @@ class BulletViz(NVD3Viz): raise QueryObjectValidationError(_("Pick a metric to display")) return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1255,6 +1300,7 @@ class BigNumberViz(BaseViz): credits = 'a Superset original' is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() metric = self.form_data.get("metric") @@ -1264,6 +1310,7 @@ class BigNumberViz(BaseViz): self.form_data["metric"] = metric return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1289,6 +1336,7 @@ class BigNumberTotalViz(BaseViz): credits = 'a Superset original' is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() metric = self.form_data.get("metric") @@ -1312,6 +1360,7 @@ class NVD3TimeSeriesViz(NVD3Viz): is_timeseries = True pivot_fill_value: Optional[int] = None + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() sort_by = self.form_data.get( @@ -1325,6 +1374,7 @@ class NVD3TimeSeriesViz(NVD3Viz): query_obj["orderby"] = [(sort_by, is_asc)] return query_obj + @deprecated(deprecated_in="3.0") def to_series( # pylint: disable=too-many-branches self, df: pd.DataFrame, classed: str = "", title_suffix: str = "" ) -> List[Dict[str, Any]]: @@ -1386,6 +1436,7 @@ class NVD3TimeSeriesViz(NVD3Viz): chart_data.append(data) return chart_data + @deprecated(deprecated_in="3.0") def process_data(self, df: pd.DataFrame, aggregate: bool = False) -> VizData: if self.form_data.get("granularity") == "all": raise QueryObjectValidationError( @@ -1429,6 +1480,7 @@ class NVD3TimeSeriesViz(NVD3Viz): return df + @deprecated(deprecated_in="3.0") def run_extra_queries(self) -> None: time_compare = self.form_data.get("time_compare") or [] # backwards compatibility @@ -1463,6 +1515,7 @@ class NVD3TimeSeriesViz(NVD3Viz): df2 = self.process_data(df2) self._extra_chart_data.append((label, df2)) + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: comparison_type = self.form_data.get("comparison_type") or "values" df = self.process_data(df) @@ -1521,9 +1574,11 @@ class MultiLineViz(NVD3Viz): is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: return {} + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=import-outside-toplevel,too-many-locals multiline_fd = self.form_data @@ -1599,6 +1654,7 @@ class NVD3DualLineViz(NVD3Viz): sort_series = False is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() m1 = self.form_data.get("metric") @@ -1614,6 +1670,7 @@ class NVD3DualLineViz(NVD3Viz): query_obj["metrics"] = [m1, m2] return query_obj + @deprecated(deprecated_in="3.0") def to_series(self, df: pd.DataFrame, classed: str = "") -> List[Dict[str, Any]]: cols = [] for col in df.columns: @@ -1646,6 +1703,7 @@ class NVD3DualLineViz(NVD3Viz): ) return chart_data + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1680,11 +1738,13 @@ class NVD3TimePivotViz(NVD3TimeSeriesViz): sort_series = True verbose_name = _("Time Series - Period Pivot") + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["metrics"] = [self.form_data.get("metric")] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1745,6 +1805,7 @@ class HistogramViz(BaseViz): verbose_name = _("Histogram") is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: """Returns the query object for this visualization""" query_obj = super().query_obj() @@ -1762,6 +1823,7 @@ class HistogramViz(BaseViz): query_obj["metrics"] = None return query_obj + @deprecated(deprecated_in="3.0") def labelify(self, keys: Union[List[str], str], column: str) -> str: if isinstance(keys, str): keys = [keys] @@ -1772,6 +1834,7 @@ class HistogramViz(BaseViz): labels = [column] + labels return "__".join(labels) + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: """Returns the chart data""" if df.empty: @@ -1803,6 +1866,7 @@ class DistributionBarViz(BaseViz): verbose_name = _("Distribution - Bar Chart") is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() if len(query_obj["groupby"]) < len(self.form_data.get("groupby") or []) + len( @@ -1833,6 +1897,7 @@ class DistributionBarViz(BaseViz): return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=too-many-locals if df.empty: return None @@ -1894,6 +1959,7 @@ class SunburstViz(BaseViz): '@bl.ocks.org' ) + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1918,6 +1984,7 @@ class SunburstViz(BaseViz): df = df[cols] return df.to_numpy().tolist() + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["metrics"] = [self.form_data["metric"]] @@ -1938,6 +2005,7 @@ class SankeyViz(BaseViz): is_timeseries = False credits = 'd3-sankey on npm' + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() if len(query_obj["groupby"]) != 2: @@ -1949,6 +2017,7 @@ class SankeyViz(BaseViz): query_obj["orderby"] = [(query_obj["metrics"][0], False)] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -1970,10 +2039,12 @@ class SankeyViz(BaseViz): for row in recs: hierarchy[row["source"]].add(row["target"]) + @deprecated(deprecated_in="3.0") def find_cycle(graph: Dict[str, Set[str]]) -> Optional[Tuple[str, str]]: """Whether there's a cycle in a directed graph""" path = set() + @deprecated(deprecated_in="3.0") def visit(vertex: str) -> Optional[Tuple[str, str]]: path.add(vertex) for neighbour in graph.get(vertex, ()): @@ -2008,6 +2079,7 @@ class ChordViz(BaseViz): credits = 'Bostock' is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["groupby"] = [ @@ -2019,6 +2091,7 @@ class ChordViz(BaseViz): query_obj["orderby"] = [(query_obj["metrics"][0], False)] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -2047,6 +2120,7 @@ class CountryMapViz(BaseViz): is_timeseries = False credits = "From bl.ocks.org By john-guerra" + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() metric = self.form_data.get("metric") @@ -2061,6 +2135,7 @@ class CountryMapViz(BaseViz): query_obj["groupby"] = [entity] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -2082,6 +2157,7 @@ class WorldMapViz(BaseViz): is_timeseries = False credits = 'datamaps on npm' + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["groupby"] = [self.form_data["entity"]] @@ -2089,6 +2165,7 @@ class WorldMapViz(BaseViz): query_obj["orderby"] = [(query_obj["metrics"][0], False)] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -2135,7 +2212,6 @@ class WorldMapViz(BaseViz): return data -@deprecated(deprecated_in="3.0") class FilterBoxViz(BaseViz): """A multi filter, multi-choice filter box to make dashboards interactive""" @@ -2148,9 +2224,11 @@ class FilterBoxViz(BaseViz): cache_type = "get_data" filter_row_limit = 1000 + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: return {} + @deprecated(deprecated_in="3.0") def run_extra_queries(self) -> None: query_obj = super().query_obj() filters = self.form_data.get("filter_configs") or [] @@ -2175,6 +2253,7 @@ class FilterBoxViz(BaseViz): df = self.get_df_payload(query_obj=query_obj).get("df") self.dataframes[col] = df + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: filters = self.form_data.get("filter_configs") or [] data = {} @@ -2201,6 +2280,7 @@ class FilterBoxViz(BaseViz): data[col] = [] return data + @deprecated(deprecated_in="3.0") def get_query_context_factory(self) -> QueryContextFactory: if self.query_context_factory is None: # pylint: disable=import-outside-toplevel @@ -2226,6 +2306,7 @@ class ParallelCoordinatesViz(BaseViz): ) is_timeseries = False + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["groupby"] = [self.form_data.get("series")] @@ -2240,6 +2321,7 @@ class ParallelCoordinatesViz(BaseViz): ] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: return df.to_dict(orient="records") @@ -2256,6 +2338,7 @@ class HeatmapViz(BaseViz): "bl.ocks.org" ) + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["metrics"] = [self.form_data.get("metric")] @@ -2269,6 +2352,7 @@ class HeatmapViz(BaseViz): return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -2326,6 +2410,7 @@ class MapboxViz(BaseViz): is_timeseries = False credits = "Mapbox GL JS" + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() label_col = self.form_data.get("mapbox_label") @@ -2393,6 +2478,7 @@ class MapboxViz(BaseViz): ) return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -2473,9 +2559,11 @@ class DeckGLMultiLayer(BaseViz): is_timeseries = False credits = 'deck.gl' + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: return {} + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: # Late imports to avoid circular import issues # pylint: disable=import-outside-toplevel @@ -2498,14 +2586,17 @@ class BaseDeckGLViz(BaseViz): credits = 'deck.gl' spatial_control_keys: List[str] = [] + @deprecated(deprecated_in="3.0") def get_metrics(self) -> List[str]: # pylint: disable=attribute-defined-outside-init self.metric = self.form_data.get("size") return [self.metric] if self.metric else [] + @deprecated(deprecated_in="3.0") def process_spatial_query_obj(self, key: str, group_by: List[str]) -> None: group_by.extend(self.get_spatial_columns(key)) + @deprecated(deprecated_in="3.0") def get_spatial_columns(self, key: str) -> List[str]: spatial = self.form_data.get(key) if spatial is None: @@ -2522,6 +2613,7 @@ class BaseDeckGLViz(BaseViz): return [] @staticmethod + @deprecated(deprecated_in="3.0") def parse_coordinates(latlog: Any) -> Optional[Tuple[float, float]]: if not latlog: return None @@ -2534,14 +2626,17 @@ class BaseDeckGLViz(BaseViz): ) from ex @staticmethod + @deprecated(deprecated_in="3.0") def reverse_geohash_decode(geohash_code: str) -> Tuple[str, str]: lat, lng = geohash.decode(geohash_code) return (lng, lat) @staticmethod + @deprecated(deprecated_in="3.0") def reverse_latlong(df: pd.DataFrame, key: str) -> None: df[key] = [tuple(reversed(o)) for o in df[key] if isinstance(o, (list, tuple))] + @deprecated(deprecated_in="3.0") def process_spatial_data_obj(self, key: str, df: pd.DataFrame) -> pd.DataFrame: spatial = self.form_data.get(key) if spatial is None: @@ -2574,6 +2669,7 @@ class BaseDeckGLViz(BaseViz): ) return df + @deprecated(deprecated_in="3.0") def add_null_filters(self) -> None: spatial_columns = set() for key in self.spatial_control_keys: @@ -2593,6 +2689,7 @@ class BaseDeckGLViz(BaseViz): ) self.form_data["adhoc_filters"].append(filter_) + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: # add NULL filters if self.form_data.get("filter_nulls", True): @@ -2627,10 +2724,12 @@ class BaseDeckGLViz(BaseViz): query_obj["columns"] = group_by return query_obj + @deprecated(deprecated_in="3.0") def get_js_columns(self, data: Dict[str, Any]) -> Dict[str, Any]: cols = self.form_data.get("js_columns") or [] return {col: data.get(col) for col in cols} + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -2653,6 +2752,7 @@ class BaseDeckGLViz(BaseViz): "metricLabels": self.metric_labels, } + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: raise NotImplementedError() @@ -2666,6 +2766,7 @@ class DeckScatterViz(BaseDeckGLViz): spatial_control_keys = ["spatial"] is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: # pylint: disable=attribute-defined-outside-init self.is_timeseries = bool( @@ -2677,6 +2778,7 @@ class DeckScatterViz(BaseDeckGLViz): } return super().query_obj() + @deprecated(deprecated_in="3.0") def get_metrics(self) -> List[str]: # pylint: disable=attribute-defined-outside-init self.metric = None @@ -2685,6 +2787,7 @@ class DeckScatterViz(BaseDeckGLViz): return [self.metric] return [] + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: return { "metric": data.get(self.metric_label) if self.metric_label else None, @@ -2698,6 +2801,7 @@ class DeckScatterViz(BaseDeckGLViz): DTTM_ALIAS: data.get(DTTM_ALIAS), } + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: # pylint: disable=attribute-defined-outside-init self.metric_label = utils.get_metric_name(self.metric) if self.metric else None @@ -2718,12 +2822,14 @@ class DeckScreengrid(BaseDeckGLViz): spatial_control_keys = ["spatial"] is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: self.is_timeseries = bool( self.form_data.get("time_grain_sqla") or self.form_data.get("granularity") ) return super().query_obj() + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: return { "position": data.get("spatial"), @@ -2731,6 +2837,7 @@ class DeckScreengrid(BaseDeckGLViz): "__timestamp": data.get(DTTM_ALIAS) or data.get("__time"), } + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: self.metric_label = ( # pylint: disable=attribute-defined-outside-init utils.get_metric_name(self.metric) if self.metric else None @@ -2746,12 +2853,14 @@ class DeckGrid(BaseDeckGLViz): verbose_name = _("Deck.gl - 3D Grid") spatial_control_keys = ["spatial"] + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: return { "position": data.get("spatial"), "weight": (data.get(self.metric_label) if self.metric_label else None) or 1, } + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: self.metric_label = ( # pylint: disable=attribute-defined-outside-init utils.get_metric_name(self.metric) if self.metric else None @@ -2759,6 +2868,7 @@ class DeckGrid(BaseDeckGLViz): return super().get_data(df) +@deprecated(deprecated_in="3.0") def geohash_to_json(geohash_code: str) -> List[List[float]]: bbox = geohash.bbox(geohash_code) return [ @@ -2784,6 +2894,7 @@ class DeckPathViz(BaseDeckGLViz): "geohash": geohash_to_json, } + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: # pylint: disable=attribute-defined-outside-init self.is_timeseries = bool( @@ -2800,6 +2911,7 @@ class DeckPathViz(BaseDeckGLViz): query_obj["columns"].append(line_col) return query_obj + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: line_type = self.form_data["line_type"] deser = self.deser_map[line_type] @@ -2813,6 +2925,7 @@ class DeckPathViz(BaseDeckGLViz): data["__timestamp"] = data.get(DTTM_ALIAS) or data.get("__time") return data + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: self.metric_label = ( # pylint: disable=attribute-defined-outside-init utils.get_metric_name(self.metric) if self.metric else None @@ -2828,6 +2941,7 @@ class DeckPolygon(DeckPathViz): deck_viz_key = "polygon" verbose_name = _("Deck.gl - Polygon") + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: # pylint: disable=attribute-defined-outside-init self.elevation = self.form_data.get("point_radius_fixed") or { @@ -2836,12 +2950,14 @@ class DeckPolygon(DeckPathViz): } return super().query_obj() + @deprecated(deprecated_in="3.0") def get_metrics(self) -> List[str]: metrics = [self.form_data.get("metric")] if self.elevation.get("type") == "metric": metrics.append(self.elevation.get("value")) return [metric for metric in metrics if metric] + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: super().get_properties(data) elevation = self.form_data["point_radius_fixed"]["value"] @@ -2862,12 +2978,14 @@ class DeckHex(BaseDeckGLViz): verbose_name = _("Deck.gl - 3D HEX") spatial_control_keys = ["spatial"] + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: return { "position": data.get("spatial"), "weight": (data.get(self.metric_label) if self.metric_label else None) or 1, } + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: self.metric_label = ( # pylint: disable=attribute-defined-outside-init utils.get_metric_name(self.metric) if self.metric else None @@ -2882,6 +3000,7 @@ class DeckGeoJson(BaseDeckGLViz): viz_type = "deck_geojson" verbose_name = _("Deck.gl - GeoJSON") + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() query_obj["columns"] += [self.form_data.get("geojson")] @@ -2889,6 +3008,7 @@ class DeckGeoJson(BaseDeckGLViz): query_obj["groupby"] = [] return query_obj + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: geojson = data[get_column_name(self.form_data["geojson"])] return json.loads(geojson) @@ -2903,12 +3023,14 @@ class DeckArc(BaseDeckGLViz): spatial_control_keys = ["start_spatial", "end_spatial"] is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: self.is_timeseries = bool( self.form_data.get("time_grain_sqla") or self.form_data.get("granularity") ) return super().query_obj() + @deprecated(deprecated_in="3.0") def get_properties(self, data: Dict[str, Any]) -> Dict[str, Any]: dim = self.form_data.get("dimension") return { @@ -2918,12 +3040,13 @@ class DeckArc(BaseDeckGLViz): DTTM_ALIAS: data.get(DTTM_ALIAS), } + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None return { - "features": super().get_data(df)["features"], # type: ignore + "features": super().get_data(df)["features"], "mapboxApiKey": config["MAPBOX_API_KEY"], } @@ -2937,6 +3060,7 @@ class EventFlowViz(BaseViz): credits = 'from @data-ui' is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query = super().query_obj() form_data = self.form_data @@ -2956,6 +3080,7 @@ class EventFlowViz(BaseViz): return query + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: return df.to_dict(orient="records") @@ -2969,6 +3094,7 @@ class PairedTTestViz(BaseViz): sort_series = False is_timeseries = True + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() sort_by = self.form_data.get("timeseries_limit_metric") @@ -2982,6 +3108,7 @@ class PairedTTestViz(BaseViz): ] return query_obj + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: """ Transform received data frame into an object of the form: @@ -3040,13 +3167,14 @@ class RoseViz(NVD3TimeSeriesViz): sort_series = False is_timeseries = True + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None data = super().get_data(df) result: Dict[str, List[Dict[str, str]]] = {} - for datum in data: # type: ignore + for datum in data: key = datum["key"] for val in datum["values"]: timestamp = val["x"].value @@ -3073,6 +3201,7 @@ class PartitionViz(NVD3TimeSeriesViz): viz_type = "partition" verbose_name = _("Partition Diagram") + @deprecated(deprecated_in="3.0") def query_obj(self) -> QueryObjectDict: query_obj = super().query_obj() time_op = self.form_data.get("time_series_option", "not_time") @@ -3081,6 +3210,7 @@ class PartitionViz(NVD3TimeSeriesViz): return query_obj @staticmethod + @deprecated(deprecated_in="3.0") def levels_for( time_op: str, groups: List[str], df: pd.DataFrame ) -> Dict[int, pd.Series]: @@ -3098,6 +3228,7 @@ class PartitionViz(NVD3TimeSeriesViz): return levels @staticmethod + @deprecated(deprecated_in="3.0") def levels_for_diff( time_op: str, groups: List[str], df: pd.DataFrame ) -> Dict[int, pd.DataFrame]: @@ -3134,6 +3265,7 @@ class PartitionViz(NVD3TimeSeriesViz): ) return levels + @deprecated(deprecated_in="3.0") def levels_for_time( self, groups: List[str], df: pd.DataFrame ) -> Dict[int, VizData]: @@ -3145,6 +3277,7 @@ class PartitionViz(NVD3TimeSeriesViz): self.form_data["groupby"] = groups return procs + @deprecated(deprecated_in="3.0") def nest_values( self, levels: Dict[int, pd.DataFrame], @@ -3189,6 +3322,7 @@ class PartitionViz(NVD3TimeSeriesViz): for i in dim_level.index ] + @deprecated(deprecated_in="3.0") def nest_procs( self, procs: Dict[int, pd.DataFrame], @@ -3223,6 +3357,7 @@ class PartitionViz(NVD3TimeSeriesViz): for i in procs[level][dims].columns ] + @deprecated(deprecated_in="3.0") def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -3244,6 +3379,7 @@ class PartitionViz(NVD3TimeSeriesViz): return self.nest_values(levels) +@deprecated(deprecated_in="3.0") def get_subclasses(cls: Type[BaseViz]) -> Set[Type[BaseViz]]: return set(cls.__subclasses__()).union( [sc for c in cls.__subclasses__() for sc in get_subclasses(c)]