mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-07 13:44:23 +08:00
Don't revert to viewer role for roles with no read permission [SCI-12210]
This commit is contained in:
parent
6c6b8dc8da
commit
3fb55af206
3 changed files with 26 additions and 12 deletions
|
@ -25,13 +25,9 @@ class TeamSharedObjectsController < ApplicationController
|
|||
|
||||
case global_permission_level
|
||||
when :shared_read
|
||||
UserAssignment.where(assignable: @model).where.not(team: @model.team).update!(user_role: UserRole.find_predefined_viewer_role)
|
||||
TeamAssignment.where(assignable: @model).where.not(team: @model.team).update!(user_role: UserRole.find_predefined_viewer_role)
|
||||
UserGroupAssignment.where(assignable: @model).where.not(team: @model.team).update!(user_role: UserRole.find_predefined_viewer_role)
|
||||
@model.demote_all_sharing_assignments_to_viewer!
|
||||
when :not_shared
|
||||
UserAssignment.where(assignable: @model).where.not(team: @model.team).destroy_all
|
||||
TeamAssignment.where(assignable: @model).where.not(team: @model.team).destroy_all
|
||||
UserGroupAssignment.where(assignable: @model).where.not(team: @model.team).destroy_all
|
||||
@model.destroy_all_sharing_assignments!
|
||||
end
|
||||
|
||||
case @model
|
||||
|
|
|
@ -99,4 +99,26 @@ module Shareable
|
|||
|
||||
shared_read? || team_shared_objects.exists?(team: team, permission_level: :shared_read)
|
||||
end
|
||||
|
||||
def demote_all_sharing_assignments_to_viewer!(for_team: nil)
|
||||
# take into account special roles with no read permission, and do not upgrade them to viewer
|
||||
read_permission = "#{self.class.permission_class}Permissions".constantize::READ
|
||||
|
||||
teams = for_team ? Team.where(id: for_team.id).where.not(id: team.id) : Team.where.not(id: team.id)
|
||||
|
||||
[user_assignments, user_group_assignments, team_assignments].each do |assignments|
|
||||
assignments.joins(:user_role)
|
||||
.where(team_id: teams.select(:id))
|
||||
.where(['user_roles.permissions @> ARRAY[?]::varchar[]', [read_permission]])
|
||||
.update!(user_role: UserRole.find_predefined_viewer_role)
|
||||
end
|
||||
end
|
||||
|
||||
def destroy_all_sharing_assignments!(for_team: nil)
|
||||
teams = for_team ? Team.where(id: for_team.id).where.not(id: team.id) : Team.where.not(id: team.id)
|
||||
|
||||
user_assignments.where(team_id: teams.select(:id)).destroy_all
|
||||
user_group_assignments.where.not(team_id: teams.select(:id)).destroy_all
|
||||
team_assignments.where.not(team_id: teams.select(:id)).destroy_all
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,15 +26,11 @@ class TeamSharedObject < ApplicationRecord
|
|||
def update_assignments
|
||||
return unless saved_change_to_permission_level? && permission_level == 'shared_read'
|
||||
|
||||
shared_object.user_assignments.where(team: team).update!(user_role: UserRole.find_predefined_viewer_role)
|
||||
shared_object.user_group_assignments.where(team: team).update!(user_role: UserRole.find_predefined_viewer_role)
|
||||
shared_object.team_assignments.where(team: team).update!(user_role: UserRole.find_predefined_viewer_role)
|
||||
shared_object.demote_all_sharing_assignments_to_viewer!(for_team: team)
|
||||
end
|
||||
|
||||
def destroy_assignments
|
||||
shared_object.user_assignments.where(team: team).destroy_all
|
||||
shared_object.user_group_assignments.where(team: team).destroy_all
|
||||
shared_object.team_assignments.where(team: team).destroy_all
|
||||
shared_object.destroy_all_sharing_assignments!(for_team: team)
|
||||
end
|
||||
|
||||
def team_cannot_be_the_same
|
||||
|
|
Loading…
Add table
Reference in a new issue