Sha256: 3fb2be269a7f522b41225069eb74a8a822fb8a5dc62b1158c6a136119c6ce30d

Contents?: true

Size: 1.98 KB

Versions: 10

Compression:

Stored size: 1.98 KB

Contents

module Calagator
  class Event < ActiveRecord::Base
    class Browse < Struct.new(:order, :date, :time)
      def initialize(attributes={})
        members.each do |key|
          send "#{key}=", attributes[key]
        end
      end

      def events
        @events ||= sort.filter_by_date.filter_by_time.scope
      end

      def start_date
        date_for(:start).strftime('%Y-%m-%d')
      end

      def end_date
        date_for(:end).strftime('%Y-%m-%d')
      end

      def start_time
        time_for(:start).strftime('%I:%M %p') if time_for(:start)
      end

      def end_time
        time_for(:end).strftime('%I:%M %p') if time_for(:end)
      end

      def errors
        @errors ||= []
      end

      def default?
        values.all?(&:blank?)
      end

      protected

      def scope
        @scope ||= Event.non_duplicates.includes(:venue, :tags)
      end

      def sort
        @scope = scope.ordered_by_ui_field(order)
        self
      end

      def filter_by_date
        @scope = if date
          scope.within_dates(date_for(:start), date_for(:end))
        else
          scope.future
        end
        self
      end

      def filter_by_time
        @scope = after_time if time_for(:start)
        @scope = before_time if time_for(:end)
        self
      end

      private

      def default_date_for(kind)
        kind == :start ? Time.zone.today : Time.zone.today + 3.months
      end

      def date_for(kind)
        return default_date_for(kind) unless date.present?
        Date.parse(date[kind])
      rescue NoMethodError, ArgumentError, TypeError
        errors << "Can't filter by an invalid #{kind} date."
        default_date_for(kind)
      end

      def time_for(kind)
        Time.zone.parse(time[kind]) rescue nil
      end

      def before_time
        scope.select { |event| event.end_time.hour <= time_for(:end).hour }
      end

      def after_time
        scope.select { |event| event.start_time.hour >= time_for(:start).hour }
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 2 rubygems

Version Path
calagator-1.0.0 app/models/calagator/event/browse.rb
grokus-1.0.0.9 app/models/calagator/event/browse.rb
grokus-1.0.0.8 app/models/calagator/event/browse.rb
grokus-1.0.0.7 app/models/calagator/event/browse.rb
grokus-1.0.0.6 app/models/calagator/event/browse.rb
grokus-1.0.0.5 app/models/calagator/event/browse.rb
grokus-1.0.0.3 app/models/calagator/event/browse.rb
grokus-1.0.0.2 app/models/calagator/event/browse.rb
grokus-1.0.0.1 app/models/calagator/event/browse.rb
calagator-1.0.0.rc3 app/models/calagator/event/browse.rb