class Decidim::Meetings::CloseMeetingReminderGenerator
after reminder is generated it is send to user who have not closed past meetings.
This class is the generator class which creates and updates meetings related reminders,
def finder_query(component_id, interval)
def finder_query(component_id, interval) Decidim::Meetings::Meeting .published .not_hidden .except_withdrawn .where( "decidim_component_id = ? AND end_time >= ? AND end_time <= ? AND closed_at IS NULL", component_id, interval.ago.beginning_of_day, interval.ago.end_of_day ) end
def generate
def generate Decidim::Component.where(manifest_name: "meetings").published.each do |component| send_reminders(component) end end
def global_admins
def global_admins @global_admins ||= Decidim::User.where(admin: true).all end
def initialize
def initialize @reminder_manifest = Decidim.reminders_registry.for(:close_meeting) @reminder_jobs_queued = 0 end
def send_reminders(component)
def send_reminders(component) intervals = Array(reminder_manifest.settings.attributes[:reminder_times].default) space_admins = Decidim::ParticipatoryProcessUserRole.where(decidim_participatory_process_id: component.participatory_space_id, role: "admin").collect(&:user) space_admins = (global_admins + space_admins).uniq intervals.each do |interval| finder_query(component.id, interval).find_each do |meeting| authors = meeting.official? ? space_admins : [meeting.author] authors.each do |author| send_notif = author.notification_settings.fetch("close_meeting_reminder", "1") next unless send_notif == "1" reminder = Decidim::Reminder.find_or_create_by(user: author, component: component) record = Decidim::ReminderRecord.find_or_create_by(reminder: reminder, remindable: meeting) record.update(state: "active") unless record.active? reminder.records << record reminder.save! Decidim::Meetings::SendCloseMeetingReminderJob.perform_later(record) @reminder_jobs_queued += 1 end end end end