separate visibility_level_allowed logic from model validators

This commit is contained in:
Mike Greiling 2017-08-24 16:21:10 -05:00
parent b2b9d63f9b
commit af6968a158
1 changed files with 17 additions and 15 deletions

View File

@ -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)
end projects.where('visibility_level > ?', level).none?
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)