Class Schedule::Schedule
In: app/models/schedule/schedule.rb
Parent: Object

Single year‘s event schedule. Hierarchical model or Arrays: Schedule —> Month —> Week —> Day —> SingleDayEvent

Methods

Included Modules

ActionView

Constants

COLUMNS_MAP = { :race_name => :name, :race => :name, :event => :name, :type => :discipline, :city_state => :location, :promoter => :promoter_name, :phone => :promoter_phone, :email => :promoter_email, :sponsoring_team => :team_id, :team => :team_id, :club => :team_id, :website => :flyer, :flyer_approved => { :column_type => :boolean }

Attributes

months  [R]  0-based array of Months
year  [R]  0-based array of Months

Public Class methods

[Source]

     # File app/models/schedule/schedule.rb, line 164
164:     def Schedule.add_one_day_events_to_parents(events, multi_day_events)
165:       events.each do |event|
166:         parent = multi_day_events[event.name]
167:         if parent
168:           parent.events << event
169:         end
170:       end
171:     end

Events with results _will not_ be destroyed

[Source]

    # File app/models/schedule/schedule.rb, line 50
50:     def Schedule.delete_all_future_events(date)
51:       logger.debug "Delete all events after #{date}"
52:       # Avoid lock version errors by destroying child events first
53:       SingleDayEvent.destroy_all ["date >= ? and events.id not in (select event_id from races)", date]
54:       Event.destroy_all ["date >= ? and events.id not in (select event_id from races)", date]
55:     end

Try and create parent MultiDayEvents from imported SingleDayEvents

[Source]

     # File app/models/schedule/schedule.rb, line 141
141:     def Schedule.find_multi_day_events(events)
142:       logger.debug "Find multi-day events"
143: 
144:       # Hash of Arrays keyed by event name
145:       events_by_name = Hash.new
146:       events.each do |event|
147:         logger.debug "Find multi-day events #{event.name}"
148:         event_array = events_by_name[event.name] || Array.new
149:         event_array << event
150:         events_by_name[event.name] = event_array if event_array.size == 1
151:       end
152:   
153:       multi_day_events = []
154:       events_by_name.each do |name, event_array|
155:         logger.debug "Create multi-day event #{name}"
156:         if event_array.size > 1
157:           multi_day_events << MultiDayEvent.create_from_children(event_array)
158:         end
159:       end
160:   
161:       multi_day_events
162:     end

[Source]

    # File app/models/schedule/schedule.rb, line 69
69:     def Schedule.has_event?(row)
70:       row[:name].present? && row[:date].present? && (row[:notes].blank? || !row[:notes]["Not on calendar"])
71:     end

Import Schedule from Excel filename.

*Warning:* Deletes all events after the schedule‘s first event date. See trac.butlerpress.com/racing_on_rails/wiki/SampleImportFiles for format details and examples.

file_path = schedule file to import

Returns

  • date of first event

[Source]

    # File app/models/schedule/schedule.rb, line 35
35:     def Schedule.import(file_path)
36:       start_date = nil
37:       Event.transaction do
38:         table = Tabular::Table.read(file_path, :columns => COLUMNS_MAP)
39:         start_date = table[0][:date]
40:         delete_all_future_events start_date
41:         events = parse_events(table)
42:         multi_day_events = find_multi_day_events(events)
43:         save events, multi_day_events
44:       end
45:       
46:       start_date
47:     end

[Source]

     # File app/models/schedule/schedule.rb, line 185
185:     def Schedule.logger
186:       Rails.logger
187:     end

[Source]

     # File app/models/schedule/schedule.rb, line 189
189:     def initialize(year, events)
190:       @year = year.to_i
191:       @months = []
192:       (1..12).each do |month|
193:         @months << Month.new(year, month)
194:       end
195:       events.each do |event|
196:         month = @months[event.date.month - 1]
197:         if month.nil?
198:           raise IndexError, "Could not find month for #{event.date.month} in year #{year}"
199:         end
200:         month.add event
201:       end
202:     end

Read Table Row and create SingleDayEvent

[Source]

     # File app/models/schedule/schedule.rb, line 74
 74:     def Schedule.parse(row)
 75:       logger.debug(row.inspect) if logger.debug?
 76:       event = nil
 77: 
 78:       if row[:discipline] == "Clinic"
 79:         row[:instructional] = true
 80:       end
 81: 
 82:       if row[:discipline]
 83:         discipline = Discipline.find_via_alias(row[:discipline])
 84:         if discipline != nil
 85:           row[:discipline] = discipline.name
 86:         else
 87:           row[:discipline] = RacingAssociation.current.default_discipline
 88:         end
 89:       end
 90:       
 91:       if row[:sanctioned_by].nil?
 92:         if row[:notes] == 'national'
 93:           row[:sanctioned_by] = 'USA Cycling'
 94:         elsif row[:notes] == 'international'
 95:           row[:sanctioned_by] = 'UCI'
 96:         end
 97:       end
 98:       
 99:       event_hash = row.to_hash
100:       promoter = Person.find_by_info(row[:promoter_name], row[:promoter_email], row[:promoter_phone])
101:       
102:       if promoter
103:         if promoter.name.blank?
104:           promoter.update_attributes!(:name => row[:promoter_name])
105:         end
106:           
107:         if promoter.home_phone.blank?
108:           promoter.update_attributes!(:home_phone => row[:promoter_phone])
109:         else
110:           event_hash[:phone] = row[:promoter_phone]
111:         end
112: 
113:         if promoter.email.blank?
114:           promoter.update_attributes!(:email => row[:promoter_email])
115:         else
116:           event_hash[:email] = row[:promoter_email]
117:         end
118:       elsif row[:promoter_name].present? || row[:promoter_email].present? || row[:promoter_phone].present?
119:         promoter = Person.create!(
120:                     :name => row[:promoter_name], 
121:                     :email => row[:promoter_email], 
122:                     :home_phone => row[:promoter_phone]
123:                   )
124:       end
125: 
126:       event_hash.delete :promoter_email
127:       event_hash.delete :promoter_phone
128:       event_hash[:promoter] = promoter
129: 
130:       event_hash.delete :series
131: 
132:       
133:       event = SingleDayEvent.new(event_hash)
134:       event.notification = false
135:       
136:        logger.debug("Add #{event.name} to schedule") if logger.debug?
137:       event
138:     end

Read file, split city and state, read and create promoter

[Source]

    # File app/models/schedule/schedule.rb, line 58
58:     def Schedule.parse_events(file)
59:       events = []
60:       file.rows.each do |row|
61:         if has_event?(row)
62:           events << Schedule.parse(row)
63:         end
64:       end
65:       events.compact!
66:       events
67:     end

[Source]

     # File app/models/schedule/schedule.rb, line 173
173:     def Schedule.save(events, multi_day_events)
174:       events.each do |event|
175:         logger.debug "Save #{event.name}"
176:         event.save!
177:       end
178:       multi_day_events.each do |event|
179:         logger.debug "Save #{event.name}"
180:         event.save!
181:         event.update_date
182:       end
183:     end

[Validate]