Created
August 17, 2022 20:07
-
-
Save divinorum-webb/2d9f5aec492831b6478e6d6c350c2cbc to your computer and use it in GitHub Desktop.
tableau-api-lib-query-project-permissions
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, "devyx") | |
conn.sign_in() | |
project_permissions_df = pd.DataFrame() | |
projects_df = querying.get_projects_dataframe(conn)[["name", "id", "contentPermissions"]] | |
projects_df.rename(columns={"id": "project_id", "name": "project_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 _, project in projects_df.iterrows(): | |
print(f"fetching group permissions for project '{project.project_name}...'") | |
response = conn.query_project_permissions(project_id=project.project_id) | |
try: | |
permissions_df = pd.DataFrame(response.json()["permissions"]["granteeCapabilities"]) | |
except KeyError: | |
print(f"skipping project '{project.project_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["project_name"] = project.project_name | |
permissions_df["project_id"] = project.project_id | |
permissions_df["join_col"] = 1 | |
project_permissions_df = pd.concat( | |
[project_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 _, project in projects_df.iterrows(): | |
print(f"fetching user permissions for project '{project.project_name}...'") | |
response = conn.query_project_permissions(project_id=project.project_id) | |
try: | |
permissions_df = pd.DataFrame(response.json()["permissions"]["granteeCapabilities"]) | |
except KeyError: | |
print(f"skipping project '{project.project_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["project_name"] = project.project_name | |
permissions_df["project_id"] = project.project_id | |
permissions_df["join_col"] = 1 | |
project_permissions_df = pd.concat( | |
[project_permissions_df, permissions_df.merge(users_df, on=["user_id"])] | |
) | |
project_permissions_df.to_csv("project_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