0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-09 19:36:44 +08:00
discourse/plugins/discourse-assign/lib/discourse_assign/guardian_extensions.rb
Mark VanLandingham 2aaa6a5ca3
FEATURE: Add category-level assignment permissions (#40412)
Previously, assignment permissions only came from the global
`assign_allowed_on_groups` site setting.

This change lets categories grant assignment permission to additional
groups, keeping assignment controls and assignee suggestions scoped to
the relevant category.
2026-06-08 09:59:40 -05:00

45 lines
1.3 KiB
Ruby
Vendored

# frozen_string_literal: true
module DiscourseAssign
module GuardianExtensions
def can_assign?(target = nil)
return false if user.blank?
return can_assign_target?(target) if target
@can_assign ||= can_assign_globally? || scoped_assign_group_ids_for_user.present?
end
def can_assign_globally?
return false if user.blank?
@can_assign_globally ||=
if user.admin?
true
else
allowed_group_ids = DiscourseAssign::AssignmentPermissions.global_group_ids
allowed_group_ids.present? && (allowed_group_ids & user.group_ids).present?
end
end
private
def can_assign_target?(target)
return true if can_assign_globally?
category_id = DiscourseAssign::AssignmentPermissions.category_id_for(target)
return false if category_id.blank?
(scoped_assign_group_ids_for_category(category_id) & user.group_ids).present?
end
def scoped_assign_group_ids_for_user
DiscourseAssign::AssignmentPermissions.scoped_group_ids_for_user(user)
end
def scoped_assign_group_ids_for_category(category_id)
@scoped_assign_group_ids_by_category ||= {}
@scoped_assign_group_ids_by_category[
category_id
] ||= DiscourseAssign::AssignmentPermissions.scoped_group_ids_for_category(category_id)
end
end
end