Shortcut when all levels visible.
This commit is contained in:
parent
d13aebabc3
commit
39d14f2f4b
|
@ -325,6 +325,12 @@ class Project < ActiveRecord::Base
|
|||
|
||||
levels = Gitlab::VisibilityLevel.levels_for_user(user)
|
||||
|
||||
if Gitlab::VisibilityLevel.all_levels?(levels)
|
||||
# If the user is allowed to see all projects,
|
||||
# we can shortcut and just return.
|
||||
return all
|
||||
end
|
||||
|
||||
authorized_projects = where('EXISTS (?)', authorized).select(:id)
|
||||
visible_projects = where('visibility_level IN (?)', levels).select(:id)
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ module Gitlab
|
|||
PRIVATE = 0 unless const_defined?(:PRIVATE)
|
||||
INTERNAL = 10 unless const_defined?(:INTERNAL)
|
||||
PUBLIC = 20 unless const_defined?(:PUBLIC)
|
||||
ALL_LEVELS = [PRIVATE, INTERNAL, PUBLIC].freeze unless const_defined?(:ALL_LEVELS)
|
||||
|
||||
class << self
|
||||
delegate :values, to: :options
|
||||
|
@ -28,7 +29,7 @@ module Gitlab
|
|||
return [PUBLIC] unless user
|
||||
|
||||
if user.full_private_access?
|
||||
[PRIVATE, INTERNAL, PUBLIC]
|
||||
ALL_LEVELS
|
||||
elsif user.external?
|
||||
[PUBLIC]
|
||||
else
|
||||
|
@ -36,6 +37,10 @@ module Gitlab
|
|||
end
|
||||
end
|
||||
|
||||
def all_levels?(levels = [])
|
||||
levels&.sort == ALL_LEVELS
|
||||
end
|
||||
|
||||
def string_values
|
||||
string_options.keys
|
||||
end
|
||||
|
|
|
@ -50,6 +50,28 @@ describe Gitlab::VisibilityLevel do
|
|||
end
|
||||
end
|
||||
|
||||
describe '.all_levels?' do
|
||||
let(:levels) do
|
||||
[
|
||||
Gitlab::VisibilityLevel::PUBLIC,
|
||||
Gitlab::VisibilityLevel::INTERNAL,
|
||||
Gitlab::VisibilityLevel::PRIVATE
|
||||
].shuffle
|
||||
end
|
||||
|
||||
it 'returns true only when given all levels defined at once' do
|
||||
expect(described_class.all_levels?(levels)).to be_truthy
|
||||
end
|
||||
|
||||
it 'returns true for ALL_LEVELS' do
|
||||
expect(described_class.all_levels?(Gitlab::VisibilityLevel::ALL_LEVELS)).to be_truthy
|
||||
end
|
||||
|
||||
it 'returns false if any one level is missing' do
|
||||
expect(described_class.all_levels?(levels[0..-2])).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
describe '.allowed_levels' do
|
||||
it 'only includes the levels that arent restricted' do
|
||||
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::INTERNAL])
|
||||
|
|
Loading…
Reference in New Issue