robertgauld/OSMExtender

View on GitHub
app/models/email_reminder_item_event.rb

Summary

Maintainability
B
4 hrs
Test Coverage
class EmailReminderItemEvent < EmailReminderItem

  validate :configuration_is_valid

  def get_data
    events = []
    event_list = Osm::Event.get_list(user.osm_api, section_id)
    event_list.reject!{ |e| e[:archived] }
    event_list.each do |event|
      start = event[:start]
      unless start.nil?
        if (start < configuration[:the_next_n_months].months.from_now)  &&  (start > Time.zone.now)
          events.push Osm::Event.get(user.osm_api, section_id, event[:id])
        end
      end
    end

    attendance = {}
    if configuration[:include_attendance]
      events.each do |event|
        h = {
          :yes => {:leaders=>0, :members=>0, :total=>0},
          :no => {:leaders=>0, :members=>0, :total=>0},
          :invited => {:leaders=>0, :members=>0, :total=>0},
          :shown => {:leaders=>0, :members=>0, :total=>0},
          :reserved => {:leaders=>0, :members=>0, :total=>0},
        }
        event.get_attendance(user.osm_api).each do |a|
          unless a.attending.nil?
            h[a.attending][a.grouping_id.eql?(-2) ? :leaders : :members] += 1
            h[a.attending][:total] += 1
          end
        end
        attendance[event.id] = h
      end
    end

    return events.empty? ? nil : {
      :events => events.sort,
      :attendance => attendance,
    }
  end


  def get_fake_data
    events = []
    attendance = {}

    (1 + rand(3)).times do |i|
      start_datetime = rand(configuration[:the_next_n_months].months / 1.day).days.from_now.to_datetime
      confirm_date = (start_datetime - (rand(12) + 2).days).to_date
      end_datetime = start_datetime + rand(2).days + 18.hours
      events.push Osm::Event.new({
        :name => Faker::Lorem.words(2 + rand(3)).join(' '),
        :start => start_datetime,
        :end => end_datetime,
        :confirm_by_date => confirm_date,
        :id => i,
      })
      attendance[i] = {
        :yes => {:leaders=>rand(2)+2, :members=>rand(10)},
        :no => {:leaders=>rand(2), :members=>rand(10)},
        :invited => {:leaders=>rand(2), :members=>rand(5)},
        :shown => {:leaders=>rand(2), :members=>rand(5)},
        :reserved => {:leaders=>rand(2), :members=>rand(3)},
      }
      attendance[i].keys.each do |k|
        attendance[i][k][:total] = attendance[i][k][:leaders] + attendance[i][k][:members]
      end
    end

    return {
      :events => events.sort,
      :attendance => attendance,
    }
  end


  def self.required_permissions
    [:read, :events]
  end

  def self.configuration_labels
    {
      :the_next_n_months => 'How many months into the future?',
      :include_attendance => 'Include attendance breakdown?',
    }
  end

  def self.default_configuration
    {
      :the_next_n_months => 3,
      :include_attendance => false,
    }
  end

  def self.configuration_types
    {
      :the_next_n_months => :positive_integer,
      :include_attendance => :boolean,
    }
  end

  def self.human_name
    return 'Events'
  end

  def human_configuration
    "For the next #{configuration[:the_next_n_months]} months, #{configuration[:include_attendance] ? 'with' : 'without'} attendance breakdown."
  end


  private
  def configuration_is_valid
    config = configuration
    unless config[:the_next_n_months] > 0
      errors.add('How many months into the future?', 'Must be greater than 0')
      config[:the_next_n_months] = self.class.default_configuration[:the_next_n_months]
    end
    unless [true, false].include?(config[:include_attendance])
      errors.add('Include attendance breakdown?', 'Invalid option')
      config[:include_attendance] = self.class.default_configuration[:include_attendance]
    end
    self.configuration = config
  end

end