redash/handlers/api.py (314 lines of code) (raw):
from flask import make_response
from flask_restful import Api
from werkzeug.wrappers import Response
from redash.handlers.alerts import (
AlertListResource,
AlertResource,
AlertMuteResource,
AlertSubscriptionListResource,
AlertSubscriptionResource,
)
from redash.handlers.base import org_scoped_rule
from redash.handlers.dashboards import (
MyDashboardsResource,
DashboardFavoriteListResource,
DashboardListResource,
DashboardResource,
DashboardShareResource,
DashboardTagsResource,
PublicDashboardResource,
)
from redash.handlers.data_sources import (
DataSourceListResource,
DataSourcePauseResource,
DataSourceResource,
DataSourceSchemaResource,
DataSourceTestResource,
DataSourceTypeListResource,
)
from redash.handlers.databricks import (
DatabricksDatabaseListResource,
DatabricksSchemaResource,
DatabricksTableColumnListResource,
)
from redash.handlers.destinations import (
DestinationListResource,
DestinationResource,
DestinationTypeListResource,
)
from redash.handlers.events import EventsResource
from redash.handlers.favorites import DashboardFavoriteResource, QueryFavoriteResource
from redash.handlers.groups import (
GroupDataSourceListResource,
GroupDataSourceResource,
GroupListResource,
GroupMemberListResource,
GroupMemberResource,
GroupResource,
)
from redash.handlers.permissions import (
CheckPermissionResource,
ObjectPermissionsListResource,
)
from redash.handlers.queries import (
MyQueriesResource,
QueryArchiveResource,
QueryFavoriteListResource,
QueryForkResource,
QueryListResource,
QueryRecentResource,
QueryRefreshResource,
QueryResource,
QuerySearchResource,
QueryTagsResource,
QueryRegenerateApiKeyResource,
)
from redash.handlers.query_results import (
JobResource,
QueryResultDropdownResource,
QueryDropdownsResource,
QueryResultListResource,
QueryResultResource,
)
from redash.handlers.query_snippets import (
QuerySnippetListResource,
QuerySnippetResource,
)
from redash.handlers.settings import OrganizationSettings
from redash.handlers.users import (
UserDisableResource,
UserInviteResource,
UserListResource,
UserRegenerateApiKeyResource,
UserResetPasswordResource,
UserResource,
)
from redash.handlers.visualizations import (
VisualizationListResource,
VisualizationResource,
)
from redash.handlers.widgets import WidgetListResource, WidgetResource
from redash.utils import json_dumps
from redash import settings
class ApiExt(Api):
def add_org_resource(self, resource, *urls, **kwargs):
urls = [org_scoped_rule(url) for url in urls]
if settings.ROUTE_PREFIX:
new_urls = []
for url in urls:
new_urls.append(settings.ROUTE_PREFIX + url)
urls = new_urls
return self.add_resource(resource, *urls, **kwargs)
api = ApiExt()
@api.representation("application/json")
def json_representation(data, code, headers=None):
# Flask-Restful checks only for flask.Response but flask-login uses werkzeug.wrappers.Response
if isinstance(data, Response):
return data
resp = make_response(json_dumps(data), code)
resp.headers.extend(headers or {})
return resp
api.add_org_resource(AlertResource, "/api/alerts/<alert_id>", endpoint="alert")
api.add_org_resource(
AlertMuteResource, "/api/alerts/<alert_id>/mute", endpoint="alert_mute"
)
api.add_org_resource(
AlertSubscriptionListResource,
"/api/alerts/<alert_id>/subscriptions",
endpoint="alert_subscriptions",
)
api.add_org_resource(
AlertSubscriptionResource,
"/api/alerts/<alert_id>/subscriptions/<subscriber_id>",
endpoint="alert_subscription",
)
api.add_org_resource(AlertListResource, "/api/alerts", endpoint="alerts")
api.add_org_resource(DashboardListResource, "/api/dashboards", endpoint="dashboards")
api.add_org_resource(
DashboardResource, "/api/dashboards/<dashboard_id>", endpoint="dashboard"
)
api.add_org_resource(
PublicDashboardResource,
"/api/dashboards/public/<token>",
endpoint="public_dashboard",
)
api.add_org_resource(
DashboardShareResource,
"/api/dashboards/<dashboard_id>/share",
endpoint="dashboard_share",
)
api.add_org_resource(
DataSourceTypeListResource, "/api/data_sources/types", endpoint="data_source_types"
)
api.add_org_resource(
DataSourceListResource, "/api/data_sources", endpoint="data_sources"
)
api.add_org_resource(
DataSourceSchemaResource, "/api/data_sources/<data_source_id>/schema"
)
api.add_org_resource(
DatabricksDatabaseListResource, "/api/databricks/databases/<data_source_id>"
)
api.add_org_resource(
DatabricksSchemaResource,
"/api/databricks/databases/<data_source_id>/<database_name>/tables",
)
api.add_org_resource(
DatabricksTableColumnListResource,
"/api/databricks/databases/<data_source_id>/<database_name>/columns/<table_name>",
)
api.add_org_resource(
DataSourcePauseResource, "/api/data_sources/<data_source_id>/pause"
)
api.add_org_resource(DataSourceTestResource, "/api/data_sources/<data_source_id>/test")
api.add_org_resource(
DataSourceResource, "/api/data_sources/<data_source_id>", endpoint="data_source"
)
api.add_org_resource(GroupListResource, "/api/groups", endpoint="groups")
api.add_org_resource(GroupResource, "/api/groups/<group_id>", endpoint="group")
api.add_org_resource(
GroupMemberListResource, "/api/groups/<group_id>/members", endpoint="group_members"
)
api.add_org_resource(
GroupMemberResource,
"/api/groups/<group_id>/members/<user_id>",
endpoint="group_member",
)
api.add_org_resource(
GroupDataSourceListResource,
"/api/groups/<group_id>/data_sources",
endpoint="group_data_sources",
)
api.add_org_resource(
GroupDataSourceResource,
"/api/groups/<group_id>/data_sources/<data_source_id>",
endpoint="group_data_source",
)
api.add_org_resource(EventsResource, "/api/events", endpoint="events")
api.add_org_resource(
QueryFavoriteListResource, "/api/queries/favorites", endpoint="query_favorites"
)
api.add_org_resource(
QueryFavoriteResource, "/api/queries/<query_id>/favorite", endpoint="query_favorite"
)
api.add_org_resource(
DashboardFavoriteListResource,
"/api/dashboards/favorites",
endpoint="dashboard_favorites",
)
api.add_org_resource(
DashboardFavoriteResource,
"/api/dashboards/<object_id>/favorite",
endpoint="dashboard_favorite",
)
api.add_org_resource(MyDashboardsResource, "/api/dashboards/my", endpoint="my_dashboards")
api.add_org_resource(QueryTagsResource, "/api/queries/tags", endpoint="query_tags")
api.add_org_resource(
DashboardTagsResource, "/api/dashboards/tags", endpoint="dashboard_tags"
)
api.add_org_resource(
QuerySearchResource, "/api/queries/search", endpoint="queries_search"
)
api.add_org_resource(
QueryRecentResource, "/api/queries/recent", endpoint="recent_queries"
)
api.add_org_resource(
QueryArchiveResource, "/api/queries/archive", endpoint="queries_archive"
)
api.add_org_resource(QueryListResource, "/api/queries", endpoint="queries")
api.add_org_resource(MyQueriesResource, "/api/queries/my", endpoint="my_queries")
api.add_org_resource(
QueryRefreshResource, "/api/queries/<query_id>/refresh", endpoint="query_refresh"
)
api.add_org_resource(QueryResource, "/api/queries/<query_id>", endpoint="query")
api.add_org_resource(
QueryForkResource, "/api/queries/<query_id>/fork", endpoint="query_fork"
)
api.add_org_resource(
QueryRegenerateApiKeyResource,
"/api/queries/<query_id>/regenerate_api_key",
endpoint="query_regenerate_api_key",
)
api.add_org_resource(
ObjectPermissionsListResource,
"/api/<object_type>/<object_id>/acl",
endpoint="object_permissions",
)
api.add_org_resource(
CheckPermissionResource,
"/api/<object_type>/<object_id>/acl/<access_type>",
endpoint="check_permissions",
)
api.add_org_resource(
QueryResultListResource, "/api/query_results", endpoint="query_results"
)
api.add_org_resource(
QueryResultDropdownResource,
"/api/queries/<query_id>/dropdown",
endpoint="query_result_dropdown",
)
api.add_org_resource(
QueryDropdownsResource,
"/api/queries/<query_id>/dropdowns/<dropdown_query_id>",
endpoint="query_result_dropdowns",
)
api.add_org_resource(
QueryResultResource,
"/api/query_results/<query_result_id>.<filetype>",
"/api/query_results/<query_result_id>",
"/api/queries/<query_id>/results",
"/api/queries/<query_id>/results.<filetype>",
"/api/queries/<query_id>/results/<query_result_id>.<filetype>",
endpoint="query_result",
)
api.add_org_resource(
JobResource,
"/api/jobs/<job_id>",
"/api/queries/<query_id>/jobs/<job_id>",
endpoint="job",
)
api.add_org_resource(UserListResource, "/api/users", endpoint="users")
api.add_org_resource(UserResource, "/api/users/<user_id>", endpoint="user")
api.add_org_resource(
UserInviteResource, "/api/users/<user_id>/invite", endpoint="user_invite"
)
api.add_org_resource(
UserResetPasswordResource,
"/api/users/<user_id>/reset_password",
endpoint="user_reset_password",
)
api.add_org_resource(
UserRegenerateApiKeyResource,
"/api/users/<user_id>/regenerate_api_key",
endpoint="user_regenerate_api_key",
)
api.add_org_resource(
UserDisableResource, "/api/users/<user_id>/disable", endpoint="user_disable"
)
api.add_org_resource(
VisualizationListResource, "/api/visualizations", endpoint="visualizations"
)
api.add_org_resource(
VisualizationResource,
"/api/visualizations/<visualization_id>",
endpoint="visualization",
)
api.add_org_resource(WidgetListResource, "/api/widgets", endpoint="widgets")
api.add_org_resource(WidgetResource, "/api/widgets/<int:widget_id>", endpoint="widget")
api.add_org_resource(
DestinationTypeListResource, "/api/destinations/types", endpoint="destination_types"
)
api.add_org_resource(
DestinationResource, "/api/destinations/<destination_id>", endpoint="destination"
)
api.add_org_resource(
DestinationListResource, "/api/destinations", endpoint="destinations"
)
api.add_org_resource(
QuerySnippetResource, "/api/query_snippets/<snippet_id>", endpoint="query_snippet"
)
api.add_org_resource(
QuerySnippetListResource, "/api/query_snippets", endpoint="query_snippets"
)
api.add_org_resource(
OrganizationSettings, "/api/settings/organization", endpoint="organization_settings"
)