osm 1.2.10 → 1.2.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +8 -0
- data/lib/osm/api.rb +1 -0
- data/lib/osm/event.rb +248 -41
- data/lib/osm/meeting.rb +1 -1
- data/lib/osm/model.rb +7 -3
- data/spec/osm/event_spec.rb +284 -1
- data/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NzVhNDE1ZTEwZGVlNDJkNjYzNjFlY2JjMGVmOThlNzExZDc0NWU1NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZjI1YmNmOTEyMjFkMjJkYzUzZjI1YzUyNTUxYzRlN2E1ZmFlMzY0ZQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZGJhZjk3MDAyZTNhOTg0MjNkMTczMWE0MTc3ZDJlNmU4MDdkM2IyOTM2YTBi
|
10
|
+
MGIzNDllMDU2MzViNjQzMzcwYzEyN2ZmZmM1NmM4MjVkNmE0ZDZhZGRmY2Q3
|
11
|
+
MjkxNzE5ZDQwZTZlMzM0ZWU5NTIzZmRmNTA1N2RkZWUxN2JjYjA=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzcyMjU0OTczNjc3YmVmNmVjODA4YjI1N2ViZTcwMmU0MTQwYzg1YTMxMjcz
|
14
|
+
MDJhMjJkOTBlMDBmNTRkOTRkZWI4M2MwOGZiMzBmN2UyMzYzMDM1OTk4MWE3
|
15
|
+
NjgzNTk3YTg3N2I5YTA4MGI5YmZhYmQxZDYyODA2NmVhNWVjY2I=
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## Version 1.2.11
|
2
|
+
|
3
|
+
* Fix handling blank event config from OSM (JSON parse error)
|
4
|
+
* Add retrieving of badge links to events
|
5
|
+
* When creating an event in OSM badge links are also added
|
6
|
+
* When updating an event in OSM badge links are also updated
|
7
|
+
* Add get\_list method to Event (get basic event details, should cutout the need to get all events all the time)
|
8
|
+
|
1
9
|
## Version 1.2.10
|
2
10
|
|
3
11
|
* Update levels for Hikes and Nights away staged badges (released April 2014)
|
data/lib/osm/api.rb
CHANGED
@@ -264,6 +264,7 @@ module Osm
|
|
264
264
|
# @return [String] the error message
|
265
265
|
def self.get_osm_error(data)
|
266
266
|
return false unless data.is_a?(Hash)
|
267
|
+
return false if data['ok']
|
267
268
|
to_return = data['error'] || data['err'] || false
|
268
269
|
to_return = false if to_return.blank?
|
269
270
|
return to_return
|
data/lib/osm/event.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
module Osm
|
2
2
|
|
3
3
|
class Event < Osm::Model
|
4
|
+
class BadgeLink < Osm::Model; end # Ensure the constant exists for the validators
|
4
5
|
class Column < Osm::Model; end # Ensure the constant exists for the validators
|
5
6
|
|
7
|
+
LIST_ATTRIBUTES = [:id, :section_id, :name, :start, :finish, :cost, :location, :notes, :archived, :public_notepad, :confirm_by_date, :allow_changes, :reminders, :attendance_limit, :attendance_limit_includes_leaders, :attendance_reminder, :allow_booking]
|
8
|
+
EXTRA_ATTRIBUTES = [:notepad, :columns, :badges]
|
9
|
+
|
6
10
|
# @!attribute [rw] id
|
7
11
|
# @return [Fixnum] the id for the event
|
8
12
|
# @!attribute [rw] section_id
|
@@ -21,6 +25,8 @@ module Osm
|
|
21
25
|
# @return [String] notes about the event
|
22
26
|
# @!attribute [rw] archived
|
23
27
|
# @return [Boolean] if the event has been archived
|
28
|
+
# @!attribute [rw] badges
|
29
|
+
# @return [Array<Osm::Event::BadgeLink>] the badge links for the event
|
24
30
|
# @!attribute [rw] columns
|
25
31
|
# @return [Array<Osm::Event::Column>] the custom columns for the event
|
26
32
|
# @!attribute [rw] notepad
|
@@ -51,6 +57,7 @@ module Osm
|
|
51
57
|
attribute :location, :type => String, :default => ''
|
52
58
|
attribute :notes, :type => String, :default => ''
|
53
59
|
attribute :archived, :type => Boolean, :default => false
|
60
|
+
attribute :badges, :default => []
|
54
61
|
attribute :columns, :default => []
|
55
62
|
attribute :notepad, :type => String, :default => ''
|
56
63
|
attribute :public_notepad, :type => String, :default => ''
|
@@ -64,7 +71,7 @@ module Osm
|
|
64
71
|
|
65
72
|
if ActiveModel::VERSION::MAJOR < 4
|
66
73
|
attr_accessible :id, :section_id, :name, :start, :finish, :cost, :location, :notes, :archived,
|
67
|
-
:fields, :columns, :notepad, :public_notepad, :confirm_by_date, :allow_changes,
|
74
|
+
:fields, :badges, :columns, :notepad, :public_notepad, :confirm_by_date, :allow_changes,
|
68
75
|
:reminders, :attendance_limit, :attendance_limit_includes_leaders,
|
69
76
|
:attendance_reminder, :allow_booking
|
70
77
|
end
|
@@ -73,6 +80,7 @@ module Osm
|
|
73
80
|
validates_numericality_of :section_id, :only_integer=>true, :greater_than=>0
|
74
81
|
validates_numericality_of :attendance_limit, :only_integer=>true, :greater_than_or_equal_to=>0
|
75
82
|
validates_presence_of :name
|
83
|
+
validates :badges, :array_of => {:item_type => Osm::Event::BadgeLink, :item_valid => true}
|
76
84
|
validates :columns, :array_of => {:item_type => Osm::Event::Column, :item_valid => true}
|
77
85
|
validates_inclusion_of :allow_changes, :in => [true, false]
|
78
86
|
validates_inclusion_of :reminders, :in => [true, false]
|
@@ -126,6 +134,52 @@ module Osm
|
|
126
134
|
end
|
127
135
|
end
|
128
136
|
|
137
|
+
# Get event list for a section (not all details for each event)
|
138
|
+
# @param [Osm::Api] api The api to use to make the request
|
139
|
+
# @param [Osm::Section, Fixnum, #to_i] section The section (or its ID) to get the events for
|
140
|
+
# @!macro options_get
|
141
|
+
# @return [Array<Hash>]
|
142
|
+
def self.get_list(api, section, options={})
|
143
|
+
require_ability_to(api, :read, :events, section, options)
|
144
|
+
section_id = section.to_i
|
145
|
+
cache_key = ['events_list', section_id]
|
146
|
+
events_cache_key = ['events', section_id]
|
147
|
+
events = nil
|
148
|
+
|
149
|
+
unless options[:no_cache]
|
150
|
+
|
151
|
+
# Try getting from cache
|
152
|
+
if cache_exist?(api, cache_key)
|
153
|
+
return cache_read(api, cache_key)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Try generating from cached events
|
157
|
+
if cache_exist?(api, events_cache_key)
|
158
|
+
ids = cache_read(api, events_cache_key)
|
159
|
+
events = get_from_ids(api, ids, 'event', section, options, :get_for_section).map do |e|
|
160
|
+
e.attributes.symbolize_keys.select do |k,v|
|
161
|
+
LIST_ATTRIBUTES.include?(k)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
# Fetch from OSM
|
169
|
+
if events.nil?
|
170
|
+
data = api.perform_query("events.php?action=getEvents§ionid=#{section_id}&showArchived=true")
|
171
|
+
events = Array.new
|
172
|
+
unless data['items'].nil?
|
173
|
+
data['items'].map do |event_data|
|
174
|
+
events.push(attributes_from_data(event_data))
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
cache_write(api, cache_key, events)
|
180
|
+
return events
|
181
|
+
end
|
182
|
+
|
129
183
|
# Get an event
|
130
184
|
# @param [Osm::Api] api The api to use to make the request
|
131
185
|
# @param [Osm::Section, Fixnum, #to_i] section The section (or its ID) to get the events for
|
@@ -148,6 +202,7 @@ module Osm
|
|
148
202
|
|
149
203
|
|
150
204
|
# Create an event in OSM
|
205
|
+
# If something goes wrong adding badges to OSM then the event returned will have been read from OSM
|
151
206
|
# @param [Osm::Api] api The api to use to make the request
|
152
207
|
# @return [Osm::Event, nil] the created event, nil if failed
|
153
208
|
# @raise [Osm::ObjectIsInvalid] If the Event is invalid
|
@@ -174,13 +229,33 @@ module Osm
|
|
174
229
|
'allowbooking' => event.allow_booking ? 'true' : 'false',
|
175
230
|
})
|
176
231
|
|
177
|
-
# The cached events for the section will be out of date - remove them
|
178
|
-
cache_delete(api, ['events', event.section_id])
|
179
|
-
cache_write(api, ['event', event.id], event)
|
180
|
-
|
181
232
|
if (data.is_a?(Hash) && data.has_key?('id'))
|
182
233
|
event.id = data['id'].to_i
|
183
|
-
|
234
|
+
|
235
|
+
# The cached events for the section will be out of date - remove them
|
236
|
+
cache_delete(api, ['events', event.section_id])
|
237
|
+
cache_write(api, ['event', event.id], event)
|
238
|
+
|
239
|
+
# Add badge links to OSM
|
240
|
+
badges_created = true
|
241
|
+
event.badges.each do |badge|
|
242
|
+
badge_data = data = api.perform_query("ext/events/event/index.php?action=badgeAddToEvent§ionid=#{event.section_id}&eventid=#{event.id}", {
|
243
|
+
'section' => badge.badge_section,
|
244
|
+
'badgetype' => badge.badge_type,
|
245
|
+
'badge' => badge.badge_key,
|
246
|
+
'columnname' => badge.requirement_key,
|
247
|
+
'data' => badge.data,
|
248
|
+
'newcolumnname' => badge.label,
|
249
|
+
})
|
250
|
+
badges_created = false unless badge_data.is_a?(Hash) && badge_data['ok']
|
251
|
+
end
|
252
|
+
|
253
|
+
if badges_created
|
254
|
+
return event
|
255
|
+
else
|
256
|
+
# Someting went wrong adding badges so return what OSM has
|
257
|
+
return get(api, event.section_id, event.id)
|
258
|
+
end
|
184
259
|
else
|
185
260
|
return nil
|
186
261
|
end
|
@@ -188,42 +263,107 @@ module Osm
|
|
188
263
|
|
189
264
|
# Update event in OSM
|
190
265
|
# @param [Osm::Api] api The api to use to make the request
|
191
|
-
# @return [Boolean] whether the update succedded
|
266
|
+
# @return [Boolean] whether the update succedded (will return true if no updates needed to be made)
|
192
267
|
def update(api)
|
193
268
|
require_ability_to(api, :write, :events, section_id)
|
269
|
+
updated = true
|
270
|
+
|
271
|
+
# Update main attributes
|
272
|
+
update_main_attributes = false
|
273
|
+
%w{ id name location start finish cost cost_tbc notes confirm_by_date allow_changes reminders attendance_limit attendance_limit_includes_leaders allow_booking }.each do |a|
|
274
|
+
if changed_attributes.include?(a)
|
275
|
+
update_main_attributes = true
|
276
|
+
break # no use checking the others
|
277
|
+
end
|
278
|
+
end
|
279
|
+
if update_main_attributes
|
280
|
+
data = api.perform_query("events.php?action=addEvent§ionid=#{section_id}", {
|
281
|
+
'eventid' => id,
|
282
|
+
'name' => name,
|
283
|
+
'location' => location,
|
284
|
+
'startdate' => start? ? start.strftime(Osm::OSM_DATE_FORMAT) : '',
|
285
|
+
'enddate' => finish? ? finish.strftime(Osm::OSM_DATE_FORMAT) : '',
|
286
|
+
'cost' => cost_tbc? ? '-1' : cost,
|
287
|
+
'notes' => notes,
|
288
|
+
'starttime' => start? ? start.strftime(Osm::OSM_TIME_FORMAT) : '',
|
289
|
+
'endtime' => finish? ? finish.strftime(Osm::OSM_TIME_FORMAT) : '',
|
290
|
+
'confdate' => confirm_by_date? ? confirm_by_date.strftime(Osm::OSM_DATE_FORMAT) : '',
|
291
|
+
'allowChanges' => allow_changes ? 'true' : 'false',
|
292
|
+
'disablereminders' => !reminders ? 'true' : 'false',
|
293
|
+
'attendancelimit' => attendance_limit,
|
294
|
+
'attendancereminder' => attendance_reminder,
|
295
|
+
'limitincludesleaders' => attendance_limit_includes_leaders ? 'true' : 'false',
|
296
|
+
'allowbooking' => allow_booking ? 'true' : 'false',
|
297
|
+
})
|
298
|
+
updated &= data.is_a?(Hash) && (data['id'].to_i == id)
|
299
|
+
end
|
194
300
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
'cost' => cost_tbc? ? '-1' : cost,
|
204
|
-
'notes' => notes,
|
205
|
-
'starttime' => start? ? start.strftime(Osm::OSM_TIME_FORMAT) : '',
|
206
|
-
'endtime' => finish? ? finish.strftime(Osm::OSM_TIME_FORMAT) : '',
|
207
|
-
'confdate' => confirm_by_date? ? confirm_by_date.strftime(Osm::OSM_DATE_FORMAT) : '',
|
208
|
-
'allowChanges' => allow_changes ? 'true' : 'false',
|
209
|
-
'disablereminders' => !reminders ? 'true' : 'false',
|
210
|
-
'attendancelimit' => attendance_limit,
|
211
|
-
'attendancereminder' => attendance_reminder,
|
212
|
-
'limitincludesleaders' => attendance_limit_includes_leaders ? 'true' : 'false',
|
213
|
-
'allowbooking' => allow_booking ? 'true' : 'false',
|
214
|
-
})
|
301
|
+
# Private notepad
|
302
|
+
if changed_attributes.include?('notepad')
|
303
|
+
data = api.perform_query("events.php?action=saveNotepad§ionid=#{section_id}", {
|
304
|
+
'eventid' => id,
|
305
|
+
'notepad' => notepad,
|
306
|
+
})
|
307
|
+
updated &= data.is_a?(Hash)
|
308
|
+
end
|
215
309
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
310
|
+
# MySCOUT notepad
|
311
|
+
if changed_attributes.include?('public_notepad')
|
312
|
+
data = api.perform_query("events.php?action=saveNotepad§ionid=#{section_id}", {
|
313
|
+
'eventid' => id,
|
314
|
+
'pnnotepad' => public_notepad,
|
315
|
+
})
|
316
|
+
updated &= data.is_a?(Hash)
|
317
|
+
end
|
318
|
+
|
319
|
+
# Badges
|
320
|
+
if changed_attributes.include?('badges')
|
321
|
+
original_badges = @original_attributes['badges'] || []
|
322
|
+
|
323
|
+
# Deleted badges
|
324
|
+
badges_to_delete = []
|
325
|
+
original_badges.each do |badge|
|
326
|
+
unless badges.include?(badge)
|
327
|
+
badges_to_delete.push({
|
328
|
+
'section' => badge.badge_section,
|
329
|
+
'badge' => badge.badge_key,
|
330
|
+
'columnname' => badge.requirement_key,
|
331
|
+
'data' => badge.data,
|
332
|
+
'newcolumnname' => badge.label,
|
333
|
+
'badgetype' => badge.badge_type,
|
334
|
+
})
|
335
|
+
end
|
336
|
+
end
|
337
|
+
unless badges_to_delete.empty?
|
338
|
+
data = api.perform_query("ext/events/event/index.php?action=badgeDeleteFromEvent§ionid=#{section_id}&eventid=#{id}", {
|
339
|
+
'badgelinks' => badges_to_delete,
|
340
|
+
})
|
341
|
+
updated &= data.is_a?(Hash) && data['ok']
|
342
|
+
end
|
220
343
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
344
|
+
# Added badges
|
345
|
+
badges_to_add = []
|
346
|
+
badges.each do |badge|
|
347
|
+
unless original_badges.include?(badge)
|
348
|
+
badges_to_add.push({
|
349
|
+
'section' => badge.badge_section,
|
350
|
+
'badge' => badge.badge_key,
|
351
|
+
'columnname' => badge.requirement_key,
|
352
|
+
'data' => badge.data,
|
353
|
+
'newcolumnname' => badge.label,
|
354
|
+
'badgetype' => badge.badge_type,
|
355
|
+
})
|
356
|
+
end
|
357
|
+
end
|
358
|
+
unless badges_to_add.empty?
|
359
|
+
data = api.perform_query("ext/events/event/index.php?action=badgeAddToEvent§ionid=#{section_id}&eventid=#{id}", {
|
360
|
+
'badgelinks' => badges_to_add,
|
361
|
+
})
|
362
|
+
updated &= data.is_a?(Hash) && data['ok']
|
363
|
+
end
|
364
|
+
end # includes badges
|
225
365
|
|
226
|
-
if
|
366
|
+
if updated
|
227
367
|
reset_changed_attributes
|
228
368
|
# The cached event will be out of date - remove it
|
229
369
|
cache_delete(api, ['event', id])
|
@@ -383,8 +523,8 @@ module Osm
|
|
383
523
|
return attendees
|
384
524
|
end
|
385
525
|
|
386
|
-
def self.
|
387
|
-
|
526
|
+
def self.attributes_from_data(event_data)
|
527
|
+
{
|
388
528
|
:id => Osm::to_i_or_nil(event_data['eventid']),
|
389
529
|
:section_id => Osm::to_i_or_nil(event_data['sectionid']),
|
390
530
|
:name => event_data['name'],
|
@@ -394,7 +534,6 @@ module Osm
|
|
394
534
|
:location => event_data['location'],
|
395
535
|
:notes => event_data['notes'],
|
396
536
|
:archived => event_data['archived'].eql?('1'),
|
397
|
-
:notepad => event_data['notepad'],
|
398
537
|
:public_notepad => event_data['publicnotes'],
|
399
538
|
:confirm_by_date => Osm::parse_date(event_data['confdate']),
|
400
539
|
:allow_changes => event_data['allowchanges'].eql?('1'),
|
@@ -403,19 +542,87 @@ module Osm
|
|
403
542
|
:attendance_limit_includes_leaders => event_data['limitincludesleaders'].eql?('1'),
|
404
543
|
:attendance_reminder => event_data['attendancereminder'].to_i,
|
405
544
|
:allow_booking => event_data['allowbooking'].eql?('1'),
|
406
|
-
|
545
|
+
}
|
546
|
+
end
|
547
|
+
|
548
|
+
def self.new_event_from_data(event_data)
|
549
|
+
event = Osm::Event.new(attributes_from_data(event_data))
|
550
|
+
event.notepad = event_data['notepad']
|
407
551
|
|
408
552
|
columns = []
|
409
|
-
|
553
|
+
config_raw = event_data['config']
|
554
|
+
config_raw = '[]' if config_raw.blank?
|
555
|
+
column_data = ActiveSupport::JSON.decode(config_raw)
|
410
556
|
column_data = [] unless column_data.is_a?(Array)
|
411
557
|
column_data.each do |field|
|
412
558
|
columns.push Column.new(:id => field['id'], :name => field['name'], :label => field['pL'], :parent_required => field['pR'].to_s.eql?('1'), :event => event)
|
413
559
|
end
|
414
560
|
event.columns = columns
|
561
|
+
|
562
|
+
badges = []
|
563
|
+
badges_data = event_data['badgelinks']
|
564
|
+
badges_data = [] unless badges_data.is_a?(Array)
|
565
|
+
badges_data.each do |field|
|
566
|
+
badges.push BadgeLink.new(badge_key: field['badge'], badge_type: field['badgetype'].to_sym, badge_section: field['section'].to_sym, requirement_key: field['columnname'], label: field['columnnameLongName'], data: field['data'])
|
567
|
+
end
|
568
|
+
event.badges = badges
|
569
|
+
|
415
570
|
return event
|
416
571
|
end
|
417
572
|
|
418
573
|
|
574
|
+
# When creating a BadgeLink for an existing column in a hikes/nights badge the label is optional
|
575
|
+
# When creating a BadgeLink for a new column in a hikes/nights badge the requirement_key MUST be blank
|
576
|
+
# TODO : Add validation for above statements
|
577
|
+
class BadgeLink
|
578
|
+
include ActiveModel::MassAssignmentSecurity if ActiveModel::VERSION::MAJOR < 4
|
579
|
+
include ActiveAttr::Model
|
580
|
+
|
581
|
+
# @!attribute [rw] badge_key
|
582
|
+
# @return [String] the badge being done
|
583
|
+
# @!attribute [rw] badge_type
|
584
|
+
# @return [Symbol] the type of badge
|
585
|
+
# @!attribute [rw] requirement_key
|
586
|
+
# @return [String] the requirement being done
|
587
|
+
# @!attribute [rw] badge_section
|
588
|
+
# @return [Symbol] the section type that the badge belongs to
|
589
|
+
# @!attribute [rw] label
|
590
|
+
# @return [String] human firendly label for the badge and requirement
|
591
|
+
# @!attribute [rw] data
|
592
|
+
# @return [String] what to put in the column when the badge records are updated
|
593
|
+
|
594
|
+
attribute :badge_key, :type => String
|
595
|
+
attribute :badge_type, :type => Object
|
596
|
+
attribute :requirement_key, :type => String
|
597
|
+
attribute :badge_section, :type => Object
|
598
|
+
attribute :label, :type => String
|
599
|
+
attribute :data, :type => String
|
600
|
+
|
601
|
+
if ActiveModel::VERSION::MAJOR < 4
|
602
|
+
attr_accessible :badge_key, :badge_type, :requirement_key, :badge_section, :label, :data
|
603
|
+
end
|
604
|
+
|
605
|
+
validates_presence_of :badge_key
|
606
|
+
validates_format_of :requirement_key, :with => /\A(?:[a-z]_\d{2})|(?:custom_\d+)\Z/, :allow_blank => true, :message => 'is not in the correct format (e.g. "a_01")'
|
607
|
+
validates_inclusion_of :badge_section, :in => [:beavers, :cubs, :scouts, :explorers, :staged]
|
608
|
+
validates_inclusion_of :badge_type, :in => [:core, :staged, :activity, :challenge]
|
609
|
+
|
610
|
+
# @!method initialize
|
611
|
+
# Initialize a new Meeting::Activity
|
612
|
+
# @param [Hash] attributes The hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
|
613
|
+
|
614
|
+
# Compare BadgeLink based on section, type, key, requirement, data
|
615
|
+
def <=>(another)
|
616
|
+
[:badge_section, :badge_type, :badge_key, :requirement_key].each do |attribute|
|
617
|
+
result = self.try(:data) <=> another.try(:data)
|
618
|
+
return result unless result == 0
|
619
|
+
end
|
620
|
+
return self.try(:data) <=> another.try(:data)
|
621
|
+
end
|
622
|
+
|
623
|
+
end # Class Event::BadgeLink
|
624
|
+
|
625
|
+
|
419
626
|
class Column < Osm::Model
|
420
627
|
# @!attribute [rw] id
|
421
628
|
# @return [String] OSM id for the column
|
data/lib/osm/meeting.rb
CHANGED
@@ -377,7 +377,7 @@ module Osm
|
|
377
377
|
|
378
378
|
validates_presence_of :badge_key
|
379
379
|
validates_format_of :requirement_key, :with => /\A[a-z]_\d{2}\Z/, :message => 'is not in the correct format (e.g. "a_01")'
|
380
|
-
validates_inclusion_of :badge_section, :in => [:beavers, :cubs, :scouts, :explorers]
|
380
|
+
validates_inclusion_of :badge_section, :in => [:beavers, :cubs, :scouts, :explorers, :staged]
|
381
381
|
validates_inclusion_of :badge_type, :in => [:core, :staged, :activity, :challenge]
|
382
382
|
|
383
383
|
# @!method initialize
|
data/lib/osm/model.rb
CHANGED
@@ -74,7 +74,11 @@ module Osm
|
|
74
74
|
|
75
75
|
# Reset the list of attributes which have changed
|
76
76
|
def reset_changed_attributes
|
77
|
-
|
77
|
+
classes_to_clone = [Array, Hash]
|
78
|
+
attributes_now = attributes.map do |k,v|
|
79
|
+
[k, (classes_to_clone.include?(v.class) ? v.clone : v)]
|
80
|
+
end # Deep(ish) clone
|
81
|
+
@original_attributes = Hash[attributes_now]
|
78
82
|
end
|
79
83
|
|
80
84
|
|
@@ -82,7 +86,7 @@ module Osm
|
|
82
86
|
old_initialize = instance_method(:initialize)
|
83
87
|
define_method :initialize do |*args|
|
84
88
|
ret_val = old_initialize.bind(self).call(*args)
|
85
|
-
|
89
|
+
reset_changed_attributes
|
86
90
|
return ret_val
|
87
91
|
end
|
88
92
|
|
@@ -252,7 +256,7 @@ module Osm
|
|
252
256
|
# @param [Symbol] get_all_method The method to get all items (either :get_all or :get_for_section)
|
253
257
|
# @return [Array] An array of the items
|
254
258
|
def self.get_from_ids(api, ids, key, arguments=[], options, get_all_method)
|
255
|
-
raise ArgumentError, "
|
259
|
+
raise ArgumentError, "get_all_method is invalid" unless [:get_all, :get_for_section].include?(get_all_method)
|
256
260
|
items = Array.new
|
257
261
|
ids.each do |id|
|
258
262
|
if cache_exist?(api, [key, id])
|
data/spec/osm/event_spec.rb
CHANGED
@@ -15,6 +15,7 @@ describe "Event" do
|
|
15
15
|
:location => 'Somewhere',
|
16
16
|
:notes => 'None',
|
17
17
|
:archived => '0',
|
18
|
+
:badges => [],
|
18
19
|
:columns => [],
|
19
20
|
:notepad => 'notepad',
|
20
21
|
:public_notepad => 'public notepad',
|
@@ -37,6 +38,7 @@ describe "Event" do
|
|
37
38
|
event.location.should == 'Somewhere'
|
38
39
|
event.notes.should == 'None'
|
39
40
|
event.archived.should be_false
|
41
|
+
event.badges.should == []
|
40
42
|
event.columns.should == []
|
41
43
|
event.notepad.should == 'notepad'
|
42
44
|
event.public_notepad.should == 'public notepad'
|
@@ -114,7 +116,30 @@ describe "Event" do
|
|
114
116
|
|
115
117
|
event_attendances.sort.should == [ea1, ea2, ea3]
|
116
118
|
end
|
119
|
+
|
120
|
+
end
|
117
121
|
|
122
|
+
describe "Event::BadgeLink" do
|
123
|
+
|
124
|
+
it "Create" do
|
125
|
+
bl = Osm::Event::BadgeLink.new(
|
126
|
+
:badge_key => 'artist',
|
127
|
+
:badge_type => :activity,
|
128
|
+
:requirement_key => 'a_01',
|
129
|
+
:badge_section => :cubs,
|
130
|
+
:label => 'Cubs Artist Activity - A: Poster',
|
131
|
+
:data => 'abc'
|
132
|
+
)
|
133
|
+
|
134
|
+
bl.badge_key.should == 'artist'
|
135
|
+
bl.badge_type.should == :activity
|
136
|
+
bl.requirement_key.should == 'a_01'
|
137
|
+
bl.badge_section.should == :cubs
|
138
|
+
bl.label.should == 'Cubs Artist Activity - A: Poster'
|
139
|
+
bl.data.should == 'abc'
|
140
|
+
bl.valid?.should be_true
|
141
|
+
end
|
142
|
+
|
118
143
|
end
|
119
144
|
|
120
145
|
describe "Using the API" do
|
@@ -159,6 +184,10 @@ describe "Event" do
|
|
159
184
|
'notepad' => 'notepad',
|
160
185
|
'publicnotes' => 'public notepad',
|
161
186
|
'config' => '[{"id":"f_1","name":"Name","pL":"Label","pR":"1"}]',
|
187
|
+
'badgelinks' => [
|
188
|
+
{"section"=>"cubs", "badgetype"=>"activity", "badge"=>"athletics", "columnname"=>"b_06", "data"=>"", "badgeLongName"=>"Athletics", "columnnameLongName"=>"B: Run", "sectionLongName"=>"Cubs", "badgetypeLongName"=>"Activity"},
|
189
|
+
{"section"=>"staged", "badgetype"=>"staged", "badge"=>"hikes", "columnname"=>"custom_69153", "data"=>"1", "badgeLongName"=>"Hikes", "columnnameLongName"=>"C: Hike name = 1", "sectionLongName"=>"Staged", "badgetypeLongName"=>"Staged"},
|
190
|
+
],
|
162
191
|
'sectionid' => '1',
|
163
192
|
'googlecalendar' => nil,
|
164
193
|
'archived' => '0',
|
@@ -206,9 +235,27 @@ describe "Event" do
|
|
206
235
|
event.columns[0].name.should == 'Name'
|
207
236
|
event.columns[0].label.should == 'Label'
|
208
237
|
event.columns[0].parent_required.should be_true
|
238
|
+
event.badges[0].badge_key.should == 'athletics'
|
239
|
+
event.badges[0].badge_section.should == :cubs
|
240
|
+
event.badges[0].badge_type.should == :activity
|
241
|
+
event.badges[0].requirement_key.should == 'b_06'
|
242
|
+
event.badges[0].data.should == ''
|
243
|
+
event.badges[0].label.should == 'B: Run'
|
244
|
+
event.badges[1].badge_key.should == 'hikes'
|
245
|
+
event.badges[1].badge_section.should == :staged
|
246
|
+
event.badges[1].badge_type.should == :staged
|
247
|
+
event.badges[1].requirement_key.should == 'custom_69153'
|
248
|
+
event.badges[1].data.should == '1'
|
209
249
|
event.valid?.should be_true
|
210
250
|
end
|
211
251
|
|
252
|
+
it "Handles a blank config" do
|
253
|
+
@event_body['config'] = ''
|
254
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvent§ionid=1&eventid=2", :body => @event_body.to_json,:content_type => 'application/json')
|
255
|
+
expect { @event = Osm::Event.get(@api, 1, 2) }.to_not raise_error
|
256
|
+
@event.columns.should == []
|
257
|
+
end
|
258
|
+
|
212
259
|
it 'Handles cost of "-1" for TBC' do
|
213
260
|
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvent§ionid=1&eventid=2", :body => @event_body.merge({'cost' => '-1'}).to_json, :content_type => 'application/json')
|
214
261
|
|
@@ -271,6 +318,28 @@ describe "Event" do
|
|
271
318
|
end
|
272
319
|
end
|
273
320
|
|
321
|
+
describe "Get events list for section" do
|
322
|
+
it "From OSM" do
|
323
|
+
events = Osm::Event.get_list(@api, 1)
|
324
|
+
events.map{ |e| e[:id]}.should == [2]
|
325
|
+
end
|
326
|
+
|
327
|
+
it "From cache" do
|
328
|
+
events = Osm::Event.get_list(@api, 1)
|
329
|
+
HTTParty.should_not_receive(:post)
|
330
|
+
Osm::Event.get_list(@api, 1).should == events
|
331
|
+
end
|
332
|
+
|
333
|
+
it "From cached events" do
|
334
|
+
Osm::Event.get_for_section(@api, 1)
|
335
|
+
HTTParty.should_not_receive(:post)
|
336
|
+
events = Osm::Event.get_list(@api, 1)
|
337
|
+
events.map{ |e| e[:id]}.should == [2]
|
338
|
+
end
|
339
|
+
|
340
|
+
end
|
341
|
+
|
342
|
+
|
274
343
|
it "Get event" do
|
275
344
|
event = Osm::Event.get(@api, 1, 2)
|
276
345
|
event.should_not be_nil
|
@@ -417,6 +486,7 @@ describe "Event" do
|
|
417
486
|
:cost => '1.23',
|
418
487
|
:location => 'Somewhere',
|
419
488
|
:notes => 'none',
|
489
|
+
:badges => [],
|
420
490
|
:columns => [],
|
421
491
|
:notepad => '',
|
422
492
|
:public_notepad => '',
|
@@ -467,6 +537,7 @@ describe "Event" do
|
|
467
537
|
:cost => 'TBC',
|
468
538
|
:location => 'Somewhere',
|
469
539
|
:notes => 'none',
|
540
|
+
:badges => [],
|
470
541
|
:columns => [],
|
471
542
|
:notepad => '',
|
472
543
|
:public_notepad => '',
|
@@ -481,6 +552,144 @@ describe "Event" do
|
|
481
552
|
event.id.should == 2
|
482
553
|
end
|
483
554
|
|
555
|
+
describe "With badges" do
|
556
|
+
|
557
|
+
before :each do
|
558
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=addEvent§ionid=1'
|
559
|
+
post_data = {
|
560
|
+
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
561
|
+
'token' => @CONFIGURATION[:api][:osm][:token],
|
562
|
+
'userid' => 'user_id',
|
563
|
+
'secret' => 'secret',
|
564
|
+
'name' => 'Test event',
|
565
|
+
'startdate' => '2000-01-02',
|
566
|
+
'enddate' => '2001-02-03',
|
567
|
+
'starttime' => '03:04:05',
|
568
|
+
'endtime' => '04:05:06',
|
569
|
+
'cost' => '1.23',
|
570
|
+
'location' => 'Somewhere',
|
571
|
+
'notes' => 'none',
|
572
|
+
'confdate' => '2000-01-01',
|
573
|
+
'allowChanges' => 'true',
|
574
|
+
'disablereminders' => 'false',
|
575
|
+
'attendancelimit' => 3,
|
576
|
+
'limitincludesleaders' => 'true',
|
577
|
+
'allowbooking' => 'true',
|
578
|
+
'attendancereminder' => 1,
|
579
|
+
}
|
580
|
+
|
581
|
+
Osm::Event.stub(:get_for_section) { [] }
|
582
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"id":2}'}) }
|
583
|
+
|
584
|
+
@attributes = {
|
585
|
+
:section_id => 1,
|
586
|
+
:name => 'Test event',
|
587
|
+
:start => DateTime.new(2000, 1, 2, 3, 4, 5),
|
588
|
+
:finish => DateTime.new(2001, 2, 3, 4, 5, 6),
|
589
|
+
:cost => '1.23',
|
590
|
+
:location => 'Somewhere',
|
591
|
+
:notes => 'none',
|
592
|
+
:badges => [],
|
593
|
+
:columns => [],
|
594
|
+
:notepad => '',
|
595
|
+
:public_notepad => '',
|
596
|
+
:confirm_by_date => Date.new(2000, 1, 1),
|
597
|
+
:allow_changes => true,
|
598
|
+
:reminders => true,
|
599
|
+
:attendance_limit => 3,
|
600
|
+
:attendance_limit_includes_leaders => true,
|
601
|
+
:attendance_reminder => 1,
|
602
|
+
:allow_booking => true,
|
603
|
+
}
|
604
|
+
@badge_url = 'https://www.onlinescoutmanager.co.uk/ext/events/event/index.php?action=badgeAddToEvent§ionid=1&eventid=2'
|
605
|
+
end
|
606
|
+
|
607
|
+
it "'Normal badge'" do
|
608
|
+
post_data = {
|
609
|
+
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
610
|
+
'token' => @CONFIGURATION[:api][:osm][:token],
|
611
|
+
'userid' => 'user_id',
|
612
|
+
'secret' => 'secret',
|
613
|
+
'section' => :beavers,
|
614
|
+
'badgetype' => :activity,
|
615
|
+
'badge' => 'test',
|
616
|
+
'columnname' => 'a_01',
|
617
|
+
'data' => '',
|
618
|
+
'newcolumnname' => '',
|
619
|
+
}
|
620
|
+
HTTParty.should_receive(:post).with(@badge_url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true}'}) }
|
621
|
+
|
622
|
+
@attributes[:badges] = [Osm::Event::BadgeLink.new(
|
623
|
+
badge_key: 'test',
|
624
|
+
badge_type: :activity,
|
625
|
+
requirement_key: 'a_01',
|
626
|
+
badge_section: :beavers,
|
627
|
+
label: '',
|
628
|
+
data: '',
|
629
|
+
)]
|
630
|
+
event = Osm::Event.create(@api, @attributes)
|
631
|
+
event.should_not be_nil
|
632
|
+
event.id.should == 2
|
633
|
+
end
|
634
|
+
|
635
|
+
it "Add a hikes column" do
|
636
|
+
post_data = {
|
637
|
+
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
638
|
+
'token' => @CONFIGURATION[:api][:osm][:token],
|
639
|
+
'userid' => 'user_id',
|
640
|
+
'secret' => 'secret',
|
641
|
+
'section' => :staged,
|
642
|
+
'badgetype' => :staged,
|
643
|
+
'badge' => 'hikes',
|
644
|
+
'columnname' => '',
|
645
|
+
'data' => '1',
|
646
|
+
'newcolumnname' => 'Label for added column',
|
647
|
+
}
|
648
|
+
HTTParty.should_receive(:post).with(@badge_url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true}'}) }
|
649
|
+
|
650
|
+
@attributes[:badges] = [Osm::Event::BadgeLink.new(
|
651
|
+
badge_key: 'hikes',
|
652
|
+
badge_type: :staged,
|
653
|
+
requirement_key: '',
|
654
|
+
badge_section: :staged,
|
655
|
+
label: 'Label for added column',
|
656
|
+
data: '1',
|
657
|
+
)]
|
658
|
+
event = Osm::Event.create(@api, @attributes)
|
659
|
+
event.should_not be_nil
|
660
|
+
event.id.should == 2
|
661
|
+
end
|
662
|
+
|
663
|
+
it "Existing nights away column" do
|
664
|
+
post_data = {
|
665
|
+
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
666
|
+
'token' => @CONFIGURATION[:api][:osm][:token],
|
667
|
+
'userid' => 'user_id',
|
668
|
+
'secret' => 'secret',
|
669
|
+
'section' => :staged,
|
670
|
+
'badgetype' => :staged,
|
671
|
+
'badge' => 'nights',
|
672
|
+
'columnname' => 'custom_01234',
|
673
|
+
'data' => '2',
|
674
|
+
'newcolumnname' => '',
|
675
|
+
}
|
676
|
+
HTTParty.should_receive(:post).with(@badge_url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true}'}) }
|
677
|
+
|
678
|
+
@attributes[:badges] = [Osm::Event::BadgeLink.new(
|
679
|
+
badge_key: 'nights',
|
680
|
+
badge_type: :staged,
|
681
|
+
requirement_key: 'custom_01234',
|
682
|
+
badge_section: :staged,
|
683
|
+
label: '',
|
684
|
+
data: '2',
|
685
|
+
)]
|
686
|
+
event = Osm::Event.create(@api, @attributes)
|
687
|
+
event.should_not be_nil
|
688
|
+
event.id.should == 2
|
689
|
+
end
|
690
|
+
|
691
|
+
end
|
692
|
+
|
484
693
|
end
|
485
694
|
|
486
695
|
it "Create (failed)" do
|
@@ -539,7 +748,7 @@ describe "Event" do
|
|
539
748
|
|
540
749
|
event = Osm::Event.new(
|
541
750
|
:section_id => 1,
|
542
|
-
:name => '
|
751
|
+
:name => '',
|
543
752
|
:start => DateTime.new(2000, 01, 02, 03, 04, 05),
|
544
753
|
:finish => DateTime.new(2001, 02, 03, 04, 05, 06),
|
545
754
|
:cost => '1.23',
|
@@ -556,6 +765,7 @@ describe "Event" do
|
|
556
765
|
:attendance_reminder => 2,
|
557
766
|
:allow_booking => true,
|
558
767
|
)
|
768
|
+
event.name = 'Test event'
|
559
769
|
event.notepad = 'notepad'
|
560
770
|
event.public_notepad = 'public notepad'
|
561
771
|
event.update(@api).should be_true
|
@@ -611,6 +821,78 @@ describe "Event" do
|
|
611
821
|
event.update(@api).should be_true
|
612
822
|
end
|
613
823
|
|
824
|
+
describe "Badge links" do
|
825
|
+
|
826
|
+
before :each do
|
827
|
+
@event = Osm::Event.new({
|
828
|
+
:id => 2,
|
829
|
+
:section_id => 1,
|
830
|
+
:name => 'Test event',
|
831
|
+
:start => DateTime.new(2000, 1, 2, 3, 4, 5),
|
832
|
+
:finish => DateTime.new(2001, 2, 3, 4, 5, 6),
|
833
|
+
:cost => '1.23',
|
834
|
+
:location => 'Somewhere',
|
835
|
+
:notes => 'none',
|
836
|
+
:badges => [Osm::Event::BadgeLink.new(badge_key: 'test')],
|
837
|
+
:columns => [],
|
838
|
+
:notepad => '',
|
839
|
+
:public_notepad => '',
|
840
|
+
:confirm_by_date => Date.new(2000, 1, 1),
|
841
|
+
:allow_changes => true,
|
842
|
+
:reminders => true,
|
843
|
+
:attendance_limit => 3,
|
844
|
+
:attendance_limit_includes_leaders => true,
|
845
|
+
:attendance_reminder => 1,
|
846
|
+
:allow_booking => true,
|
847
|
+
})
|
848
|
+
end
|
849
|
+
|
850
|
+
it "Added" do
|
851
|
+
url = 'https://www.onlinescoutmanager.co.uk/ext/events/event/index.php?action=badgeAddToEvent§ionid=1&eventid=2'
|
852
|
+
post_data = {
|
853
|
+
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
854
|
+
'token' => @CONFIGURATION[:api][:osm][:token],
|
855
|
+
'userid' => 'user_id',
|
856
|
+
'secret' => 'secret',
|
857
|
+
'badgelinks' => [{
|
858
|
+
'section' => nil,
|
859
|
+
'badgetype' => nil,
|
860
|
+
'badge' => 'test2',
|
861
|
+
'columnname' => nil,
|
862
|
+
'data' => nil,
|
863
|
+
'newcolumnname' => nil,
|
864
|
+
}],
|
865
|
+
}
|
866
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true,"error":"Update Error"}'}) }
|
867
|
+
|
868
|
+
@event.badges.push(Osm::Event::BadgeLink.new(badge_key: 'test2'))
|
869
|
+
@event.update(@api).should be_true
|
870
|
+
end
|
871
|
+
|
872
|
+
it "Removed" do
|
873
|
+
url = 'https://www.onlinescoutmanager.co.uk/ext/events/event/index.php?action=badgeDeleteFromEvent§ionid=1&eventid=2'
|
874
|
+
post_data = {
|
875
|
+
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
876
|
+
'token' => @CONFIGURATION[:api][:osm][:token],
|
877
|
+
'userid' => 'user_id',
|
878
|
+
'secret' => 'secret',
|
879
|
+
'badgelinks' => [{
|
880
|
+
'section' => nil,
|
881
|
+
'badgetype' => nil,
|
882
|
+
'badge' => 'test',
|
883
|
+
'columnname' => nil,
|
884
|
+
'data' => nil,
|
885
|
+
'newcolumnname' => nil,
|
886
|
+
}],
|
887
|
+
}
|
888
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true,"error":"Update Error"}'}) }
|
889
|
+
|
890
|
+
@event.badges = []
|
891
|
+
@event.update(@api).should be_true
|
892
|
+
end
|
893
|
+
|
894
|
+
end
|
895
|
+
|
614
896
|
end
|
615
897
|
|
616
898
|
it "Update (failed)" do
|
@@ -626,6 +908,7 @@ describe "Event" do
|
|
626
908
|
:notes => 'none',
|
627
909
|
:id => 2
|
628
910
|
)
|
911
|
+
event.id = 22
|
629
912
|
event.update(@api).should be_false
|
630
913
|
end
|
631
914
|
|
data/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: osm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Gauld
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|