Now supporting multi-metric selection

This commit is contained in:
Maxime 2015-07-17 07:09:47 +00:00
parent 8b175638cd
commit d268b6b231
4 changed files with 16 additions and 20 deletions

View File

@ -1,3 +1,2 @@
# TODO
* Multi-filters
* multi-metrics

View File

@ -19,7 +19,7 @@
<hr>
<form method="GET">
<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 class="row">
<div class="form-group">

View File

@ -41,7 +41,7 @@ def form_factory(datasource, form_args=None):
viz_type = SelectField(
'Viz',
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(
'Group by', choices=[
(s, s) for s in datasource.groupby_column_names])

View File

@ -23,7 +23,9 @@ class BaseViz(object):
self.datasource = datasource
self.form_class = form_class
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.view = view
if self.df is not None:
@ -70,7 +72,7 @@ class BaseViz(object):
granularity = utils.parse_human_timedelta(granularity).total_seconds() * 1000
aggregations = {
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(
args.get("limit", config.ROW_LIMIT)) or config.ROW_LIMIT
@ -94,7 +96,7 @@ class BaseViz(object):
"type": "default",
"limit": limit,
"columns": [{
"dimension": self.metric,
"dimension": self.metrics[0],
"direction": "descending",
}],
},
@ -156,13 +158,12 @@ class TimeSeriesViz(HighchartsViz):
chart_kind = "line"
def render(self):
metric = self.metric
metrics = self.metrics
df = self.df
df = df.pivot_table(
index="timestamp",
columns=[
col for col in df.columns if col not in ["timestamp", metric]],
values=[metric])
columns=self.groupby,
values=metrics)
chart_js = serialize(
df, kind=self.chart_kind, stacked=self.stacked, **CHART_ARGS)
@ -226,13 +227,11 @@ class DistributionBarViz(HighchartsViz):
return d
def render(self):
metric = self.metric
df = self.df
df = df.pivot_table(
index=[
col for col in df.columns if col not in ['timestamp', metric]],
values=[metric])
df = df.sort(metric, ascending=False)
index=self.groupby,
values=self.metrics)
df = df.sort(self.metrics[0], ascending=False)
chart_js = serialize(
df, kind=self.chart_kind, **CHART_ARGS)
return super(DistributionBarViz, self).render(chart_js=chart_js)
@ -248,13 +247,11 @@ class DistributionPieViz(HighchartsViz):
return d
def render(self):
metric = self.metric
df = self.df
df = df.pivot_table(
index=[
col for col in df.columns if col not in ['timestamp', metric]],
values=[metric])
df = df.sort(metric, ascending=False)
index=self.groupby,
values=[self.metrics[0]])
df = df.sort(self.metrics[0], ascending=False)
chart_js = serialize(
df, kind=self.chart_kind, **CHART_ARGS)
return super(DistributionPieViz, self).render(chart_js=chart_js)