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