diff --git a/superset/assets/src/chart/Chart.jsx b/superset/assets/src/chart/Chart.jsx
index f223174efa..e7c0d3f078 100644
--- a/superset/assets/src/chart/Chart.jsx
+++ b/superset/assets/src/chart/Chart.jsx
@@ -221,6 +221,7 @@ class Chart extends React.PureComponent {
}
diff --git a/superset/assets/src/components/StackTraceMessage.jsx b/superset/assets/src/components/StackTraceMessage.jsx
index ee190b7c5c..dbbfdd6dd2 100644
--- a/superset/assets/src/components/StackTraceMessage.jsx
+++ b/superset/assets/src/components/StackTraceMessage.jsx
@@ -7,9 +7,11 @@ const propTypes = {
message: PropTypes.string,
queryResponse: PropTypes.object,
showStackTrace: PropTypes.bool,
+ resolutionLink: PropTypes.string,
};
const defaultProps = {
showStackTrace: false,
+ resolutionLink: '',
};
class StackTraceMessage extends React.PureComponent {
@@ -25,6 +27,10 @@ class StackTraceMessage extends React.PureComponent {
return this.props.queryResponse && this.props.queryResponse.stacktrace;
}
+ hasLink() {
+ return this.props.queryResponse && this.props.queryResponse.link;
+ }
+
render() {
return (
@@ -33,6 +39,9 @@ class StackTraceMessage extends React.PureComponent {
onClick={() => this.setState({ showStackTrace: !this.state.showStackTrace })}
>
{this.props.message}
+ {this.hasLink() &&
+
(Request Access)
+ }
{this.hasTrace() &&
diff --git a/superset/views/base.py b/superset/views/base.py
index dc2e48f43a..d3fd1a4e06 100644
--- a/superset/views/base.py
+++ b/superset/views/base.py
@@ -41,11 +41,13 @@ def get_error_msg():
return error_msg
-def json_error_response(msg=None, status=500, stacktrace=None, payload=None):
+def json_error_response(msg=None, status=500, stacktrace=None, payload=None, link=None):
if not payload:
payload = {'error': str(msg)}
if stacktrace:
payload['stacktrace'] = stacktrace
+ if link:
+ payload['link'] = link
return Response(
json.dumps(payload, default=utils.json_iso_dttm_ser),
status=status, mimetype='application/json')
diff --git a/superset/views/core.py b/superset/views/core.py
index 14380c50ab..086c210abf 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -68,14 +68,7 @@ DATASOURCE_MISSING_ERR = __('The datasource seems to have been deleted')
ACCESS_REQUEST_MISSING_ERR = __(
'The access requests seem to have been deleted')
USER_MISSING_ERR = __('The user seems to have been deleted')
-perms_instruction_link = config.get('PERMISSION_INSTRUCTIONS_LINK')
-if perms_instruction_link:
- DATASOURCE_ACCESS_ERR = __(
- "You don't have access to this datasource. (Gain access)"
- .format(perms_instruction_link),
- )
-else:
- DATASOURCE_ACCESS_ERR = __("You don't have access to this datasource")
+DATASOURCE_ACCESS_ERR = __("You don't have access to this datasource")
FORM_DATA_KEY_BLACKLIST = []
if not config.get('ENABLE_JAVASCRIPT_CONTROLS'):
@@ -1090,7 +1083,9 @@ class Superset(BaseSupersetView):
stacktrace=traceback.format_exc())
if not security_manager.datasource_access(viz_obj.datasource, g.user):
- return json_error_response(DATASOURCE_ACCESS_ERR, status=404)
+ perms_instruction_link = config.get('PERMISSION_INSTRUCTIONS_LINK')
+ return json_error_response(
+ DATASOURCE_ACCESS_ERR, status=404, link=perms_instruction_link)
if csv:
return CsvResponse(