osm 0.0.25 → 0.0.26
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 +17 -0
- data/README.md +20 -17
- data/lib/osm/api.rb +255 -11
- data/lib/osm/event.rb +3 -2
- data/lib/osm/event_attendance.rb +55 -0
- data/lib/osm/flexi_record_data.rb +2 -2
- data/lib/osm.rb +15 -0
- data/spec/osm/api_spec.rb +407 -0
- data/spec/osm/event_attendance_spec.rb +34 -0
- data/spec/osm/event_spec.rb +1 -1
- data/version.rb +1 -1
- metadata +18 -16
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## Version 0.0.26
|
2
|
+
|
3
|
+
* Register - Update attendance
|
4
|
+
* Add api.get\_badge\_requirements\_for\_evening
|
5
|
+
* Add api.update\_register
|
6
|
+
* Event:
|
7
|
+
* Add api.ceate\_event
|
8
|
+
* Add api.update\_event
|
9
|
+
* Add api.delete\_event
|
10
|
+
* Add api.add\_event\_field
|
11
|
+
* Event attendance:
|
12
|
+
* Add api.get\_event
|
13
|
+
* Add api.get\_event\_fields
|
14
|
+
* Add api.get\_event\_attendance
|
15
|
+
* Add api.update\_event\_attendance
|
16
|
+
* Fix "uninitialized constant Osm::Api::HTTParty"
|
17
|
+
|
1
18
|
## Version 0.0.25
|
2
19
|
|
3
20
|
* FlexiRecordData, move these attributes to the fields hash:
|
data/README.md
CHANGED
@@ -71,9 +71,13 @@ however it should be noted that when the OSM API adds a feature it can be diffic
|
|
71
71
|
* Activity
|
72
72
|
* API Access
|
73
73
|
* API Access for our app
|
74
|
+
* Badge requirements for evening
|
74
75
|
* Due Badges
|
75
76
|
* Evening
|
77
|
+
* Event
|
76
78
|
* Events
|
79
|
+
* Event Fields
|
80
|
+
* Event Attendance
|
77
81
|
* Flexi Record Data
|
78
82
|
* Flexi Record Structure
|
79
83
|
* Groupings (e.g. Sixes, Patrols)
|
@@ -91,9 +95,16 @@ however it should be noted that when the OSM API adds a feature it can be diffic
|
|
91
95
|
|
92
96
|
### Update
|
93
97
|
* Evening
|
98
|
+
* Event
|
99
|
+
* Event Attendance
|
100
|
+
* Register attendance
|
94
101
|
|
95
102
|
### Create
|
96
103
|
* Evening
|
104
|
+
* Event
|
105
|
+
|
106
|
+
### Delete
|
107
|
+
* Event
|
97
108
|
|
98
109
|
### Actions
|
99
110
|
* Authorise an app to use the API on a user's behalf
|
@@ -103,26 +114,18 @@ however it should be noted that when the OSM API adds a feature it can be diffic
|
|
103
114
|
|
104
115
|
* Badges:
|
105
116
|
* Which requirements each member has met:
|
106
|
-
* Retreive
|
107
|
-
* Update
|
108
|
-
* Retrieve details for each badge (stock, short column names etc.)
|
109
|
-
* Retreival of leader access
|
110
|
-
* Register - Update attendance
|
117
|
+
* Retreive [issue 21]
|
118
|
+
* Update [issue 22]
|
119
|
+
* Retrieve details for each badge (stock, short column names etc.) [issue 20]
|
111
120
|
* Flexi Records:
|
112
|
-
* Update data
|
113
|
-
* Add Column
|
114
|
-
* Events:
|
115
|
-
* Attendance (everything)
|
116
|
-
* Add column
|
117
|
-
* Create
|
118
|
-
* Update
|
121
|
+
* Update data [issue 23]
|
122
|
+
* Add Column [issue 24]
|
119
123
|
* Member:
|
120
|
-
* Update
|
121
|
-
* Add
|
122
|
-
|
124
|
+
* Update [issue 33]
|
125
|
+
* Add [issue 34]
|
126
|
+
* Add activity to programme [issue 35]
|
127
|
+
* Delete Evening [issue 36]
|
123
128
|
* Update Activity
|
124
|
-
* Add activity to programme
|
125
|
-
* Delete Evening
|
126
129
|
* Gift aid (everything)
|
127
130
|
* Finances (Everything)
|
128
131
|
* SMS:
|
data/lib/osm/api.rb
CHANGED
@@ -326,6 +326,25 @@ module Osm
|
|
326
326
|
return result
|
327
327
|
end
|
328
328
|
|
329
|
+
# Get the badge requirements met on a specific evening
|
330
|
+
# @param [Osm::Section] section the section to get the pbadge requirements for
|
331
|
+
# @param [Osm::Evening, DateTime, Date] evening the evening (or its date) to get the badge requirements for
|
332
|
+
# @!macro options_get
|
333
|
+
# @return [Array<Hash>] hashes ready to pass into the update_register method
|
334
|
+
def get_badge_requirements_for_evening(section, evening, options={})
|
335
|
+
evening = evening.meeting_date if evening.is_a?(Osm::Evening)
|
336
|
+
cache_key = "badge_requirements-#{section.id}-#{evening.strftime('%Y%m%d')}"
|
337
|
+
|
338
|
+
if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:programme, section.id)
|
339
|
+
return cache_read(cache_key)
|
340
|
+
end
|
341
|
+
|
342
|
+
data = perform_query("users.php?action=getActivityRequirements&date=#{evening.strftime(Osm::OSM_DATE_FORMAT)}§ionid=#{section.id}§ion=#{section.type}")
|
343
|
+
|
344
|
+
cache_write(cache_key, data, :expires_in => @@default_cache_ttl)
|
345
|
+
return data
|
346
|
+
end
|
347
|
+
|
329
348
|
# Get activity details
|
330
349
|
# @param [Fixnum] activity_id the activity ID
|
331
350
|
# @param [Fixnum] version the version of the activity to retreive, if nil the latest version will be assumed
|
@@ -448,21 +467,22 @@ module Osm
|
|
448
467
|
cache_key = "events-#{section_id}"
|
449
468
|
events = nil
|
450
469
|
|
451
|
-
if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:
|
452
|
-
|
453
|
-
|
470
|
+
if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:events, section_id, api_data)
|
471
|
+
return cache_read(cache_key)
|
472
|
+
end
|
454
473
|
|
455
|
-
|
474
|
+
data = perform_query("events.php?action=getEvents§ionid=#{section_id}&showArchived=true", api_data)
|
456
475
|
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
476
|
+
events = Array.new
|
477
|
+
unless data['items'].nil?
|
478
|
+
data['items'].each do |item|
|
479
|
+
event = Osm::Event.from_api(item)
|
480
|
+
events.push event
|
481
|
+
cache_write("event-#{section_id}-#{event.id}", event, :expires_in => @@default_cache_ttl)
|
462
482
|
end
|
463
|
-
self.user_can_access :programme, section_id, api_data
|
464
|
-
cache_write(cache_key, events, :expires_in => @@default_cache_ttl)
|
465
483
|
end
|
484
|
+
self.user_can_access :events, section_id, api_data
|
485
|
+
cache_write(cache_key, events, :expires_in => @@default_cache_ttl)
|
466
486
|
|
467
487
|
return events if options[:include_archived]
|
468
488
|
return events.reject do |event|
|
@@ -470,6 +490,82 @@ module Osm
|
|
470
490
|
end
|
471
491
|
end
|
472
492
|
|
493
|
+
# Get event
|
494
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the events for
|
495
|
+
# @param [Fixnum] event_id the id of the event to get
|
496
|
+
# @!macro options_get
|
497
|
+
# @option options [Boolean] :include_archived (optional) if true then archived activities will also be returned
|
498
|
+
# @return [Osm::Event, nil] the event (or nil if it couldn't be found
|
499
|
+
def get_event(section, event_id, options={})
|
500
|
+
section_id = id_for_section(section)
|
501
|
+
cache_key = "event-#{section_id}-#{event_id}"
|
502
|
+
|
503
|
+
if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:events, section_id)
|
504
|
+
return cache_read(cache_key)
|
505
|
+
end
|
506
|
+
|
507
|
+
events = get_events(section, options)
|
508
|
+
return nil unless events.is_a? Array
|
509
|
+
|
510
|
+
events.each do |event|
|
511
|
+
return event if event.id == event_id
|
512
|
+
end
|
513
|
+
|
514
|
+
return nil
|
515
|
+
end
|
516
|
+
|
517
|
+
# Get event fields
|
518
|
+
# @param [Osm::Event, Fixnum] event the event to get the fieldss for
|
519
|
+
# @param [Osm::Term, Fixnum, nil] term the term (or its ID) to get the members for, passing nil causes the current term to be used
|
520
|
+
# @!macro options_get
|
521
|
+
# @option options [Boolean] :include_archived (optional) if true then archived activities will also be returned
|
522
|
+
# @return [Hash] fields of data assigned to the event (keys is the id, value is the field names)
|
523
|
+
def get_event_fields(event, term=nil, options={})
|
524
|
+
term_id = id_for_term(term, event.section_id)
|
525
|
+
cache_key = "event-fields-#{event.section_id}-#{event.id}"
|
526
|
+
|
527
|
+
if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:events, event.section_id)
|
528
|
+
return cache_read(cache_key)
|
529
|
+
end
|
530
|
+
|
531
|
+
data = perform_query("events.php?action=getEvent§ionid=#{event.section_id}&eventid=#{event.id}")
|
532
|
+
|
533
|
+
fields = {}
|
534
|
+
ActiveSupport::JSON.decode(data['config']).each do |field|
|
535
|
+
fields[field['id']] = field['name']
|
536
|
+
end
|
537
|
+
|
538
|
+
self.user_can_access :events, event.section_id
|
539
|
+
cache_write(cache_key, fields, :expires_in => @@default_cache_ttl)
|
540
|
+
return fields
|
541
|
+
end
|
542
|
+
|
543
|
+
# Get event attendance
|
544
|
+
# @param [Osm::Event] event the event to get the fieldss for
|
545
|
+
# @param [Osm::Term, Fixnum, nil] term the term (or its ID) to get the members for, passing nil causes the current term to be used
|
546
|
+
# @!macro options_get
|
547
|
+
# @option options [Boolean] :include_archived (optional) if true then archived activities will also be returned
|
548
|
+
# @return [Hash] fields of data assigned to the event (keys is the id, value is the field names)
|
549
|
+
def get_event_attendance(event, term=nil, options={})
|
550
|
+
term_id = id_for_term(term, event.section_id)
|
551
|
+
cache_key = "event-attendance-#{event.section_id}-#{event.id}"
|
552
|
+
|
553
|
+
if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:events, event.section_id)
|
554
|
+
return cache_read(cache_key)
|
555
|
+
end
|
556
|
+
|
557
|
+
data = perform_query("events.php?action=getEventAttendance&eventid=#{event.id}§ionid=#{event.section_id}&termid=#{term_id}")
|
558
|
+
data = data['items']
|
559
|
+
|
560
|
+
to_return = []
|
561
|
+
data.each_with_index do |item, index|
|
562
|
+
to_return.push Osm::EventAttendance.from_api(item, index)
|
563
|
+
end
|
564
|
+
self.user_can_access :events, event.section_id
|
565
|
+
cache_write(cache_key, to_return, :expires_in => @@default_cache_ttl/2)
|
566
|
+
return to_return
|
567
|
+
end
|
568
|
+
|
473
569
|
# Get due badges
|
474
570
|
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the due badges for
|
475
571
|
# @param [Osm::Term, Fixnum, nil] term the term (or its ID) to get the due badges for, passing nil causes the current term to be used
|
@@ -661,6 +757,93 @@ module Osm
|
|
661
757
|
return data.is_a?(Hash) && (data['result'] == 0)
|
662
758
|
end
|
663
759
|
|
760
|
+
# Create an event in OSM
|
761
|
+
# @param [Osm::Event] event the event to add to OSM
|
762
|
+
# @return [Fixnum, nil] the id of the created event, nil if failed
|
763
|
+
def create_event(event)
|
764
|
+
raise ArgumentIsInvalid, 'event is invalid' unless event.valid?
|
765
|
+
|
766
|
+
data = perform_query("events.php?action=addEvent§ionid=#{event.section_id}", {
|
767
|
+
'name' => event.name,
|
768
|
+
'location' => event.location,
|
769
|
+
'startdate' => event.start.strftime(Osm::OSM_DATE_FORMAT),
|
770
|
+
'enddate' => event.finish.strftime(Osm::OSM_DATE_FORMAT),
|
771
|
+
'cost' => event.cost,
|
772
|
+
'notes' => event.notes,
|
773
|
+
'starttime' => event.start.strftime(Osm::OSM_TIME_FORMAT),
|
774
|
+
'endtime' => event.finish.strftime(Osm::OSM_TIME_FORMAT),
|
775
|
+
})
|
776
|
+
|
777
|
+
# The cached events for the section will be out of date - remove them
|
778
|
+
get_events(event.section_id).each do |item|
|
779
|
+
cache_delete("event-#{item.section_id}-#{item.id}")
|
780
|
+
end
|
781
|
+
cache_delete("events-#{event.section_id}")
|
782
|
+
|
783
|
+
return data.is_a?(Hash) ? data['id'] : nil
|
784
|
+
end
|
785
|
+
|
786
|
+
# Update an event in OSM
|
787
|
+
# @param [Osm::Event] event the event to update in OSM
|
788
|
+
# @return [Boolean] wether the update succedded
|
789
|
+
def update_event(event)
|
790
|
+
raise ArgumentIsInvalid, 'event is invalid' unless event.valid?
|
791
|
+
|
792
|
+
data = perform_query("events.php?action=addEvent§ionid=#{event.section_id}", {
|
793
|
+
'eventid' => event.id,
|
794
|
+
'name' => event.name,
|
795
|
+
'location' => event.location,
|
796
|
+
'startdate' => event.start? ? event.start.strftime(Osm::OSM_DATE_FORMAT) : '',
|
797
|
+
'enddate' => event.finish? ? event.finish.strftime(Osm::OSM_DATE_FORMAT) : '',
|
798
|
+
'cost' => event.cost,
|
799
|
+
'notes' => event.notes,
|
800
|
+
'starttime' => event.start? ? event.start.strftime(Osm::OSM_TIME_FORMAT) : '',
|
801
|
+
'endtime' => event.finish? ? event.finish.strftime(Osm::OSM_TIME_FORMAT) : '',
|
802
|
+
})
|
803
|
+
|
804
|
+
# The cached events for the section will be out of date - remove them
|
805
|
+
get_events(event.section_id).each do |item|
|
806
|
+
cache_delete("event-#{item.section_id}-#{item.id}")
|
807
|
+
end
|
808
|
+
cache_delete("events-#{event.section_id}")
|
809
|
+
|
810
|
+
return data.is_a?(Hash) && (data['id'].to_i == event.id)
|
811
|
+
end
|
812
|
+
|
813
|
+
# Delete an event from OSM
|
814
|
+
# @param [Osm::Event] event the event to delete from OSM
|
815
|
+
# @return [Boolean] wether the delete succedded
|
816
|
+
def delete_event(event)
|
817
|
+
raise ArgumentIsInvalid, 'event is invalid' unless event.valid?
|
818
|
+
|
819
|
+
data = perform_query("events.php?action=deleteEvent§ionid=#{event.section_id}&eventid=#{event.id}", {})
|
820
|
+
|
821
|
+
# The cached events for the section will be out of date - remove them
|
822
|
+
cache_delete("event-#{event.section_id}-#{event.id}")
|
823
|
+
cache_delete("events-#{event.section_id}")
|
824
|
+
|
825
|
+
return data.is_a?(Hash) ? data['ok'] : false
|
826
|
+
end
|
827
|
+
|
828
|
+
# Add a field to an Event in OSM
|
829
|
+
# @param [Osm::Event] event the event to update in OSM
|
830
|
+
# @param [String] field_label the label for the field to add
|
831
|
+
# @return [Boolean] wether the update succedded
|
832
|
+
def add_event_field(event, field_label)
|
833
|
+
raise ArgumentIsInvalid, 'event is invalid' unless event.valid?
|
834
|
+
raise ArgumentIsInvalid, 'field_label is invalid' if field_label.blank?
|
835
|
+
|
836
|
+
data = perform_query("events.php?action=addColumn§ionid=#{event.section_id}&eventid=#{event.id}", {
|
837
|
+
'columnName' => field_label
|
838
|
+
})
|
839
|
+
|
840
|
+
# The cached events for the section will be out of date - remove them
|
841
|
+
cache_delete("event-fields-#{event.section_id}-#{event.id}")
|
842
|
+
cache_delete("event-attendance-#{event.section_id}-#{event.id}")
|
843
|
+
|
844
|
+
return data.is_a?(Hash) && (data['eventid'].to_i == event.id)
|
845
|
+
end
|
846
|
+
|
664
847
|
# Create a term in OSM
|
665
848
|
# @param [Hash] options - the configuration of the new term
|
666
849
|
# @option options [Osm::Section, Fixnum] :section (required) section or section_id to add the term to
|
@@ -711,6 +894,42 @@ module Osm
|
|
711
894
|
return response.is_a?(Hash) && (response['result'] == 0)
|
712
895
|
end
|
713
896
|
|
897
|
+
|
898
|
+
# Update register for an evening in OSM
|
899
|
+
# @param [Hash] data
|
900
|
+
# @option data [Osm::Section] :section the section to update the register for
|
901
|
+
# @option data [Osm::Term, Fixnum, nil] :term the term (or its ID) to get the register for, passing nil causes the current term to be used
|
902
|
+
# @option data [Osm::Evening, DateTime, Date] :evening the evening to update the register on
|
903
|
+
# @option data [String] :attendance what to mark the attendance as, one of "Yes", "No" or "Absent"
|
904
|
+
# @option data [Fixnum, Array<Fixnum>, Osm::Member, Array<Osm::Member>] :members the members (or their ids) to update
|
905
|
+
# @option data [Array<Hash>] :completed_badge_requirements (optional) the badge requirements to mark as completed, selected from the Hash returned by the get_badge_requirements_for_evening method
|
906
|
+
# @return [Boolean] wether the update succedded
|
907
|
+
def update_register(data={})
|
908
|
+
raise ArgumentIsInvalid, ':attendance is invalid' unless ['Yes', 'No', 'Absent'].include?(data[:attendance])
|
909
|
+
raise ArgumentIsInvalid, ':section is missing' if data[:section].nil?
|
910
|
+
raise ArgumentIsInvalid, ':evening is missing' if data[:evening].nil?
|
911
|
+
raise ArgumentIsInvalid, ':members is missing' if data[:members].nil?
|
912
|
+
|
913
|
+
term_id = id_for_term(data[:term], data[:section])
|
914
|
+
|
915
|
+
data[:members] = [data[:members]] unless data[:members].is_a?(Array) # Make sure it's an Array
|
916
|
+
data[:members] = data[:members].map{ |member| (member.is_a?(Fixnum) ? member : member.id).to_s } # Make sure it's an Array of Strings
|
917
|
+
|
918
|
+
response = perform_query("users.php?action=registerUpdate§ionid=#{data[:section].id}&termid=#{term_id}", {
|
919
|
+
'scouts' => data[:members].inspect,
|
920
|
+
'selectedDate' => data[:evening].strftime(Osm::OSM_DATE_FORMAT),
|
921
|
+
'present' => data[:attendance],
|
922
|
+
'section' => data[:section].type,
|
923
|
+
'sectionid' => data[:section].id,
|
924
|
+
'completedBadges' => (data[:completed_badge_requirements] || []).to_json
|
925
|
+
})
|
926
|
+
|
927
|
+
# The cached attendance will be out of date - remove them
|
928
|
+
cache_delete("register-#{data[:section].id}-#{term_id}")
|
929
|
+
|
930
|
+
return response.is_a?(Array)
|
931
|
+
end
|
932
|
+
|
714
933
|
# Update a term in OSM
|
715
934
|
# @param [Osm::Term] term the term to update
|
716
935
|
# @return [Boolean] if the operation suceeded or not
|
@@ -725,6 +944,31 @@ module Osm
|
|
725
944
|
|
726
945
|
return data.is_a?(Hash) && data['terms'].is_a?(Hash)
|
727
946
|
end
|
947
|
+
|
948
|
+
# Update event attendance
|
949
|
+
# @param [Osm::Event] event the event to update the attendance of
|
950
|
+
# @param [Osm::EventAttendance] event_attendance the attendance record to update
|
951
|
+
# @param [String] field_id the id of the field to update (must be 'attending' or /\Af_\d+\Z/)
|
952
|
+
# @return [Boolean] if the operation suceeded or not
|
953
|
+
def update_event_attendance(event, event_attendance, field_id)
|
954
|
+
raise ArgumentIsInvalid, 'event is invalid' unless event.valid?
|
955
|
+
raise ArgumentIsInvalid, 'event_attendance is invalid' unless event_attendance.valid?
|
956
|
+
raise ArgumentIsInvalid, 'field_id is invalid' unless field_id.match(/\Af_\d+\Z/) || field_id.eql?('attending')
|
957
|
+
|
958
|
+
data = perform_query("events.php?action=updateScout", {
|
959
|
+
'scoutid' => event_attendance.member_id,
|
960
|
+
'column' => field_id,
|
961
|
+
'value' => !field_id.eql?('attending') ? event_attendance.fields[field_id] : (event_attendance.fields['attending'] ? 'Yes' : 'No'),
|
962
|
+
'sectionid' => event.section_id,
|
963
|
+
'row' => event_attendance.row,
|
964
|
+
'eventid' => event.id,
|
965
|
+
})
|
966
|
+
|
967
|
+
# The cached event attedance will be out of date
|
968
|
+
cache_delete("event-attendance-#{event.section_id}-#{event.id}")
|
969
|
+
|
970
|
+
return data.is_a?(Hash)
|
971
|
+
end
|
728
972
|
|
729
973
|
|
730
974
|
|
data/lib/osm/event.rb
CHANGED
@@ -21,6 +21,7 @@ module Osm
|
|
21
21
|
# @!attribute [rw] notes
|
22
22
|
# @return [String] notes about the event
|
23
23
|
# @!attribute [rw] archived
|
24
|
+
# @return [Boolean] if the event has been archived
|
24
25
|
|
25
26
|
attribute :id, :type => Integer
|
26
27
|
attribute :section_id, :type => Integer
|
@@ -34,7 +35,7 @@ module Osm
|
|
34
35
|
|
35
36
|
attr_accessible :id, :section_id, :name, :start, :finish, :cost, :location, :notes, :archived
|
36
37
|
|
37
|
-
validates_numericality_of :id, :only_integer=>true, :greater_than=>0
|
38
|
+
validates_numericality_of :id, :only_integer=>true, :greater_than=>0, :allow_nil => true
|
38
39
|
validates_numericality_of :section_id, :only_integer=>true, :greater_than=>0
|
39
40
|
validates_presence_of :name
|
40
41
|
|
@@ -55,7 +56,7 @@ module Osm
|
|
55
56
|
:cost => data['cost'],
|
56
57
|
:location => data['location'],
|
57
58
|
:notes => data['notes'],
|
58
|
-
:archived => data['archived'].eql?('1')
|
59
|
+
:archived => data['archived'].eql?('1'),
|
59
60
|
})
|
60
61
|
end
|
61
62
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Osm
|
2
|
+
|
3
|
+
class EventAttendance
|
4
|
+
include ::ActiveAttr::MassAssignmentSecurity
|
5
|
+
include ::ActiveAttr::Model
|
6
|
+
|
7
|
+
# @!attribute [rw] member_id
|
8
|
+
# @return [Fixnum] OSM id for the member
|
9
|
+
# @!attribute [rw] grouping__id
|
10
|
+
# @return [Fixnum] OSM id for the grouping the member is in
|
11
|
+
# @!attribute [rw] fields
|
12
|
+
# @return [Hash] Keys are the field's id, values are the field values
|
13
|
+
# @!attribute [rw] row
|
14
|
+
# @return [Fixnum] part of the OSM API
|
15
|
+
|
16
|
+
attribute :row, :type => Integer
|
17
|
+
attribute :member_id, :type => Integer
|
18
|
+
attribute :grouping_id, :type => Integer
|
19
|
+
attribute :fields, :default => {}
|
20
|
+
|
21
|
+
attr_accessible :member_id, :grouping_id, :fields, :row
|
22
|
+
|
23
|
+
validates_numericality_of :row, :only_integer=>true, :greater_than_or_equal_to=>0
|
24
|
+
validates_numericality_of :member_id, :only_integer=>true, :greater_than=>0
|
25
|
+
validates_numericality_of :grouping_id, :only_integer=>true, :greater_than_or_equal_to=>-2
|
26
|
+
validates :fields, :hash => {:key_type => String}
|
27
|
+
|
28
|
+
|
29
|
+
# @!method initialize
|
30
|
+
# Initialize a new FlexiRecordData
|
31
|
+
# @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
|
32
|
+
|
33
|
+
|
34
|
+
# Initialize a new FlexiRecordData from api data
|
35
|
+
# @param [Hash] data the hash of data provided by the API
|
36
|
+
# @param [Fixnum] row part of the OSM API
|
37
|
+
def self.from_api(data, row)
|
38
|
+
data.merge!({
|
39
|
+
'dob' => data['dob'].nil? ? nil : Osm::parse_date(data['dob'], :ignore_epoch => true),
|
40
|
+
'attending' => data['attending'].eql?('Yes'),
|
41
|
+
})
|
42
|
+
|
43
|
+
new({
|
44
|
+
:member_id => Osm::to_i_or_nil(data['scoutid']),
|
45
|
+
:grouping_id => Osm::to_i_or_nil(data['patrolid'].eql?('') ? nil : data['patrolid']),
|
46
|
+
:fields => data.select { |key, value|
|
47
|
+
['firstname', 'lastname', 'dob', 'attending'].include?(key) || key.to_s.match(/\Af_\d+\Z/)
|
48
|
+
},
|
49
|
+
:row => row,
|
50
|
+
})
|
51
|
+
end
|
52
|
+
|
53
|
+
end # Class EventAttendance
|
54
|
+
|
55
|
+
end # Module
|
@@ -9,7 +9,7 @@ module Osm
|
|
9
9
|
# @!attribute [rw] grouping__id
|
10
10
|
# @return [Fixnum] OSM id for the grouping the member is in
|
11
11
|
# @!attribute [rw] fields
|
12
|
-
# @return [Hash] Keys are the field'
|
12
|
+
# @return [Hash] Keys are the field's id, values are the field values
|
13
13
|
|
14
14
|
attribute :member_id, :type => Integer
|
15
15
|
attribute :grouping_id, :type => Integer
|
@@ -41,7 +41,7 @@ module Osm
|
|
41
41
|
:member_id => Osm::to_i_or_nil(data['scoutid']),
|
42
42
|
:grouping_id => Osm::to_i_or_nil(data['patrolid'].eql?('') ? nil : data['patrolid']),
|
43
43
|
:fields => data.select { |key, value|
|
44
|
-
['firstname', 'lastname', 'dob', 'total', 'completed', 'age'].include?(key) || key.to_s.match(
|
44
|
+
['firstname', 'lastname', 'dob', 'total', 'completed', 'age'].include?(key) || key.to_s.match(/\Af_\d+\Z/)
|
45
45
|
}
|
46
46
|
})
|
47
47
|
end
|
data/lib/osm.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'active_attr'
|
2
|
+
require 'active_support'
|
3
|
+
require 'active_model'
|
2
4
|
require 'date'
|
5
|
+
require 'httparty'
|
6
|
+
|
3
7
|
|
4
8
|
module Osm
|
5
9
|
OSM_EPOCH_S = '1970-01-01'
|
6
10
|
OSM_DATE_FORMAT = '%Y-%m-%d'
|
11
|
+
OSM_TIME_FORMAT = '%H:%M:%S'
|
7
12
|
OSM_DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
|
8
13
|
OSM_TIME_REGEX = /\A(?:[0-1][0-9]|2[0-3]):[0-5][0-9]\Z/
|
9
14
|
OSM_DATE_REGEX = /\A\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])\Z/
|
@@ -59,6 +64,16 @@ module Osm
|
|
59
64
|
end
|
60
65
|
end
|
61
66
|
|
67
|
+
def self.parse_date_time(date_time)
|
68
|
+
return nil if date_time.nil? || date_time.empty?
|
69
|
+
begin
|
70
|
+
return DateTime.strptime((date_time), OSM_DATETIME_FORMAT)
|
71
|
+
rescue ArgumentError
|
72
|
+
return nil
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
|
62
77
|
def self.parse_date(date, options={})
|
63
78
|
return nil if date.nil? || date.empty? || (date.eql?(OSM_EPOCH_S) && !options[:ignore_epoch])
|
64
79
|
begin
|
data/spec/osm/api_spec.rb
CHANGED
@@ -346,6 +346,165 @@ describe "API" do
|
|
346
346
|
events[0].id.should == 1
|
347
347
|
end
|
348
348
|
|
349
|
+
it "Fetch an event" do
|
350
|
+
body = {
|
351
|
+
'identifier' => 'eventid',
|
352
|
+
'label' => 'name',
|
353
|
+
'items' => [{
|
354
|
+
'eventid' => '2',
|
355
|
+
'name' => 'An Event',
|
356
|
+
'startdate' => '2001-02-03',
|
357
|
+
'enddate' => nil,
|
358
|
+
'starttime' => '00:00:00',
|
359
|
+
'endtime' => '00:00:00',
|
360
|
+
'cost' => '0.00',
|
361
|
+
'location' => '',
|
362
|
+
'notes' => '',
|
363
|
+
'sectionid' => 1,
|
364
|
+
'googlecalendar' => nil,
|
365
|
+
'archived' => '0'
|
366
|
+
}]
|
367
|
+
}
|
368
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents§ionid=1&showArchived=true", :body => body.to_json)
|
369
|
+
event = Osm::Api.new('1', '2').get_event(1, 2)
|
370
|
+
event.id.should == 2
|
371
|
+
end
|
372
|
+
|
373
|
+
it "Fetch an event's fields" do
|
374
|
+
events_body = {
|
375
|
+
'identifier' => 'eventid',
|
376
|
+
'label' => 'name',
|
377
|
+
'items' => [{
|
378
|
+
'eventid' => '2',
|
379
|
+
'name' => 'An Event',
|
380
|
+
'startdate' => '2001-02-03',
|
381
|
+
'enddate' => nil,
|
382
|
+
'starttime' => '00:00:00',
|
383
|
+
'endtime' => '00:00:00',
|
384
|
+
'cost' => '0.00',
|
385
|
+
'location' => '',
|
386
|
+
'notes' => '',
|
387
|
+
'sectionid' => 1,
|
388
|
+
'googlecalendar' => nil,
|
389
|
+
'archived' => '0'
|
390
|
+
}]
|
391
|
+
}
|
392
|
+
fields_body = {
|
393
|
+
'config' => '[{"id":"f_1","name":"Field 1"}]'
|
394
|
+
}
|
395
|
+
|
396
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents§ionid=1&showArchived=true", :body => events_body.to_json)
|
397
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvent§ionid=1&eventid=2", :body => fields_body.to_json)
|
398
|
+
api = Osm::Api.new('1', '2')
|
399
|
+
|
400
|
+
fields = api.get_event_fields(api.get_event(1, 2), 3)
|
401
|
+
fields.should == {'f_1' => 'Field 1'}
|
402
|
+
end
|
403
|
+
|
404
|
+
it "Fetch an event's attendance" do
|
405
|
+
events_body = {
|
406
|
+
'identifier' => 'eventid',
|
407
|
+
'label' => 'name',
|
408
|
+
'items' => [{
|
409
|
+
'eventid' => '2',
|
410
|
+
'name' => 'An Event',
|
411
|
+
'startdate' => '2001-02-03',
|
412
|
+
'enddate' => nil,
|
413
|
+
'starttime' => '00:00:00',
|
414
|
+
'endtime' => '00:00:00',
|
415
|
+
'cost' => '0.00',
|
416
|
+
'location' => '',
|
417
|
+
'notes' => '',
|
418
|
+
'sectionid' => 1,
|
419
|
+
'googlecalendar' => nil,
|
420
|
+
'archived' => '0'
|
421
|
+
}]
|
422
|
+
}
|
423
|
+
attendance_body = {
|
424
|
+
'identifier' => 'scoutid',
|
425
|
+
'eventid' => '2',
|
426
|
+
'items' => [
|
427
|
+
{
|
428
|
+
'scoutid' => '1',
|
429
|
+
'attending' => 'Yes',
|
430
|
+
'firstname' => 'First',
|
431
|
+
'lastname' => 'Last',
|
432
|
+
'dob' => '1980-01-02',
|
433
|
+
'patrolid' => '2',
|
434
|
+
'f_1' => '',
|
435
|
+
}
|
436
|
+
]
|
437
|
+
}
|
438
|
+
|
439
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents§ionid=1&showArchived=true", :body => events_body.to_json)
|
440
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEventAttendance&eventid=2§ionid=1&termid=3", :body => attendance_body.to_json)
|
441
|
+
api = Osm::Api.new('1', '2')
|
442
|
+
|
443
|
+
attendance = api.get_event_attendance(api.get_event(1, 2), 3)
|
444
|
+
attendance.is_a?(Array).should be_true
|
445
|
+
end
|
446
|
+
|
447
|
+
it "Update an event's attendance" do
|
448
|
+
events_body = {
|
449
|
+
'identifier' => 'eventid',
|
450
|
+
'label' => 'name',
|
451
|
+
'items' => [{
|
452
|
+
'eventid' => '2',
|
453
|
+
'name' => 'An Event',
|
454
|
+
'startdate' => '2001-02-03',
|
455
|
+
'enddate' => nil,
|
456
|
+
'starttime' => '00:00:00',
|
457
|
+
'endtime' => '00:00:00',
|
458
|
+
'cost' => '0.00',
|
459
|
+
'location' => '',
|
460
|
+
'notes' => '',
|
461
|
+
'sectionid' => 1,
|
462
|
+
'googlecalendar' => nil,
|
463
|
+
'archived' => '0'
|
464
|
+
}]
|
465
|
+
}
|
466
|
+
attendance_body = {
|
467
|
+
'identifier' => 'scoutid',
|
468
|
+
'eventid' => '2',
|
469
|
+
'items' => [
|
470
|
+
{
|
471
|
+
'scoutid' => '1',
|
472
|
+
'attending' => 'Yes',
|
473
|
+
'firstname' => 'First',
|
474
|
+
'lastname' => 'Last',
|
475
|
+
'dob' => '1980-01-02',
|
476
|
+
'patrolid' => '2',
|
477
|
+
'f_1' => '',
|
478
|
+
}
|
479
|
+
]
|
480
|
+
}
|
481
|
+
|
482
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents§ionid=1&showArchived=true", :body => events_body.to_json)
|
483
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEventAttendance&eventid=2§ionid=1&termid=3", :body => attendance_body.to_json)
|
484
|
+
|
485
|
+
api = Osm::Api.new('1', '2')
|
486
|
+
e = api.get_event(1, 2)
|
487
|
+
ea = api.get_event_attendance(e, 3)[0]
|
488
|
+
ea.fields['f_1'] = 'TEST'
|
489
|
+
|
490
|
+
HTTParty.should_receive(:post).with(
|
491
|
+
"https://www.onlinescoutmanager.co.uk/events.php?action=updateScout",
|
492
|
+
{:body => {
|
493
|
+
'scoutid' => 1,
|
494
|
+
'column' => 'f_1',
|
495
|
+
'value' => 'TEST',
|
496
|
+
'sectionid' => 1,
|
497
|
+
'row' => 0,
|
498
|
+
'eventid' => 2,
|
499
|
+
'apiid' => '1',
|
500
|
+
'token' => 'API TOKEN',
|
501
|
+
'userid' => '1',
|
502
|
+
'secret' => '2',
|
503
|
+
}}
|
504
|
+
) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
505
|
+
api.update_event_attendance(e, ea, 'f_1').should be_true
|
506
|
+
end
|
507
|
+
|
349
508
|
it "Fetch events for a section honoring archived option" do
|
350
509
|
body = {
|
351
510
|
'identifier' => 'eventid',
|
@@ -401,6 +560,17 @@ describe "API" do
|
|
401
560
|
end
|
402
561
|
|
403
562
|
|
563
|
+
it "Fetch badge requirements for an evening" do
|
564
|
+
badges_body = [{'a'=>'a'},{'a'=>'A'}]
|
565
|
+
FakeWeb.register_uri(:post, 'https://www.onlinescoutmanager.co.uk/users.php?action=getActivityRequirements&date=2000-01-02§ionid=3§ion=cubs', :body => badges_body.to_json)
|
566
|
+
|
567
|
+
section = Osm::Section.new(:id => 3, :type => :cubs)
|
568
|
+
evening = Date.new(2000, 1, 2)
|
569
|
+
|
570
|
+
Osm::Api.new('1', '2').get_badge_requirements_for_evening(section, evening).should == badges_body
|
571
|
+
end
|
572
|
+
|
573
|
+
|
404
574
|
it "Fetch badge stock levels for a section" do
|
405
575
|
badges_body = {
|
406
576
|
'stock' => {
|
@@ -587,6 +757,217 @@ describe "API" do
|
|
587
757
|
end
|
588
758
|
|
589
759
|
|
760
|
+
it "Create an event (succeded)" do
|
761
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=addEvent§ionid=1'
|
762
|
+
post_data = {
|
763
|
+
'apiid' => @api_config[:api_id],
|
764
|
+
'token' => @api_config[:api_token],
|
765
|
+
'userid' => 'user',
|
766
|
+
'secret' => 'secret',
|
767
|
+
'name' => 'Test event',
|
768
|
+
'startdate' => '2000-01-02',
|
769
|
+
'enddate' => '2001-02-03',
|
770
|
+
'starttime' => '03:04:05',
|
771
|
+
'endtime' => '04:05:06',
|
772
|
+
'cost' => '1.23',
|
773
|
+
'location' => 'Somewhere',
|
774
|
+
'notes' => 'none'
|
775
|
+
}
|
776
|
+
|
777
|
+
api = Osm::Api.new('user', 'secret')
|
778
|
+
api.stub(:get_events) { [] }
|
779
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"id":2}'}) }
|
780
|
+
|
781
|
+
api.create_event(Osm::Event.new({
|
782
|
+
:section_id => 1,
|
783
|
+
:name => 'Test event',
|
784
|
+
:start => DateTime.new(2000, 01, 02, 03, 04, 05),
|
785
|
+
:finish => DateTime.new(2001, 02, 03, 04, 05, 06),
|
786
|
+
:cost => '1.23',
|
787
|
+
:location => 'Somewhere',
|
788
|
+
:notes => 'none'
|
789
|
+
})).should == 2
|
790
|
+
end
|
791
|
+
|
792
|
+
it "Create an event (failed)" do
|
793
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=addEvent§ionid=1'
|
794
|
+
post_data = {
|
795
|
+
'apiid' => @api_config[:api_id],
|
796
|
+
'token' => @api_config[:api_token],
|
797
|
+
'userid' => 'user',
|
798
|
+
'secret' => 'secret',
|
799
|
+
'name' => 'Test event',
|
800
|
+
'startdate' => '2000-01-02',
|
801
|
+
'enddate' => '2001-02-03',
|
802
|
+
'starttime' => '03:04:05',
|
803
|
+
'endtime' => '04:05:06',
|
804
|
+
'cost' => '1.23',
|
805
|
+
'location' => 'Somewhere',
|
806
|
+
'notes' => 'none'
|
807
|
+
}
|
808
|
+
|
809
|
+
api = Osm::Api.new('user', 'secret')
|
810
|
+
api.stub(:get_events) { [] }
|
811
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
812
|
+
|
813
|
+
api.create_event(Osm::Event.new({
|
814
|
+
:section_id => 1,
|
815
|
+
:name => 'Test event',
|
816
|
+
:start => DateTime.new(2000, 01, 02, 03, 04, 05),
|
817
|
+
:finish => DateTime.new(2001, 02, 03, 04, 05, 06),
|
818
|
+
:cost => '1.23',
|
819
|
+
:location => 'Somewhere',
|
820
|
+
:notes => 'none'
|
821
|
+
})).should be_nil
|
822
|
+
end
|
823
|
+
|
824
|
+
it "Update an event (succeded)" do
|
825
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=addEvent§ionid=1'
|
826
|
+
post_data = {
|
827
|
+
'apiid' => @api_config[:api_id],
|
828
|
+
'token' => @api_config[:api_token],
|
829
|
+
'userid' => 'user',
|
830
|
+
'secret' => 'secret',
|
831
|
+
'name' => 'Test event',
|
832
|
+
'startdate' => '2000-01-02',
|
833
|
+
'enddate' => '2001-02-03',
|
834
|
+
'starttime' => '03:04:05',
|
835
|
+
'endtime' => '04:05:06',
|
836
|
+
'cost' => '1.23',
|
837
|
+
'location' => 'Somewhere',
|
838
|
+
'notes' => 'none',
|
839
|
+
'eventid' => 2
|
840
|
+
}
|
841
|
+
|
842
|
+
api = Osm::Api.new('user', 'secret')
|
843
|
+
api.stub(:get_events) { [] }
|
844
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"id":2}'}) }
|
845
|
+
|
846
|
+
api.update_event(Osm::Event.new({
|
847
|
+
:section_id => 1,
|
848
|
+
:name => 'Test event',
|
849
|
+
:start => DateTime.new(2000, 01, 02, 03, 04, 05),
|
850
|
+
:finish => DateTime.new(2001, 02, 03, 04, 05, 06),
|
851
|
+
:cost => '1.23',
|
852
|
+
:location => 'Somewhere',
|
853
|
+
:notes => 'none',
|
854
|
+
:id => 2
|
855
|
+
})).should be_true
|
856
|
+
end
|
857
|
+
|
858
|
+
it "Update an event (failed)" do
|
859
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=addEvent§ionid=1'
|
860
|
+
post_data = {
|
861
|
+
'apiid' => @api_config[:api_id],
|
862
|
+
'token' => @api_config[:api_token],
|
863
|
+
'userid' => 'user',
|
864
|
+
'secret' => 'secret',
|
865
|
+
'name' => 'Test event',
|
866
|
+
'startdate' => '2000-01-02',
|
867
|
+
'enddate' => '2001-02-03',
|
868
|
+
'starttime' => '03:04:05',
|
869
|
+
'endtime' => '04:05:06',
|
870
|
+
'cost' => '1.23',
|
871
|
+
'location' => 'Somewhere',
|
872
|
+
'notes' => 'none',
|
873
|
+
'eventid' => 2
|
874
|
+
}
|
875
|
+
|
876
|
+
api = Osm::Api.new('user', 'secret')
|
877
|
+
api.stub(:get_events) { [] }
|
878
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
879
|
+
|
880
|
+
api.update_event(Osm::Event.new({
|
881
|
+
:section_id => 1,
|
882
|
+
:name => 'Test event',
|
883
|
+
:start => DateTime.new(2000, 01, 02, 03, 04, 05),
|
884
|
+
:finish => DateTime.new(2001, 02, 03, 04, 05, 06),
|
885
|
+
:cost => '1.23',
|
886
|
+
:location => 'Somewhere',
|
887
|
+
:notes => 'none',
|
888
|
+
:id => 2
|
889
|
+
})).should be_false
|
890
|
+
end
|
891
|
+
|
892
|
+
it "Delete an event (succeded)" do
|
893
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=deleteEvent§ionid=1&eventid=2'
|
894
|
+
post_data = {
|
895
|
+
'apiid' => @api_config[:api_id],
|
896
|
+
'token' => @api_config[:api_token],
|
897
|
+
'userid' => 'user',
|
898
|
+
'secret' => 'secret',
|
899
|
+
}
|
900
|
+
|
901
|
+
api = Osm::Api.new('user', 'secret')
|
902
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true}'}) }
|
903
|
+
|
904
|
+
api.delete_event(Osm::Event.new({
|
905
|
+
:section_id => 1,
|
906
|
+
:name => 'Test event',
|
907
|
+
:id => 2
|
908
|
+
})).should be_true
|
909
|
+
end
|
910
|
+
|
911
|
+
it "Delete an event (failed)" do
|
912
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=deleteEvent§ionid=1&eventid=2'
|
913
|
+
post_data = {
|
914
|
+
'apiid' => @api_config[:api_id],
|
915
|
+
'token' => @api_config[:api_token],
|
916
|
+
'userid' => 'user',
|
917
|
+
'secret' => 'secret',
|
918
|
+
}
|
919
|
+
|
920
|
+
api = Osm::Api.new('user', 'secret')
|
921
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":false}'}) }
|
922
|
+
|
923
|
+
api.delete_event(Osm::Event.new({
|
924
|
+
:section_id => 1,
|
925
|
+
:name => 'Test event',
|
926
|
+
:id => 2
|
927
|
+
})).should be_false
|
928
|
+
end
|
929
|
+
|
930
|
+
it "Add field to an event (succeded)" do
|
931
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=addColumn§ionid=1&eventid=2'
|
932
|
+
post_data = {
|
933
|
+
'apiid' => @api_config[:api_id],
|
934
|
+
'token' => @api_config[:api_token],
|
935
|
+
'userid' => 'user',
|
936
|
+
'secret' => 'secret',
|
937
|
+
'columnName' => 'Test field',
|
938
|
+
}
|
939
|
+
|
940
|
+
api = Osm::Api.new('user', 'secret')
|
941
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"eventid":"2"}'}) }
|
942
|
+
|
943
|
+
api.add_event_field(Osm::Event.new({
|
944
|
+
:section_id => 1,
|
945
|
+
:name => 'Test event',
|
946
|
+
:id => 2
|
947
|
+
}), 'Test field').should be_true
|
948
|
+
end
|
949
|
+
|
950
|
+
it "Add field to an event (failed)" do
|
951
|
+
url = 'https://www.onlinescoutmanager.co.uk/events.php?action=addColumn§ionid=1&eventid=2'
|
952
|
+
post_data = {
|
953
|
+
'apiid' => @api_config[:api_id],
|
954
|
+
'token' => @api_config[:api_token],
|
955
|
+
'userid' => 'user',
|
956
|
+
'secret' => 'secret',
|
957
|
+
'columnName' => 'Test field',
|
958
|
+
}
|
959
|
+
|
960
|
+
api = Osm::Api.new('user', 'secret')
|
961
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
962
|
+
|
963
|
+
api.add_event_field(Osm::Event.new({
|
964
|
+
:section_id => 1,
|
965
|
+
:name => 'Test event',
|
966
|
+
:id => 2
|
967
|
+
}), 'Test field').should be_false
|
968
|
+
end
|
969
|
+
|
970
|
+
|
590
971
|
it "Create a term (succeded)" do
|
591
972
|
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=addTerm§ionid=1'
|
592
973
|
post_data = {
|
@@ -637,6 +1018,32 @@ describe "API" do
|
|
637
1018
|
}).should be_false
|
638
1019
|
end
|
639
1020
|
|
1021
|
+
it "Update register attendance" do
|
1022
|
+
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=registerUpdate§ionid=1&termid=2'
|
1023
|
+
post_data = {
|
1024
|
+
'apiid' => @api_config[:api_id],
|
1025
|
+
'token' => @api_config[:api_token],
|
1026
|
+
'userid' => 'user',
|
1027
|
+
'secret' => 'secret',
|
1028
|
+
'scouts' => '["3"]',
|
1029
|
+
'selectedDate' => '2000-01-02',
|
1030
|
+
'present' => 'Yes',
|
1031
|
+
'section' => :cubs,
|
1032
|
+
'sectionid' => 1,
|
1033
|
+
'completedBadges' => '[{"a":"A"},{"b":"B"}]'
|
1034
|
+
}
|
1035
|
+
|
1036
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'[]'}) }
|
1037
|
+
Osm::Api.new('user', 'secret').update_register({
|
1038
|
+
:section => Osm::Section.new(:id=>1, :type=>:cubs),
|
1039
|
+
:term => 2,
|
1040
|
+
:evening => Date.new(2000, 1, 2),
|
1041
|
+
:attendance => 'Yes',
|
1042
|
+
:members => 3,
|
1043
|
+
:completed_badge_requirements => [{'a'=>'A'}, {'b'=>'B'}]
|
1044
|
+
}).should be_true
|
1045
|
+
end
|
1046
|
+
|
640
1047
|
|
641
1048
|
it "Update a term (succeded)" do
|
642
1049
|
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=addTerm§ionid=1'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
|
6
|
+
describe "Event Attendance" do
|
7
|
+
|
8
|
+
it "Create from API data" do
|
9
|
+
data = {
|
10
|
+
"scoutid" => "1",
|
11
|
+
"firstname" => "First",
|
12
|
+
"lastname" => "Last",
|
13
|
+
"dob" => "1899-11-30",
|
14
|
+
"patrolid" => "2",
|
15
|
+
"f_1" => "a",
|
16
|
+
"attending" => "Yes",
|
17
|
+
}
|
18
|
+
|
19
|
+
ea = Osm::EventAttendance.from_api(data, 3)
|
20
|
+
|
21
|
+
ea.member_id.should == 1
|
22
|
+
ea.grouping_id.should == 2
|
23
|
+
ea.fields.should == {
|
24
|
+
'firstname' => 'First',
|
25
|
+
'lastname' => 'Last',
|
26
|
+
'dob' => Date.new(1899, 11, 30),
|
27
|
+
'attending' => true,
|
28
|
+
'f_1' => 'a',
|
29
|
+
}
|
30
|
+
ea.row.should == 3
|
31
|
+
ea.valid?.should be_true
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/spec/osm/event_spec.rb
CHANGED
data/version.rb
CHANGED
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: 0.0.
|
4
|
+
version: 0.0.26
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-02 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &84281650 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *84281650
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: httparty
|
27
|
-
requirement: &
|
27
|
+
requirement: &84280940 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0.9'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *84280940
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: active_attr
|
38
|
-
requirement: &
|
38
|
+
requirement: &84277910 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0.6'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *84277910
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: activemodel
|
49
|
-
requirement: &
|
49
|
+
requirement: &84277570 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '3.2'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *84277570
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rake
|
60
|
-
requirement: &
|
60
|
+
requirement: &84277120 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0.9'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *84277120
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &84276710 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '2.11'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *84276710
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: fakeweb
|
82
|
-
requirement: &
|
82
|
+
requirement: &84276320 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '1.3'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *84276320
|
91
91
|
description: Use the Online Scout Manager API (https://www.onlinescoutmanager.co.uk)
|
92
92
|
to retrieve and save data.
|
93
93
|
email:
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- lib/osm/due_badges.rb
|
114
114
|
- lib/osm/evening.rb
|
115
115
|
- lib/osm/event.rb
|
116
|
+
- lib/osm/event_attendance.rb
|
116
117
|
- lib/osm/flexi_record_data.rb
|
117
118
|
- lib/osm/flexi_record_field.rb
|
118
119
|
- lib/osm/grouping.rb
|
@@ -129,6 +130,7 @@ files:
|
|
129
130
|
- spec/osm/api_strangeness_spec.rb
|
130
131
|
- spec/osm/due_badges_spec.rb
|
131
132
|
- spec/osm/evening_spec.rb
|
133
|
+
- spec/osm/event_attendance_spec.rb
|
132
134
|
- spec/osm/event_spec.rb
|
133
135
|
- spec/osm/flexi_record_data_spec.rb
|
134
136
|
- spec/osm/flexi_record_field_spec.rb
|