Fixes by Claude
This commit is contained in:
parent
eca5238abd
commit
107531385b
8 changed files with 413 additions and 69 deletions
|
|
@ -24,8 +24,38 @@ module Admin
|
|||
|
||||
def bulk
|
||||
authorize! :index, @conference.email_settings
|
||||
@registrations = @conference.registrations.includes(:user, :qanswers)
|
||||
@questions = @conference.questions.includes(:qanswers)
|
||||
@step = params[:step] || 'filter'
|
||||
|
||||
case @step
|
||||
when 'filter'
|
||||
@registrations = @conference.registrations.includes(:user, :qanswers)
|
||||
@questions = @conference.questions.includes(:qanswers)
|
||||
when 'recipients'
|
||||
@selected_recipients = filtered_recipients(params[:filter_type], params[:search_term])
|
||||
@filter_type = params[:filter_type]
|
||||
@search_term = params[:search_term]
|
||||
when 'compose'
|
||||
@recipient_emails = params[:recipient_emails] || []
|
||||
@filter_type = params[:filter_type]
|
||||
@search_term = params[:search_term]
|
||||
end
|
||||
end
|
||||
|
||||
def recipients
|
||||
authorize! :index, @conference.email_settings
|
||||
|
||||
recipients = filtered_recipients(params[:filter_type], params[:search_term])
|
||||
|
||||
render json: {
|
||||
recipients: recipients.map do |user|
|
||||
{
|
||||
id: user.id,
|
||||
name: user.name,
|
||||
email: user.email
|
||||
}
|
||||
end,
|
||||
count: recipients.count
|
||||
}
|
||||
end
|
||||
|
||||
def send_bulk
|
||||
|
|
@ -33,47 +63,91 @@ module Admin
|
|||
|
||||
subject = params[:subject]
|
||||
body = params[:body]
|
||||
filter_type = params[:filter_type]
|
||||
recipient_emails = params[:recipient_emails] || []
|
||||
|
||||
if subject.blank? || body.blank?
|
||||
redirect_to bulk_admin_conference_emails_path(@conference.short_title), alert: 'Subject and body are required.'
|
||||
redirect_to bulk_admin_conference_emails_path(@conference.short_title, step: 'compose'),
|
||||
alert: 'Subject and body are required.'
|
||||
return
|
||||
end
|
||||
|
||||
recipients = get_filtered_recipients(filter_type)
|
||||
|
||||
if recipients.empty?
|
||||
redirect_to bulk_admin_conference_emails_path(@conference.short_title), alert: 'No recipients found with the selected filter.'
|
||||
if recipient_emails.empty?
|
||||
redirect_to bulk_admin_conference_emails_path(@conference.short_title, step: 'recipients'),
|
||||
alert: 'No recipients selected.'
|
||||
return
|
||||
end
|
||||
|
||||
recipients = User.where(email: recipient_emails)
|
||||
|
||||
recipients.each do |user|
|
||||
Mailbot.bulk_mail(@conference, user, subject, body).deliver_later
|
||||
end
|
||||
|
||||
redirect_to bulk_admin_conference_emails_path(@conference.short_title),
|
||||
redirect_to admin_conference_emails_path(@conference.short_title),
|
||||
notice: "Bulk email sent to #{recipients.count} recipients."
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_filtered_recipients(filter_type)
|
||||
def filtered_recipients(filter_type, search_term = nil)
|
||||
base_users = get_base_user_set(filter_type)
|
||||
apply_search_filter(base_users, search_term)
|
||||
end
|
||||
|
||||
def get_base_user_set(filter_type)
|
||||
registrations = @conference.registrations.includes(:user, :qanswers)
|
||||
|
||||
case filter_type
|
||||
when 'no_questions_answered'
|
||||
registrations.select { |r| r.qanswers.empty? }.map(&:user)
|
||||
users_with_no_answers(registrations)
|
||||
when 'some_questions_answered'
|
||||
registrations.select { |r| r.qanswers.any? && r.qanswers.count < @conference.questions.count }.map(&:user)
|
||||
users_with_some_answers(registrations)
|
||||
when 'all_questions_answered'
|
||||
registrations.select { |r| r.qanswers.count >= @conference.questions.count }.map(&:user)
|
||||
users_with_all_answers(registrations)
|
||||
when 'all_registered'
|
||||
registrations.map(&:user)
|
||||
when 'not_registered'
|
||||
User.where.not(id: registrations.map(&:user_id))
|
||||
when 'all_users'
|
||||
User.all
|
||||
else
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
||||
def users_with_no_answers(registrations)
|
||||
registrations.select { |r| r.qanswers.empty? }.map(&:user)
|
||||
end
|
||||
|
||||
def users_with_some_answers(registrations)
|
||||
total_questions = @conference.questions.count
|
||||
registrations.select { |r| r.qanswers.any? && r.qanswers.count < total_questions }.map(&:user)
|
||||
end
|
||||
|
||||
def users_with_all_answers(registrations)
|
||||
total_questions = @conference.questions.count
|
||||
registrations.select { |r| r.qanswers.count >= total_questions }.map(&:user)
|
||||
end
|
||||
|
||||
def apply_search_filter(base_users, search_term)
|
||||
return base_users if search_term.blank?
|
||||
|
||||
if base_users.respond_to?(:where)
|
||||
base_users.where('name ILIKE ? OR email ILIKE ?', "%#{search_term}%", "%#{search_term}%")
|
||||
else
|
||||
search_in_memory(base_users, search_term)
|
||||
end
|
||||
end
|
||||
|
||||
def search_in_memory(users, search_term)
|
||||
lower_term = search_term.downcase
|
||||
users.select { |u| user_matches_search?(u, lower_term) }
|
||||
end
|
||||
|
||||
def user_matches_search?(user, search_term)
|
||||
user.name&.downcase&.include?(search_term) || user.email&.downcase&.include?(search_term)
|
||||
end
|
||||
|
||||
def bulk_email_params
|
||||
params.permit(:subject, :body, :filter_type)
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue