diff --git a/app/models/min_trust_to_create_topic_setting.rb b/app/models/min_trust_to_create_topic_setting.rb new file mode 100644 index 00000000000..a38031d1bf9 --- /dev/null +++ b/app/models/min_trust_to_create_topic_setting.rb @@ -0,0 +1,18 @@ +require_dependency 'enum_site_setting' + +class MinTrustToCreateTopicSetting < EnumSiteSetting + + def self.valid_value?(val) + valid_values.any? { |v| v.to_s == val.to_s } + end + + def self.values + @values ||= valid_values.map {|x| {name: x.to_s, value: x} } + end + + private + + def self.valid_values + TrustLevel.levels.values.sort + end +end diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index 53004c947c0..88c6e2f757c 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -205,6 +205,8 @@ class SiteSetting < ActiveRecord::Base setting(:regular_requires_likes_given, 1) setting(:regular_requires_topic_reply_count, 3) + setting(:min_trust_to_create_topic, 0, enum: 'MinTrustToCreateTopicSetting') + # Reply by Email Settings setting(:reply_by_email_enabled, false) setting(:reply_by_email_address, '') diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 3c407dc852a..0b061deb275 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -611,6 +611,8 @@ en: regular_requires_likes_given: "How many likes a basic user must cast before promotion to regular (2) trust level" regular_requires_topic_reply_count: "How many topics a basic user must reply to before promotion to regular (2) trust level" + min_trust_to_create_topic: "The minimum trust level required to create a new topic." + newuser_max_links: "How many links a new user can add to a post" newuser_max_images: "How many images a new user can add to a post" newuser_max_attachments: "How many attachments a new user can add to a post" diff --git a/lib/guardian.rb b/lib/guardian.rb index cea13bc930b..d5bd9e6a980 100644 --- a/lib/guardian.rb +++ b/lib/guardian.rb @@ -229,11 +229,11 @@ class Guardian end def can_create_topic?(parent) - can_create_post?(parent) + user && user.trust_level >= SiteSetting.min_trust_to_create_topic.to_i && can_create_post?(parent) end def can_create_topic_on_category?(category) - can_create_post?(nil) && ( + can_create_topic?(nil) && ( !category || Category.topic_create_allowed(self).where(:id => category.id).count == 1 ) diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb index 84afc362af1..a176a0713ab 100644 --- a/spec/components/guardian_spec.rb +++ b/spec/components/guardian_spec.rb @@ -283,6 +283,21 @@ describe Guardian do category.save Guardian.new(user).can_create?(Topic,category).should be_false end + + it "is true for new users by default" do + Guardian.new(user).can_create?(Topic,Fabricate(:category)).should be_true + end + + it "is false if user has not met minimum trust level" do + SiteSetting.stubs(:min_trust_to_create_topic).returns(1) + Guardian.new(build(:user, trust_level: 0)).can_create?(Topic,Fabricate(:category)).should be_false + end + + it "is true if user has met or exceeded the minimum trust level" do + SiteSetting.stubs(:min_trust_to_create_topic).returns(1) + Guardian.new(build(:user, trust_level: 1)).can_create?(Topic,Fabricate(:category)).should be_true + Guardian.new(build(:user, trust_level: 2)).can_create?(Topic,Fabricate(:category)).should be_true + end end describe 'a Post' do