osm 0.0.21 → 0.0.22
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 +12 -1
- data/README.md +15 -9
- data/lib/osm/api.rb +94 -20
- data/lib/osm/due_badges.rb +26 -52
- data/lib/osm/term.rb +11 -0
- data/spec/osm/api_spec.rb +128 -1
- data/spec/osm/due_badges_spec.rb +11 -11
- data/spec/osm/term_spec.rb +11 -0
- data/version.rb +1 -1
- metadata +16 -16
data/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
|
+
## Version 0.0.22
|
|
2
|
+
|
|
3
|
+
* Adjustments so DueBadge is similar enough to badge\_stock data to be useful:
|
|
4
|
+
* by\_member Hash -> Keys are member's name (String), values are the badge key (String)
|
|
5
|
+
* descriptions Hash -> keys are the badge key (String), values are the badge name (String)
|
|
6
|
+
* totals Hash -> keys are the badge key (String), values are the number required (Fixnum)
|
|
7
|
+
* Badge keys are the same as are used in getting badge stock levels
|
|
8
|
+
* Add ability to get badge stock levels
|
|
9
|
+
* Add ability to Create a term
|
|
10
|
+
* Add ability to Update a term
|
|
11
|
+
|
|
1
12
|
## Version 0.0.21
|
|
2
13
|
|
|
3
14
|
* Fix getting section\_id and grouping\_id for api.get\_members
|
|
4
15
|
|
|
5
16
|
## Version 0.0.20
|
|
6
17
|
|
|
7
|
-
*
|
|
18
|
+
* Deprecation of api\_data option in api methods (raise a warning if used and adjust documentation)
|
|
8
19
|
* Hide sesitive information when printing data sent to OSM in debug mode
|
|
9
20
|
* Add archived attribute to Event
|
|
10
21
|
* Add :include\_archived option to api.get\_events method
|
data/README.md
CHANGED
|
@@ -72,6 +72,7 @@ however it should be noted that when the OSM API adds a feature it can be diffic
|
|
|
72
72
|
* API Access
|
|
73
73
|
* API Access for our app
|
|
74
74
|
* Due Badges
|
|
75
|
+
* Evening
|
|
75
76
|
* Events
|
|
76
77
|
* Flexi Record Data
|
|
77
78
|
* Flexi Record Structure
|
|
@@ -100,25 +101,30 @@ however it should be noted that when the OSM API adds a feature it can be diffic
|
|
|
100
101
|
|
|
101
102
|
## Parts of the OSM API currently NOT supported:
|
|
102
103
|
|
|
104
|
+
* Badges:
|
|
105
|
+
* Which requirements each member has met:
|
|
106
|
+
* Retreive
|
|
107
|
+
* Update
|
|
108
|
+
* Retrieve details for each badge (stock, short column names etc.)
|
|
103
109
|
* Retreival of leader access
|
|
104
|
-
* Terms:
|
|
105
|
-
* Create
|
|
106
|
-
* Update
|
|
107
110
|
* Register - Update attendance
|
|
108
|
-
* Flexi
|
|
111
|
+
* Flexi Records:
|
|
112
|
+
* Update data
|
|
113
|
+
* Delete
|
|
114
|
+
* Update
|
|
115
|
+
* Add Column
|
|
109
116
|
* Events:
|
|
110
117
|
* Attendance (everything)
|
|
111
118
|
* Create
|
|
112
119
|
* Update
|
|
120
|
+
* Delete
|
|
113
121
|
* Member:
|
|
114
122
|
* Update
|
|
115
123
|
* Add
|
|
116
|
-
|
|
117
|
-
* Which requirements each member has met:
|
|
118
|
-
* Retreive
|
|
119
|
-
* Update
|
|
120
|
-
* Retrieve details for each badge (stock, short column names etc.)
|
|
124
|
+
* Delete
|
|
121
125
|
* Update Activity
|
|
126
|
+
* Add activity to programme
|
|
127
|
+
* Delete Evening
|
|
122
128
|
* Gift aid (everything)
|
|
123
129
|
* Finances (Everything)
|
|
124
130
|
* SMS:
|
data/lib/osm/api.rb
CHANGED
|
@@ -163,7 +163,7 @@ module Osm
|
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
# Get the notepad for a specified section
|
|
166
|
-
# @param [Osm
|
|
166
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the notepad for
|
|
167
167
|
# @!macro options_get
|
|
168
168
|
# @!macro options_api_data
|
|
169
169
|
# @return nil if an error occured or the user does not have access to that section
|
|
@@ -291,8 +291,8 @@ module Osm
|
|
|
291
291
|
end
|
|
292
292
|
|
|
293
293
|
# Get the programme for a given term
|
|
294
|
-
# @param [Osm
|
|
295
|
-
# @param [Osm
|
|
294
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the programme for
|
|
295
|
+
# @param [Osm::term, Fixnum, nil] term the term (or its ID) to get the programme for, passing nil causes the current term to be used
|
|
296
296
|
# @!macro options_get
|
|
297
297
|
# @!macro options_api_data
|
|
298
298
|
# @return [Array<Osm::Evening>]
|
|
@@ -356,8 +356,8 @@ module Osm
|
|
|
356
356
|
end
|
|
357
357
|
|
|
358
358
|
# Get members
|
|
359
|
-
# @param [Osm
|
|
360
|
-
# @param [Osm
|
|
359
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the members for
|
|
360
|
+
# @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
|
|
361
361
|
# @!macro options_get
|
|
362
362
|
# @!macro options_api_data
|
|
363
363
|
# @return [Array<Osm::Member>]
|
|
@@ -384,7 +384,7 @@ module Osm
|
|
|
384
384
|
end
|
|
385
385
|
|
|
386
386
|
# Get API access details for a given section
|
|
387
|
-
# @param [Osm
|
|
387
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the details for
|
|
388
388
|
# @!macro options_get
|
|
389
389
|
# @!macro options_api_data
|
|
390
390
|
# @return [Array<Osm::ApiAccess>]
|
|
@@ -414,7 +414,7 @@ module Osm
|
|
|
414
414
|
end
|
|
415
415
|
|
|
416
416
|
# Get our API access details for a given section
|
|
417
|
-
# @param [Osm
|
|
417
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the details for
|
|
418
418
|
# @!macro options_get
|
|
419
419
|
# @!macro options_api_data
|
|
420
420
|
# @return [Osm::ApiAccess]
|
|
@@ -437,7 +437,7 @@ module Osm
|
|
|
437
437
|
end
|
|
438
438
|
|
|
439
439
|
# Get events
|
|
440
|
-
# @param [Osm
|
|
440
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the events for
|
|
441
441
|
# @!macro options_get
|
|
442
442
|
# @option options [Boolean] :include_archived (optional) if true then archived activities will also be returned
|
|
443
443
|
# @!macro options_api_data
|
|
@@ -471,7 +471,8 @@ module Osm
|
|
|
471
471
|
end
|
|
472
472
|
|
|
473
473
|
# Get due badges
|
|
474
|
-
# @param [Osm
|
|
474
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the due badges for
|
|
475
|
+
# @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
|
|
475
476
|
# @!macro options_get
|
|
476
477
|
# @!macro options_api_data
|
|
477
478
|
# @return [Osm::DueBadges]
|
|
@@ -496,8 +497,8 @@ module Osm
|
|
|
496
497
|
end
|
|
497
498
|
|
|
498
499
|
# Get register structure
|
|
499
|
-
# @param [Osm
|
|
500
|
-
# @param [Osm
|
|
500
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the structure for
|
|
501
|
+
# @param [Osm::Term, Fixnum, nil] section the term (or its ID) to get the structure for, passing nil causes the current term to be used
|
|
501
502
|
# @!macro options_get
|
|
502
503
|
# @!macro options_api_data
|
|
503
504
|
# @return [Array<Osm::RegisterField>] representing the fields of the register
|
|
@@ -526,8 +527,8 @@ module Osm
|
|
|
526
527
|
end
|
|
527
528
|
|
|
528
529
|
# Get register data
|
|
529
|
-
# @param [Osm
|
|
530
|
-
# @param [Osm
|
|
530
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the register for
|
|
531
|
+
# @param [Osm::Term, Fixnum, nil] section the term (or its ID) to get the register for, passing nil causes the current term to be used
|
|
531
532
|
# @!macro options_get
|
|
532
533
|
# @!macro options_api_data
|
|
533
534
|
# @return [Array<RegisterData>] representing the attendance of each member
|
|
@@ -554,7 +555,7 @@ module Osm
|
|
|
554
555
|
end
|
|
555
556
|
|
|
556
557
|
# Get flexirecord structure
|
|
557
|
-
# @param [Osm
|
|
558
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the structure for
|
|
558
559
|
# @param [Fixnum] the id of the Flexi Record
|
|
559
560
|
# @!macro options_get
|
|
560
561
|
# @!macro options_api_data
|
|
@@ -585,7 +586,7 @@ module Osm
|
|
|
585
586
|
# Get flexi record data
|
|
586
587
|
# @param [Osm:Section, Fixnum] section the section (or its ID) to get the register for
|
|
587
588
|
# @param [Fixnum] the id of the Flexi Record
|
|
588
|
-
# @param [Osm:Term, Fixnum] section the term (or its ID) to get the register for, passing nil causes the current term to be used
|
|
589
|
+
# @param [Osm:Term, Fixnum, nil] section the term (or its ID) to get the register for, passing nil causes the current term to be used
|
|
589
590
|
# @!macro options_get
|
|
590
591
|
# @!macro options_api_data
|
|
591
592
|
# @return [Array<FlexiRecordData>]
|
|
@@ -611,8 +612,32 @@ module Osm
|
|
|
611
612
|
return to_return
|
|
612
613
|
end
|
|
613
614
|
|
|
615
|
+
# Get badge stock levels
|
|
616
|
+
# @param [Osm::Section, Fixnum] section the section (or its ID) to get the stock levels for
|
|
617
|
+
# @param [Osm::Term, Fixnum, nil] section the term (or its ID) to get the stock levels for, passing nil causes the current term to be used
|
|
618
|
+
# @!macro options_get
|
|
619
|
+
# @return Hash
|
|
620
|
+
def get_badge_stock_levels(section, term=nil, options={})
|
|
621
|
+
section_id = id_for_section(section)
|
|
622
|
+
section_type = type_for_section(section)
|
|
623
|
+
term_id = id_for_term(term, section)
|
|
624
|
+
cache_key = "badge_stock-#{section_id}-#{term_id}"
|
|
625
|
+
|
|
626
|
+
if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:badge, section_id)
|
|
627
|
+
return cache_read(cache_key)
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
data = perform_query("challenges.php?action=getInitialBadges&type=core§ionid=#{section_id}§ion=#{section_type}&termid=#{term_id}")
|
|
631
|
+
data = (data['stock'] || {}).select{ |k,v| !k.eql?('sectionid') }
|
|
632
|
+
|
|
633
|
+
self.user_can_access :badge, section_id
|
|
634
|
+
cache_write(cache_key, data, :expires_in => @@default_cache_ttl)
|
|
635
|
+
return data
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
|
|
614
639
|
# Create an evening in OSM
|
|
615
|
-
# @param [Fixnum]
|
|
640
|
+
# @param [Osm::Section, Fixnum] section or section_id to add the evening to
|
|
616
641
|
# @param [Date] meeting_date the date of the meeting
|
|
617
642
|
# @!macro options_api_data
|
|
618
643
|
# @return [Boolean] if the operation suceeded or not
|
|
@@ -635,6 +660,39 @@ module Osm
|
|
|
635
660
|
return data.is_a?(Hash) && (data['result'] == 0)
|
|
636
661
|
end
|
|
637
662
|
|
|
663
|
+
# Create a term in OSM
|
|
664
|
+
# @param [Hash] options - the configuration of the new term
|
|
665
|
+
# @option options [Osm::Section, Fixnum] :section (required) section or section_id to add the term to
|
|
666
|
+
# @option options [String] :name (required) the name for the term
|
|
667
|
+
# @option options [Date] :start (required) the date for the start of term
|
|
668
|
+
# @option options [Date] :finish (required) the date for the finish of term
|
|
669
|
+
# @return [Boolean] if the operation suceeded or not
|
|
670
|
+
def create_term(options={})
|
|
671
|
+
raise ArgumentError, ":section can't be nil" if options[:section].nil?
|
|
672
|
+
raise ArgumentError, ":name can't be nil" if options[:name].nil?
|
|
673
|
+
raise ArgumentError, ":start can't be nil" if options[:start].nil?
|
|
674
|
+
raise ArgumentError, ":finish can't be nil" if options[:finish].nil?
|
|
675
|
+
|
|
676
|
+
section_id = id_for_section(options[:section])
|
|
677
|
+
api_data = {
|
|
678
|
+
'term' => options[:name],
|
|
679
|
+
'start' => options[:start].strftime(Osm::OSM_DATE_FORMAT),
|
|
680
|
+
'end' => options[:finish].strftime(Osm::OSM_DATE_FORMAT),
|
|
681
|
+
'termid' => '0'
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
data = perform_query("users.php?action=addTerm§ionid=#{section_id}", api_data)
|
|
685
|
+
|
|
686
|
+
# The cached terms for the section will be out of date - remove them
|
|
687
|
+
get_terms.each do |term|
|
|
688
|
+
cache_delete("term-#{term.id}") if term.section_id == section_id
|
|
689
|
+
end
|
|
690
|
+
cache_delete("terms-#{@userid}")
|
|
691
|
+
|
|
692
|
+
return data.is_a?(Hash) && data['terms'].is_a?(Hash)
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
|
|
638
696
|
# Update an evening in OSM
|
|
639
697
|
# @param [Osm::Evening] evening the evening to update
|
|
640
698
|
# @!macro options_api_data
|
|
@@ -652,6 +710,22 @@ module Osm
|
|
|
652
710
|
return response.is_a?(Hash) && (response['result'] == 0)
|
|
653
711
|
end
|
|
654
712
|
|
|
713
|
+
# Update a term in OSM
|
|
714
|
+
# @param [Osm::Term] term the term to update
|
|
715
|
+
# @return [Boolean] if the operation suceeded or not
|
|
716
|
+
def update_term(term)
|
|
717
|
+
raise ArgumentIsInvalid, 'term is invalid' unless term.valid?
|
|
718
|
+
|
|
719
|
+
data = perform_query("users.php?action=addTerm§ionid=#{term.section_id}", term.to_api)
|
|
720
|
+
|
|
721
|
+
# The cached terms for the section will be out of date - remove them
|
|
722
|
+
cache_delete("term-#{term.id}")
|
|
723
|
+
cache_delete("terms-#{@userid}")
|
|
724
|
+
|
|
725
|
+
return data.is_a?(Hash) && data['terms'].is_a?(Hash)
|
|
726
|
+
end
|
|
727
|
+
|
|
728
|
+
|
|
655
729
|
|
|
656
730
|
protected
|
|
657
731
|
# Set access permission for the current user on a resource stored in the cache
|
|
@@ -660,7 +734,7 @@ module Osm
|
|
|
660
734
|
# @param [Hash] api_data the data hash used in accessing the api
|
|
661
735
|
# @param [Boolean] permission wether the user can access the resource
|
|
662
736
|
# @return [Boolean] the permission which was set
|
|
663
|
-
def user_can_access(resource_type, resource_id, api_data, permission=true)
|
|
737
|
+
def user_can_access(resource_type, resource_id, api_data={}, permission=true)
|
|
664
738
|
user = (api_data['userid'] || @userid).to_i
|
|
665
739
|
resource_id = resource_id.to_i
|
|
666
740
|
resource_type = resource_type.to_sym
|
|
@@ -677,7 +751,7 @@ module Osm
|
|
|
677
751
|
# @param [Hash] api_data the data hash used in accessing the api
|
|
678
752
|
# @return nil if the combination of user and resource has not been set
|
|
679
753
|
# @return [Boolean] if the user can access the resource
|
|
680
|
-
def user_can_access?(resource_type, resource_id, api_data)
|
|
754
|
+
def user_can_access?(resource_type, resource_id, api_data={})
|
|
681
755
|
user = (api_data['userid'] || @userid).to_i
|
|
682
756
|
resource_id = resource_id.to_i
|
|
683
757
|
resource_type = resource_type.to_sym
|
|
@@ -785,11 +859,11 @@ module Osm
|
|
|
785
859
|
id_for(Osm::Section, section, 'section')
|
|
786
860
|
end
|
|
787
861
|
|
|
788
|
-
def type_for_section(section, api_data)
|
|
862
|
+
def type_for_section(section, api_data={})
|
|
789
863
|
(section.is_a?(Osm::Section) ? section : get_section(section, api_data)).type.to_s
|
|
790
864
|
end
|
|
791
865
|
|
|
792
|
-
def id_for_term(term, section, api_data)
|
|
866
|
+
def id_for_term(term, section, api_data={})
|
|
793
867
|
return term.nil? ? Osm::find_current_term_id(self, id_for_section(section), api_data) : id_for(Osm::Term, term, 'term')
|
|
794
868
|
end
|
|
795
869
|
|
data/lib/osm/due_badges.rb
CHANGED
|
@@ -14,28 +14,17 @@ module Osm
|
|
|
14
14
|
|
|
15
15
|
attr_accessible :descriptions, :by_member
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
record.errors.add(attr, 'must be a Hash') unless value.is_a?(Hash)
|
|
19
|
-
value.each do |k, v|
|
|
20
|
-
record.errors.add(attr, 'keys must be Symbols') unless k.is_a?(Symbol)
|
|
21
|
-
record.errors.add(attr, 'values must be Hashes') unless v.is_a?(Hash)
|
|
22
|
-
[:name, :section, :type, :badge].each do |key|
|
|
23
|
-
record.errors.add(attr, "values must include the key #{key}") unless v.keys.include?(key)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
17
|
+
validates :descriptions, :hash => {:key_type => String, :value_type => String}
|
|
27
18
|
|
|
28
19
|
validates_each :by_member do |record, attr, value|
|
|
20
|
+
desc_keys = record.descriptions.keys
|
|
29
21
|
record.errors.add(attr, 'must be a Hash') unless value.is_a?(Hash)
|
|
30
22
|
value.each do |k, v|
|
|
31
23
|
record.errors.add(attr, 'keys must be String') unless k.is_a?(String)
|
|
32
24
|
record.errors.add(attr, 'values must be Arrays') unless v.is_a?(Array)
|
|
33
25
|
v.each do |vv|
|
|
34
|
-
record.errors.add(attr, 'internal values must be
|
|
35
|
-
record.errors.add(attr, 'internal values must
|
|
36
|
-
record.errors.add(attr, 'internal values :badge value must be a Symbol') unless vv[:badge].is_a?(Symbol)
|
|
37
|
-
record.errors.add(attr, 'internal values must include the key :extra_information') unless vv.keys.include?(:extra_information)
|
|
38
|
-
record.errors.add(attr, 'internal values :extra_information value must be a String') unless vv[:extra_information].is_a?(String)
|
|
26
|
+
record.errors.add(attr, 'internal values must be Strings') unless vv.is_a?(String)
|
|
27
|
+
record.errors.add(attr, 'internal values must exist as a key in :descriptions') unless desc_keys.include?(vv)
|
|
39
28
|
end
|
|
40
29
|
end
|
|
41
30
|
end
|
|
@@ -49,39 +38,27 @@ module Osm
|
|
|
49
38
|
# Initialize a new DueBadges from api data
|
|
50
39
|
# @param [Hash] data the hash of data provided by the API
|
|
51
40
|
def self.from_api(data)
|
|
52
|
-
data = {} unless data.is_a?(Hash)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
attributes
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
attributes[:descriptions][key][:type] = attributes[:descriptions][key][:type].to_sym
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
attributes[:by_member] = {}
|
|
73
|
-
attributes[:pending].each_key do |key|
|
|
74
|
-
attributes[:pending][key].each do |item|
|
|
75
|
-
name = "#{item[:firstname]} #{item[:lastname]}"
|
|
41
|
+
data = {} unless data.is_a?(Hash) # OSM returns an empty array to represent no badges
|
|
42
|
+
pending_raw = data['pending'] || {}
|
|
43
|
+
descriptions_raw = data['description'] || {}
|
|
44
|
+
|
|
45
|
+
attributes = {
|
|
46
|
+
:by_member => {},
|
|
47
|
+
:descriptions => {}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
pending_raw.each do |key, members|
|
|
51
|
+
members.each do |member|
|
|
52
|
+
name = "#{member['firstname']} #{member['lastname']}"
|
|
53
|
+
description = descriptions_raw[key]['name'] + (descriptions_raw[key]['section'].eql?('staged') ? " (Level #{member['level']})" : '')
|
|
54
|
+
description_key = key + (descriptions_raw[key]['section'].eql?('staged') ? "_#{member['level']}" : '_1')
|
|
55
|
+
|
|
56
|
+
attributes[:descriptions][description_key] = description
|
|
76
57
|
attributes[:by_member][name] ||= []
|
|
77
|
-
|
|
78
|
-
:badge => key,
|
|
79
|
-
:extra_information => item[:extra]
|
|
80
|
-
}
|
|
81
|
-
attributes[:by_member][name].push badge
|
|
58
|
+
attributes[:by_member][name].push(description_key)
|
|
82
59
|
end
|
|
83
60
|
end
|
|
84
|
-
|
|
61
|
+
|
|
85
62
|
new(attributes)
|
|
86
63
|
end
|
|
87
64
|
|
|
@@ -93,15 +70,12 @@ module Osm
|
|
|
93
70
|
|
|
94
71
|
# Calculate the total number of badges needed
|
|
95
72
|
# @return [Hash] the total number of each badge which is due
|
|
96
|
-
def totals(
|
|
73
|
+
def totals()
|
|
97
74
|
totals = {}
|
|
98
75
|
by_member.keys.each do |member_name|
|
|
99
|
-
by_member[member_name].each do |
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
totals[badge_record[:badge]] ||= {}
|
|
103
|
-
totals[badge_symbol][badge_extra] ||= 0
|
|
104
|
-
totals[badge_symbol][badge_extra] += 1
|
|
76
|
+
by_member[member_name].each do |badge|
|
|
77
|
+
totals[badge] ||= 0
|
|
78
|
+
totals[badge] += 1
|
|
105
79
|
end
|
|
106
80
|
end
|
|
107
81
|
return totals
|
data/lib/osm/term.rb
CHANGED
|
@@ -47,6 +47,17 @@ module Osm
|
|
|
47
47
|
)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
# Get the term's data for use with the API
|
|
51
|
+
# @return [Hash]
|
|
52
|
+
def to_api
|
|
53
|
+
{
|
|
54
|
+
'term' => name,
|
|
55
|
+
'start' => start.strftime(Osm::OSM_DATE_FORMAT),
|
|
56
|
+
'end' => finish.strftime(Osm::OSM_DATE_FORMAT),
|
|
57
|
+
'termid' => id
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
50
61
|
# Determine if the term is completly before the passed date
|
|
51
62
|
# @param [Date] date
|
|
52
63
|
# @return [Boolean] if the term is completly before the passed date
|
data/spec/osm/api_spec.rb
CHANGED
|
@@ -401,6 +401,33 @@ describe "API" do
|
|
|
401
401
|
end
|
|
402
402
|
|
|
403
403
|
|
|
404
|
+
it "Fetch badge stock levels for a section" do
|
|
405
|
+
badges_body = {
|
|
406
|
+
'stock' => {
|
|
407
|
+
'sectionid' => 1,
|
|
408
|
+
'badge_1' => 1,
|
|
409
|
+
'badge_2' => 2
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=getInitialBadges&type=core§ionid=1§ion=test&termid=2", :body => badges_body.to_json)
|
|
414
|
+
|
|
415
|
+
section = Osm::Section.new(:id => 1, :type => :test)
|
|
416
|
+
term = Osm::Term.new(:id => 2)
|
|
417
|
+
stock = Osm::Api.new('1', '2').get_badge_stock_levels(section, term)
|
|
418
|
+
stock.should == {'badge_1' => 1, 'badge_2' => 2}
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
it "Fetch badge stock levels for a section (data from API missing)" do
|
|
422
|
+
badges_body = {}
|
|
423
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=getInitialBadges&type=core§ionid=1§ion=test&termid=2", :body => badges_body.to_json)
|
|
424
|
+
|
|
425
|
+
section = Osm::Section.new(:id => 1, :type => :test)
|
|
426
|
+
term = Osm::Term.new(:id => 2)
|
|
427
|
+
stock = Osm::Api.new('1', '2').get_badge_stock_levels(section, term)
|
|
428
|
+
stock.should == {}
|
|
429
|
+
end
|
|
430
|
+
|
|
404
431
|
it "Fetch the register structure for a section" do
|
|
405
432
|
data = [
|
|
406
433
|
{"rows" => [{"name"=>"First name","field"=>"firstname","width"=>"100px"},{"name"=>"Last name","field"=>"lastname","width"=>"100px"},{"name"=>"Total","field"=>"total","width"=>"60px"}],"noscroll"=>true},
|
|
@@ -557,7 +584,107 @@ describe "API" do
|
|
|
557
584
|
api = Osm::Api.new('user', 'secret')
|
|
558
585
|
evening = Osm::Evening.new
|
|
559
586
|
expect{ api.update_evening(evening) }.to raise_error(Osm::ArgumentIsInvalid)
|
|
560
|
-
end
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
it "Create a term (succeded)" do
|
|
591
|
+
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=addTerm§ionid=1'
|
|
592
|
+
post_data = {
|
|
593
|
+
'apiid' => @api_config[:api_id],
|
|
594
|
+
'token' => @api_config[:api_token],
|
|
595
|
+
'userid' => 'user',
|
|
596
|
+
'secret' => 'secret',
|
|
597
|
+
'term' => 'A Term',
|
|
598
|
+
'start' => '2010-01-01',
|
|
599
|
+
'end' => '2010-12-31',
|
|
600
|
+
'termid' => '0'
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
api = Osm::Api.new('user', 'secret')
|
|
604
|
+
api.stub(:get_terms) { [] }
|
|
605
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"terms":{}}'}) }
|
|
606
|
+
|
|
607
|
+
api.create_term({
|
|
608
|
+
:section => 1,
|
|
609
|
+
:name => 'A Term',
|
|
610
|
+
:start => Date.new(2010, 01, 01),
|
|
611
|
+
:finish => Date.new(2010, 12, 31),
|
|
612
|
+
}).should be_true
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
it "Create a term (failed)" do
|
|
616
|
+
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=addTerm§ionid=1'
|
|
617
|
+
post_data = {
|
|
618
|
+
'apiid' => @api_config[:api_id],
|
|
619
|
+
'token' => @api_config[:api_token],
|
|
620
|
+
'userid' => 'user',
|
|
621
|
+
'secret' => 'secret',
|
|
622
|
+
'term' => 'A Term',
|
|
623
|
+
'start' => '2010-01-01',
|
|
624
|
+
'end' => '2010-12-31',
|
|
625
|
+
'termid' => '0'
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
api = Osm::Api.new('user', 'secret')
|
|
629
|
+
api.stub(:get_terms) { [] }
|
|
630
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
|
631
|
+
|
|
632
|
+
api.create_term({
|
|
633
|
+
:section => 1,
|
|
634
|
+
:name => 'A Term',
|
|
635
|
+
:start => Date.new(2010, 01, 01),
|
|
636
|
+
:finish => Date.new(2010, 12, 31),
|
|
637
|
+
}).should be_false
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
it "Update a term (succeded)" do
|
|
642
|
+
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=addTerm§ionid=1'
|
|
643
|
+
post_data = {
|
|
644
|
+
'apiid' => @api_config[:api_id],
|
|
645
|
+
'token' => @api_config[:api_token],
|
|
646
|
+
'userid' => 'user',
|
|
647
|
+
'secret' => 'secret',
|
|
648
|
+
'term' => 'A Term',
|
|
649
|
+
'start' => '2010-01-01',
|
|
650
|
+
'end' => '2010-12-31',
|
|
651
|
+
'termid' => 2
|
|
652
|
+
}
|
|
653
|
+
api = Osm::Api.new('user', 'secret')
|
|
654
|
+
api.stub(:get_terms) { [] }
|
|
655
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"terms":{}}'}) }
|
|
656
|
+
|
|
657
|
+
term = Osm::Term.new(:id=>2, :section_id=>1, :name=>'A Term', :start=>Date.new(2010, 01, 01), :finish=>Date.new(2010, 12, 31))
|
|
658
|
+
api.update_term(term).should be_true
|
|
659
|
+
end
|
|
660
|
+
|
|
661
|
+
it "Update a term (failed)" do
|
|
662
|
+
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=addTerm§ionid=1'
|
|
663
|
+
post_data = {
|
|
664
|
+
'apiid' => @api_config[:api_id],
|
|
665
|
+
'token' => @api_config[:api_token],
|
|
666
|
+
'userid' => 'user',
|
|
667
|
+
'secret' => 'secret',
|
|
668
|
+
'term' => 'A Term',
|
|
669
|
+
'start' => '2010-01-01',
|
|
670
|
+
'end' => '2010-12-31',
|
|
671
|
+
'termid' => 2
|
|
672
|
+
}
|
|
673
|
+
api = Osm::Api.new('user', 'secret')
|
|
674
|
+
api.stub(:get_terms) { [] }
|
|
675
|
+
HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
|
676
|
+
|
|
677
|
+
term = Osm::Term.new(:id=>2, :section_id=>1, :name=>'A Term', :start=>Date.new(2010, 01, 01), :finish=>Date.new(2010, 12, 31))
|
|
678
|
+
api.update_term(term).should be_false
|
|
679
|
+
end
|
|
680
|
+
|
|
681
|
+
it "Update a term (invalid term)" do
|
|
682
|
+
api = Osm::Api.new('user', 'secret')
|
|
683
|
+
term = Osm::Term.new
|
|
684
|
+
expect{ api.update_term(term) }.to raise_error(Osm::ArgumentIsInvalid)
|
|
685
|
+
end
|
|
686
|
+
|
|
687
|
+
end
|
|
561
688
|
|
|
562
689
|
|
|
563
690
|
describe "Options Hash" do
|
data/spec/osm/due_badges_spec.rb
CHANGED
|
@@ -11,21 +11,21 @@ describe "DueBadge" do
|
|
|
11
11
|
'scoutid' => '1',
|
|
12
12
|
'firstname' => 'John',
|
|
13
13
|
'lastname' => 'Doe',
|
|
14
|
-
'
|
|
14
|
+
'level' => '',
|
|
15
15
|
'extra' => '',
|
|
16
16
|
}
|
|
17
17
|
],
|
|
18
|
-
'
|
|
18
|
+
'staged_staged_participation' => [{
|
|
19
19
|
'sid' => '2',
|
|
20
20
|
'firstname' => 'Jane',
|
|
21
21
|
'lastname' => 'Doe',
|
|
22
|
-
'
|
|
23
|
-
'extra' => 'Lvl
|
|
22
|
+
'level' => '2',
|
|
23
|
+
'extra' => 'Lvl 2'
|
|
24
24
|
}, {
|
|
25
25
|
'sid' => '1',
|
|
26
26
|
'firstname' => 'John',
|
|
27
27
|
'lastname' => 'Doe',
|
|
28
|
-
'
|
|
28
|
+
'level' => '2',
|
|
29
29
|
'extra' => 'Lvl 2'
|
|
30
30
|
}
|
|
31
31
|
]
|
|
@@ -38,10 +38,10 @@ describe "DueBadge" do
|
|
|
38
38
|
'type' => 'activity',
|
|
39
39
|
'badge' => 'badge_name'
|
|
40
40
|
},
|
|
41
|
-
'
|
|
41
|
+
'staged_staged_participation' => {
|
|
42
42
|
'name' => 'Participation',
|
|
43
|
-
'section' => '
|
|
44
|
-
'type' => '
|
|
43
|
+
'section' => 'staged',
|
|
44
|
+
'type' => 'staged',
|
|
45
45
|
'badge' => 'participation'
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -49,9 +49,9 @@ describe "DueBadge" do
|
|
|
49
49
|
db = Osm::DueBadges.from_api(data)
|
|
50
50
|
|
|
51
51
|
db.empty?.should == false
|
|
52
|
-
db.descriptions.should == {
|
|
53
|
-
db.by_member.should == {
|
|
54
|
-
db.totals.should == {
|
|
52
|
+
db.descriptions.should == {'badge_name_1'=>'Badge Name', 'staged_staged_participation_2'=>'Participation (Level 2)'}
|
|
53
|
+
db.by_member.should == {'John Doe'=>['badge_name_1', 'staged_staged_participation_2'], 'Jane Doe'=>['staged_staged_participation_2']}
|
|
54
|
+
db.totals.should == {'staged_staged_participation_2'=>2, 'badge_name_1'=>1}
|
|
55
55
|
db.valid?.should be_true
|
|
56
56
|
end
|
|
57
57
|
|
data/spec/osm/term_spec.rb
CHANGED
|
@@ -33,6 +33,17 @@ describe "Term" do
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
it "Creates the data for saving through the API" do
|
|
37
|
+
term = Osm::Term.new(@attributes)
|
|
38
|
+
term.to_api.should == {
|
|
39
|
+
'term' => @attributes[:name],
|
|
40
|
+
'start' => @attributes[:start].strftime(Osm::OSM_DATE_FORMAT),
|
|
41
|
+
'end' => @attributes[:finish].strftime(Osm::OSM_DATE_FORMAT),
|
|
42
|
+
'termid' => @attributes[:id]
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
36
47
|
it "Compares two matching terms" do
|
|
37
48
|
term1 = Osm::Term.new(@attributes)
|
|
38
49
|
term2 = Osm::Term.new(@attributes)
|
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.22
|
|
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-09-
|
|
12
|
+
date: 2012-09-25 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activesupport
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &83982580 !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: *83982580
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: httparty
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &83975470 !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: *83975470
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: active_attr
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &83974580 !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: *83974580
|
|
47
47
|
- !ruby/object:Gem::Dependency
|
|
48
48
|
name: activemodel
|
|
49
|
-
requirement: &
|
|
49
|
+
requirement: &83973660 !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: *83973660
|
|
58
58
|
- !ruby/object:Gem::Dependency
|
|
59
59
|
name: rake
|
|
60
|
-
requirement: &
|
|
60
|
+
requirement: &83972980 !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: *83972980
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: rspec
|
|
71
|
-
requirement: &
|
|
71
|
+
requirement: &83972430 !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: *83972430
|
|
80
80
|
- !ruby/object:Gem::Dependency
|
|
81
81
|
name: fakeweb
|
|
82
|
-
requirement: &
|
|
82
|
+
requirement: &83968460 !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: *83968460
|
|
91
91
|
description: Use the Online Scout Manager API (https://www.onlinescoutmanager.co.uk)
|
|
92
92
|
to retrieve and save data.
|
|
93
93
|
email:
|