diff --git a/app/models/group_user.rb b/app/models/group_user.rb index 3c40b079285..b4bdb9674b4 100644 --- a/app/models/group_user.rb +++ b/app/models/group_user.rb @@ -8,7 +8,7 @@ class GroupUser < ActiveRecord::Base after_destroy :remove_title after_save :set_primary_group - after_destroy :remove_primary_group + after_destroy :remove_primary_group, :recalculate_trust_level before_create :set_notification_level after_save :grant_trust_level @@ -67,6 +67,30 @@ class GroupUser < ActiveRecord::Base return if group.grant_trust_level.nil? TrustLevelGranter.grant(group.grant_trust_level, user) end + + def recalculate_trust_level + return if group.grant_trust_level.nil? + return unless SiteSetting.group_removes_trust_level? + + # Find the highest level of the user's remaining groups + highest_level = GroupUser + .where(user_id: user.id) + .includes(:group) + .maximum("groups.grant_trust_level") + + if highest_level.nil? + # If the user no longer has a group with a trust level, + # unlock them, start at 0 and consider promotions. + user.trust_level_locked = false + user.trust_level = 0 + user.save + + Promotion.new(user).review + else + user.change_trust_level!(highest_level) + end + end + end # == Schema Information diff --git a/config/site_settings.yml b/config/site_settings.yml index 143e039eb0d..ece0e988f74 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -908,6 +908,8 @@ trust: tl3_links_no_follow: default: false client: true + group_removes_trust_level: + default: false security: force_https: diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index fbdb7c9505f..78c25c11398 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -468,6 +468,67 @@ describe Group do expect(u3.reload.trust_level).to eq(3) end + describe "group_removes_trust_level" do + + context "set to false" do + before do + SiteSetting.group_removes_trust_level = false + end + + it "maintains the chosen trust level" do + g0 = Fabricate(:group, grant_trust_level: 2) + g1 = Fabricate(:group, grant_trust_level: 3) + user = Fabricate(:user, trust_level: 0) + + g0.add(user) + expect(user.reload.trust_level).to eq(2) + + g1.add(user) + expect(user.reload.trust_level).to eq(3) + + g1.remove(user) + expect(user.reload.trust_level).to eq(3) + + g0.remove(user) + expect(user.reload.trust_level).to eq(3) + end + end + + context "set to true" do + before do + SiteSetting.group_removes_trust_level = true + end + + it "adjusts the user trust level" do + g0 = Fabricate(:group, grant_trust_level: 2) + g1 = Fabricate(:group, grant_trust_level: 3) + g2 = Fabricate(:group) + + # Add a group without one to consider `NULL` check + g2.add(user) + + user = Fabricate(:user, trust_level: 0) + + g0.add(user) + expect(user.reload.trust_level).to eq(2) + expect(user.trust_level_locked?).to eq(true) + + g1.add(user) + expect(user.reload.trust_level).to eq(3) + expect(user.trust_level_locked?).to eq(true) + + g1.remove(user) + expect(user.reload.trust_level).to eq(2) + expect(user.trust_level_locked?).to eq(true) + + g0.remove(user) + expect(user.reload.trust_level).to eq(0) + expect(user.trust_level_locked?).to eq(false) + end + end + + end + it 'should cook the bio' do group = Fabricate(:group) group.update_attributes!(bio_raw: 'This is a group for :unicorn: lovers')