Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save divinorum-webb/3ec37e8669bb8b48caac9bfe4e6f3ff3 to your computer and use it in GitHub Desktop.
Save divinorum-webb/3ec37e8669bb8b48caac9bfe4e6f3ff3 to your computer and use it in GitHub Desktop.
tableau-api-lib-query-workbook-permissions.py
import pandas as pd
from tableau_api_lib import TableauServerConnection
from tableau_api_lib.sample import sample_config
from tableau_api_lib.utils import querying, flatten_dict_column, flatten_dict_list_column
# sample config
tableau_server_config = {
'tableau_env': {
'server': 'https://<YOUR_SERVER>.com',
'api_version': '<YOUR_API_VERSION>',
'username': '<YOUR_USERNAME>',
'password': '<YOUR_PASSWORD>',
'site_name': '<YOUR_SITE_NAME>',
'site_url': '<YOUR_SITE_URL>'
}
}
# configure connection and sign in
conn = TableauServerConnection(config, 'tableau_env')
conn.sign_in()
workbook_permissions_df = pd.DataFrame()
workbooks_df = querying.get_workbooks_dataframe(conn)[["project", "name", "id"]]
workbooks_df = flatten_dict_column(df=workbooks_df, keys=["id", "name"], col_name="project")
workbooks_df.rename(columns={"id": "workbook_id", "name": "workbook_name"}, inplace=True)
all_group_users_df = pd.DataFrame()
groups_df = querying.get_groups_dataframe(conn)
for index, group in groups_df.iterrows():
print(f"joining users from group '{group.id}'")
group_users_df = querying.get_group_users_dataframe(conn=conn, group_id=group.id)
group_users_df.rename(columns={"name": "user_name", "id": "user_id"}, inplace=True)
group_users_df["group_id"] = group["id"]
group_users_df["group_name"] = group["name"]
group_users_df["domain"] = group["domain"]
all_group_users_df = pd.concat([all_group_users_df, group_users_df])
# group permissions
for _, workbook in workbooks_df.iterrows():
print(f"fetching group permissions for workbook '{workbook.workbook_name}...'")
response = conn.query_workbook_permissions(workbook_id=workbook.workbook_id)
try:
permissions_df = pd.DataFrame(response.json()["permissions"]["granteeCapabilities"])
except KeyError:
print(f"skipping workbook '{workbook.workbook_name}' because no permissions rules are defined for it...")
continue
if "group" not in permissions_df.columns:
continue
permissions_df = permissions_df[permissions_df["group"].notnull()]
permissions_df = flatten_dict_column(df=permissions_df, keys=["id"], col_name="group")
permissions_df = flatten_dict_list_column(df=permissions_df, col_name="capabilities")
permissions_df = flatten_dict_column(df=permissions_df, keys=["name", "mode"], col_name="capability")
permissions_df["workbook_id"] = workbook.workbook_id
permissions_df["workbook_name"] = workbook.workbook_name
permissions_df["project_name"] = workbook.project_name
permissions_df["project_id"] = workbook.project_id
permissions_df["join_col"] = 1
workbook_permissions_df = pd.concat(
[workbook_permissions_df, permissions_df.merge(all_group_users_df, on=["group_id"])]
)
# user permissions
users_df = querying.get_users_dataframe(conn)
users_df.rename(columns={"id": "user_id", "name": "user_name"}, inplace=True)
for _, workbook in workbooks_df.iterrows():
print(f"fetching user permissions for workbook '{workbook.workbook_name}...'")
response = conn.query_workbook_permissions(workbook_id=workbook.workbook_id)
try:
permissions_df = pd.DataFrame(response.json()["permissions"]["granteeCapabilities"])
except KeyError:
print(f"skipping workbook '{workbook.workbook_name}' because no permissions rules are defined for it...")
continue
if "user" not in permissions_df.columns:
continue
permissions_df = permissions_df[permissions_df["user"].notnull()]
permissions_df = flatten_dict_column(df=permissions_df, keys=["id"], col_name="user")
permissions_df = flatten_dict_list_column(df=permissions_df, col_name="capabilities")
permissions_df = flatten_dict_column(df=permissions_df, keys=["name", "mode"], col_name="capability")
permissions_df["workbook_id"] = workbook.workbook_id
permissions_df["workbook_name"] = workbook.workbook_name
permissions_df["project_name"] = workbook.project_name
permissions_df["project_id"] = workbook.project_id
permissions_df["join_col"] = 1
workbook_permissions_df = pd.concat(
[workbook_permissions_df, permissions_df.merge(users_df, on=["user_id"])]
)
workbook_permissions_df.to_csv("workbook_permissions.csv", sep=",", header=True, index=False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment