mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 20:01:11 +08:00
ad07e6e172
By default in Discourse, if a group grants a user a particular trust level that is locked even if they are removed from the group. With this new setting, when a user is removed from a group their trust level is set to either the next highest trust level based on group membership, or they are unlocked and promoted based on the default mechanisms.
113 lines
2.8 KiB
Ruby
113 lines
2.8 KiB
Ruby
require_dependency 'notification_levels'
|
|
|
|
class GroupUser < ActiveRecord::Base
|
|
belongs_to :group, counter_cache: "user_count"
|
|
belongs_to :user
|
|
|
|
after_save :update_title
|
|
after_destroy :remove_title
|
|
|
|
after_save :set_primary_group
|
|
after_destroy :remove_primary_group, :recalculate_trust_level
|
|
|
|
before_create :set_notification_level
|
|
after_save :grant_trust_level
|
|
|
|
def self.notification_levels
|
|
NotificationLevels.all
|
|
end
|
|
|
|
protected
|
|
|
|
def set_notification_level
|
|
self.notification_level = group&.default_notification_level || 3
|
|
end
|
|
|
|
def set_primary_group
|
|
if group.primary_group
|
|
self.class.exec_sql("
|
|
UPDATE users
|
|
SET primary_group_id = :id
|
|
WHERE id = :user_id",
|
|
id: group.id, user_id: user_id
|
|
)
|
|
end
|
|
end
|
|
|
|
def remove_primary_group
|
|
self.class.exec_sql("
|
|
UPDATE users
|
|
SET primary_group_id = NULL
|
|
WHERE id = :user_id AND primary_group_id = :id",
|
|
id: group.id, user_id: user_id
|
|
)
|
|
end
|
|
|
|
def remove_title
|
|
if group.title.present?
|
|
self.class.exec_sql("
|
|
UPDATE users SET title = NULL
|
|
WHERE title = :title AND id = :id",
|
|
id: user_id, title: group.title
|
|
)
|
|
end
|
|
end
|
|
|
|
def update_title
|
|
if group.title.present?
|
|
self.class.exec_sql("
|
|
UPDATE users SET title = :title
|
|
WHERE (title IS NULL OR title = '') AND id = :id",
|
|
id: user_id, title: group.title
|
|
)
|
|
end
|
|
end
|
|
|
|
def grant_trust_level
|
|
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
|
|
#
|
|
# Table name: group_users
|
|
#
|
|
# id :integer not null, primary key
|
|
# group_id :integer not null
|
|
# user_id :integer not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# owner :boolean default(FALSE), not null
|
|
# notification_level :integer default(2), not null
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_group_users_on_group_id_and_user_id (group_id,user_id) UNIQUE
|
|
# index_group_users_on_user_id_and_group_id (user_id,group_id) UNIQUE
|
|
#
|