| 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
| 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 } |
| months | [R] | 0-based array of Months |
| year | [R] | 0-based array of Months |
# 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
# 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
# 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
# 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
# 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
# File app/models/schedule/schedule.rb, line 185
185: def Schedule.logger
186: Rails.logger
187: end
# 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
# 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
# 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
# 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