FIX: unable to create new categories

Previous attempt at 70adb940 missed the critical "everyone" group from
staff, leading to a case where staff was no longer able to create categories
This commit is contained in:
Sam 2019-02-15 10:24:29 +11:00
parent 0472bd4adc
commit f8b70f4ca3
5 changed files with 23 additions and 11 deletions

View File

@ -88,8 +88,12 @@ class Group < ActiveRecord::Base
validates :mentionable_level, inclusion: { in: ALIAS_LEVELS.values } validates :mentionable_level, inclusion: { in: ALIAS_LEVELS.values }
validates :messageable_level, inclusion: { in: ALIAS_LEVELS.values } validates :messageable_level, inclusion: { in: ALIAS_LEVELS.values }
scope :visible_groups, Proc.new { |user, order| scope :visible_groups, Proc.new { |user, order, opts|
groups = Group.order(order || "name ASC").where("groups.id > 0") groups = Group.order(order || "name ASC")
if !opts || !opts[:include_everyone]
groups = groups.where("groups.id > 0")
end
unless user&.admin unless user&.admin
sql = <<~SQL sql = <<~SQL

View File

@ -72,9 +72,7 @@ class Site
end end
def groups def groups
groups = Group.visible_groups(@guardian.user) Group.visible_groups(@guardian.user, "name ASC", include_everyone: true)
groups = groups.where("automatic IS FALSE OR groups.id = #{Group::AUTO_GROUPS[:moderators]}") if !@guardian.is_staff?
groups
end end
def suppressed_from_latest_category_ids def suppressed_from_latest_category_ids

View File

@ -25,4 +25,12 @@ class ApplicationSerializer < ActiveModel::Serializer
def cache_fragment(name) def cache_fragment(name)
ApplicationSerializer.fragment_cache[name] ||= yield ApplicationSerializer.fragment_cache[name] ||= yield
end end
def cache_anon_fragment(name, &blk)
if scope.anonymous?
cache_fragment(name, &blk)
else
blk.call
end
end
end end

View File

@ -50,7 +50,9 @@ class SiteSerializer < ApplicationSerializer
end end
def groups def groups
object.groups.pluck(:id, :name).map { |id, name| { id: id, name: name } }.as_json cache_anon_fragment("group_names") do
object.groups.order(:name).pluck(:id, :name).map { |id, name| { id: id, name: name } }.as_json
end
end end
def post_action_types def post_action_types

View File

@ -70,15 +70,15 @@ describe Site do
user = Fabricate(:user) user = Fabricate(:user)
site = Site.new(Guardian.new(user)) site = Site.new(Guardian.new(user))
group = Fabricate(:group, visibility_level: Group.visibility_levels[:staff]) staff_group = Fabricate(:group, visibility_level: Group.visibility_levels[:staff])
expect(site.groups.pluck(:name)).to contain_exactly("moderators") expect(site.groups.pluck(:name)).not_to include(staff_group.name)
group = Fabricate(:group) public_group = Fabricate(:group)
expect(site.groups.pluck(:name)).to contain_exactly("moderators", group.name) expect(site.groups.pluck(:name)).to include(public_group.name)
admin = Fabricate(:admin) admin = Fabricate(:admin)
site = Site.new(Guardian.new(admin)) site = Site.new(Guardian.new(admin))
expect(site.groups.pluck(:name)).to match_array(Group.visible_groups(admin).pluck(:name)) expect(site.groups.pluck(:name)).to include(staff_group.name, public_group.name, "everyone")
end end
it "includes all enabled authentication providers" do it "includes all enabled authentication providers" do