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

View file

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

View file

@ -6,4 +6,14 @@ module UserRolesHelper
@user_roles_collection ||= UserRole.order(id: :asc).pluck(:name, :id) @user_roles_collection ||= UserRole.order(id: :asc).pluck(:name, :id)
end end
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 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> <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li> <% team_user_roles_collection.each do |user_role| %>
<%= link_to t('invite_users.invite_guest'), '#', data: { action: 'invite', 'team-role' => 'guest', remote: true } %> <li>
</li> <%= link_to '#', data: { action: 'invite', 'team-role-id' => user_role.id, remote: true } do %>
<li> <%= t('invite_users.invite_as', role: user_role.name.pluralize) %>
<%= link_to t('invite_users.invite_user'), '#', data: { action: 'invite', 'team-role' => 'normal_user', remote: true } %> <% end %>
</li> </li>
<li> <% end %>
<%= link_to t('invite_users.invite_admin'), '#', data: { action: 'invite', 'team-role' => 'admin', remote: true } %>
</li>
</ul> </ul>
</div> </div>
</div> </div>

View file

@ -15,24 +15,24 @@
<strong><%= result[:email] %></strong> <strong><%= result[:email] %></strong>
&nbsp;-&nbsp; &nbsp;-&nbsp;
<%= t('invite_users.results.user_exists_and_in_team', <%= t('invite_users.results.user_exists_and_in_team',
team: result[:team].name, team: result[:team_name],
role: t("user_teams.enums.role.#{result[:user_team].role}")) %> role: result[:user_role_name]) %>
</div> </div>
<% elsif result[:status] == :user_exists_unconfirmed_invited_to_team %> <% elsif result[:status] == :user_exists_unconfirmed_invited_to_team %>
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
<strong><%= result[:email] %></strong> <strong><%= result[:email] %></strong>
&nbsp;-&nbsp; &nbsp;-&nbsp;
<%= t('invite_users.results.user_exists_unconfirmed_invited_to_team', <%= t('invite_users.results.user_exists_unconfirmed_invited_to_team',
team: result[:team].name, team: result[:team_name],
role: t("user_teams.enums.role.#{result[:user_team].role}")) %> role: result[:user_role_name]) %>
</div> </div>
<% elsif result[:status] == :user_exists_invited_to_team %> <% elsif result[:status] == :user_exists_invited_to_team %>
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
<strong><%= result[:email] %></strong> <strong><%= result[:email] %></strong>
&nbsp;-&nbsp; &nbsp;-&nbsp;
<%= t('invite_users.results.user_exists_invited_to_team', <%= t('invite_users.results.user_exists_invited_to_team',
team: result[:team].name, team: result[:team_name],
role: t("user_teams.enums.role.#{result[:user_team].role}")) %> role: result[:user_role_name]) %>
</div> </div>
<% elsif result[:status] == :user_created %> <% elsif result[:status] == :user_created %>
<div class="alert alert-success" role="alert"> <div class="alert alert-success" role="alert">
@ -45,8 +45,8 @@
<strong><%= result[:email] %></strong> <strong><%= result[:email] %></strong>
&nbsp;-&nbsp; &nbsp;-&nbsp;
<%= t('invite_users.results.user_created_invited_to_team', <%= t('invite_users.results.user_created_invited_to_team',
team: result[:team].name, team: result[:team_name],
role: t("user_teams.enums.role.#{result[:user_team].role}")) %> role: result[:user_role_name]) %>
</div> </div>
<% elsif result[:status] == :user_invalid %> <% elsif result[:status] == :user_invalid %>
<div class="alert alert-danger" role="alert"> <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." 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_to_team_heading: "Invite users to my team:"
invite_btn: "Invite members" invite_btn: "Invite members"
invite_as: "As %{role}"
invite_guest: "As Guests" invite_guest: "As Guests"
invite_user: "As Normal Users" invite_user: "As Normal Users"
invite_admin: "As Administrators" invite_admin: "As Administrators"