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/2d9f5aec492831b6478e6d6c350c2cbc to your computer and use it in GitHub Desktop.
Save divinorum-webb/2d9f5aec492831b6478e6d6c350c2cbc to your computer and use it in GitHub Desktop.
tableau-api-lib-query-project-permissions
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