Minor fixes and improvments

This commit is contained in:
Maxime Beauchemin 2015-08-12 21:22:02 -07:00
parent 59efbcdead
commit 36a58e8885
5 changed files with 52 additions and 15 deletions

View File

@ -2,7 +2,7 @@ from flask.ext.appbuilder import Model
from datetime import timedelta
from flask.ext.appbuilder.models.mixins import AuditMixin
from sqlalchemy import Column, Integer, String, ForeignKey, Text, Boolean, DateTime
from sqlalchemy import create_engine, MetaData
from sqlalchemy import create_engine, MetaData, desc
from sqlalchemy import Table as sqlaTable
from sqlalchemy.orm import relationship
from dateutil.parser import parse
@ -210,11 +210,11 @@ class Table(Model, Queryable, AuditMixin):
select_exprs = [literal_column(s) for s in groupby]
groupby_exprs = [literal_column(s) for s in groupby]
inner_groupby_exprs = [literal_column(s).label('__' + s) for s in groupby]
select_exprs += metrics_exprs
if granularity != "all":
select_exprs += [timestamp]
groupby_exprs += [timestamp]
select_exprs += metrics_exprs
qry = select(select_exprs)
from_clause = table(self.table_name)
qry = qry.group_by(*groupby_exprs)
@ -231,6 +231,7 @@ class Table(Model, Queryable, AuditMixin):
cond = ~cond
where_clause_and.append(cond)
qry = qry.where(and_(*where_clause_and))
qry = qry.order_by(desc(main_metric_expr))
qry = qry.limit(row_limit)
if timeseries_limit and groupby:
@ -238,6 +239,7 @@ class Table(Model, Queryable, AuditMixin):
subq = subq.select_from(table(self.table_name))
subq = subq.where(and_(*where_clause_and))
subq = subq.group_by(*inner_groupby_exprs)
subq = subq.order_by(desc(main_metric_expr))
subq = subq.limit(timeseries_limit)
on_clause = []
for gb in groupby:

View File

@ -57,7 +57,6 @@ form input.form-control {
</div>
</div>
<div>{{ form.groupby.label }}: {{ form.groupby(class_="form-control select2") }}</div>
<div>{{ form.limit.label }}: {{ form.limit(class_="form-control select2") }}</div>
{% block extra_fields %}{% endblock %}
<hr>
<h4>Filters</h4>

View File

@ -13,6 +13,7 @@
<span class="col col-sm-4">{{ form.rolling_periods.label }}: {{ form.rolling_periods(class_="form-control") }}</span>
</div>
{% endif %}
<div>{{ form.limit.label }}: {{ form.limit(class_="form-control select2") }}</div>
{% endblock %}
{% block tail %}

View File

@ -1,11 +1,31 @@
{% extends "panoramix/datasource.html" %}
{% block head_css %}
{{super()}}
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='dataTables.bootstrap.css') }}">
{% endblock %}
{% block viz %}
{{ table|safe }}
{% endblock %}
{% block scripts %}
{% block extra_fields %}
<div>{{ form.row_limit.label }}: {{ form.row_limit(class_="form-control select2") }}</div>
{% endblock %}
{% block tail %}
{{ super() }}
<script src="{{ url_for('static', filename='jquery.dataTables.min.js') }}"></script>
<script src="{{ url_for('static', filename='dataTables.bootstrap.js') }}"></script>
<script>
$('table').css('background-color', 'white');
//$('table').css('background-color', 'white');
$(document).ready(function() {
var table = $('table').DataTable({
paging: false,
});
table.column('-1').order( 'desc' ).draw();
});
</script>
{% endblock %}

View File

@ -31,7 +31,6 @@ class OmgWtForm(Form):
def form_factory(datasource, form_args=None, extra_fields_dict=None):
extra_fields_dict = extra_fields_dict or {}
limits = [0, 5, 10, 25, 50, 100, 500]
if form_args:
limit = form_args.get("limit")
@ -54,8 +53,6 @@ def form_factory(datasource, form_args=None, extra_fields_dict=None):
granularity = TextField('Time Granularity', default="one day")
since = TextField('Since', default="one day ago")
until = TextField('Until', default="now")
limit = SelectField(
'Limit', choices=[(s, s) for s in limits])
for i in range(10):
setattr(QueryForm, 'flt_col_' + str(i), SelectField(
'Filter 1', choices=[(s, s) for s in datasource.filterable_column_names]))
@ -110,10 +107,13 @@ class BaseViz(object):
groupby = args.getlist("groupby") or []
metrics = args.getlist("metrics") or ['count']
granularity = args.get("granularity", "1 day")
granularity = utils.parse_human_timedelta(
granularity).total_seconds() * 1000
if granularity != "all":
granularity = utils.parse_human_timedelta(
granularity).total_seconds() * 1000
limit = int(
args.get("limit", config.ROW_LIMIT)) or config.ROW_LIMIT
args.get("limit", config.ROW_LIMIT))
row_limit = int(
args.get("row_limit", config.ROW_LIMIT))
since = args.get("since", "1 year ago")
from_dttm = utils.parse_human_datetime(since)
if from_dttm > datetime.now():
@ -129,6 +129,7 @@ class BaseViz(object):
'to_dttm': to_dttm,
'groupby': groupby,
'metrics': metrics,
'row_limit': row_limit,
'filter': self.query_filters(),
'timeseries_limit': limit,
}
@ -156,19 +157,29 @@ class TableViz(BaseViz):
verbose_name = "Table View"
template = 'panoramix/viz_table.html'
def render(self):
if self.df is None or self.df.empty:
df = self.df
row_limit = request.args.get("row_limit")
if df is None or df.empty:
flash("No data.", "error")
table = None
else:
if self.form_data.get("granularity") == "all":
del self.df['timestamp']
table = self.df.to_html(
if self.form_data.get("granularity") == "all" and 'timestamp' in df:
del df['timestamp']
table = df.to_html(
classes=[
'table', 'table-striped', 'table-bordered',
'table-condensed'],
index=False)
return super(TableViz, self).render(table=table)
def form_class(self):
limits = [10, 50, 100, 500, 1000, 5000, 10000]
return form_factory(self.datasource, request.args,
extra_fields_dict={
'row_limit':
SelectField('Row limit', choices=[(s, s) for s in limits])
})
class HighchartsViz(BaseViz):
verbose_name = "Base Highcharts Viz"
@ -194,6 +205,7 @@ class TimeSeriesViz(HighchartsViz):
values=metrics,)
rolling_periods = request.args.get("rolling_periods")
limit = request.args.get("limit")
rolling_type = request.args.get("rolling_type")
if rolling_periods and rolling_type:
if rolling_type == 'mean':
@ -214,6 +226,7 @@ class TimeSeriesViz(HighchartsViz):
return super(TimeSeriesViz, self).render(chart_js=chart.javascript_cmd)
def form_class(self):
limits = [0, 5, 10, 25, 50, 100, 500]
return form_factory(self.datasource, request.args,
extra_fields_dict={
#'compare': TextField('Period Compare',),
@ -221,6 +234,8 @@ class TimeSeriesViz(HighchartsViz):
'Rolling',
choices=[(s, s) for s in ['mean', 'sum', 'std']]),
'rolling_periods': TextField('Periods',),
'limit': SelectField(
'Series limit', choices=[(s, s) for s in limits])
})
def bake_query(self):