Files
redmine/plugins/redmine_workload/app/models/wl_group_selection.rb

80 lines
1.7 KiB
Ruby

# frozen_string_literal: true
##
# Presenter organising groups to be used in views/workloads/_filers.erb.
#
class WlGroupSelection
##
# @param groups [Array(Group)] List of Group objects.
# @param user [User] A user object.
#
# @note params[:user] is currently used for tests only!
def initialize(**params)
self.groups = params[:groups] || []
self.user = define_user(params[:user])
end
##
# Returns selected groups when allowed to be viewed by the user.
#
# @return [Array(Group)] An array of group objects.
def selected
groups_by_params & allowed_to_display
end
##
# Prepares groups to be used as selection in filters.
#
def allowed_to_display
groups_allowed_to_display.sort_by { |group| group[:lastname] }
end
def all_group_ids
all_groups.map(&:id)
end
private
attr_accessor :user, :groups
##
# Define the current user.
#
def define_user(user)
user || User.current
end
##
# Queries the groups the user is allowed to view.
# @return [Array(Group)] List of group objects. The list is empty if the user
# is not allowed to view any group.
#
def groups_allowed_to_display
return all_groups if user.admin? || allowed_to?(:view_all_workloads)
return own_groups if allowed_to?(:view_own_group_workloads)
[]
end
def all_groups
Group.includes(users: :wl_user_data).distinct.all.to_a
end
def own_groups
user.groups.to_a
end
def groups_by_params
Group.joins(users: :wl_user_data).distinct.where(id: group_ids).to_a
end
def group_ids
groups.map(&:to_i)
end
def allowed_to?(permission)
user.allowed_to?(permission.to_sym, nil, global: true)
end
end