fix: [search query view] edit link is broken (#10128)
* fix: [search query view] edit link is broken * eslint + mypy * rever app.py changes * addressing comments * use api/v1/query * fix test
This commit is contained in:
parent
0017b61f51
commit
1781ebbaa4
|
|
@ -45,7 +45,7 @@ combine_as_imports = true
|
|||
include_trailing_comma = true
|
||||
line_length = 88
|
||||
known_first_party = superset
|
||||
known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,contextlib2,croniter,cryptography,dateutil,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,geohash,geopy,humanize,isodate,jinja2,markdown,markupsafe,marshmallow,msgpack,numpy,pandas,parsedatetime,pathlib2,polyline,prison,pyarrow,pyhive,pytz,retry,selenium,setuptools,simplejson,slack,sphinx_rtd_theme,sqlalchemy,sqlalchemy_utils,sqlparse,werkzeug,wtforms,wtforms_json,yaml
|
||||
known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,contextlib2,croniter,cryptography,dateutil,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,geohash,geopy,humanize,isodate,jinja2,markdown,markupsafe,marshmallow,msgpack,numpy,pandas,parameterized,parsedatetime,pathlib2,polyline,prison,pyarrow,pyhive,pytz,retry,selenium,setuptools,simplejson,slack,sphinx_rtd_theme,sqlalchemy,sqlalchemy_utils,sqlparse,werkzeug,wtforms,wtforms_json,yaml
|
||||
multi_line_output = 3
|
||||
order_by_type = false
|
||||
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@ export const CtasEnum = {
|
|||
TABLE: 'TABLE',
|
||||
VIEW: 'VIEW',
|
||||
};
|
||||
const ERR_MSG_CANT_LOAD_QUERY = t("The query couldn't be loaded");
|
||||
|
||||
// a map of SavedQuery field names to the different names used client-side,
|
||||
// because for now making the names consistent is too complicated
|
||||
|
|
@ -1182,7 +1183,7 @@ export function popStoredQuery(urlId) {
|
|||
}),
|
||||
),
|
||||
)
|
||||
.catch(() => dispatch(addDangerToast(t("The query couldn't be loaded"))));
|
||||
.catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));
|
||||
};
|
||||
}
|
||||
export function popSavedQuery(saveQueryId) {
|
||||
|
|
@ -1197,7 +1198,26 @@ export function popSavedQuery(saveQueryId) {
|
|||
};
|
||||
return dispatch(addQueryEditor(queryEditorProps));
|
||||
})
|
||||
.catch(() => dispatch(addDangerToast(t("The query couldn't be loaded"))));
|
||||
.catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));
|
||||
};
|
||||
}
|
||||
export function popQuery(queryId) {
|
||||
return function (dispatch) {
|
||||
return SupersetClient.get({
|
||||
endpoint: `/api/v1/query/${queryId}`,
|
||||
})
|
||||
.then(({ json }) => {
|
||||
const queryData = json.result;
|
||||
const queryEditorProps = {
|
||||
dbId: queryData.database.id,
|
||||
schema: queryData.schema,
|
||||
sql: queryData.sql,
|
||||
title: `Copy of ${queryData.tab_name}`,
|
||||
autorun: false,
|
||||
};
|
||||
return dispatch(addQueryEditor(queryEditorProps));
|
||||
})
|
||||
.catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));
|
||||
};
|
||||
}
|
||||
export function popDatasourceQuery(datasourceKey, sql) {
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@ import ResultSet from './ResultSet';
|
|||
import ModalTrigger from '../../components/ModalTrigger';
|
||||
import HighlightedSql from './HighlightedSql';
|
||||
import { fDuration } from '../../modules/dates';
|
||||
import { storeQuery } from '../../utils/common';
|
||||
import QueryStateLabel from './QueryStateLabel';
|
||||
|
||||
const propTypes = {
|
||||
|
|
@ -57,18 +56,10 @@ class QueryTable extends React.PureComponent {
|
|||
activeQuery: null,
|
||||
};
|
||||
}
|
||||
callback(url) {
|
||||
openQuery(id) {
|
||||
const url = `/superset/sqllab?queryId=${id}`;
|
||||
window.open(url);
|
||||
}
|
||||
openQuery(dbId, schema, sql) {
|
||||
const newQuery = {
|
||||
dbId,
|
||||
title: t('Untitled Query'),
|
||||
schema,
|
||||
sql,
|
||||
};
|
||||
storeQuery(newQuery).then(url => this.callback(url));
|
||||
}
|
||||
hideVisualizeModal() {
|
||||
this.setState({ showVisualizeModal: false });
|
||||
}
|
||||
|
|
@ -127,10 +118,10 @@ class QueryTable extends React.PureComponent {
|
|||
<div style={{ width: '100px' }}>
|
||||
<button
|
||||
className="btn btn-link btn-xs"
|
||||
onClick={this.openQuery.bind(this, q.dbId, q.schema, q.sql)}
|
||||
onClick={this.openQuery.bind(this, q.queryId)}
|
||||
>
|
||||
<i className="fa fa-external-link" />
|
||||
{t('Open in SQL Editor')}
|
||||
<i className="fa fa-external-link m-r-3" />
|
||||
{t('Edit')}
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ const RunQueryActionButton = ({
|
|||
runQuery = NO_OP,
|
||||
selectedText,
|
||||
stopQuery = NO_OP,
|
||||
sql,
|
||||
sql = '',
|
||||
}: Props) => {
|
||||
const runBtnText = selectedText ? t('Run Selected Query') : t('Run');
|
||||
const btnStyle = selectedText ? 'warning' : 'primary';
|
||||
|
|
|
|||
|
|
@ -108,11 +108,19 @@ class TabbedSqlEditors extends React.PureComponent {
|
|||
};
|
||||
|
||||
// Popping a new tab based on the querystring
|
||||
if (query.id || query.sql || query.savedQueryId || query.datasourceKey) {
|
||||
if (
|
||||
query.id ||
|
||||
query.sql ||
|
||||
query.savedQueryId ||
|
||||
query.datasourceKey ||
|
||||
query.queryId
|
||||
) {
|
||||
if (query.id) {
|
||||
this.props.actions.popStoredQuery(query.id);
|
||||
} else if (query.savedQueryId) {
|
||||
this.props.actions.popSavedQuery(query.savedQueryId);
|
||||
} else if (query.queryId) {
|
||||
this.props.actions.popQuery(query.queryId);
|
||||
} else if (query.datasourceKey) {
|
||||
this.props.actions.popDatasourceQuery(query.datasourceKey, query.sql);
|
||||
} else if (query.sql) {
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ class Query(Model, ExtraJSONMixin):
|
|||
"errorMessage": self.error_message,
|
||||
"executedSql": self.executed_sql,
|
||||
"id": self.client_id,
|
||||
"queryId": self.id,
|
||||
"limit": self.limit,
|
||||
"progress": self.progress,
|
||||
"rows": self.rows,
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ class QueryRestApi(BaseSupersetModelRestApi):
|
|||
"status",
|
||||
"tab_name",
|
||||
"sql_editor_id",
|
||||
"database.id",
|
||||
"schema",
|
||||
"sql",
|
||||
"select_sql",
|
||||
|
|
|
|||
|
|
@ -78,8 +78,9 @@ class QueryApiTests(SupersetTestCase):
|
|||
"""
|
||||
admin = self.get_user("admin")
|
||||
client_id = self.get_random_string()
|
||||
example_db = get_example_database()
|
||||
query = self.insert_query(
|
||||
get_example_database().id,
|
||||
example_db.id,
|
||||
admin.id,
|
||||
client_id,
|
||||
sql="SELECT col1, col2 from table1",
|
||||
|
|
@ -92,6 +93,7 @@ class QueryApiTests(SupersetTestCase):
|
|||
self.assertEqual(rv.status_code, 200)
|
||||
|
||||
expected_result = {
|
||||
"database": {"id": example_db.id},
|
||||
"client_id": client_id,
|
||||
"end_result_backend_time": None,
|
||||
"error_message": None,
|
||||
|
|
|
|||
Loading…
Reference in New Issue