@@ -1037,6 +1037,11 @@ def _find_user_group_url(self, assignable_user_groups, user_group_name):
10371037 if user_group ['name' ] == user_group_name :
10381038 return user_group ['usergroup' ]
10391039
1040+ def _find_user_url (self , assignable_user , user_name ):
1041+ for user in assignable_user ['items' ]:
1042+ if user ['name' ] == user_name :
1043+ return user ['user' ]
1044+
10401045 def _project_role_urls (self , project_role_names ):
10411046 all_project_roles = self .get_project_roles ()
10421047 project_role_urls = list ()
@@ -1099,8 +1104,61 @@ def assign_user_group_to_project(self, project_name, user_group_name, project_ro
10991104 else :
11001105 logging .warning ("Did not find a project by the name {}" .format (project_name ))
11011106
1102- def assign_user_to_project (self , user_name , project_name , project_roles_l ):
1103- pass
1107+ def assign_user_to_project (self , user_name , project_name , project_roles , limit = 1000 ):
1108+ # Assign users to projects
1109+ project = self .get_project_by_name (project_name )
1110+
1111+ if project :
1112+ project_url = project ['_meta' ]['href' ]
1113+ assignable_users_link = self .get_link (project , 'assignable-users' )
1114+ paramstring = self .get_limit_paramstring (limit )
1115+ url = assignable_users_link + paramstring
1116+ logging .debug ("GET {}" .format (url ))
1117+ if assignable_users_link :
1118+ assignable_users_response = self .execute_get (url )
1119+ assignable_users = assignable_users_response .json ()
1120+
1121+ # TODO: What to do if the user is already assigned to the project, and therefore
1122+ # does not appear in the list of 'assignable' user? Should we search the (assigned) user
1123+ # and re-apply the project-roles to the assignment?
1124+
1125+ user_url = self ._find_user_url (assignable_users , user_name )
1126+ if user_url :
1127+ headers = self .get_headers ()
1128+
1129+ # need project role urls to build the POST payload
1130+ project_roles_urls = self ._project_role_urls (project_roles )
1131+
1132+ # The POST endpoint changes based on whether we found any project-roles to assign
1133+ # Also, due to what appears to be a defect, the Content-Type changes
1134+ if project_roles_urls :
1135+ url = user_url + "/roles"
1136+ # one dict per project role assignment
1137+ post_data = [{'role' : r , 'scope' : project_url } for r in project_roles_urls ]
1138+ # I found I had to use this Content-Type (application/json resulted in 412)
1139+ # ref: https://jira.dc1.lan/browse/HUB-18417
1140+ headers ['Content-Type' ] = 'application/vnd.blackducksoftware.internal-1+json'
1141+ else :
1142+ url = project_url + "/users"
1143+ # Assigning a user with no project-roles
1144+ post_data = {"user" : user_url }
1145+ headers ['Content-Type' ] = 'application/json'
1146+
1147+ response = requests .post (
1148+ url ,
1149+ headers = headers ,
1150+ data = json .dumps (post_data ),
1151+ verify = not self .config ['insecure' ])
1152+ return response
1153+ else :
1154+ assignable_username = [u ['name' ] for u in assignable_users ['items' ]]
1155+ logging .warning (
1156+ "The user {} was not found in the assignable user ({}) for this project {}. Is the user already assigned to this project?" .format (
1157+ user_name , assignable_username , project_name ))
1158+ else :
1159+ logging .warning ("This project {} has no assignable users" .format (project_name ))
1160+ else :
1161+ logging .warning ("Did not find a project by the name {}" .format (project_name ))
11041162
11051163 def assign_project_application_id (self , project_name , application_id , overwrite = False ):
11061164 logging .debug ("Assigning application_id {} to project_name {}, overwrite={}" .format (
0 commit comments