71306f14f6
When a VisibilityLevel is an integer formatted as a string, convert it to an integer, instead of looking it up in the hash map. When the value is not recognized, default to PRIVATE.
132 lines
3.1 KiB
Ruby
132 lines
3.1 KiB
Ruby
# Gitlab::VisibilityLevel module
|
|
#
|
|
# Define allowed public modes that can be used for
|
|
# GitLab projects to determine project public mode
|
|
#
|
|
module Gitlab
|
|
module VisibilityLevel
|
|
extend CurrentSettings
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
scope :public_only, -> { where(visibility_level: PUBLIC) }
|
|
scope :public_and_internal_only, -> { where(visibility_level: [PUBLIC, INTERNAL] ) }
|
|
scope :non_public_only, -> { where.not(visibility_level: PUBLIC) }
|
|
|
|
scope :public_to_user, -> (user) do
|
|
if user
|
|
if user.admin?
|
|
all
|
|
elsif !user.external?
|
|
public_and_internal_only
|
|
else
|
|
public_only
|
|
end
|
|
else
|
|
public_only
|
|
end
|
|
end
|
|
end
|
|
|
|
PRIVATE = 0 unless const_defined?(:PRIVATE)
|
|
INTERNAL = 10 unless const_defined?(:INTERNAL)
|
|
PUBLIC = 20 unless const_defined?(:PUBLIC)
|
|
|
|
class << self
|
|
delegate :values, to: :options
|
|
|
|
def string_values
|
|
string_options.keys
|
|
end
|
|
|
|
def options
|
|
{
|
|
'Private' => PRIVATE,
|
|
'Internal' => INTERNAL,
|
|
'Public' => PUBLIC
|
|
}
|
|
end
|
|
|
|
def string_options
|
|
{
|
|
'private' => PRIVATE,
|
|
'internal' => INTERNAL,
|
|
'public' => PUBLIC
|
|
}
|
|
end
|
|
|
|
def highest_allowed_level
|
|
restricted_levels = current_application_settings.restricted_visibility_levels
|
|
|
|
allowed_levels = self.values - restricted_levels
|
|
allowed_levels.max || PRIVATE
|
|
end
|
|
|
|
def allowed_for?(user, level)
|
|
user.is_admin? || allowed_level?(level.to_i)
|
|
end
|
|
|
|
# Return true if the specified level is allowed for the current user.
|
|
# Level should be a numeric value, e.g. `20`.
|
|
def allowed_level?(level)
|
|
valid_level?(level) && non_restricted_level?(level)
|
|
end
|
|
|
|
def non_restricted_level?(level)
|
|
restricted_levels = current_application_settings.restricted_visibility_levels
|
|
|
|
if restricted_levels.nil?
|
|
true
|
|
else
|
|
!restricted_levels.include?(level)
|
|
end
|
|
end
|
|
|
|
def valid_level?(level)
|
|
options.has_value?(level)
|
|
end
|
|
|
|
def level_name(level)
|
|
level_name = 'Unknown'
|
|
options.each do |name, lvl|
|
|
level_name = name if lvl == level.to_i
|
|
end
|
|
|
|
level_name
|
|
end
|
|
|
|
def level_value(level)
|
|
return level.to_i if level.to_i.to_s == level.to_s && string_options.key(level.to_i)
|
|
string_options[level] || PRIVATE
|
|
end
|
|
|
|
def string_level(level)
|
|
string_options.key(level)
|
|
end
|
|
end
|
|
|
|
def private?
|
|
visibility_level_value == PRIVATE
|
|
end
|
|
|
|
def internal?
|
|
visibility_level_value == INTERNAL
|
|
end
|
|
|
|
def public?
|
|
visibility_level_value == PUBLIC
|
|
end
|
|
|
|
def visibility_level_value
|
|
self[visibility_level_field]
|
|
end
|
|
|
|
def visibility
|
|
Gitlab::VisibilityLevel.string_level(visibility_level_value)
|
|
end
|
|
|
|
def visibility=(level)
|
|
self[visibility_level_field] = Gitlab::VisibilityLevel.level_value(level)
|
|
end
|
|
end
|
|
end
|