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 # TODO
* Multi-filters * Multi-filters
* multi-metrics

View File

@ -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">

View File

@ -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])

View File

@ -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)