Skip to content

Commit

Permalink
Merge pull request #1185 from uc-cdis/feat/add_extra_fields_to_admin_…
Browse files Browse the repository at this point in the history
…user_post

Feat: add extra fields to "create user" (/admin/user) endpoint
  • Loading branch information
pieterlukasse authored Nov 5, 2024
2 parents 5a3877b + bd4f3b0 commit edf5f45
Show file tree
Hide file tree
Showing 5 changed files with 525 additions and 362 deletions.
16 changes: 15 additions & 1 deletion fence/blueprints/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,22 @@ def create_user():
username = request.get_json().get("name", None)
role = request.get_json().get("role", None)
email = request.get_json().get("email", None)
display_name = request.get_json().get("display_name", None)
phone_number = request.get_json().get("phone_number", None)
idp_name = request.get_json().get("idp_name", None)
tags = request.get_json().get("tags", None)

return jsonify(
admin.create_user(current_app.scoped_session(), username, role, email)
admin.create_user(
current_app.scoped_session(),
username,
role,
email,
display_name,
phone_number,
idp_name,
tags,
)
)


Expand Down
39 changes: 38 additions & 1 deletion fence/resources/admin/admin_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
UserGoogleAccount,
UserGoogleAccountToProxyGroup,
query_for_user,
IdentityProvider,
Tag,
)
from fence.resources import group as gp, project as pj, user as us, userdatamodel as udm
from flask import current_app as capp
Expand Down Expand Up @@ -92,7 +94,16 @@ def get_user_groups(current_session, username):
return {"groups": user_groups_info}


def create_user(current_session, username, role, email):
def create_user(
current_session,
username,
role,
email,
display_name=None,
phone_number=None,
idp_name=None,
tags=None,
):
"""
Create a user for all the projects or groups in the list.
If the user already exists, to avoid unadvertedly changing it, we suggest update
Expand All @@ -102,28 +113,54 @@ def create_user(current_session, username, role, email):
raise UserError(("Error: Please provide a username"))
try:
usr = us.get_user(current_session, username)
logger.debug(f"User already exists for: {username}")
raise UserError(
(
"Error: user already exist. If this is not a"
" mistake, please, retry using update"
)
)
except NotFound:
logger.debug(f"User not found for: {username}. Checking again ignoring case...")
user_list = [
user["name"].upper() for user in get_all_users(current_session)["users"]
]
if username.upper() in user_list:
logger.debug(f"User already exists for: {username}")
raise UserError(
(
"Error: user with a name with the same combination/order "
"of characters already exists. Please remove this other user"
" or modify the new one. Contact us in case of doubt"
)
)
logger.debug(f"User does not yet exist for: {username}. Creating a new one...")
is_admin = role == "admin"
email_add = email
usr = User(username=username, active=True, is_admin=is_admin, email=email_add)
usr.display_name = display_name
usr.phone_number = phone_number

if idp_name:
logger.debug(f"User {username} idp set to {idp_name}")
idp = (
current_session.query(IdentityProvider)
.filter(IdentityProvider.name == idp_name)
.first()
)
if not idp:
idp = IdentityProvider(name=idp_name)
usr.identity_provider = idp
if tags:
logger.debug(f"Setting {len(tags)} tags for user {username}...")
for key, value in tags.items():
tag = Tag(key=key, value=value)
usr.tags.append(tag)

logger.debug(f"Adding user {username}...")
current_session.add(usr)
current_session.commit()
logger.debug(f"Success adding user {username}. Returning...")
return us.get_user_info(current_session, username)


Expand Down
Loading

0 comments on commit edf5f45

Please sign in to comment.