osm 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.md CHANGED
@@ -1,10 +1,13 @@
1
1
  ## Version 1.0.6
2
2
 
3
- *
3
+ * Add badge\_links to Meeting
4
+ * Event.add\_column method gains a required attirbute (default false) to control whether parents are required to enter something
5
+ * Event::Column gains parent\_required attribute (default false)
6
+ * Event::Attendance gains get\_audit\_trail(api) method
4
7
 
5
8
  ## Version 1.0.5
6
9
 
7
- * Fix undefined method youth_section? within Model.require\_ability\_to
10
+ * Fix undefined method youth\_section? within Model.require\_ability\_to
8
11
 
9
12
  ## Version 1.0.4
10
13
 
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard 'rspec' do
4
+ guard 'rspec', all_on_start: true, all_after_pass: true do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
7
  watch(%r{^lib/([^/]+)/(.+)\.rb$}) { |m| "spec/#{m[1]}/#{m[2]}_spec.rb" }
data/lib/osm.rb CHANGED
@@ -94,7 +94,7 @@ module Osm
94
94
  def self.parse_datetime(date_time)
95
95
  return nil if date_time.nil? || date_time.empty?
96
96
  begin
97
- return DateTime.strptime((date_time), OSM_DATETIME_FORMAT)
97
+ return DateTime.strptime(date_time, OSM_DATETIME_FORMAT)
98
98
  rescue ArgumentError
99
99
  return nil
100
100
  end
data/lib/osm/event.rb CHANGED
@@ -267,6 +267,7 @@ module Osm
267
267
  'No' => :no,
268
268
  'Invited' => :invited,
269
269
  'Show in My.SCOUT' => :shown,
270
+ 'Reserved' => :reserved,
270
271
  }
271
272
 
272
273
  attendance = []
@@ -297,15 +298,17 @@ module Osm
297
298
  # @param [Osm::Api] api The api to use to make the request
298
299
  # @param [String] label The label for the field in OSM
299
300
  # @param [String] name The label for the field in My.SCOUT (if this is blank then parents can't edit it)
301
+ # @param [Boolean] required Whether the parent is required to enter something
300
302
  # @return [Boolean] whether the update succedded
301
303
  # @raise [Osm::ArgumentIsInvalid] If the name is blank
302
- def add_column(api, name, label='')
304
+ def add_column(api, name, label='', required=false)
303
305
  require_ability_to(api, :write, :events, section_id)
304
306
  raise Osm::ArgumentIsInvalid, 'name is invalid' if name.blank?
305
307
 
306
308
  data = api.perform_query("events.php?action=addColumn&sectionid=#{section_id}&eventid=#{id}", {
307
309
  'columnName' => name,
308
- 'parentLabel' => label
310
+ 'parentLabel' => label,
311
+ 'parentRequire' => (required ? 1 : 0),
309
312
  })
310
313
 
311
314
  # The cached events for the section will be out of date - remove them
@@ -396,7 +399,7 @@ module Osm
396
399
  column_data = ActiveSupport::JSON.decode(event_data['config'] || '[]')
397
400
  column_data = [] unless column_data.is_a?(Array)
398
401
  column_data.each do |field|
399
- columns.push Column.new(:id => field['id'], :name => field['name'], :label => field['pL'], :event => event)
402
+ columns.push Column.new(:id => field['id'], :name => field['name'], :label => field['pL'], :parent_required => field['pR'].to_s.eql?('1'), :event => event)
400
403
  end
401
404
  event.columns = columns
402
405
  return event
@@ -411,15 +414,18 @@ module Osm
411
414
  # @return [String] name for the column (displayed in OSM)
412
415
  # @!attribute [rw] label
413
416
  # @return [String] label to display in My.SCOUT ("" prevents display in My.SCOUT)
417
+ # @!attribute [rw] parent_required
418
+ # @return [Boolean] whether the parent is required to enter something
414
419
  # @!attriute [rw] event
415
420
  # @return [Osm::Event] the event that this column belongs to
416
421
 
417
422
  attribute :id, :type => String
418
423
  attribute :name, :type => String
419
424
  attribute :label, :type => String, :default => ''
425
+ attribute :parent_required, :type => Boolean, :default => false
420
426
  attribute :event
421
427
 
422
- attr_accessible :id, :name, :label, :event
428
+ attr_accessible :id, :name, :label, :parent_required, :event
423
429
 
424
430
  validates_presence_of :id
425
431
  validates_presence_of :name
@@ -439,12 +445,13 @@ module Osm
439
445
  data = api.perform_query("events.php?action=renameColumn&sectionid=#{event.section_id}&eventid=#{event.id}", {
440
446
  'columnId' => id,
441
447
  'columnName' => name,
442
- 'pL' => label
448
+ 'pL' => label,
449
+ 'pR' => (parent_required ? 1 : 0),
443
450
  })
444
451
 
445
452
  (ActiveSupport::JSON.decode(data['config']) || []).each do |i|
446
453
  if i['id'] == id
447
- if i['name'].eql?(name) && (i['pL'].nil? || i['pL'].eql?(label))
454
+ if i['name'].eql?(name) && (i['pL'].nil? || i['pL'].eql?(label)) && (i['pR'].eql?('1') == parent_required)
448
455
  reset_changed_attributes
449
456
  # The cached event will be out of date - remove it
450
457
  cache_delete(api, ['event', event.id])
@@ -513,7 +520,7 @@ module Osm
513
520
  # @!attribute [rw] date_of_birth
514
521
  # @return [Date] the member's date of birth
515
522
  # @!attribute [rw] attending
516
- # @return [Symbol] whether the member is attending (either :yes, :no, :invited, :shown or nil)
523
+ # @return [Symbol] whether the member is attending (either :yes, :no, :invited, :shown, :reserved or nil)
517
524
  # @!attribute [rw] payments
518
525
  # @return [Hash] keys are the payment's id, values are the payment state
519
526
  # @!attribute [rw] payment_control
@@ -545,7 +552,7 @@ module Osm
545
552
  validates_presence_of :last_name
546
553
  validates_presence_of :date_of_birth
547
554
  validates_inclusion_of :payment_control, :in => [:manual, :automatic, nil]
548
- validates_inclusion_of :attending, :in => [:yes, :no, :invited, :shown, nil]
555
+ validates_inclusion_of :attending, :in => [:yes, :no, :invited, :shown, :reserved, nil]
549
556
 
550
557
 
551
558
  # @!method initialize
@@ -575,6 +582,7 @@ module Osm
575
582
  :no => 'No',
576
583
  :invited => 'Invited',
577
584
  :shown => 'Show in My.SCOUT',
585
+ :reserved => 'Reserved',
578
586
  }
579
587
 
580
588
  updated = true
@@ -622,6 +630,56 @@ module Osm
622
630
  return updated
623
631
  end
624
632
 
633
+ # Get audit trail
634
+ # @param [Osm::Api] api The api to use to make the request
635
+ # @!macro options_get
636
+ # @return [Array<Hash>]
637
+ def get_audit_trail(api, options={})
638
+ require_ability_to(api, :read, :events, event.section_id, options)
639
+ cache_key = ['event\_attendance\_audit', event.id, member_id]
640
+
641
+ if !options[:no_cache] && cache_exist?(api, cache_key)
642
+ return cache_read(api, cache_key)
643
+ end
644
+
645
+ data = api.perform_query("events.php?action=getEventAudit&sectionid=#{event.section_id}&scoutid=#{member_id}&eventid=#{event.id}")
646
+ data ||= []
647
+
648
+ attending_values = {
649
+ 'Yes' => :yes,
650
+ 'No' => :no,
651
+ 'Invited' => :invited,
652
+ 'Show in My.SCOUT' => :shown,
653
+ 'Reserved' => :reserved,
654
+ }
655
+
656
+ trail = []
657
+ data.each do |item|
658
+ this_item = {
659
+ :at => DateTime.strptime(item['date'], '%d/%m/%Y %H:%M'),
660
+ :by => item['updatedby'].strip,
661
+ :type => item['type'].to_sym,
662
+ :description => item['desc'],
663
+ :event_id => event.id,
664
+ :member_id => member_id,
665
+ :event_attendance => self,
666
+ }
667
+ if this_item[:type].eql?(:detail)
668
+ results = this_item[:description].match(/\ASet '(?<label>.+)' to '(?<value>.+)'\Z/)
669
+ this_item[:label] = results[:label]
670
+ this_item[:value] = results[:value]
671
+ end
672
+ if this_item[:type].eql?(:attendance)
673
+ results = this_item[:description].match(/\AAttendance: (?<attending>.+)\Z/)
674
+ this_item[:attendance] = attending_values[results[:attending]]
675
+ end
676
+ trail.push this_item
677
+ end
678
+
679
+ cache_write(api, cache_key, trail)
680
+ return trail
681
+ end
682
+
625
683
  # @! method automatic_payments?
626
684
  # Check wether payments are made automatically for this member
627
685
  # @return [Boolean]
@@ -645,8 +703,10 @@ module Osm
645
703
  # @return [Boolean]
646
704
  # @! method is_shown?
647
705
  # Check wether the member can see the event in My.SCOUT
706
+ # @! method is_reserved?
707
+ # Check wether the member has reserved a space when one becomes availible
648
708
  # @return [Boolean]
649
- [:attending, :not_attending, :invited, :shown].each do |attending_type|
709
+ [:attending, :not_attending, :invited, :shown, :reserved].each do |attending_type|
650
710
  define_method "is_#{attending_type}?" do
651
711
  attending == attending_type
652
712
  end
data/lib/osm/meeting.rb CHANGED
@@ -2,6 +2,7 @@ module Osm
2
2
 
3
3
  class Meeting < Osm::Model
4
4
  class Activity; end # Ensure the constant exists for the validators
5
+ class BadgeLink; end # Ensure the constant exists for the validators
5
6
 
6
7
  # @!attribute [rw] id
7
8
  # @return [Fixnum] the id of the meeting
@@ -23,6 +24,8 @@ module Osm
23
24
  # @return [Date] the date of the meeting
24
25
  # @!attribute [rw] activities
25
26
  # @return [Array<Activity>] list of activities being done during the meeting
27
+ # @!attribute [rw] badge_links
28
+ # @return [Array<BadgeLink>] list of badge links added to the meeting
26
29
  # @!attribute [rw] start_time
27
30
  # @return [String] the start time (hh:mm)
28
31
  # @!attribute [rw] finish_time
@@ -40,8 +43,9 @@ module Osm
40
43
  attribute :start_time, :type => String
41
44
  attribute :finish_time, :type => String
42
45
  attribute :activities, :default => []
46
+ attribute :badge_links, :default => []
43
47
 
44
- attr_accessible :id, :section_id, :title, :notes_for_parents, :games, :pre_notes, :post_notes, :leaders, :date, :activities, :start_time, :finish_time
48
+ attr_accessible :id, :section_id, :title, :notes_for_parents, :games, :pre_notes, :post_notes, :leaders, :date, :activities, :start_time, :finish_time, :badge_links
45
49
 
46
50
  validates_numericality_of :id, :only_integer=>true, :greater_than=>0
47
51
  validates_numericality_of :section_id, :only_integer=>true, :greater_than=>0
@@ -49,8 +53,8 @@ module Osm
49
53
  validates_presence_of :date
50
54
  validates_format_of :start_time, :with => Osm::OSM_TIME_REGEX, :message => 'is not in the correct format (HH:MM)', :allow_blank => true
51
55
  validates_format_of :finish_time, :with => Osm::OSM_TIME_REGEX, :message => 'is not in the correct format (HH:MM)', :allow_blank => true
52
-
53
56
  validates :activities, :array_of => {:item_type => Osm::Meeting::Activity, :item_valid => true}
57
+ validates :badge_links, :array_of => {:item_type => Osm::Meeting::BadgeLink, :item_valid => true}
54
58
 
55
59
  # @!method initialize
56
60
  # Initialize a new Meeting
@@ -79,6 +83,7 @@ module Osm
79
83
  data = {'items'=>[],'activities'=>{}} if data.is_a? Array
80
84
  items = data['items'] || []
81
85
  activities = data['activities'] || {}
86
+ badge_links = data['badgelinks'] || {}
82
87
 
83
88
  items.each do |item|
84
89
  attributes = {}
@@ -93,7 +98,7 @@ module Osm
93
98
  attributes[:start_time] = item['starttime'].nil? ? nil : item['starttime'][0..4]
94
99
  attributes[:finish_time] = item['endtime'].nil? ? nil : item['endtime'][0..4]
95
100
  attributes[:date] = Osm::parse_date(item['meetingdate'])
96
-
101
+
97
102
  our_activities = activities[item['eveningid']]
98
103
  attributes[:activities] = Array.new
99
104
  unless our_activities.nil?
@@ -105,7 +110,21 @@ module Osm
105
110
  )
106
111
  end
107
112
  end
108
-
113
+
114
+ our_badge_links = badge_links[item['eveningid']]
115
+ attributes[:badge_links] = Array.new
116
+ unless our_badge_links.nil?
117
+ our_badge_links.each do |badge_link_data|
118
+ attributes[:badge_links].push Osm::Meeting::BadgeLink.new(
119
+ :badge_key => badge_link_data['badge'],
120
+ :badge_type => badge_link_data['badgetype'].downcase.to_sym,
121
+ :requirement_key => badge_link_data['columnname'],
122
+ :badge_section => badge_link_data['section'].downcase.to_sym,
123
+ :label => badge_link_data['label'],
124
+ )
125
+ end
126
+ end
127
+
109
128
  result.push new(attributes)
110
129
  end
111
130
 
@@ -156,7 +175,17 @@ module Osm
156
175
  }
157
176
  activities_data.push this_activity
158
177
  end
159
- activities_data = ActiveSupport::JSON.encode(activities_data)
178
+
179
+ badge_links_data = Array.new
180
+ badge_links.each do |badge_link|
181
+ this_badge_link = {
182
+ 'section' => badge_link.badge_section,
183
+ 'badge' => badge_link.badge_key,
184
+ 'columnname' => badge_link.requirement_key,
185
+ 'badgetype' => badge_link.badge_type,
186
+ }
187
+ badge_links_data.push this_badge_link
188
+ end
160
189
 
161
190
  api_data = {
162
191
  'eveningid' => id,
@@ -170,7 +199,8 @@ module Osm
170
199
  'postnotes' => post_notes,
171
200
  'games' => games,
172
201
  'leaders' => leaders,
173
- 'activity' => activities_data,
202
+ 'activity' => ActiveSupport::JSON.encode(activities_data),
203
+ 'badgelinks' => ActiveSupport::JSON.encode(badge_links_data),
174
204
  }
175
205
  response = api.perform_query("programme.php?action=editEvening", api_data)
176
206
 
@@ -290,6 +320,46 @@ module Osm
290
320
 
291
321
  end # Class Meeting::Activity
292
322
 
323
+
324
+ class BadgeLink
325
+ include ActiveModel::MassAssignmentSecurity
326
+ include ActiveAttr::Model
327
+
328
+ # @!attribute [rw] badge_key
329
+ # @return [String] the badge being done
330
+ # @!attribute [rw] badge_type
331
+ # @return [Symbol] the type of badge
332
+ # @!attribute [rw] requirement_key
333
+ # @return [String] the requirement being done
334
+ # @!attribute [rw] badge_section
335
+ # @return [Symbol] the section type that the badge belongs to
336
+ # @!attribute [rw] label
337
+ # @return [String] human firendly label for the badge and requirement
338
+
339
+ attribute :badge_key, :type => String
340
+ attribute :badge_type, :type => Object
341
+ attribute :requirement_key, :type => String
342
+ attribute :badge_section, :type => Object
343
+ attribute :label, :type => String
344
+
345
+ attr_accessible :badge_key, :badge_type, :requirement_key, :badge_section, :label
346
+
347
+ validates_presence_of :badge_key
348
+ validates_format_of :requirement_key, :with => /\A[a-z]_\d{2}\Z/, :message => 'is not in the correct format (e.g. "a_01")'
349
+ validates_inclusion_of :badge_section, :in => [:beavers, :cubs, :scouts, :explorers]
350
+ validates_inclusion_of :badge_type, :in => [:core, :staged, :activity, :challenge]
351
+
352
+ # @!method initialize
353
+ # Initialize a new Meeting::Activity
354
+ # @param [Hash] attributes The hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
355
+
356
+ # Compare BadgeLink based on title then activity_id
357
+ def <=>(another)
358
+ return self.label <=> another.try(:label)
359
+ end
360
+
361
+ end # Class Meeting::BadgeLink
362
+
293
363
  end # Class Meeting
294
364
 
295
365
  end # Module
@@ -155,7 +155,7 @@ describe "Event" do
155
155
  'notes' => 'Notes',
156
156
  'notepad' => 'notepad',
157
157
  'publicnotes' => 'public notepad',
158
- 'config' => '[{"id":"f_1","name":"Name","pL":"Label"}]',
158
+ 'config' => '[{"id":"f_1","name":"Name","pL":"Label","pR":"1"}]',
159
159
  'sectionid' => '1',
160
160
  'googlecalendar' => nil,
161
161
  'archived' => '0',
@@ -200,6 +200,7 @@ describe "Event" do
200
200
  event.columns[0].id.should == 'f_1'
201
201
  event.columns[0].name.should == 'Name'
202
202
  event.columns[0].label.should == 'Label'
203
+ event.columns[0].parent_required.should == true
203
204
  event.valid?.should be_true
204
205
  end
205
206
 
@@ -778,6 +779,7 @@ describe "Event" do
778
779
  'secret' => 'secret',
779
780
  'columnName' => 'Test name',
780
781
  'parentLabel' => 'Test label',
782
+ 'parentRequire' => 1
781
783
  }
782
784
  body = {
783
785
  'eventid' => '2',
@@ -787,7 +789,7 @@ describe "Event" do
787
789
 
788
790
  event = Osm::Event.new(:id => 2, :section_id => 1)
789
791
  event.should_not be_nil
790
- event.add_column(@api, 'Test name', 'Test label').should be_true
792
+ event.add_column(@api, 'Test name', 'Test label', true).should be_true
791
793
  column = event.columns[0]
792
794
  column.id.should == 'f_1'
793
795
  column.name.should == 'Test name'
@@ -813,10 +815,11 @@ describe "Event" do
813
815
  'columnId' => 'f_1',
814
816
  'columnName' => 'New name',
815
817
  'pL' => 'New label',
818
+ 'pR' => 1
816
819
  }
817
820
  body = {
818
821
  'eventid' => '2',
819
- 'config' => '[{"id":"f_1","name":"New name","pL":"New label"}]'
822
+ 'config' => '[{"id":"f_1","name":"New name","pL":"New label","pR":"1"}]'
820
823
  }
821
824
  HTTParty.should_receive(:post).with(url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>body.to_json}) }
822
825
 
@@ -825,6 +828,7 @@ describe "Event" do
825
828
  column = event.columns[0]
826
829
  column.name = 'New name'
827
830
  column.label = 'New label'
831
+ column.parent_required = true
828
832
 
829
833
  column.update(@api).should be_true
830
834
 
@@ -873,6 +877,41 @@ describe "Event" do
873
877
  column.delete(@api).should be_false
874
878
  end
875
879
 
880
+ it "Get audit trail" do
881
+ url = 'https://www.onlinescoutmanager.co.uk/events.php?action=getEventAudit&sectionid=1&scoutid=2&eventid=3'
882
+ post_data = {
883
+ 'apiid' => @CONFIGURATION[:api][:osm][:id],
884
+ 'token' => @CONFIGURATION[:api][:osm][:token],
885
+ 'userid' => 'user_id',
886
+ 'secret' => 'secret',
887
+ }
888
+ data = [
889
+ {"date" => "10/06/2013 19:17","updatedby" => "My.SCOUT","type" => "detail","desc" => "Set 'Test' to 'Test data'"},
890
+ {"date" => "10/06/2013 19:16","updatedby" => "My.SCOUT","type" => "attendance","desc" => "Attendance: Yes"},
891
+ {"date" => "10/06/2013 19:15","updatedby" => "A Leader ","type" => "attendance","desc" => "Attendance: Reserved"},
892
+ {"date" => "10/06/2013 19:14","updatedby" => "A Leader ","type" => "attendance","desc" => "Attendance: No"},
893
+ {"date" => "10/06/2013 19:13","updatedby" => "A Leader ","type" => "attendance","desc" => "Attendance: Yes"},
894
+ {"date" => "10/06/2013 19:12","updatedby" => "A Leader ","type" => "attendance","desc" => "Attendance: Invited"},
895
+ {"date" => "10/06/2013 19:11","updatedby" => "A Leader ","type" => "attendance","desc" => "Attendance: Show in My.SCOUT"},
896
+ ]
897
+
898
+ HTTParty.should_receive(:post).with(url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>data.to_json}) }
899
+
900
+ ea = Osm::Event::Attendance.new(
901
+ :event => Osm::Event.new(:id => 3, :section_id => 1),
902
+ :member_id => 2,
903
+ )
904
+ ea.get_audit_trail(@api).should == [
905
+ {:event_attendance => ea, :event_id => 3, :member_id => 2, :at => DateTime.new(2013, 6, 10, 19, 17), :by => 'My.SCOUT', :type => :detail, :description => "Set 'Test' to 'Test data'", :label => 'Test', :value => 'Test data'},
906
+ {:event_attendance => ea, :event_id => 3, :member_id => 2, :at => DateTime.new(2013, 6, 10, 19, 16), :by => 'My.SCOUT', :type => :attendance, :description => "Attendance: Yes", :attendance => :yes},
907
+ {:event_attendance => ea, :event_id => 3, :member_id => 2, :at => DateTime.new(2013, 6, 10, 19, 15), :by => 'A Leader', :type => :attendance, :description => "Attendance: Reserved", :attendance => :reserved},
908
+ {:event_attendance => ea, :event_id => 3, :member_id => 2, :at => DateTime.new(2013, 6, 10, 19, 14), :by => 'A Leader', :type => :attendance, :description => "Attendance: No", :attendance => :no},
909
+ {:event_attendance => ea, :event_id => 3, :member_id => 2, :at => DateTime.new(2013, 6, 10, 19, 13), :by => 'A Leader', :type => :attendance, :description => "Attendance: Yes", :attendance => :yes},
910
+ {:event_attendance => ea, :event_id => 3, :member_id => 2, :at => DateTime.new(2013, 6, 10, 19, 12), :by => 'A Leader', :type => :attendance, :description => "Attendance: Invited", :attendance => :invited},
911
+ {:event_attendance => ea, :event_id => 3, :member_id => 2, :at => DateTime.new(2013, 6, 10, 19, 11), :by => 'A Leader', :type => :attendance, :description => "Attendance: Show in My.SCOUT", :attendance => :shown},
912
+ ]
913
+ end
914
+
876
915
  end
877
916
 
878
917
 
@@ -17,7 +17,8 @@ describe "Meeting" do
17
17
  :start_time => '19:00',
18
18
  :finish_time => '21:00',
19
19
  :date => Date.new(2000, 01, 02),
20
- :activities => []
20
+ :activities => [],
21
+ :badge_links => []
21
22
  )
22
23
 
23
24
  e.id.should == 1
@@ -32,6 +33,7 @@ describe "Meeting" do
32
33
  e.finish_time.should == '21:00'
33
34
  e.date.should == Date.new(2000, 1, 2)
34
35
  e.activities.should == []
36
+ e.badge_links.should == []
35
37
  e.valid?.should be_true
36
38
  end
37
39
 
@@ -49,7 +51,7 @@ describe "Meeting" do
49
51
 
50
52
  describe "Meeting::Activity" do
51
53
 
52
- it "Create Meeting::Activity" do
54
+ it "Create" do
53
55
  ea = Osm::Meeting::Activity.new(
54
56
  :activity_id => 2,
55
57
  :title => 'Activity Name',
@@ -74,21 +76,84 @@ describe "Meeting" do
74
76
  end
75
77
 
76
78
 
79
+ describe "Meeting::BadgeLink" do
80
+
81
+ it "Create" do
82
+ bl = Osm::Meeting::BadgeLink.new(
83
+ :badge_key => 'artist',
84
+ :badge_type => :activity,
85
+ :requirement_key => 'a_01',
86
+ :badge_section => :cubs,
87
+ :label => 'Cubs Artist Activity - A: Poster',
88
+ )
89
+
90
+ bl.badge_key.should == 'artist'
91
+ bl.badge_type.should == :activity
92
+ bl.requirement_key.should == 'a_01'
93
+ bl.badge_section.should == :cubs
94
+ bl.label.should == 'Cubs Artist Activity - A: Poster'
95
+ bl.valid?.should be_true
96
+ end
97
+
98
+ it "Sorts by label" do
99
+ a1 = Osm::Meeting::BadgeLink.new(:label => 'a')
100
+ a2 = Osm::Meeting::BadgeLink.new(:label => 'b')
101
+
102
+ data = [a2, a1]
103
+ data.sort.should == [a1, a2]
104
+ end
105
+
106
+ end
107
+
108
+
77
109
  describe 'Using the API' do
78
110
 
79
111
  it "Fetch the term's programme for a section" do
80
- items = [{"eveningid" => "5", "sectionid" =>"3", "title" => "Weekly Meeting 1", "notesforparents" => "", "games" => "", "prenotes" => "", "postnotes" => "", "leaders" => "", "meetingdate" => "2001-02-03", "starttime" => "19:15:00", "endtime" => "20:30:00", "googlecalendar" => ""}]
81
- activities = {"5" => [
82
- {"activityid" => "6", "title" => "Activity 6", "notes" => "", "eveningid" => "5"},
83
- {"activityid" => "7", "title" => "Activity 7", "notes" => "", "eveningid" => "5"}
84
- ]}
85
- body = {"items" => items, "activities" => activities}
112
+ body = {
113
+ "items" => [{"eveningid" => "5", "sectionid" =>"3", "title" => "Weekly Meeting 1", "notesforparents" => "parents", "games" => "games", "prenotes" => "before", "postnotes" => "after", "leaders" => "leaders", "meetingdate" => "2001-02-03", "starttime" => "19:15:00", "endtime" => "20:30:00", "googlecalendar" => ""}],
114
+ "activities" => {"5" => [
115
+ {"activityid" => "6", "title" => "Activity 6", "notes" => "Some notes", "eveningid" => "5"},
116
+ {"activityid" => "7", "title" => "Activity 7", "notes" => "", "eveningid" => "5"}
117
+ ]},
118
+ "badgelinks" => {"5" => [{
119
+ "badge" => "artist",
120
+ "badgetype" => "activity",
121
+ "columnname" => "a_01",
122
+ "eveningid" => "5",
123
+ "label" => "Cubs Artist Activity - A: Poster",
124
+ "section" => "cubs",
125
+ "sectionid" => "3",
126
+ }]},
127
+ }
86
128
  FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/programme.php?action=getProgramme&sectionid=3&termid=4", :body => body.to_json)
87
129
 
88
130
  programme = Osm::Meeting.get_for_section(@api, 3, 4)
89
131
  programme.size.should == 1
90
- programme[0].is_a?(Osm::Meeting).should be_true
91
- programme[0].activities.size.should == 2
132
+ meeting = programme[0]
133
+ meeting.is_a?(Osm::Meeting).should be_true
134
+ meeting.id.should == 5
135
+ meeting.section_id.should == 3
136
+ meeting.title.should == 'Weekly Meeting 1'
137
+ meeting.notes_for_parents.should == 'parents'
138
+ meeting.games.should == 'games'
139
+ meeting.pre_notes.should == 'before'
140
+ meeting.post_notes.should == 'after'
141
+ meeting.leaders.should == 'leaders'
142
+ meeting.date.should == Date.new(2001, 2, 3)
143
+ meeting.start_time.should == '19:15'
144
+ meeting.finish_time.should == '20:30'
145
+ meeting.activities.size.should == 2
146
+ activity = meeting.activities[0]
147
+ activity.activity_id.should == 6
148
+ activity.title.should == 'Activity 6'
149
+ activity.notes.should == 'Some notes'
150
+ meeting.badge_links.size.should == 1
151
+ badge_link = meeting.badge_links[0]
152
+ badge_link.badge_key.should == 'artist'
153
+ badge_link.badge_type.should == :activity
154
+ badge_link.requirement_key.should == 'a_01'
155
+ badge_link.badge_section.should == :cubs
156
+ badge_link.label.should == 'Cubs Artist Activity - A: Poster'
92
157
  end
93
158
 
94
159
  it "Fetch badge requirements for a meeting" do
@@ -181,12 +246,20 @@ describe "Meeting" do
181
246
  'secret' => 'secret',
182
247
  'eveningid' => 1, 'sectionid' => 2, 'meetingdate' => '2000-01-02', 'starttime' => nil,
183
248
  'endtime' => nil, 'title' => 'Unnamed meeting', 'notesforparents' =>'', 'prenotes' => '',
184
- 'postnotes' => '', 'games' => '', 'leaders' => '', 'activity' => '[]',
249
+ 'postnotes' => '', 'games' => '', 'leaders' => '',
250
+ 'activity' => '[{"activityid":3,"notes":"Some notes"}]',
251
+ 'badgelinks' => '[{"section":"beavers","badge":"badge","columnname":"b_03","badgetype":"activity"}]',
185
252
  }
186
253
  Osm::Term.stub(:get_for_section) { [] }
187
254
  HTTParty.should_receive(:post).with(url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"result":0}'}) }
188
255
 
189
- meeting = Osm::Meeting.new(:id=>1, :section_id=>2, :date=>Date.new(2000, 01, 02))
256
+ meeting = Osm::Meeting.new(
257
+ :id=>1,
258
+ :section_id=>2,
259
+ :date=>Date.new(2000, 01, 02),
260
+ :activities => [Osm::Meeting::Activity.new(:activity_id => 3, :title => 'Activity Title', :notes => 'Some notes')],
261
+ :badge_links => [Osm::Meeting::BadgeLink.new(:badge_key => 'badge', :badge_type => :activity, :requirement_key => 'b_03', :badge_section => :beavers, :label => 'Label')]
262
+ )
190
263
  meeting.update(@api).should be_true
191
264
  end
192
265
 
@@ -199,7 +272,7 @@ describe "Meeting" do
199
272
  'secret' => 'secret',
200
273
  'eveningid' => 1, 'sectionid' => 2, 'meetingdate' => '2000-01-02', 'starttime' => nil,
201
274
  'endtime' => nil, 'title' => 'Unnamed meeting', 'notesforparents' =>'', 'prenotes' => '',
202
- 'postnotes' => '', 'games' => '', 'leaders' => '', 'activity' => '[]',
275
+ 'postnotes' => '', 'games' => '', 'leaders' => '', 'activity' => '[]', 'badgelinks' => '[]',
203
276
  }
204
277
  Osm::Term.stub(:get_for_section) { [] }
205
278
  HTTParty.should_receive(:post).with(url, {:body => post_data}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"result":1}'}) }
data/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Osm
2
- VERSION = "1.0.5"
2
+ VERSION = "1.0.6"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: osm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-10 00:00:00.000000000 Z
12
+ date: 2013-06-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport