src/redash_stmo/data_sources/details/extension.py (83 lines of code) (raw):

import json import logging from redash.handlers.base import BaseResource, get_object_or_404 from redash.models import DataSource from redash.permissions import require_access, view_only from redash_stmo.resources import add_resource DATASOURCE_URLS = { "bigquery": "https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators", "Cassandra": "http://cassandra.apache.org/doc/latest/cql/index.html", "dynamodb_sql": "https://dql.readthedocs.io/en/latest/", "baseelasticsearch": "https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html", "google_spreadsheets": "http://redash.readthedocs.io/en/latest/datasources.html#google-spreadsheets", "hive": "https://cwiki.apache.org/confluence/display/Hive/LanguageManual", "impala": "http://www.cloudera.com/documentation/enterprise/latest/topics/impala_langref.html", "influxdb": "https://docs.influxdata.com/influxdb/v1.0/query_language/spec/", "jirajql": "https://confluence.atlassian.com/jirasoftwarecloud/advanced-searching-764478330.html", "mongodb": "https://docs.mongodb.com/manual/reference/operator/query/", "mssql": "https://msdn.microsoft.com/en-us/library/bb510741.aspx", "mysql": "https://dev.mysql.com/doc/refman/5.7/en/", "oracle": "http://docs.oracle.com/database/121/SQLRF/toc.htm", "pg": "https://www.postgresql.org/docs/current/", "redshift": "http://docs.aws.amazon.com/redshift/latest/dg/cm_chap_SQLCommandRef.html", "presto": "https://prestodb.io/docs/current/", "python": "http://redash.readthedocs.io/en/latest/datasources.html#python", "insecure_script": "http://redash.readthedocs.io/en/latest/datasources.html#python", "sqlite": "http://sqlite.org/lang.html", "treasuredata": "https://docs.treasuredata.com/categories/hive", "url": "http://redash.readthedocs.io/en/latest/datasources.html#url", "vertica": ( "https://my.vertica.com/docs/8.0.x/HTML/index.htm#Authoring/" "ConceptsGuide/Other/SQLOverview.htm%3FTocPath%3DSQL" "%2520Reference%2520Manual%7C_____1" ), } DATASOURCE_VERSION_PARSE_INFO = { "pg": {"version_query": "SELECT version();", "delimiter": " ", "index": 1}, "redshift": {"version_query": "SELECT version();", "delimiter": " ", "index": -1}, "mysql": { "version_query": "SELECT VERSION() AS version;", "delimiter": "-", "index": 0, }, } logger = logging.getLogger(__name__) def get_data_source_version(query_runner): parse_info = DATASOURCE_VERSION_PARSE_INFO.get(query_runner.type()) if parse_info is None: return None data, error = query_runner.run_query(parse_info["version_query"], None) if error is not None: logger.error( "Unable to run version query for %s: %s", query_runner.type(), error ) return None try: version = json.loads(data)["rows"][0]["version"] except (KeyError, IndexError) as err: logger.exception( "Unable to parse data source version for %s: %s", query_runner.type(), err ) return None version = version.split(parse_info["delimiter"])[parse_info["index"]] return version class DataSourceDetailsResource(BaseResource): def get(self, data_source_id): data_source = get_object_or_404( DataSource.get_by_id_and_org, data_source_id, self.current_org ) require_access(data_source.groups, self.current_user, view_only) try: result = { "type_name": data_source.query_runner.name(), "doc_url": DATASOURCE_URLS.get(data_source.query_runner.type(), None), "version": get_data_source_version(data_source.query_runner), } except Exception as e: return {"message": str(e), "ok": False} else: return {"message": result, "ok": True} def extension(app=None): add_resource( app, DataSourceDetailsResource, "/api/data_sources/<data_source_id>/details" )