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