Merge pull request #4104 from okriuchykhin/ok_SCI_6823

Update user invitations with new user roles [SCI-6823]
This commit is contained in:
Alex Kriuchykhin 2022-05-24 10:32:11 +02:00 committed by GitHub
commit 4977756e3a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 45 deletions

View file

@ -143,11 +143,11 @@
switch (type) {
case 'invite_to_team':
data.team_ids = [modal.attr('data-team-id')];
data.role = $(this).attr('data-team-role');
data.role_id = $(this).attr('data-team-role-id');
break;
case 'invite_to_team_with_role':
data.team_ids = [modal.attr('data-team-id')];
data.role = modal.attr('data-team-role');
data.role_id = modal.attr('data-team-role-id');
break;
case 'invite':
data.team_ids = [];
@ -155,13 +155,13 @@
case 'invite_with_team_selector':
if (teamSelectorCheckbox.is(':checked')) {
data.team_ids = [teamSelectorDropdown.val()];
data.role = $(this).attr('data-team-role');
data.role_id = $(this).attr('data-team-role-id');
}
break;
case 'invite_with_team_selector_and_role':
if (teamSelectorCheckbox.is(':checked')) {
data.team_ids = [teamSelectorDropdown.val()];
data.role = modal.attr('data-team-role');
data.role_id = modal.attr('data-team-role-id');
}
break;
default:

View file

@ -25,12 +25,6 @@ module Users
if user.errors.blank?
@team.created_by = user
@team.save
UserTeam.create(
user: user,
team: @team,
role: 'admin'
)
end
end
end
@ -77,7 +71,7 @@ module Users
next
end
# Check if user already exists
user = User.find_by_email(email)
user = User.find_by(email: email)
if user
result[:status] = :user_exists
@ -101,24 +95,19 @@ module Users
end
if @teams.any? && user
@user_role ||= UserRole.find_by(name: UserRole.public_send('normal_user_role').name)
@teams.each do |team|
user_team = UserTeam.find_by(user_id: user.id, team_id: team.id)
if user_team
if team.user_assignments.exists?(user: user)
result[:status] = :user_exists_and_in_team
else
# Also generate user team relation
user_team = UserTeam.new(
user: user,
team: team,
role: @role || 'normal_user'
)
user_team.save
team.user_assignments.create(user: user, user_role: @user_role, assigned_by: current_user)
generate_notification(
@user,
user,
user_team.team,
user_team.role_str
team,
@user_role.name
)
Activities::CreateActivityService
@ -129,7 +118,7 @@ module Users
message_items: {
team: team.id,
user_invited: user.id,
role: user_team.role_str
role: @user_role.name
})
result[:status] = if result[:status] == :user_exists && !user.confirmed?
@ -141,8 +130,8 @@ module Users
end
end
result[:user_team] = user_team
result[:team] = team
result[:user_role_name] = @user_role.name
result[:team_name] = team.name
end
end
@ -163,8 +152,9 @@ module Users
def invitable_teams
teams = current_user.teams
.select(:id, :name)
.joins(:user_teams)
.where('user_teams.role': UserTeam.roles[:admin])
.joins(user_assignments: :user_role)
.where(user_assignments: { user: current_user })
.where('? = ANY(user_roles.permissions)', TeamPermissions::USERS_MANAGE)
.distinct
teams = teams.where_attributes_like(:name, params[:query]) if params[:query].present?
@ -207,10 +197,9 @@ module Users
@teams = Team.where(id: params[:team_ids]).select { |team| can_manage_team_users?(team) }
return render_403 if params[:team_ids].present? && @teams.blank?
@role = params['role']
@user_role = UserRole.find_by(id: params[:role_id])
return render_403 if @emails.blank? # We must have at least one email
return render_403 if @role && !UserTeam.roles.key?(@role) # if we select role, we must check that this role exist
end
end
end

View file

@ -6,4 +6,14 @@ module UserRolesHelper
@user_roles_collection ||= UserRole.order(id: :asc).pluck(:name, :id)
end
end
def team_user_roles_collection
team_permissions =
PermissionExtends::TeamPermissions.constants.map { |const| TeamPermissions.const_get(const) } +
ProtocolPermissions.constants.map { |const| ProtocolPermissions.const_get(const) } +
RepositoryPermissions.constants.map { |const| RepositoryPermissions.const_get(const) }
UserRole.where('permissions && ARRAY[?]::varchar[]', team_permissions)
.sort_by { |user_role| (user_role.permissions & team_permissions).length }
.reverse!
end
end

View file

@ -157,15 +157,13 @@ invite_with_team_selector = type.in?(%w(invite_new_members invite_with_team_sele
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li>
<%= link_to t('invite_users.invite_guest'), '#', data: { action: 'invite', 'team-role' => 'guest', remote: true } %>
</li>
<li>
<%= link_to t('invite_users.invite_user'), '#', data: { action: 'invite', 'team-role' => 'normal_user', remote: true } %>
</li>
<li>
<%= link_to t('invite_users.invite_admin'), '#', data: { action: 'invite', 'team-role' => 'admin', remote: true } %>
</li>
<% team_user_roles_collection.each do |user_role| %>
<li>
<%= link_to '#', data: { action: 'invite', 'team-role-id' => user_role.id, remote: true } do %>
<%= t('invite_users.invite_as', role: user_role.name.pluralize) %>
<% end %>
</li>
<% end %>
</ul>
</div>
</div>

View file

@ -15,24 +15,24 @@
<strong><%= result[:email] %></strong>
&nbsp;-&nbsp;
<%= t('invite_users.results.user_exists_and_in_team',
team: result[:team].name,
role: t("user_teams.enums.role.#{result[:user_team].role}")) %>
team: result[:team_name],
role: result[:user_role_name]) %>
</div>
<% elsif result[:status] == :user_exists_unconfirmed_invited_to_team %>
<div class="alert alert-info" role="alert">
<strong><%= result[:email] %></strong>
&nbsp;-&nbsp;
<%= t('invite_users.results.user_exists_unconfirmed_invited_to_team',
team: result[:team].name,
role: t("user_teams.enums.role.#{result[:user_team].role}")) %>
team: result[:team_name],
role: result[:user_role_name]) %>
</div>
<% elsif result[:status] == :user_exists_invited_to_team %>
<div class="alert alert-info" role="alert">
<strong><%= result[:email] %></strong>
&nbsp;-&nbsp;
<%= t('invite_users.results.user_exists_invited_to_team',
team: result[:team].name,
role: t("user_teams.enums.role.#{result[:user_team].role}")) %>
team: result[:team_name],
role: result[:user_role_name]) %>
</div>
<% elsif result[:status] == :user_created %>
<div class="alert alert-success" role="alert">
@ -45,8 +45,8 @@
<strong><%= result[:email] %></strong>
&nbsp;-&nbsp;
<%= t('invite_users.results.user_created_invited_to_team',
team: result[:team].name,
role: t("user_teams.enums.role.#{result[:user_team].role}")) %>
team: result[:team_name],
role: result[:user_role_name]) %>
</div>
<% elsif result[:status] == :user_invalid %>
<div class="alert alert-danger" role="alert">

View file

@ -2580,6 +2580,7 @@ en:
input_subtitle: "You can enter one or more emails. To confirm each one press the ENTER key."
invite_to_team_heading: "Invite users to my team:"
invite_btn: "Invite members"
invite_as: "As %{role}"
invite_guest: "As Guests"
invite_user: "As Normal Users"
invite_admin: "As Administrators"