Commit af6968a1 authored by Mike Greiling's avatar Mike Greiling

separate visibility_level_allowed logic from model validators

parent b2b9d63f
...@@ -105,33 +105,35 @@ class Group < Namespace ...@@ -105,33 +105,35 @@ class Group < Namespace
end end
def visibility_level_allowed_by_parent def visibility_level_allowed_by_parent
return if parent_id.blank? return if visibility_level_allowed_by_parent?
if parent && (visibility_level > parent.visibility_level)
errors.add(:visibility_level, "#{visibility} is not allowed since the parent group has a #{parent.visibility} visibility.") errors.add(:visibility_level, "#{visibility} is not allowed since the parent group has a #{parent.visibility} visibility.")
end end
end
def visibility_level_allowed_by_projects def visibility_level_allowed_by_projects
check_visibility_level_for(:projects) return if visibility_level_allowed_by_projects?
errors.add(:visibility_level, "#{visibility} is not allowed since this group contains projects with higher visibility.")
end end
def visibility_level_allowed_by_sub_groups def visibility_level_allowed_by_sub_groups
check_visibility_level_for(:children) return if visibility_level_allowed_by_sub_groups?
errors.add(:visibility_level, "#{visibility} is not allowed since there are sub-groups with higher visibility.")
end end
def check_visibility_level_for(children_type) def visibility_level_allowed_by_parent?(level = self.visibility_level)
base_query = public_send(children_type) return true unless parent_id.present? || parent
children_have_higher_visibility = base_query.where('visibility_level > ?', visibility_level).exists?
if children_have_higher_visibility level <= parent.visibility_level
children_label = children_type == :projects ? 'projects' : 'sub groups' end
level_name = Gitlab::VisibilityLevel.level_name(visibility_level).downcase
self.errors.add(:visibility_level, "#{level_name} is not allowed since there are #{children_label} with higher visibility.") def visibility_level_allowed_by_projects?(level = self.visibility_level)
projects.where('visibility_level > ?', level).none?
end end
children_have_higher_visibility def visibility_level_allowed_by_sub_groups?(level = self.visibility_level)
children.where('visibility_level > ?', level).none?
end end
def avatar_url(**args) def avatar_url(**args)
......
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