Last active
July 23, 2022 19:01
-
-
Save divinorum-webb/3ec37e8669bb8b48caac9bfe4e6f3ff3 to your computer and use it in GitHub Desktop.
tableau-api-lib-query-workbook-permissions.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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