diff --git a/superset/assets/javascripts/explorev2/components/SelectField.jsx b/superset/assets/javascripts/explorev2/components/SelectField.jsx
index f9686e06bd68..dacff881b15b 100644
--- a/superset/assets/javascripts/explorev2/components/SelectField.jsx
+++ b/superset/assets/javascripts/explorev2/components/SelectField.jsx
@@ -1,11 +1,11 @@
import React, { PropTypes } from 'react';
import Select, { Creatable } from 'react-select';
-
const propTypes = {
choices: PropTypes.array,
clearable: PropTypes.bool,
description: PropTypes.string,
+ editUrl: PropTypes.string,
freeForm: PropTypes.bool,
label: PropTypes.string,
multi: PropTypes.bool,
@@ -18,6 +18,7 @@ const defaultProps = {
choices: [],
clearable: true,
description: null,
+ editUrl: null,
freeForm: false,
label: null,
multi: false,
@@ -89,6 +90,9 @@ export default class SelectField extends React.Component {
return (
{selectWrap}
+ {this.props.editUrl &&
+
edit
+ }
);
}
diff --git a/superset/assets/javascripts/explorev2/stores/fields.js b/superset/assets/javascripts/explorev2/stores/fields.js
index fcc325f5df9b..14ea9a70d761 100644
--- a/superset/assets/javascripts/explorev2/stores/fields.js
+++ b/superset/assets/javascripts/explorev2/stores/fields.js
@@ -31,6 +31,7 @@ export const fields = {
label: 'Datasource',
clearable: false,
default: null,
+ editUrl: '/tablemodelview/edit',
mapStateToProps: (state) => ({
choices: state.datasources || [],
}),
diff --git a/superset/models.py b/superset/models.py
index c52373bd38c7..678564eb4a9e 100644
--- a/superset/models.py
+++ b/superset/models.py
@@ -169,7 +169,7 @@ def _user_link(self, user):
if not user:
return ''
url = '/superset/profile/{}/'.format(user.username)
- return '{}'.format(url, escape(user) or '')
+ return Markup('{}'.format(url, escape(user) or ''))
@renders('created_by')
def creator(self): # noqa
@@ -2586,6 +2586,8 @@ def wrapper(*args, **kwargs):
except:
pass
value = f(*args, **kwargs)
+
+ sesh = db.session()
log = cls(
action=f.__name__,
json=params,
@@ -2595,7 +2597,8 @@ def wrapper(*args, **kwargs):
datetime.now() - start_dttm).total_seconds() * 1000,
referrer=request.referrer[:1000] if request.referrer else None,
user_id=user_id)
- db.session.flush()
+ sesh.add(log)
+ sesh.commit()
return value
return wrapper
diff --git a/superset/viz.py b/superset/viz.py
index c15ad40ce9fa..532e629ecd96 100755
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -1187,19 +1187,6 @@ def get_df(self, query_obj=None):
dft = df.T
df = (dft / dft.sum()).T
- num_period_compare = form_data.get("num_period_compare")
- if num_period_compare:
- num_period_compare = int(num_period_compare)
- prt = form_data.get('period_ratio_type')
- if prt and prt == 'growth':
- df = (df / df.shift(num_period_compare)) - 1
- elif prt and prt == 'value':
- df = df - df.shift(num_period_compare)
- else:
- df = df / df.shift(num_period_compare)
-
- df = df[num_period_compare:]
-
rolling_periods = form_data.get("rolling_periods")
rolling_type = form_data.get("rolling_type")
@@ -1212,6 +1199,19 @@ def get_df(self, query_obj=None):
df = pd.rolling_sum(df, int(rolling_periods), min_periods=0)
elif rolling_type == 'cumsum':
df = df.cumsum()
+
+ num_period_compare = form_data.get("num_period_compare")
+ if num_period_compare:
+ num_period_compare = int(num_period_compare)
+ prt = form_data.get('period_ratio_type')
+ if prt and prt == 'growth':
+ df = (df / df.shift(num_period_compare)) - 1
+ elif prt and prt == 'value':
+ df = df - df.shift(num_period_compare)
+ else:
+ df = df / df.shift(num_period_compare)
+
+ df = df[num_period_compare:]
return df
def to_series(self, df, classed='', title_suffix=''):
diff --git a/tests/core_tests.py b/tests/core_tests.py
index 44d97b88d909..7d29b044a7fc 100644
--- a/tests/core_tests.py
+++ b/tests/core_tests.py
@@ -59,16 +59,20 @@ def test_slice_endpoint(self):
'/superset/slice/{}/?standalone=true'.format(slc.id))
assert 'List Roles' not in resp
- def test_endpoints_for_a_slice(self):
+ def test_slice_json_endpoint(self):
self.login(username='admin')
slc = self.get_slice("Girls", db.session)
- resp = self.get_resp(slc.viz.csv_endpoint)
- assert 'Jennifer,' in resp
-
resp = self.get_resp(slc.viz.json_endpoint)
assert '"Jennifer"' in resp
+ def test_slice_csv_endpoint(self):
+ self.login(username='admin')
+ slc = self.get_slice("Girls", db.session)
+
+ resp = self.get_resp(slc.viz.csv_endpoint)
+ assert 'Jennifer,' in resp
+
def test_admin_only_permissions(self):
def assert_admin_permission_in(role_name, assert_func):
role = sm.find_role(role_name)
@@ -466,6 +470,7 @@ def test_templated_sql_json(self):
def test_table_metadata(self):
maindb = self.get_main_database(db.session)
+ backend = maindb.backend
data = self.get_json_resp(
"/superset/table/{}/ab_user/null/".format(maindb.id))
self.assertEqual(data['name'], 'ab_user')
@@ -473,7 +478,6 @@ def test_table_metadata(self):
assert data.get('selectStar').startswith('SELECT')
# Engine specific tests
- backend = maindb.backend
if backend in ('mysql', 'postgresql'):
self.assertEqual(data.get('primaryKey').get('type'), 'pk')
self.assertEqual(
diff --git a/tests/sqllab_tests.py b/tests/sqllab_tests.py
index 22c06d4e1f52..1ddaf85c2bcb 100644
--- a/tests/sqllab_tests.py
+++ b/tests/sqllab_tests.py
@@ -133,19 +133,19 @@ def test_search_query_on_user(self):
self.login('admin')
# Test search queries on user Id
- user = appbuilder.sm.find_user('admin')
+ user_id = appbuilder.sm.find_user('admin').id
data = self.get_json_resp(
- '/superset/search_queries?user_id={}'.format(user.id))
+ '/superset/search_queries?user_id={}'.format(user_id))
self.assertEquals(2, len(data))
user_ids = {k['userId'] for k in data}
- self.assertEquals(set([user.id]), user_ids)
+ self.assertEquals(set([user_id]), user_ids)
- user = appbuilder.sm.find_user('gamma_sqllab')
+ user_id = appbuilder.sm.find_user('gamma_sqllab').id
resp = self.get_resp(
- '/superset/search_queries?user_id={}'.format(user.id))
+ '/superset/search_queries?user_id={}'.format(user_id))
data = json.loads(resp)
self.assertEquals(1, len(data))
- self.assertEquals(data[0]['userId'] , user.id)
+ self.assertEquals(data[0]['userId'] , user_id)
def test_search_query_on_status(self):
self.run_some_queries()