diff --git a/panoramix/highchart.py b/panoramix/highchart.py
index 295d80537920e..9f3cf2d48d186 100644
--- a/panoramix/highchart.py
+++ b/panoramix/highchart.py
@@ -16,7 +16,6 @@ def json(self):
.replace("\n", " ")
)
-
@property
def javascript_cmd(self):
js = self.json
diff --git a/panoramix/models.py b/panoramix/models.py
index 575764dc79266..20197e90cefbe 100644
--- a/panoramix/models.py
+++ b/panoramix/models.py
@@ -33,15 +33,17 @@ class Slice(Model, AuditMixin):
__tablename__ = 'slices'
id = Column(Integer, primary_key=True)
slice_name = Column(String(250))
- datasource_id = Column(Integer, ForeignKey('datasources.id'))
+ druid_datasource_id = Column(Integer, ForeignKey('datasources.id'))
table_id = Column(Integer, ForeignKey('tables.id'))
datasource_type = Column(String(200))
datasource_name = Column(String(2000))
viz_type = Column(String(250))
params = Column(Text)
- table = relationship('Table', backref='slices')
- druid_datasource = relationship('Datasource', backref='slices')
+ table = relationship(
+ 'Table', foreign_keys=[table_id], backref='slices')
+ druid_datasource = relationship(
+ 'Datasource', foreign_keys=[druid_datasource_id], backref='slices')
def __repr__(self):
return self.slice_name
@@ -50,6 +52,11 @@ def __repr__(self):
def datasource(self):
return self.table or self.druid_datasource
+ @property
+ def datasource_id(self):
+ datasource = self.datasource
+ return datasource.id if datasource else None
+
@property
def slice_link(self):
d = json.loads(self.params)
@@ -69,6 +76,9 @@ def css_files(self):
from panoramix.viz import viz_types
return viz_types[self.viz_type].css_files
+ def get_viz(self):
+ pass
+
dashboard_slices = Table('dashboard_slices', Model.metadata,
Column('id', Integer, primary_key=True),
diff --git a/panoramix/templates/panoramix/dashboard.html b/panoramix/templates/panoramix/dashboard.html
index d56ea6f8c0d1f..23fc55519a3ba 100644
--- a/panoramix/templates/panoramix/dashboard.html
+++ b/panoramix/templates/panoramix/dashboard.html
@@ -73,7 +73,7 @@
{{ slice.slice_name }}
widget_base_dimensions: [150, 150],
resize: {enabled: true}
});
- var url = "/panoramix/table/2/?flt_col_0=gender&datasource_id=2&flt_op_0=in&viz_type=pie&since=50%20years%20ago&until=now&metrics=total&limit=10&granularity=one%20day&datasource_name=baby_names&slice_name=Pie&where=&groupby=name&flt_eq_0=&datasource_type=table&standalone=true&skip_libs=true";
+ var url = "/panoramix/table/2/?flt_col_0=gender&rolling_periods=&datasource_id=2&flt_op_0=in&slice_name=Super%20Slice&viz_type=line&since=50%20years%20ago&groupby=name&metrics=total&limit=25&flt_eq_0=&granularity=one%20day&datasource_name=baby_names&where=&until=now&rolling_type=mean&datasource_type=table&skip_libs=true&standalone=true";
$.ajax({
url: url,
success: function(result){
@@ -81,7 +81,7 @@ {{ slice.slice_name }}
},
async: true,
});
- var url = "/panoramix/table/2/?flt_col_0=gender&rolling_periods=&datasource_id=2&flt_op_0=in&slice_name=Super%20Slice&viz_type=line&since=50%20years%20ago&groupby=name&metrics=total&limit=25&flt_eq_0=&granularity=one%20day&datasource_name=baby_names&where=&until=now&rolling_type=mean&datasource_type=table&standalone=true&skip_libs=true";
+ var url = "/panoramix/table/2/?flt_col_0=gender&datasource_id=2&flt_op_0=in&viz_type=pie&since=50%20years%20ago&until=now&metrics=total&limit=10&granularity=one%20day&datasource_name=baby_names&slice_name=Pie&where=&groupby=name&flt_eq_0=&datasource_type=table&skip_libs=true&standalone=true";
$.ajax({
url: url,
success: function(result){
diff --git a/panoramix/templates/panoramix/viz_highcharts.html b/panoramix/templates/panoramix/viz_highcharts.html
index 25a78f4e067ba..140e2e25cfbe2 100644
--- a/panoramix/templates/panoramix/viz_highcharts.html
+++ b/panoramix/templates/panoramix/viz_highcharts.html
@@ -1,8 +1,7 @@
{% macro viz_html(viz) %}
-
-
-
![]({{ url_for()
-
+
+
![]({{ url_for()
+
{% endmacro %}
{% macro viz_js(viz) %}
@@ -24,10 +23,11 @@
console.log(url);
$.getJSON(url, function(data){
console.log(data);
- new Highcharts.{{ viz.chart_call }}(data);
+ $("#{{ viz.token }}").highcharts('{{ viz.chart_call }}', data);
})
- .fail(function() {
- console.log( "error" );
+ .fail(function(xhr) {
+ var err = '' + xhr.responseText + '
';
+ $("#{{ viz.token }}").html(err);
});
});
diff --git a/panoramix/templates/panoramix/viz_table.html b/panoramix/templates/panoramix/viz_table.html
index fa3a2d3a6ddd8..b08a147048f95 100644
--- a/panoramix/templates/panoramix/viz_table.html
+++ b/panoramix/templates/panoramix/viz_table.html
@@ -26,7 +26,7 @@
{% else %}
-
+
![]({{ url_for()
{% endif %}
@@ -37,13 +37,13 @@
{% endif %}
diff --git a/panoramix/views.py b/panoramix/views.py
index 2bee21d33f53e..a1ca23a3a5022 100644
--- a/panoramix/views.py
+++ b/panoramix/views.py
@@ -220,9 +220,15 @@ def table(self, table_id):
table,
form_data=request.args, view=self)
if request.args.get("json") == "true":
+ try:
+ payload = obj.get_json()
+ status=200
+ except Exception as e:
+ payload = str(e)
+ status=500
return Response(
- obj.get_json(),
- #status=200,
+ payload,
+ status=status,
mimetype="application/json")
else:
return self.render_template("panoramix/viz.html", viz=obj)
diff --git a/panoramix/viz.py b/panoramix/viz.py
index 0fcf66bc087b1..6c498ea1d8b7f 100644
--- a/panoramix/viz.py
+++ b/panoramix/viz.py
@@ -3,7 +3,7 @@
import pandas as pd
from collections import OrderedDict
import config
-import logging
+import uuid
import numpy as np
from panoramix import utils
@@ -11,9 +11,7 @@
from panoramix.forms import form_factory
CHART_ARGS = {
- #'height': 700,
'title': None,
- 'target_div': 'chart',
}
@@ -28,6 +26,7 @@ class BaseViz(object):
css_files = []
def __init__(self, datasource, form_data, view):
+ self.token = form_data.get('token', 'token_' + uuid.uuid4().hex[:8])
self.datasource = datasource
self.view = view
self.form_data = form_data
@@ -97,7 +96,7 @@ def query_obj(self):
to_dttm = utils.parse_human_datetime(until)
if from_dttm >= to_dttm:
flash("The date range doesn't seem right.", "danger")
- from_dttm = to_dttm # Making them identicial to not raise
+ from_dttm = to_dttm # Making them identical to not raise
# extras are used to query elements specific to a datasource type
# for instance the extra where clause that applies only to Tables
@@ -183,16 +182,20 @@ def query_obj(self):
raise Exception("Pick a metric for x, y and size")
return d
- def render(self):
- df = self.df.fillna(0)
+ def get_df(self):
+ df = super(BubbleViz, self).get_df()
+ df = df.fillna(0)
df['x'] = df[[self.x_metric]]
df['y'] = df[[self.y_metric]]
df['z'] = df[[self.z_metric]]
df['name'] = df[[self.entity]]
df['group'] = df[[self.series]]
+ return df
+
+ def get_json(self):
+ df = self.get_df()
chart = HighchartBubble(df)
- self.chart_js = chart.javascript_cmd
- return super(BubbleViz, self).render()
+ return chart.json
class TimeSeriesViz(HighchartsViz):