Now supporting multi-metric selection
This commit is contained in:
parent
8b175638cd
commit
d268b6b231
|
|
@ -19,7 +19,7 @@
|
||||||
<hr>
|
<hr>
|
||||||
<form method="GET">
|
<form method="GET">
|
||||||
<div>{{ form.viz_type.label }}: {{ form.viz_type(class_="form-control select2") }}</div>
|
<div>{{ form.viz_type.label }}: {{ form.viz_type(class_="form-control select2") }}</div>
|
||||||
<div>{{ form.metric.label }}: {{ form.metric(class_="form-control select2") }}</div>
|
<div>{{ form.metrics.label }}: {{ form.metrics(class_="form-control select2") }}</div>
|
||||||
<div>{{ form.granularity.label }}: {{ form.granularity(class_="form-control select2_free_granularity") }}</div>
|
<div>{{ form.granularity.label }}: {{ form.granularity(class_="form-control select2_free_granularity") }}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ def form_factory(datasource, form_args=None):
|
||||||
viz_type = SelectField(
|
viz_type = SelectField(
|
||||||
'Viz',
|
'Viz',
|
||||||
choices=[(k, v.verbose_name) for k, v in viz.viz_types.items()])
|
choices=[(k, v.verbose_name) for k, v in viz.viz_types.items()])
|
||||||
metric = SelectField('Metric', choices=datasource.metrics_combo)
|
metrics = SelectMultipleField('Metrics', choices=datasource.metrics_combo)
|
||||||
groupby = SelectMultipleField(
|
groupby = SelectMultipleField(
|
||||||
'Group by', choices=[
|
'Group by', choices=[
|
||||||
(s, s) for s in datasource.groupby_column_names])
|
(s, s) for s in datasource.groupby_column_names])
|
||||||
|
|
|
||||||
31
app/viz.py
31
app/viz.py
|
|
@ -23,7 +23,9 @@ class BaseViz(object):
|
||||||
self.datasource = datasource
|
self.datasource = datasource
|
||||||
self.form_class = form_class
|
self.form_class = form_class
|
||||||
self.form_data = form_data
|
self.form_data = form_data
|
||||||
self.metric = form_data.get('metric', 'count')
|
self.metrics = form_data.getlist('metrics') or ['count']
|
||||||
|
self.groupby = form_data.getlist('groupby') or []
|
||||||
|
|
||||||
self.df = self.bake_query()
|
self.df = self.bake_query()
|
||||||
self.view = view
|
self.view = view
|
||||||
if self.df is not None:
|
if self.df is not None:
|
||||||
|
|
@ -70,7 +72,7 @@ class BaseViz(object):
|
||||||
granularity = utils.parse_human_timedelta(granularity).total_seconds() * 1000
|
granularity = utils.parse_human_timedelta(granularity).total_seconds() * 1000
|
||||||
aggregations = {
|
aggregations = {
|
||||||
m.metric_name: m.json_obj
|
m.metric_name: m.json_obj
|
||||||
for m in ds.metrics if m.metric_name == self.metric
|
for m in ds.metrics if m.metric_name in self.metrics
|
||||||
}
|
}
|
||||||
limit = int(
|
limit = int(
|
||||||
args.get("limit", config.ROW_LIMIT)) or config.ROW_LIMIT
|
args.get("limit", config.ROW_LIMIT)) or config.ROW_LIMIT
|
||||||
|
|
@ -94,7 +96,7 @@ class BaseViz(object):
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"limit": limit,
|
"limit": limit,
|
||||||
"columns": [{
|
"columns": [{
|
||||||
"dimension": self.metric,
|
"dimension": self.metrics[0],
|
||||||
"direction": "descending",
|
"direction": "descending",
|
||||||
}],
|
}],
|
||||||
},
|
},
|
||||||
|
|
@ -156,13 +158,12 @@ class TimeSeriesViz(HighchartsViz):
|
||||||
chart_kind = "line"
|
chart_kind = "line"
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
metric = self.metric
|
metrics = self.metrics
|
||||||
df = self.df
|
df = self.df
|
||||||
df = df.pivot_table(
|
df = df.pivot_table(
|
||||||
index="timestamp",
|
index="timestamp",
|
||||||
columns=[
|
columns=self.groupby,
|
||||||
col for col in df.columns if col not in ["timestamp", metric]],
|
values=metrics)
|
||||||
values=[metric])
|
|
||||||
|
|
||||||
chart_js = serialize(
|
chart_js = serialize(
|
||||||
df, kind=self.chart_kind, stacked=self.stacked, **CHART_ARGS)
|
df, kind=self.chart_kind, stacked=self.stacked, **CHART_ARGS)
|
||||||
|
|
@ -226,13 +227,11 @@ class DistributionBarViz(HighchartsViz):
|
||||||
return d
|
return d
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
metric = self.metric
|
|
||||||
df = self.df
|
df = self.df
|
||||||
df = df.pivot_table(
|
df = df.pivot_table(
|
||||||
index=[
|
index=self.groupby,
|
||||||
col for col in df.columns if col not in ['timestamp', metric]],
|
values=self.metrics)
|
||||||
values=[metric])
|
df = df.sort(self.metrics[0], ascending=False)
|
||||||
df = df.sort(metric, ascending=False)
|
|
||||||
chart_js = serialize(
|
chart_js = serialize(
|
||||||
df, kind=self.chart_kind, **CHART_ARGS)
|
df, kind=self.chart_kind, **CHART_ARGS)
|
||||||
return super(DistributionBarViz, self).render(chart_js=chart_js)
|
return super(DistributionBarViz, self).render(chart_js=chart_js)
|
||||||
|
|
@ -248,13 +247,11 @@ class DistributionPieViz(HighchartsViz):
|
||||||
return d
|
return d
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
metric = self.metric
|
|
||||||
df = self.df
|
df = self.df
|
||||||
df = df.pivot_table(
|
df = df.pivot_table(
|
||||||
index=[
|
index=self.groupby,
|
||||||
col for col in df.columns if col not in ['timestamp', metric]],
|
values=[self.metrics[0]])
|
||||||
values=[metric])
|
df = df.sort(self.metrics[0], ascending=False)
|
||||||
df = df.sort(metric, ascending=False)
|
|
||||||
chart_js = serialize(
|
chart_js = serialize(
|
||||||
df, kind=self.chart_kind, **CHART_ARGS)
|
df, kind=self.chart_kind, **CHART_ARGS)
|
||||||
return super(DistributionPieViz, self).render(chart_js=chart_js)
|
return super(DistributionPieViz, self).render(chart_js=chart_js)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue