From 1630cbb904c2f6c40f4048cfa1a32279af79ab79 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 12 Jun 2019 11:46:59 +0300 Subject: [PATCH] Google Sheets: friendlier error message in case of an API error and more reliable test connection (#3883) * Google Sheets: friendlier error message in case of an APIError and more reliable test connection. * Pleasing the pep8 gods --- redash/query_runner/google_spreadsheets.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/redash/query_runner/google_spreadsheets.py b/redash/query_runner/google_spreadsheets.py index f14d2d446c..908230ee97 100644 --- a/redash/query_runner/google_spreadsheets.py +++ b/redash/query_runner/google_spreadsheets.py @@ -12,6 +12,7 @@ try: import gspread + from gspread.exceptions import APIError from oauth2client.service_account import ServiceAccountCredentials enabled = True @@ -120,6 +121,17 @@ def is_url_key(key): return key.startswith('https://') +def parse_api_error(error): + error_data = error.response.json() + + if 'error' in error_data and 'message' in error_data['error']: + message = error_data['error']['message'] + else: + message = error.message + + return message + + class TimeoutSession(Session): def request(self, *args, **kwargs): kwargs.setdefault('timeout', 300) @@ -176,7 +188,13 @@ def _get_spreadsheet_service(self): return spreadsheetservice def test_connection(self): - self._get_spreadsheet_service() + service = self._get_spreadsheet_service() + test_spreadsheet_key = '1S0mld7LMbUad8LYlo13Os9f7eNjw57MqVC0YiCd1Jis' + try: + service.open_by_key(test_spreadsheet_key).worksheets() + except APIError as e: + message = parse_api_error(e) + raise Exception(message) def run_query(self, query, user): logger.debug("Spreadsheet is about to execute query: %s", query) @@ -195,6 +213,8 @@ def run_query(self, query, user): return json_dumps(data), None except gspread.SpreadsheetNotFound: return None, "Spreadsheet ({}) not found. Make sure you used correct id.".format(key) + except APIError as e: + return None, parse_api_error(e) register(GoogleSpreadsheet)