Skip to content

Commit

Permalink
Improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
mistercrunch committed Jul 21, 2015
1 parent bd1d8eb commit c6dca0f
Show file tree
Hide file tree
Showing 14 changed files with 137 additions and 101 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.pyc
*.db
tmp
local_config
7 changes: 2 additions & 5 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
# TODO
* STOCK CHART + compare time ranges
* Save a chart
* Datasource + Owner
* Column description
* compare time ranges
* Label
* CSV
* Bookmarks / url shortener
* Save / bookmark / url shortener
Binary file modified app.db
Binary file not shown.
15 changes: 0 additions & 15 deletions app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,5 @@ class MyIndexView(IndexView):
appbuilder = AppBuilder(
app, db.session, base_template='panoramix/base.html',
indexview=MyIndexView)
#appbuilder.app_name = 'Panoramix'


"""
from sqlalchemy.engine import Engine
from sqlalchemy import event
#Only include this for SQLLite constraints
@event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
# Will force sqllite contraint foreign keys
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON")
cursor.close()
"""

from app import views
8 changes: 6 additions & 2 deletions app/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from flask.ext.appbuilder import Model
from datetime import datetime, timedelta
from flask.ext.appbuilder.models.mixins import AuditMixin, FileColumn, ImageColumn
from flask.ext.appbuilder.security.sqla.models import User
from sqlalchemy import Column, Integer, String, ForeignKey, Text, Boolean
from sqlalchemy.orm import relationship
from app import db, utils
Expand All @@ -18,6 +19,9 @@ class Datasource(Model, AuditMixin):
is_hidden = Column(Boolean, default=False)
description = Column(Text)
default_endpoint = Column(Text)
user_id = Column(Integer,
ForeignKey('ab_user.id'))
owner = relationship('User', backref='datasources', foreign_keys=[user_id])

@property
def metrics_combo(self):
Expand Down Expand Up @@ -111,6 +115,7 @@ class Metric(Model):
ForeignKey('datasources.datasource_name'))
datasource = relationship('Datasource', backref='metrics')
json = Column(Text)
description = Column(Text)

@property
def json_obj(self):
Expand All @@ -132,6 +137,7 @@ class Column(Model, AuditMixin):
max = Column(Boolean, default=False)
min = Column(Boolean, default=False)
filterable = Column(Boolean, default=False)
description = Column(Text)

def __repr__(self):
return self.column_name
Expand All @@ -150,8 +156,6 @@ def generate_metrics(self):
json=json.dumps({
'type': 'count', 'name': 'count'})
))
if self.datasource.datasource_name == 'platform' and self.column_name=='subject_id':
print((self.column_name, self.type, self.isnum))

if self.sum and self.isnum:
mt = self.type.lower() + 'Sum'
Expand Down
6 changes: 5 additions & 1 deletion app/templates/appbuilder/baselayout.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</header>
{% endblock %}

<div class="container-fluid">
<div class="container">
<div class="row">
{% block messages %}
{% include 'appbuilder/flash.html' %}
Expand All @@ -20,6 +20,10 @@
{% endblock %}
</div>
</div>
<div class="container-fluid">
{% block content_fluid %}
{% endblock %}
</div>

{% block footer %}
<footer>
Expand Down
14 changes: 7 additions & 7 deletions app/templates/index.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{% extends "appbuilder/base.html" %}
{% block content %}
<div class="jumbotron">
<div class="container">
<h1>Panoramix</h1>
<p>Panoramix is an interactive visualization platform built on top of Druid.io</p>
<div class="container">
<div class="jumbotron">
<h1>Panoramix</h1>
<p>Panoramix is an interactive visualization platform built on top of Druid.io</p>
</div>
<div class="text-center">
<img width="250" src="/static/tux_panoramix.png">
</div>
</div>
<div class="text-center">
<img width="250" src="/static/tux_panoramix.png">
</div>
{% endblock %}

3 changes: 3 additions & 0 deletions app/templates/panoramix/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,8 @@
box-shadow: 0px 3px 3px #AAA;
z-index:999;
}
.panel.panel-primary {
margin: 10px;
}
</style>
{% endblock %}
10 changes: 7 additions & 3 deletions app/templates/panoramix/datasource.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,15 @@
padding-right:0;
padding-left:0;
}
form div.select2-container.form-control {
margin-bottom: 5px;
form div.form-control {
margin-bottom: 5px !important;
}
form input.form-control {
margin-bottom: 5px !important;
}
</style>
{% endblock %}
{% block content %}
{% block content_fluid %}
<div class="container-fluid">
<div class="col-md-3">
<h3>
Expand All @@ -36,6 +39,7 @@ <h3>
</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>
<div id="flt0" style="display: none;">
Expand Down
14 changes: 12 additions & 2 deletions app/templates/panoramix/viz_highcharts.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@
<div id="chart"></div>
{% endblock %}

{% block extra_fields %}
{% if form.compare %}
<div>{{ form.compare.label }}: {{ form.compare(class_="form-control") }}</div>
{% endif %}
{% if form.compare %}
<div class="row">
<span class="col col-sm-5">{{ form.rolling_type.label }}: {{ form.rolling_type(class_="form-control select2") }}</span>
<span class="col col-sm-4">{{ form.rolling_periods.label }}: {{ form.rolling_periods(class_="form-control") }}</span>
</div>
{% endif %}
{% endblock %}

{% block tail %}
{{ super() }}
{% if viz.chart_type == "stock" %}
Expand All @@ -20,8 +32,6 @@
global: {
useUTC: false
},


});
$("#viz_type").click(function(){
$("#queryform").submit();
Expand Down
68 changes: 7 additions & 61 deletions app/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,69 +7,14 @@
from flask.ext.appbuilder import ModelView, CompactCRUDMixin, BaseView, expose
from app import appbuilder, db, models, viz, utils
import config
from wtforms import Form, SelectMultipleField, SelectField, TextField
from wtforms.fields import Field


class OmgWtForm(Form):
field_order = (
'viz_type', 'granularity', 'since', 'group_by', 'limit')
def fields(self):
fields = []
for field in self.field_order:
if hasattr(self, field):
obj = getattr(self, field)
if isinstance(obj, Field):
fields.append(getattr(self, field))
return fields


def form_factory(datasource, form_args=None):
grain = ['all', 'none', 'minute', 'hour', 'day']
limits = [0, 5, 10, 25, 50, 100, 500]

if form_args:
limit = form_args.get("limit")
try:
limit = int(limit)
if limit not in limits:
limits.append(limit)
limits = sorted(limits)
except:
pass

class QueryForm(OmgWtForm):
viz_type = SelectField(
'Viz',
choices=[(k, v.verbose_name) for k, v in viz.viz_types.items()])
metrics = SelectMultipleField('Metrics', choices=datasource.metrics_combo)
groupby = SelectMultipleField(
'Group by', choices=[
(s, s) for s in datasource.groupby_column_names])
#granularity = SelectField(
# 'Time Granularity', choices=[(g, g) for g in grain])
#since = SelectField(
# 'Since', choices=[(s, s) for s in utils.since_l.keys()],
# default="all")
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]))
setattr(QueryForm, 'flt_op_' + str(i), SelectField(
'Filter 1', choices=[(m, m) for m in ['in', 'not in']]))
setattr(QueryForm, 'flt_eq_' + str(i), TextField("Super"))
return QueryForm


class ColumnInlineView(CompactCRUDMixin, ModelView):
datamodel = SQLAInterface(models.Column)
edit_columns = [
'column_name', 'datasource', 'groupby', 'count_distinct',
'sum', 'min', 'max']
'column_name', 'description', 'datasource', 'groupby',
'count_distinct', 'sum', 'min', 'max']
list_columns = [
'column_name', 'type', 'groupby', 'count_distinct',
'sum', 'min', 'max']
Expand All @@ -81,20 +26,22 @@ class MetricInlineView(CompactCRUDMixin, ModelView):
datamodel = SQLAInterface(models.Metric)
list_columns = ['metric_name', 'verbose_name', 'metric_type' ]
edit_columns = [
'metric_name', 'verbose_name', 'metric_type', 'datasource', 'json']
'metric_name', 'description', 'verbose_name', 'metric_type',
'datasource', 'json']
add_columns = [
'metric_name', 'verbose_name', 'metric_type', 'datasource', 'json']
appbuilder.add_view_no_menu(MetricInlineView)


class DatasourceModelView(ModelView):
datamodel = SQLAInterface(models.Datasource)
list_columns = ['datasource_link', 'is_featured', 'is_hidden']
list_columns = ['datasource_link', 'owner', 'is_featured', 'is_hidden']
related_views = [ColumnInlineView, MetricInlineView]
edit_columns = [
'datasource_name', 'description', 'is_featured', 'is_hidden',
'datasource_name', 'description', 'owner', 'is_featured', 'is_hidden',
'default_endpoint']
page_size = 100
order_columns = ['datasource_name']


appbuilder.add_view(
Expand All @@ -121,7 +68,6 @@ def datasource(self, datasource_name):
viz_type = "table"
obj = viz.viz_types[viz_type](
datasource,
form_class=form_factory(datasource, request.args),
form_data=request.args, view=self)
if request.args.get("json"):
return Response(
Expand Down
Loading

0 comments on commit c6dca0f

Please sign in to comment.