osm 0.6.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -0
- data/README.md +5 -6
- data/lib/osm.rb +1 -1
- data/lib/osm/section.rb +17 -1
- data/lib/osm/sms.rb +180 -0
- data/spec/osm/section_spec.rb +15 -3
- data/spec/osm/sms_spec.rb +129 -0
- data/version.rb +1 -1
- metadata +3 -1
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## Version 1.0.0
|
2
|
+
|
3
|
+
* SMS text messages:
|
4
|
+
* Section gains sms\_sent\_test, sms\_messages\_sent and sms\_messages\_remaining attributes
|
5
|
+
* Add Sms class:
|
6
|
+
* With send\_sms(api, section\_id, member\_ids, all\_or\_one, source\_address, message) method
|
7
|
+
* With DeliveryReport Model subclass
|
8
|
+
* With get\_for\_section(api, section) class method
|
9
|
+
|
1
10
|
## Version 0.6.3
|
2
11
|
|
3
12
|
* Fix started? and started methods for badges with a combination of custom and normal requirements
|
data/README.md
CHANGED
@@ -32,7 +32,7 @@ Use the [Online Scout Manager](https://www.onlinescoutmanager.co.uk) API.
|
|
32
32
|
Add to your Gemfile and run the `bundle` command to install it.
|
33
33
|
|
34
34
|
```ruby
|
35
|
-
gem 'osm', '~> 0.
|
35
|
+
gem 'osm', '~> 1.0.0'
|
36
36
|
```
|
37
37
|
|
38
38
|
Configure the gem during the initalization of the app (e.g. if using rails then config/initializers/osm.rb would look like):
|
@@ -108,6 +108,7 @@ however it should be noted that when the OSM API adds a feature it can be diffic
|
|
108
108
|
* Roles
|
109
109
|
* Section
|
110
110
|
* Sections
|
111
|
+
* SMS Delivery Reports
|
111
112
|
* Term
|
112
113
|
* Terms
|
113
114
|
|
@@ -141,15 +142,13 @@ however it should be noted that when the OSM API adds a feature it can be diffic
|
|
141
142
|
### Actions
|
142
143
|
* Authorise an app to use the API on a user's behalf
|
143
144
|
* Add activity to programme
|
145
|
+
* Send an SMS to member(s)
|
144
146
|
|
145
147
|
|
146
148
|
## Parts of the OSM API currently NOT supported (may not be an exhaustive list):
|
147
149
|
|
148
150
|
See the [Roadmap page in the wiki](https://github.com/robertgauld/osm/wiki/Roadmap) for more details.
|
149
151
|
|
150
|
-
*
|
151
|
-
|
152
|
-
* Sending a message [issue 54]
|
153
|
-
* Gift aid (Everything) (Gold required)
|
154
|
-
* Finances (Everything) (Gold required)
|
152
|
+
* Gift aid (Everything) (Gold required) [issue 75]
|
153
|
+
* Finances (Everything) (Gold required) [issues 76 & 77]]
|
155
154
|
* MyScout (Everything) (Maybe)
|
data/lib/osm.rb
CHANGED
data/lib/osm/section.rb
CHANGED
@@ -61,6 +61,12 @@ module Osm
|
|
61
61
|
# @return [Fixnum] How many payment reminders to send to parents who haven't paid yet
|
62
62
|
# @!attribute [rw] myscout_payment_reminder_frequency
|
63
63
|
# @return [Fixnum] How many days to leave between payment reminder emails
|
64
|
+
# @!attribute [rw] sms_sent_test
|
65
|
+
# @return [Boolean] Whether the section has sent their test SMS message
|
66
|
+
# @!attribute [rw] sms_messages_sent
|
67
|
+
# @return [Fixnum] How many SMS messages have been sent by the section
|
68
|
+
# @!attribute [rw] sms_messages_remaining
|
69
|
+
# @return [Fixnum] How many SMS messages the section can send before needing to topup
|
64
70
|
|
65
71
|
attribute :id, :type => Integer
|
66
72
|
attribute :name, :type => String
|
@@ -92,6 +98,9 @@ module Osm
|
|
92
98
|
attribute :myscout_event_reminder_frequency, :type => Integer
|
93
99
|
attribute :myscout_payment_reminder_count, :type => Integer
|
94
100
|
attribute :myscout_payment_reminder_frequency, :type => Integer
|
101
|
+
attribute :sms_sent_test, :type => Boolean, :default => false
|
102
|
+
attribute :sms_messages_sent, :type => Integer, :default => 0
|
103
|
+
attribute :sms_messages_remaining, :type => Integer, :default => 0
|
95
104
|
|
96
105
|
attr_accessible :id, :name, :group_id, :group_name, :subscription_level, :subscription_expires,
|
97
106
|
:type, :column_names, :fields, :intouch_fields, :mobile_fields, :flexi_records,
|
@@ -101,7 +110,8 @@ module Osm
|
|
101
110
|
:myscout_email_address_from, :myscout_email_address_copy,
|
102
111
|
:myscout_badges_partial, :myscout_programme_summary, :myscout_programme_times,
|
103
112
|
:myscout_event_reminder_count, :myscout_event_reminder_frequency,
|
104
|
-
:myscout_payment_reminder_count, :myscout_payment_reminder_frequency
|
113
|
+
:myscout_payment_reminder_count, :myscout_payment_reminder_frequency,
|
114
|
+
:sms_sent_test, :sms_messages_sent, :sms_messages_remaining
|
105
115
|
|
106
116
|
validates_numericality_of :id, :only_integer=>true, :greater_than=>0, :allow_nil => true
|
107
117
|
validates_numericality_of :group_id, :only_integer=>true, :greater_than=>0, :allow_nil => true
|
@@ -109,6 +119,8 @@ module Osm
|
|
109
119
|
validates_numericality_of :myscout_event_reminder_frequency, :only_integer=>true, :greater_than_or_equal_to=>-1
|
110
120
|
validates_numericality_of :myscout_payment_reminder_count, :only_integer=>true, :greater_than_or_equal_to=>-1
|
111
121
|
validates_numericality_of :myscout_payment_reminder_frequency, :only_integer=>true, :greater_than_or_equal_to=>-1
|
122
|
+
validates_numericality_of :sms_messages_sent, :only_integer=>true, :greater_than_or_equal_to=>0
|
123
|
+
validates_numericality_of :sms_messages_remaining, :only_integer=>true, :greater_than_or_equal_to=>0
|
112
124
|
|
113
125
|
validates_presence_of :name
|
114
126
|
validates_presence_of :group_name
|
@@ -130,6 +142,7 @@ module Osm
|
|
130
142
|
validates_inclusion_of :myscout_badges_partial, :in => [true, false]
|
131
143
|
validates_inclusion_of :myscout_programme_summary, :in => [true, false]
|
132
144
|
validates_inclusion_of :myscout_programme_times, :in => [true, false]
|
145
|
+
validates_inclusion_of :sms_sent_test, :in => [true, false]
|
133
146
|
|
134
147
|
validates :column_names, :hash => {:key_type => Symbol, :value_type => String}
|
135
148
|
validates :fields, :hash => {:key_type => Symbol, :value_in => [true, false]}
|
@@ -216,6 +229,9 @@ module Osm
|
|
216
229
|
:myscout_event_reminder_frequency => myscout_data['eventRemindFrequency'].to_i,
|
217
230
|
:myscout_payment_reminder_count => myscout_data['paymentRemindCount'].to_i,
|
218
231
|
:myscout_payment_reminder_frequency => myscout_data['paymentRemindFrequency'].to_i,
|
232
|
+
:sms_sent_test => section_data['hasSentTestSMS'],
|
233
|
+
:sms_messages_sent => section_data['sms_sent'],
|
234
|
+
:sms_messages_remaining => section_data['sms_remaining'],
|
219
235
|
)
|
220
236
|
|
221
237
|
result.push section
|
data/lib/osm/sms.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
module Osm
|
2
|
+
|
3
|
+
class Sms
|
4
|
+
|
5
|
+
# Get delivery reports
|
6
|
+
# @param [Osm::Api] api The api to use to make the request
|
7
|
+
# @param [Osm::Section, Fixnum, #to_i] section The section (or its ID) to send the message to
|
8
|
+
# @param [Array<Osm::Member, Fixnum, #to_i>, Osm::Member, Fixnum, #to_i] members The members (or their IDs) to send the message to
|
9
|
+
# @param [Symbol] all_or_one Wheather to send the message to all numbers for a member (:all) or just the first mobile one (:one)
|
10
|
+
# @param [String, #to_s] source_address The number to claim the message is from
|
11
|
+
# @param [String, #to_s] message The text of the message to send
|
12
|
+
# @return [Hash] with keys :sent (Fixnum), :result (Boolean) and :message (String)
|
13
|
+
def self.send_sms(api, section, members, all_or_one, source_address, message)
|
14
|
+
raise ArgumentError, 'all_or_one must be either :all or :one' unless [:all, :one].include?(all_or_one)
|
15
|
+
Osm::Model.require_access_to_section(api, section)
|
16
|
+
|
17
|
+
data = api.perform_query("sms.php?action=sendText§ionid=#{section.to_i}", {
|
18
|
+
'msg' => message,
|
19
|
+
'scouts' => [*members].join(','),
|
20
|
+
'source' => source_address,
|
21
|
+
'all' => all_or_one,
|
22
|
+
'scheduled' => 'now',
|
23
|
+
})
|
24
|
+
|
25
|
+
data.select!{ |k,v| !['debug', 'config'].include?(k) }
|
26
|
+
data = data.map do |k,v|
|
27
|
+
k = 'message' if k.eql?('msg')
|
28
|
+
k = 'sent' if k.eql?('sent_to')
|
29
|
+
[k.to_sym, v]
|
30
|
+
end
|
31
|
+
return Hash[*data.flatten]
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
class DeliveryReport < Osm::Model
|
37
|
+
# @!attribute [rw] sms_id
|
38
|
+
# @return [Fixnum] the id of the SMS
|
39
|
+
# @!attribute [rw] user_id
|
40
|
+
# @return [Fixnum] the id of the OSM user who sent the SMS
|
41
|
+
# @!attribute [rw] member_id
|
42
|
+
# @return [Fixnum] the id of the member the SMS was sent to
|
43
|
+
# @!attribute [rw] section_id
|
44
|
+
# @return [Fixnum] the id of the section 'owning' the SMS
|
45
|
+
# @!attribute [rw] from_name
|
46
|
+
# @return [String] the name of the person who sent the SMS
|
47
|
+
# @!attribute [rw] from_number
|
48
|
+
# @return [String] the number the SMS was 'sent from'
|
49
|
+
# @!attribute [rw] to_name
|
50
|
+
# @return [String] the name of the person the message was sent to
|
51
|
+
# @!attribute [rw] to_number
|
52
|
+
# @return [String] the number the SMS was sent to
|
53
|
+
# @!attribute [rw] message
|
54
|
+
# @return [String] the text of the SMS
|
55
|
+
# @!attribute [rw] scheduled
|
56
|
+
# @return [DateTime] when the SMS was scheduled to be sent
|
57
|
+
# @!attribute [rw] last_updated
|
58
|
+
# @return [DateTime] when this report was last updated
|
59
|
+
# @!attribute [rw] credits
|
60
|
+
# @return [Fixnum] thow many credits the SMS cost
|
61
|
+
# @!attribute [rw] status
|
62
|
+
# @return [Symbol] the status of the SMS (usually :sent, :delivered, :not_delivered, :invalid_destination_address or :not_sent)
|
63
|
+
|
64
|
+
attribute :sms_id, :type => Integer
|
65
|
+
attribute :user_id, :type => Integer
|
66
|
+
attribute :member_id, :type => Integer
|
67
|
+
attribute :section_id, :type => Integer
|
68
|
+
attribute :from_name, :type => String
|
69
|
+
attribute :from_number, :type => String
|
70
|
+
attribute :to_name, :type => String
|
71
|
+
attribute :to_number, :type => String
|
72
|
+
attribute :message, :type => String
|
73
|
+
attribute :scheduled, :type => DateTime
|
74
|
+
attribute :last_updated, :type => DateTime
|
75
|
+
attribute :credits, :type => Integer
|
76
|
+
attribute :status, :type => Object
|
77
|
+
|
78
|
+
attr_accessible :sms_id, :user_id, :member_id, :section_id, :from_name, :from_number, :to_name, :to_number, :message, :scheduled, :last_updated, :credits, :status
|
79
|
+
|
80
|
+
validates_numericality_of :sms_id, :only_integer=>true, :greater_than_or_equal_to=>0
|
81
|
+
validates_numericality_of :user_id, :only_integer=>true, :greater_than_or_equal_to=>0
|
82
|
+
validates_numericality_of :member_id, :only_integer=>true, :greater_than_or_equal_to=>0
|
83
|
+
validates_numericality_of :section_id, :only_integer=>true, :greater_than_or_equal_to=>0
|
84
|
+
validates_numericality_of :credits, :only_integer=>true, :greater_than_or_equal_to=>0
|
85
|
+
validates_presence_of :from_name
|
86
|
+
validates_presence_of :from_number
|
87
|
+
validates_presence_of :to_name
|
88
|
+
validates_presence_of :to_number
|
89
|
+
validates_presence_of :message
|
90
|
+
validates_presence_of :scheduled
|
91
|
+
validates_presence_of :last_updated
|
92
|
+
VALID_STATUSES = [:sent, :not_sent, :delivered, :not_delivered, :invalid_destination_address, :invalid_source_address, :invalid_message_format, :route_not_available, :not_allowed]
|
93
|
+
validates_inclusion_of :status, :in => VALID_STATUSES
|
94
|
+
|
95
|
+
|
96
|
+
# @!method initialize
|
97
|
+
# Initialize a new Badge
|
98
|
+
# @param [Hash] attributes The hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
|
99
|
+
|
100
|
+
|
101
|
+
# Get delivery reports
|
102
|
+
# @param [Osm::Api] api The api to use to make the request
|
103
|
+
# @param [Osm::Section, Fixnum, #to_i] section The section (or its ID) to get the reports for
|
104
|
+
# @!macro options_get
|
105
|
+
# @return [Array<Osm::Sms::DeliveryReport>]
|
106
|
+
def self.get_for_section(api, section, options={})
|
107
|
+
require_access_to_section(api, section, options)
|
108
|
+
section_id = section.to_i
|
109
|
+
cache_key = ['sms_delivery_reports', section_id]
|
110
|
+
|
111
|
+
if !options[:no_cache] && Osm::Model.cache_exist?(api, cache_key)
|
112
|
+
return cache_read(api, cache_key)
|
113
|
+
end
|
114
|
+
|
115
|
+
reports = []
|
116
|
+
get_name_number_regex = /\A(?<name>.*\w)\W+(?<number>\d*)\Z/
|
117
|
+
data = api.perform_query("sms.php?action=deliveryReports§ionid=#{section_id}&dateFormat=generic")
|
118
|
+
data['items'].each do |report|
|
119
|
+
from = report['from'].match(get_name_number_regex)
|
120
|
+
to = report['to'].match(get_name_number_regex)
|
121
|
+
reports.push new(
|
122
|
+
:sms_id => Osm.to_i_or_nil(report['smsid']),
|
123
|
+
:user_id => Osm.to_i_or_nil(report['userid']),
|
124
|
+
:member_id => Osm.to_i_or_nil(report['scoutid']),
|
125
|
+
:section_id => Osm.to_i_or_nil(report['sectionid']),
|
126
|
+
:from_name => from[:name],
|
127
|
+
:from_number => "+#{from[:number]}",
|
128
|
+
:to_name => to[:name],
|
129
|
+
:to_number => "+#{to[:number]}",
|
130
|
+
:message => report['message'],
|
131
|
+
:scheduled => Osm.parse_datetime(report['schedule']),
|
132
|
+
:last_updated => Osm.parse_datetime(report['lastupdated']),
|
133
|
+
:credits => Osm.to_i_or_nil(report['credits']),
|
134
|
+
:status => (report['status'] || 'error').downcase.to_sym,
|
135
|
+
)
|
136
|
+
end
|
137
|
+
|
138
|
+
cache_write(api, cache_key, reports)
|
139
|
+
return reports
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
# @!method status_sent?
|
144
|
+
# Check if the SMS was sent
|
145
|
+
# @return (Boolean)
|
146
|
+
# @!method status_not_sent?
|
147
|
+
# Check if the SMS was not sent
|
148
|
+
# @return (Boolean)
|
149
|
+
# @!method status_delivered?
|
150
|
+
# Check if the SMS was delivered
|
151
|
+
# @return (Boolean)
|
152
|
+
# @!method status_not_delivered?
|
153
|
+
# Check if the SMS was not delivered
|
154
|
+
# @return (Boolean)
|
155
|
+
# @!method status_invalid_destination_address?
|
156
|
+
# Check if the SMS had an invalid destination address
|
157
|
+
# @return (Boolean)
|
158
|
+
# @!method status_invalid_source_address?
|
159
|
+
# Check if the SMS had an invalid source address
|
160
|
+
# @return (Boolean)
|
161
|
+
# @!method status_invalid_message_format?
|
162
|
+
# Check if the SMS message was in an invalid format
|
163
|
+
# @return (Boolean)
|
164
|
+
# @!method route_not_available?
|
165
|
+
# Check if the SMS sending service could not route the message
|
166
|
+
# @return (Boolean)
|
167
|
+
# @!method status_not_allowed?
|
168
|
+
# Check if the SMS sending service refused to send the message
|
169
|
+
# @return (Boolean)
|
170
|
+
VALID_STATUSES.each do |attribute|
|
171
|
+
define_method "status_#{attribute}?" do
|
172
|
+
status == attribute
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
data/spec/osm/section_spec.rb
CHANGED
@@ -37,7 +37,10 @@ describe "Section" do
|
|
37
37
|
:myscout_event_reminder_count => 4,
|
38
38
|
:myscout_event_reminder_frequency => 5,
|
39
39
|
:myscout_payment_reminder_count => 6,
|
40
|
-
:myscout_payment_reminder_frequency => 7
|
40
|
+
:myscout_payment_reminder_frequency => 7,
|
41
|
+
:sms_sent_test => true,
|
42
|
+
:sms_messages_sent => 8,
|
43
|
+
:sms_messages_remaining => 9,
|
41
44
|
}
|
42
45
|
end
|
43
46
|
|
@@ -75,6 +78,9 @@ describe "Section" do
|
|
75
78
|
section.myscout_event_reminder_frequency.should == 5
|
76
79
|
section.myscout_payment_reminder_count.should == 6
|
77
80
|
section.myscout_payment_reminder_frequency.should == 7
|
81
|
+
section.sms_sent_test.should == true
|
82
|
+
section.sms_messages_sent.should == 8
|
83
|
+
section.sms_messages_remaining.should == 9
|
78
84
|
section.valid?.should be_true
|
79
85
|
end
|
80
86
|
|
@@ -92,6 +98,9 @@ describe "Section" do
|
|
92
98
|
section.flexi_records.should == []
|
93
99
|
section.myscout_email_address_from.should == ''
|
94
100
|
section.myscout_email_address_copy.should == ''
|
101
|
+
section.sms_sent_test.should == false
|
102
|
+
section.sms_messages_sent.should == 0
|
103
|
+
section.sms_messages_remaining.should == 0
|
95
104
|
end
|
96
105
|
|
97
106
|
|
@@ -99,8 +108,8 @@ describe "Section" do
|
|
99
108
|
|
100
109
|
before :each do
|
101
110
|
body = [
|
102
|
-
{"sectionConfig"=>"{\"subscription_level\":1,\"subscription_expires\":\"2013-01-05\",\"sectionType\":\"beavers\",\"columnNames\":{\"column_names\":\"names\"},\"numscouts\":10,\"hasUsedBadgeRecords\":true,\"hasProgramme\":true,\"extraRecords\":[{\"name\":\"Flexi Record 1\",\"extraid\":\"111\"}],\"wizard\":\"false\",\"fields\":{\"fields\":true},\"intouch\":{\"intouch_fields\":true},\"mobFields\":{\"mobile_fields\":true},\"gocardless\":\"true\",\"portal\":{\"paymentRemindFrequency\":\"7\",\"paymentRemindCount\":\"6\",\"eventRemindFrequency\":\"5\",\"eventRemindCount\":\"4\",\"badgesPartial\":1,\"programmeTimes\":1,\"programmeSummary\":1,\"emailAddress\":\"send_from@example.com\",\"emailAddressCopy\":null,\"payments\":1,\"badges\":1,\"emails\":{\"email1\":\"true\",\"email2\":\"false\"},\"events\":1,\"programme\":1},\"portalExpires\":{\"events\":\"2013-01-06\",\"eventsA\":1,\"badges\":\"2013-01-07\",\"badgesA\":1,\"programme\":\"2013-01-08\",\"programmeA\":1}}", "groupname"=>"3rd Somewhere", "groupid"=>"3", "groupNormalised"=>"1", "sectionid"=>"1", "sectionname"=>"Section 1", "section"=>"beavers", "isDefault"=>"1", "permissions"=>{"badge"=>10, "member"=>20, "user"=>100, "register"=>100, "contact"=>100, "programme"=>100, "originator"=>1, "events"=>100, "finance"=>100, "flexi"=>100}},
|
103
|
-
{"sectionConfig"=>"{\"subscription_level\":3,\"subscription_expires\":\"2013-01-05\",\"sectionType\":\"cubs\",\"columnNames\":{\"phone1\":\"Home Phone\",\"phone2\":\"Parent 1 Phone\",\"address\":\"Member's Address\",\"phone3\":\"Parent 2 Phone\",\"address2\":\"Address 2\",\"phone4\":\"Alternate Contact Phone\",\"subs\":\"Gender\",\"email1\":\"Parent 1 Email\",\"medical\":\"Medical / Dietary\",\"email2\":\"Parent 2 Email\",\"ethnicity\":\"Gift Aid\",\"email3\":\"Member's Email\",\"religion\":\"Religion\",\"email4\":\"Email 4\",\"school\":\"School\"},\"numscouts\":10,\"hasUsedBadgeRecords\":true,\"hasProgramme\":true,\"extraRecords\":[],\"wizard\":\"false\",\"fields\":{\"email1\":true,\"email2\":true,\"email3\":true,\"email4\":false,\"address\":true,\"address2\":false,\"phone1\":true,\"phone2\":true,\"phone3\":true,\"phone4\":true,\"school\":false,\"religion\":true,\"ethnicity\":true,\"medical\":true,\"patrol\":true,\"subs\":true,\"saved\":true},\"intouch\":{\"address\":true,\"address2\":false,\"email1\":false,\"email2\":false,\"email3\":false,\"email4\":false,\"phone1\":true,\"phone2\":true,\"phone3\":true,\"phone4\":true,\"medical\":false},\"mobFields\":{\"email1\":false,\"email2\":false,\"email3\":false,\"email4\":false,\"address\":true,\"address2\":false,\"phone1\":true,\"phone2\":true,\"phone3\":true,\"phone4\":true,\"school\":false,\"religion\":false,\"ethnicity\":true,\"medical\":true,\"patrol\":true,\"subs\":false}}", "groupname"=>"1st Somewhere", "groupid"=>"1", "groupNormalised"=>"1", "sectionid"=>"2", "sectionname"=>"Section 2", "section"=>"cubs", "isDefault"=>"0", "permissions"=>{"badge"=>100, "member"=>100, "user"=>100, "register"=>100, "contact"=>100, "programme"=>100, "originator"=>1, "events"=>100, "finance"=>100, "flexi"=>100}}
|
111
|
+
{"sectionConfig"=>"{\"subscription_level\":1,\"subscription_expires\":\"2013-01-05\",\"sectionType\":\"beavers\",\"columnNames\":{\"column_names\":\"names\"},\"numscouts\":10,\"hasUsedBadgeRecords\":true,\"hasProgramme\":true,\"extraRecords\":[{\"name\":\"Flexi Record 1\",\"extraid\":\"111\"}],\"wizard\":\"false\",\"fields\":{\"fields\":true},\"intouch\":{\"intouch_fields\":true},\"mobFields\":{\"mobile_fields\":true},\"gocardless\":\"true\",\"portal\":{\"paymentRemindFrequency\":\"7\",\"paymentRemindCount\":\"6\",\"eventRemindFrequency\":\"5\",\"eventRemindCount\":\"4\",\"badgesPartial\":1,\"programmeTimes\":1,\"programmeSummary\":1,\"emailAddress\":\"send_from@example.com\",\"emailAddressCopy\":null,\"payments\":1,\"badges\":1,\"emails\":{\"email1\":\"true\",\"email2\":\"false\"},\"events\":1,\"programme\":1},\"portalExpires\":{\"events\":\"2013-01-06\",\"eventsA\":1,\"badges\":\"2013-01-07\",\"badgesA\":1,\"programme\":\"2013-01-08\",\"programmeA\":1},\"hasSentTestSMS\":true,\"sms_remaining\":8,\"sms_sent\":9}", "groupname"=>"3rd Somewhere", "groupid"=>"3", "groupNormalised"=>"1", "sectionid"=>"1", "sectionname"=>"Section 1", "section"=>"beavers", "isDefault"=>"1", "permissions"=>{"badge"=>10, "member"=>20, "user"=>100, "register"=>100, "contact"=>100, "programme"=>100, "originator"=>1, "events"=>100, "finance"=>100, "flexi"=>100}},
|
112
|
+
{"sectionConfig"=>"{\"subscription_level\":3,\"subscription_expires\":\"2013-01-05\",\"sectionType\":\"cubs\",\"columnNames\":{\"phone1\":\"Home Phone\",\"phone2\":\"Parent 1 Phone\",\"address\":\"Member's Address\",\"phone3\":\"Parent 2 Phone\",\"address2\":\"Address 2\",\"phone4\":\"Alternate Contact Phone\",\"subs\":\"Gender\",\"email1\":\"Parent 1 Email\",\"medical\":\"Medical / Dietary\",\"email2\":\"Parent 2 Email\",\"ethnicity\":\"Gift Aid\",\"email3\":\"Member's Email\",\"religion\":\"Religion\",\"email4\":\"Email 4\",\"school\":\"School\"},\"numscouts\":10,\"hasUsedBadgeRecords\":true,\"hasProgramme\":true,\"extraRecords\":[],\"wizard\":\"false\",\"fields\":{\"email1\":true,\"email2\":true,\"email3\":true,\"email4\":false,\"address\":true,\"address2\":false,\"phone1\":true,\"phone2\":true,\"phone3\":true,\"phone4\":true,\"school\":false,\"religion\":true,\"ethnicity\":true,\"medical\":true,\"patrol\":true,\"subs\":true,\"saved\":true},\"intouch\":{\"address\":true,\"address2\":false,\"email1\":false,\"email2\":false,\"email3\":false,\"email4\":false,\"phone1\":true,\"phone2\":true,\"phone3\":true,\"phone4\":true,\"medical\":false},\"mobFields\":{\"email1\":false,\"email2\":false,\"email3\":false,\"email4\":false,\"address\":true,\"address2\":false,\"phone1\":true,\"phone2\":true,\"phone3\":true,\"phone4\":true,\"school\":false,\"religion\":false,\"ethnicity\":true,\"medical\":true,\"patrol\":true,\"subs\":false},\"hasSentTestSMS\":true,\"sms_remaining\":8,\"sms_sent\":9}", "groupname"=>"1st Somewhere", "groupid"=>"1", "groupNormalised"=>"1", "sectionid"=>"2", "sectionname"=>"Section 2", "section"=>"cubs", "isDefault"=>"0", "permissions"=>{"badge"=>100, "member"=>100, "user"=>100, "register"=>100, "contact"=>100, "programme"=>100, "originator"=>1, "events"=>100, "finance"=>100, "flexi"=>100}}
|
104
113
|
]
|
105
114
|
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/api.php?action=getUserRoles", :body => body.to_json)
|
106
115
|
end
|
@@ -143,6 +152,9 @@ describe "Section" do
|
|
143
152
|
section.myscout_event_reminder_frequency.should == 5
|
144
153
|
section.myscout_payment_reminder_count.should == 6
|
145
154
|
section.myscout_payment_reminder_frequency.should == 7
|
155
|
+
section.sms_sent_test.should == true
|
156
|
+
section.sms_messages_remaining.should == 8
|
157
|
+
section.sms_messages_sent.should == 9
|
146
158
|
end
|
147
159
|
|
148
160
|
it "From cache" do
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe "SMS" do
|
5
|
+
|
6
|
+
describe "Send an SMS" do
|
7
|
+
|
8
|
+
it "Success" do
|
9
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/sms.php?action=sendText§ionid=1', {:body => {
|
10
|
+
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
11
|
+
'token' => @CONFIGURATION[:api][:osm][:token],
|
12
|
+
'userid' => 'user_id',
|
13
|
+
'secret' => 'secret',
|
14
|
+
'msg' => 'Test message.',
|
15
|
+
'scouts' => '2,3',
|
16
|
+
'source' => '441234567890',
|
17
|
+
'all' => :one,
|
18
|
+
'scheduled' => 'now',
|
19
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>{'result'=>true,'sent'=>2,'message'=>'Success','debug'=>nil,'config'=>{}}.to_json}) }
|
20
|
+
|
21
|
+
result = Osm::Sms.send_sms(
|
22
|
+
@api,
|
23
|
+
1, # Section
|
24
|
+
[2, 3], # Members
|
25
|
+
:one,
|
26
|
+
'441234567890', # Source address
|
27
|
+
'Test message.' # Message text
|
28
|
+
)
|
29
|
+
|
30
|
+
result.should == {
|
31
|
+
:result => true,
|
32
|
+
:sent => 2,
|
33
|
+
:message => 'Success'
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
describe "Delivery Report" do
|
41
|
+
|
42
|
+
it "Create" do
|
43
|
+
report = Osm::Sms::DeliveryReport.new(
|
44
|
+
:sms_id => 1,
|
45
|
+
:user_id => 2,
|
46
|
+
:member_id => 3,
|
47
|
+
:section_id => 4,
|
48
|
+
:from_name => 'a',
|
49
|
+
:from_number => '5',
|
50
|
+
:to_name => 'b',
|
51
|
+
:to_number => '6',
|
52
|
+
:message => 'c',
|
53
|
+
:scheduled => DateTime.new(2000, 1, 2, 3, 4, 5),
|
54
|
+
:last_updated => DateTime.new(2000, 1, 2, 3, 5, 6),
|
55
|
+
:credits => 7,
|
56
|
+
:status => :delivered,
|
57
|
+
)
|
58
|
+
|
59
|
+
report.sms_id.should == 1
|
60
|
+
report.user_id.should == 2
|
61
|
+
report.member_id.should == 3
|
62
|
+
report.section_id.should == 4
|
63
|
+
report.from_name.should == 'a'
|
64
|
+
report.from_number.should == '5'
|
65
|
+
report.to_name.should == 'b'
|
66
|
+
report.to_number.should == '6'
|
67
|
+
report.message.should == 'c'
|
68
|
+
report.scheduled.should == DateTime.new(2000, 1, 2, 3, 4, 5)
|
69
|
+
report.last_updated.should == DateTime.new(2000, 1, 2, 3, 5, 6)
|
70
|
+
report.credits.should == 7
|
71
|
+
report.status.should == :delivered
|
72
|
+
report.valid?.should be_true
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "Status helpers" do
|
76
|
+
statuses = Osm::Sms::DeliveryReport::VALID_STATUSES
|
77
|
+
statuses.each do |status|
|
78
|
+
it "For #{status}" do
|
79
|
+
statuses.each do |test_status|
|
80
|
+
Osm::Sms::DeliveryReport.new(:status => status).send("status_#{test_status}?").should == (status == test_status)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
it "Get from OSM" do
|
87
|
+
data = {
|
88
|
+
"identifier" => "smsid",
|
89
|
+
"items" => [{
|
90
|
+
"smsid" => "2",
|
91
|
+
"userid" => "3",
|
92
|
+
"scoutid" => "4",
|
93
|
+
"sectionid" => "1",
|
94
|
+
"phone" => "442345678901",
|
95
|
+
"from" => "From Name 443456789012",
|
96
|
+
"message" => "Test message.",
|
97
|
+
"schedule" => "2000-01-02 03:04:05",
|
98
|
+
"status" => "DELIVERED",
|
99
|
+
"lastupdated" => "2000-01-02 03:04:06",
|
100
|
+
"credits" => "1",
|
101
|
+
"fromuser" => "From Name ",
|
102
|
+
"firstname" => "To",
|
103
|
+
"lastname" => "Name",
|
104
|
+
"to" => "To Name 441234567890"
|
105
|
+
}]
|
106
|
+
}
|
107
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/sms.php?action=deliveryReports§ionid=1&dateFormat=generic", :body => data.to_json)
|
108
|
+
|
109
|
+
reports = Osm::Sms::DeliveryReport.get_for_section(@api, 1)
|
110
|
+
reports.size.should == 1
|
111
|
+
report = reports[0]
|
112
|
+
report.sms_id.should == 2
|
113
|
+
report.user_id.should == 3
|
114
|
+
report.member_id.should == 4
|
115
|
+
report.section_id.should == 1
|
116
|
+
report.from_name.should == 'From Name'
|
117
|
+
report.from_number.should == '+443456789012'
|
118
|
+
report.to_name.should == 'To Name'
|
119
|
+
report.to_number.should == '+441234567890'
|
120
|
+
report.message.should == 'Test message.'
|
121
|
+
report.scheduled.should == DateTime.new(2000, 1, 2, 3, 4, 5)
|
122
|
+
report.last_updated.should == DateTime.new(2000, 1, 2, 3, 4, 6)
|
123
|
+
report.credits.should == 1
|
124
|
+
report.status.should == :delivered
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
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.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -204,6 +204,7 @@ files:
|
|
204
204
|
- lib/osm/model.rb
|
205
205
|
- lib/osm/register.rb
|
206
206
|
- lib/osm/section.rb
|
207
|
+
- lib/osm/sms.rb
|
207
208
|
- lib/osm/term.rb
|
208
209
|
- osm.gemspec
|
209
210
|
- spec/osm/activity_spec.rb
|
@@ -220,6 +221,7 @@ files:
|
|
220
221
|
- spec/osm/osm_spec.rb
|
221
222
|
- spec/osm/register_spec.rb
|
222
223
|
- spec/osm/section_spec.rb
|
224
|
+
- spec/osm/sms_spec.rb
|
223
225
|
- spec/osm/term_spec.rb
|
224
226
|
- spec/spec_helper.rb
|
225
227
|
- version.rb
|