Commit 39d14f2f authored by Andreas Brandl's avatar Andreas Brandl

Shortcut when all levels visible.

parent d13aebab
...@@ -325,6 +325,12 @@ class Project < ActiveRecord::Base ...@@ -325,6 +325,12 @@ class Project < ActiveRecord::Base
levels = Gitlab::VisibilityLevel.levels_for_user(user) 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) authorized_projects = where('EXISTS (?)', authorized).select(:id)
visible_projects = where('visibility_level IN (?)', levels).select(:id) visible_projects = where('visibility_level IN (?)', levels).select(:id)
......
...@@ -20,6 +20,7 @@ module Gitlab ...@@ -20,6 +20,7 @@ module Gitlab
PRIVATE = 0 unless const_defined?(:PRIVATE) PRIVATE = 0 unless const_defined?(:PRIVATE)
INTERNAL = 10 unless const_defined?(:INTERNAL) INTERNAL = 10 unless const_defined?(:INTERNAL)
PUBLIC = 20 unless const_defined?(:PUBLIC) PUBLIC = 20 unless const_defined?(:PUBLIC)
ALL_LEVELS = [PRIVATE, INTERNAL, PUBLIC].freeze unless const_defined?(:ALL_LEVELS)
class << self class << self
delegate :values, to: :options delegate :values, to: :options
...@@ -28,7 +29,7 @@ module Gitlab ...@@ -28,7 +29,7 @@ module Gitlab
return [PUBLIC] unless user return [PUBLIC] unless user
if user.full_private_access? if user.full_private_access?
[PRIVATE, INTERNAL, PUBLIC] ALL_LEVELS
elsif user.external? elsif user.external?
[PUBLIC] [PUBLIC]
else else
...@@ -36,6 +37,10 @@ module Gitlab ...@@ -36,6 +37,10 @@ module Gitlab
end end
end end
def all_levels?(levels = [])
levels&.sort == ALL_LEVELS
end
def string_values def string_values
string_options.keys string_options.keys
end end
......
...@@ -50,6 +50,28 @@ describe Gitlab::VisibilityLevel do ...@@ -50,6 +50,28 @@ describe Gitlab::VisibilityLevel do
end end
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 describe '.allowed_levels' do
it 'only includes the levels that arent restricted' do it 'only includes the levels that arent restricted' do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::INTERNAL]) stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::INTERNAL])
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment