Add activities for user groups [SCI-11965]

This commit is contained in:
Andrej 2025-06-23 15:01:31 +02:00
parent 7a2f44e6e8
commit 1bd43f8eea
10 changed files with 169 additions and 59 deletions

View file

@ -58,7 +58,11 @@ module AccessPermissions
group: is_group
)
log_change_activity unless is_group
if is_group
log_activity(:experiment_access_changed_user_group, user_group: @assignment.user_group.id)
else
log_activity(:change_user_role_on_experiment, user_target: @assignment.user.id)
end
render json: {}, status: :ok
end
@ -88,19 +92,16 @@ module AccessPermissions
render_403 unless can_read_experiment?(@experiment)
end
def log_change_activity
Activities::CreateActivityService.call(
activity_type: :change_user_role_on_experiment,
owner: current_user,
subject: @experiment,
team: @project.team,
project: @project,
message_items: {
experiment: @experiment.id,
user_target: @assignment.user_id,
role: @assignment.user_role.name
}
)
def log_activity(type_of, message_items = {})
message_items = { experiment: @experiment.id, role: @assignment.user_role.name }.merge(message_items)
Activities::CreateActivityService
.call(activity_type: type_of,
owner: current_user,
subject: @experiment,
team: @project.team,
project: @project,
message_items: message_items)
end
end
end

View file

@ -53,16 +53,18 @@ module AccessPermissions
)
if permitted_create_params[:user_id].present?
log_activity(:form_access_granted, { user_target: assignment.user.id,
role: assignment.user_role.name })
created_count += 1
log_activity(:form_access_granted, user_target: assignment.user.id, role: assignment.user_role.name)
else
log_activity(:form_access_granted_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
end
created_count += 1
end
@message = if created_count.zero?
t('access_permissions.create.success', member_name: t('access_permissions.all_team'))
else
t('access_permissions.create.success', member_name: escape_input(assignment.user.name))
t('access_permissions.create.success', member_name: escape_input(assignment.respond_to?(:user_group) ? assignment.user_group.name : assignment.user.name))
end
render json: { message: @message }
rescue ActiveRecord::RecordInvalid => e
@ -91,8 +93,9 @@ module AccessPermissions
assignment.update!(permitted_update_params)
if permitted_create_params[:user_id].present?
log_activity(:form_access_changed, { user_target: assignment.user.id,
role: assignment.user_role.name })
log_activity(:form_access_changed, user_target: assignment.user.id, role: assignment.user_role.name)
else
log_activity(:form_access_changed_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
end
rescue ActiveRecord::RecordInvalid
render json: { flash: t('access_permissions.update.failure') }, status: :unprocessable_entity
@ -121,7 +124,12 @@ module AccessPermissions
else
assignment.destroy!
end
log_activity(:form_access_revoked, { user_target: assignment.user.id, role: assignment.user_role.name }) unless is_group
if is_group
log_activity(:form_access_revoked_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
else
log_activity(:form_access_revoked, user_target: assignment.user.id, role: assignment.user_role.name)
end
end
render json: { message: t('access_permissions.destroy.success', member_name: is_group ? assignment.user_group.name : assignment.user.full_name) }

View file

@ -47,7 +47,11 @@ module AccessPermissions
)
end
log_change_activity unless @assignment.respond_to?(:user_group)
if @assignment.respond_to?(:user_group)
log_activity(:my_module_access_changed_user_group, user_group: @assignment.user_group.id)
else
log_activity(:change_user_role_on_my_module, user_target: @assignment.user.id)
end
end
private
@ -79,19 +83,16 @@ module AccessPermissions
render_403 unless can_read_my_module?(@my_module)
end
def log_change_activity
Activities::CreateActivityService.call(
activity_type: :change_user_role_on_my_module,
owner: current_user,
subject: @my_module,
team: @project.team,
project: @project,
message_items: {
my_module: @my_module.id,
user_target: @assignment.user_id,
role: @assignment.user_role.name
}
)
def log_activity(type_of, message_items = {})
message_items = { my_module: @my_module.id, role: @assignment.user_role.name }.merge(message_items)
Activities::CreateActivityService
.call(activity_type: type_of,
owner: current_user,
subject: @my_module,
team: @project.team,
project: @project,
message_items: message_items)
end
end
end

View file

@ -46,18 +46,20 @@ module AccessPermissions
)
if permitted_create_params[:user_id].present?
log_activity(:assign_user_to_project, { user_target: assignment.user.id,
role: assignment.user_role.name })
created_count += 1
log_activity(:assign_user_to_project, user_target: assignment.user.id, role: assignment.user_role.name)
else
log_activity(:project_access_granted_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
end
created_count += 1
propagate_job(assignment)
end
@message = if created_count.zero?
t('access_permissions.create.success', member_name: t('access_permissions.all_team'))
else
t('access_permissions.create.success', member_name: escape_input(assignment.user.name))
t('access_permissions.create.success', member_name: escape_input(assignment.respond_to?(:user_group) ? assignment.user_group.name : assignment.user.name))
end
render json: { message: @message }
rescue ActiveRecord::RecordInvalid => e
@ -85,10 +87,10 @@ module AccessPermissions
end
assignment.update!(permitted_update_params)
if permitted_create_params[:user_id].present?
log_activity(:change_user_role_on_project, { user_target: assignment.user.id,
role: assignment.user_role.name })
log_activity(:change_user_role_on_project, user_target: assignment.user.id, role: assignment.user_role.name)
else
log_activity(:project_access_changed_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
end
propagate_job(assignment)
@ -120,7 +122,11 @@ module AccessPermissions
destroy: true
)
log_activity(:unassign_user_from_project, { user_target: assignment.user.id, role: assignment.user_role.name }) unless is_group
if is_group
log_activity(:project_access_revoked_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
else
log_activity(:unassign_user_from_project, user_target: assignment.user.id, role: assignment.user_role.name)
end
render json: { message: t('access_permissions.destroy.success', member_name: escape_input(is_group ? assignment.user_group.name : assignment.user.full_name)) }
rescue ActiveRecord::RecordInvalid

View file

@ -53,16 +53,18 @@ module AccessPermissions
)
if permitted_create_params[:user_id].present?
log_activity(:protocol_template_access_granted, { user_target: assignment.user.id,
role: assignment.user_role.name })
created_count += 1
log_activity(:protocol_template_access_granted, user_target: assignment.user.id, role: assignment.user_role.name)
else
log_activity(:protocol_template_access_granted_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
end
created_count += 1
end
@message = if created_count.zero?
t('access_permissions.create.success', member_name: t('access_permissions.all_team'))
else
t('access_permissions.create.success', member_name: escape_input(assignment.user.name))
t('access_permissions.create.success', member_name: escape_input(assignment.respond_to?(:user_group) ? assignment.user_group.name : assignment.user.name))
end
render json: { message: @message }
rescue ActiveRecord::RecordInvalid => e
@ -91,8 +93,9 @@ module AccessPermissions
assignment.update!(permitted_update_params)
if permitted_create_params[:user_id].present?
log_activity(:protocol_template_access_changed, { user_target: assignment.user.id,
role: assignment.user_role.name })
log_activity(:protocol_template_access_changed, user_target: assignment.user.id, role: assignment.user_role.name)
else
log_activity(:protocol_template_access_changed_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
end
rescue ActiveRecord::RecordInvalid
render json: { flash: t('access_permissions.update.failure') }, status: :unprocessable_entity
@ -121,7 +124,11 @@ module AccessPermissions
else
assignment.destroy!
end
log_activity(:protocol_template_access_revoked, { user_target: assignment.user.id, role: assignment.user_role.name }) unless is_group
if is_group
log_activity(:protocol_template_access_revoked_user_group, user_group: assignment.user_group.id, role: assignment.user_role.name)
else
log_activity(:protocol_template_access_revoked, user_target: assignment.user.id, role: assignment.user_role.name)
end
end
render json: { message: t('access_permissions.destroy.success', member_name: is_group ? assignment.user_group.name : assignment.user.full_name) }

View file

@ -31,6 +31,7 @@ module Users
new_users.each do |user|
@user_group.user_group_memberships.create!(user: user, created_by: current_user)
log_activity(:add_group_user_member, user)
end
render json: { message: :success }, status: :created
@ -44,6 +45,10 @@ module Users
def destroy_multiple
members = @user_group.user_group_memberships.where(id: params[:membership_ids])
members.each do |member|
log_activity(:remove_group_user_member, member.user)
end
if members.destroy_all
render json: { message: :success }, status: :ok
else
@ -68,6 +73,19 @@ module Users
def check_manage_permissions
render_403 unless can_manage_team?(@team)
end
def log_activity(type_of, user_target)
Activities::CreateActivityService
.call(activity_type: type_of,
owner: current_user,
subject: @user_group.team,
team: @user_group.team,
message_items: {
user_group: @user_group.id,
team: @user_group.team.id,
user_target: user_target.id
})
end
end
end
end

View file

@ -51,15 +51,22 @@ module Users
@user_group.assign_attributes(user_group_params)
if @user_group.save
log_activity(:create_user_group)
@user_group.users.each do |user|
log_activity(:add_group_user_member, { user_target: user.id })
end
render json: { message: t('user_groups.create.success') }, status: :created
else
render json: { errors: t('user_groups.create.error') }, status: :unprocessable_entity
end
end
def update; end
def update
log_activity(:update_user_group)
end
def destroy
log_activity(:delete_user_group)
if @user_group.destroy
render json: { message: t('user_groups.delete.success') }, status: :ok
else
@ -96,6 +103,18 @@ module Users
render_403 unless can_manage_team?(@team)
end
def log_activity(type_of, message_items = {})
Activities::CreateActivityService
.call(activity_type: type_of,
owner: current_user,
subject: @user_group.team,
team: @user_group.team,
message_items: {
user_group: @user_group.id,
team: @user_group.team.id
}.merge(message_items))
end
def set_breadcrumbs_items
@breadcrumbs_items = [
{ label: t('breadcrumbs.teams'), url: teams_path },

View file

@ -53,6 +53,8 @@ module GlobalActivitiesHelper
path = ''
case obj
when UserGroup
path = users_settings_team_user_group_path(obj.team, obj)
when User
return "[@#{obj.full_name}~#{obj.id.base62_encode}]"
when Tag

View file

@ -240,7 +240,7 @@ class Extends
ACTIVITY_MESSAGE_ITEMS_TYPES =
ACTIVITY_SUBJECT_TYPES + %w(
User Tag RepositoryColumn RepositoryRow Step Result Asset TinyMceAsset
Repository MyModuleStatus RepositorySnapshot
Repository MyModuleStatus RepositorySnapshot UserGroup
).freeze
ACTIVITY_TYPES = {
@ -594,31 +594,47 @@ class Extends
change_project_start_date: 375,
remove_project_start_date: 376,
set_head_of_project: 377,
remove_head_of_project: 378
remove_head_of_project: 378,
create_user_group: 379,
update_user_group: 380,
delete_user_group: 381,
add_group_user_member: 382,
remove_group_user_member: 383,
form_access_granted_user_group: 384,
form_access_changed_user_group: 385,
form_access_revoked_user_group: 386,
protocol_template_access_granted_user_group: 387,
protocol_template_access_changed_user_group: 388,
protocol_template_access_revoked_user_group: 389,
project_access_granted_user_group: 390,
project_access_changed_user_group: 391,
project_access_revoked_user_group: 392,
experiment_access_changed_user_group: 393,
my_module_access_changed_user_group: 394
}
ACTIVITY_GROUPS = {
projects: [*0..7, 32, 33, 34, 95, 108, 65, 109, *158..162, 241, 242, 243, *370..378],
projects: [*0..7, 32, 33, 34, 95, 108, 65, 109, *158..162, 241, 242, 243, *370..378, *390..392],
task_results: [23, 26, 25, 42, 24, 40, 41, 99, 110, 122, 116, 128, *246..248, *257..273, *284..291, 301, 303, 306, 328],
task: [8, 58, 9, 59, *10..14, 35, 36, 37, 53, 54, *60..63, 138, 139, 140, 64, 66, 106, 126, 120, 132,
148, 166],
148, 166, 394],
task_protocol: [15, 22, 16, 18, 19, 20, 21, 17, 38, 39, 100, 111, 45, 46, 47, 121, 124, 115, 118, 127, 130, 137,
184, 185, 188, 189, *192..203, 221, 222, 224, 225, 226, 236, *249..252, *274..278, 299, 302, 305, 327, *347..352, 359],
task_inventory: [55, 56, 146, 147, 183],
experiment: [*27..31, 57, 141, 165, *363..369],
experiment: [*27..31, 57, 141, 165, *363..369, 393],
reports: [48, 50, 49, 163, 164],
inventories: [70, 71, 105, 144, 145, 72, 73, 74, 102, 142, 143, 75, 76, 77,
78, 96, 107, 113, 114, *133..136, 180, 181, 182, *292..298, 308, 329],
protocol_repository: [80, 103, 89, 87, 79, 90, 91, 88, 85, 86, 84, 81, 82,
83, 101, 112, 123, 125, 117, 119, 129, 131, 187, 186,
190, 191, *204..215, 220, 223, 227, 228, 229, *230..235,
*237..240, *253..256, *279..283, 300, 304, 307, 330, *353..355, 360],
team: [92, 94, 93, 97, 104, 244, 245],
*237..240, *253..256, *279..283, 300, 304, 307, 330, *353..355, 360, *387..389],
team: [92, 94, 93, 97, 104, 244, 245, *379..383],
label_templates: [*216..219],
storage_locations: [*309..315, 361],
container_storage_locations: [*316..322, 326, 362],
storage_location_repository_rows: [*323..325],
forms: [331, 332, 333, 334, 335, 336, *337..346, 356, 357, 358]
forms: [331, 332, 333, 334, 335, 336, *337..346, 356, 357, 358, *384..386]
}
TOP_LEVEL_ASSIGNABLES = %w(Project Team Protocol Repository Form).freeze

View file

@ -392,6 +392,22 @@ en:
remove_head_of_project_html: "%{user} removed user %{user_target} as head of project %{project}."
task_steps_loaded_from_template_html: "%{user} added %{count} steps from template %{protocol} to task %{my_module}."
protocol_steps_loaded_from_template_html: "%{user} added %{count} steps from template %{protocol}."
create_user_group_html: "%{user} created group %{user_group} in workspace %{team}."
update_user_group_html: "%{user} updated group %{user_group} in workspace %{team}."
delete_user_group_html: "%{user} deleted group %{user_group} in workspace %{team}."
add_group_user_member_html: "%{user} added %{user_target} to group %{user_group} in workspace %{team}."
remove_group_user_member_html: "%{user} removed %{user_target} from group %{user_group} in workspace %{team}."
form_access_granted_user_group_html: "%{user} granted access to %{user_group} with user role %{role} to form template %{form}."
form_access_changed_user_group_html: "%{user} changed %{user_group}'s role on form template %{form} to %{role}."
form_access_revoked_user_group_html: "%{user} removed group %{user_group} with user role %{role} from form template %{form}."
protocol_template_access_granted_user_group_html: "%{user} granted access to %{user_group} with user role %{role} to protocol template %{protocol}."
protocol_template_access_changed_user_group_html: "%{user} changed %{user_group}'s role on protocol template %{protocol} to %{role}."
protocol_template_access_revoked_user_group_html: "%{user} removed group %{user_group} with user role %{role} from protocol template %{protocol}."
project_access_granted_user_group_html: "%{user} granted access to %{user_group} with user role %{role} to project %{project}."
project_access_changed_user_group_html: "%{user} changed %{user_group}'s role on project %{project} to %{role}."
project_access_revoked_user_group_html: "%{user} removed group %{user_group} with user role %{role} from project %{project}."
experiment_access_changed_user_group_html: "%{user} changed %{user_group}'s role on experiment %{experiment} to %{role}."
my_module_access_changed_user_group_html: "%{user} changed %{user_group}'s role on task %{my_module} to %{role}."
activity_name:
create_project: "Project created"
edit_project: "Project edited"
@ -741,6 +757,22 @@ en:
remove_head_of_project: "Head of project removed"
task_steps_loaded_from_template: "Task step loaded from template"
protocol_steps_loaded_from_template: "Step loaded from template"
create_user_group: "Group created"
update_user_group: "Group updated"
delete_user_group: "Group deleted"
add_group_user_member: "Group user added"
remove_group_user_member: "Group user removed"
form_access_granted_user_group: "Grant access to group"
form_access_changed_user_group: "Change role of group"
form_access_revoked_user_group: "Remove access to group"
protocol_template_access_granted_user_group: "Grant access to group"
protocol_template_access_changed_user_group: "Change role of group"
protocol_template_access_revoked_user_group: "Remove access to group"
project_access_granted_user_group: "Grant access to group"
project_access_changed_user_group: "Change role of group"
project_access_revoked_user_group: "Remove access to group"
experiment_access_changed_user_group: "Change role of group"
my_module_access_changed_user_group: "Change role of group"
activity_group:
projects: "Projects"
task_results: "Task results"