def test_crud_user(looker_client: mtds.LookerSDK): """Test creating, retrieving, updating and deleting a user. """ # Create user user = looker_client.create_user( ml.WriteUser(first_name="John", last_name="Doe", is_disabled=False, locale="fr") ) assert isinstance(user, ml.User) assert isinstance(user.id, int) assert user.first_name == "John" assert user.last_name == "Doe" assert not user.is_disabled assert user.locale == "fr" # sudo checks user_id = user.id looker_client.login_user(user_id) user = looker_client.me() assert user.first_name == "John" assert user.last_name == "Doe" looker_client.logout() user = looker_client.me() assert user.first_name != "John" assert user.last_name != "Doe" # Update user and check fields we didn't intend to change didn't change update_user = ml.WriteUser(is_disabled=True, locale="uk") looker_client.update_user(user_id, update_user) user = looker_client.user(user_id) assert user.first_name == "John" assert user.last_name == "Doe" assert user.locale == "uk" assert user.is_disabled # Update user and check fields we intended to wipe out are now None # first way to specify nulling out a field update_user = ml.WriteUser(first_name=ml.EXPLICIT_NULL) # second way update_user.last_name = ml.EXPLICIT_NULL looker_client.update_user(user_id, update_user) user = looker_client.user(user_id) assert user.first_name is None assert user.last_name is None # Try adding email creds looker_client.create_user_credentials_email( user_id, ml.WriteCredentialsEmail(email="*****@*****.**") ) user = looker_client.user(user_id) assert isinstance(user.credentials_email, ml.CredentialsEmail) assert user.credentials_email.email == "*****@*****.**" # Delete user resp = looker_client.delete_user(user_id) assert resp == "" looker_client.logout()
def test_search_users_matches_pattern(sdk: mtds.LookerSDK, users: List[Dict[str, str]], email_domain: str): """search_users should return a list of all matches. """ user = users[0] # Search by full email search_email = f'{user["first_name"]}.{user["last_name"]}{email_domain}' search_results = sdk.search_users_names(pattern=search_email) assert len(search_results) == 1 assert search_results[0].first_name == user["first_name"] assert search_results[0].last_name == user["last_name"] assert search_results[0].email == search_email # Search by first name search_results = sdk.search_users_names(pattern=user["first_name"]) assert len(search_results) > 0 assert search_results[0].first_name == user["first_name"] # First name with spaces u = sdk.create_user( ml.WriteUser(first_name="John Allen", last_name="Smith")) if u.id: search_results = sdk.search_users_names(pattern="John Allen") assert len(search_results) == 1 assert search_results[0].first_name == "John Allen" assert search_results[0].last_name == "Smith" # Delete user resp = sdk.delete_user(u.id) assert resp == ""
def find_or_create_user(*, sdk: methods.LookerSDK, first_name: str, last_name: str, email: str) -> models.User: try: users = sdk.search_users(email=email) if users: user = users[0] if (user.first_name != first_name or user.last_name != last_name or user.is_disabled): assert user.id user = sdk.update_user( user_id=user.id, body=models.WriteUser(first_name=first_name, last_name=last_name, is_disabled=False), ) else: user = sdk.create_user( models.WriteUser(first_name=first_name, last_name=last_name)) except error.SDKError as create_ex: raise RegisterError(f"Failed to find or create User ({create_ex})") return user
def create_test_users(sdk: mtds.LookerSDK, users: List[Dict[str, str]], email_domain: str): user_ids: List[int] = [] for u in users: user = sdk.create_user( ml.WriteUser(first_name=u["first_name"], last_name=u["last_name"])) if user.id: user_ids.append(user.id) email = f"{u['first_name']}.{u['last_name']}{email_domain}" sdk.create_user_credentials_email( user.id, ml.WriteCredentialsEmail(email=email)) yield for user_id in user_ids: sdk.delete_user(user_id)
def enable_users_by_hackathons(hackathons: Sequence[str]) -> Dict[str, str]: global LOOKER_GROUP_PREFIX sdk = looker_sdk.init31() groups = {g.name: g.id for g in sdk.all_groups(fields="id,name")} ret = {} for hackathon in hackathons: try: group_id = groups[f"{LOOKER_GROUP_PREFIX}{hackathon}"] except KeyError: raise RegisterError(f"No group found for hackathon: '{hackathon}'") for user in sdk.search_users(group_id=group_id): assert user.id assert user.email sdk.update_user(user_id=user.id, body=models.WriteUser(is_disabled=False)) password_reset_url = sdk.create_user_credentials_email_password_reset( user_id=user.id, expires=False).password_reset_url assert password_reset_url setup = re.sub("password/reset", "account/setup", password_reset_url) ret[user.email] = setup return ret
def disable_user(*, sdk: methods.LookerSDK, user_id: int): sdk.update_user(user_id=user_id, body=models.WriteUser(is_disabled=True))
def disable_user(user_id: int): user = models.WriteUser(is_disabled=True) sdk.update_user(user_id, body=user)
# Open the list of users from the csv file from numpy import genfromtxt import pandas as pd from looker_sdk import client, models, error file = genfromtxt("user_to_disable_ids.csv") # Create a list of user_ids user_ids = [] for row in file: user_ids.append(int(row)) print(user_ids) # client calls will now automatically authenticate using the # api3credentials specified in 'looker.ini' sdk = client.setup("looker.ini") looker_api_user = sdk.me() # Updating the user: change first_name and explicitly nullify update_user = models.WriteUser(is_disabled=True) # do not use None # update the user with the client count = 0 for user in user_ids: count += 1 updated_user = sdk.update_user(user_id=user, body=update_user) print( count, f"Disabled user:({user}) {updated_user.display_name} " f"locale:({updated_user.locale})", f"email:({updated_user.email})")