mirror of
https://github.com/discourse/discourse.git
synced 2026-08-14 13:58:53 +08:00
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.
67 lines
2.3 KiB
Ruby
Vendored
67 lines
2.3 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
require_relative "../../../lib/discourse_assign/assignment_permissions"
|
|
|
|
module Jobs
|
|
class EnqueueReminders < ::Jobs::Scheduled
|
|
REMINDER_BUFFER_MINUTES = 120
|
|
|
|
every 1.day
|
|
|
|
def execute(_args)
|
|
return if skip_enqueue?
|
|
user_ids.each { |id| Jobs.enqueue(:remind_user, user_id: id) }
|
|
end
|
|
|
|
private
|
|
|
|
def skip_enqueue?
|
|
SiteSetting.remind_assigns_frequency.nil? || !SiteSetting.assign_enabled? ||
|
|
DiscourseAssign::AssignmentPermissions.all_assign_allowed_group_ids.blank?
|
|
end
|
|
|
|
def allowed_group_ids
|
|
DiscourseAssign::AssignmentPermissions.all_assign_allowed_group_ids.join(",")
|
|
end
|
|
|
|
def reminder_threshold
|
|
@reminder_threshold ||= SiteSetting.pending_assign_reminder_threshold
|
|
end
|
|
|
|
def user_ids
|
|
global_frequency = SiteSetting.remind_assigns_frequency
|
|
frequency =
|
|
ActiveRecord::Base.sanitize_sql(
|
|
"COALESCE(user_frequency.value, '#{global_frequency}')::INT",
|
|
)
|
|
|
|
DB.query_single(<<~SQL)
|
|
SELECT assignments.assigned_to_id
|
|
FROM assignments
|
|
|
|
LEFT OUTER JOIN user_custom_fields AS last_reminder
|
|
ON assignments.assigned_to_id = last_reminder.user_id
|
|
AND last_reminder.name = '#{PendingAssignsReminder::REMINDED_AT}'
|
|
|
|
LEFT OUTER JOIN user_custom_fields AS user_frequency
|
|
ON assignments.assigned_to_id = user_frequency.user_id
|
|
AND user_frequency.name = '#{PendingAssignsReminder::REMINDERS_FREQUENCY}'
|
|
|
|
INNER JOIN group_users ON assignments.assigned_to_id = group_users.user_id
|
|
INNER JOIN topics ON topics.id = assignments.target_id AND assignments.target_type = 'Topic' AND topics.deleted_at IS NULL
|
|
|
|
WHERE group_users.group_id IN (#{allowed_group_ids})
|
|
AND #{frequency} > 0
|
|
AND (
|
|
last_reminder.value IS NULL OR
|
|
last_reminder.value::TIMESTAMP <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * #{frequency}) + ('1 MINUTE'::INTERVAL * #{REMINDER_BUFFER_MINUTES})
|
|
)
|
|
AND assignments.updated_at::TIMESTAMP <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * #{frequency})
|
|
AND assignments.assigned_to_type = 'User'
|
|
|
|
GROUP BY assignments.assigned_to_id
|
|
HAVING COUNT(assignments.assigned_to_id) >= #{reminder_threshold}
|
|
SQL
|
|
end
|
|
end
|
|
end
|