osm 1.2.18.dev.5 → 1.2.18.dev.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/lib/osm/member.rb +170 -112
- data/spec/osm/member_spec.rb +436 -273
- data/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ODBjYWJhMTRjZDA3NTBmOGJhNjE3YmM2MjRhZmMwMDllM2Y3OGY0ZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZWQwN2ZlNGY5ZjkzZGIwYWU0YTM0MGNiNGI4NmM0ZjcxZmJkNDk1Mw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NWZkNzgyNDI3ODU5N2UzNzM3YzkzOWI2MTQ0ZDJjODczYWRhY2U3OGVkMTY2
|
10
|
+
ODIyODY0MmUxZTVjN2JjNDY1OGI1Y2ExNTE0ZWQ4YmYwYzAxZTZhMDcyYWJi
|
11
|
+
YmMzYWYxNmIwMDI1Mjk5M2ZlZjMzODNmMTU2NmVlZGEwNzJmOGE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmZiOGMxNzMxMGQ3MmIzOWI0NzIyMGVjYzhkY2M5YmQ4ZWU5NGRlZmE4MTkx
|
14
|
+
Mjc2YWNkYjc5NDQ3NDRhZTQ5MzlmNTNkMmQ3ODU5YWM3MjY0ZjI3ZjFkNTNl
|
15
|
+
ZjgzNWEyNzcyODMyMWVlMWE1ODVkZDA4OWIxZTc3Y2JkNWVlNjE=
|
data/lib/osm/member.rb
CHANGED
@@ -32,6 +32,7 @@ module Osm
|
|
32
32
|
CID_GENDER = 34
|
33
33
|
CID_SURGERY = 54
|
34
34
|
|
35
|
+
|
35
36
|
# @!attribute [rw] id
|
36
37
|
# @return [Fixnum] the id for the member
|
37
38
|
# @!attribute [rw] section_id
|
@@ -69,7 +70,7 @@ module Osm
|
|
69
70
|
# @!attribute [rw] primary_contact
|
70
71
|
# @return [Osm::Member::PrimaryContact, nil] the member's primary contact (primary contact 1 in OSM) (nil if hidden in OSM)
|
71
72
|
# @!attribute [rw] secondary_contact
|
72
|
-
# @return [Osm::Member::
|
73
|
+
# @return [Osm::Member::SecondaryContact, nil] the member's secondary contact (primary contact 2 in OSM) (nil if hidden in OSM)
|
73
74
|
# @!attribute [rw] emergency_contact
|
74
75
|
# @return [Osm::Member::EmergencyContact, nil] the member's emergency contact (nil if hidden in OSM)
|
75
76
|
# @!attribute [rw] doctor
|
@@ -157,22 +158,28 @@ module Osm
|
|
157
158
|
structure = Hash[ structure.map{ |i| [i['group_id'].to_i, i ] } ] # Make a hash of identifier to group data hash
|
158
159
|
|
159
160
|
custom_labels = {}
|
161
|
+
var_names = {}
|
160
162
|
structure.each do |gid, group|
|
161
163
|
columns = group['columns'] || []
|
162
|
-
columns.
|
163
|
-
columns.
|
164
|
-
|
165
|
-
custom_labels[gid.to_i] = labels
|
164
|
+
columns.select!{ |a| (gid == GID_CUSTOM) || (a['column_id'].to_i > CORE_FIELD_IDS_FINISH_AT) }
|
165
|
+
custom_labels[gid.to_i] = Hash[ columns.map{ |c| [c['varname'], c['label']] } ]
|
166
|
+
var_names[gid.to_i] = DirtyHashy[ columns.map{ |c| [c['column_id'].to_i, c['varname']] } ]
|
166
167
|
end
|
167
168
|
|
168
169
|
data.each do |item|
|
169
170
|
item_data = Hash[ item['custom_data'].map{ |k,v| [k.to_i, v] } ]
|
170
|
-
member_contact = item_data[GID_MEMBER_CONTACT].nil? ? nil : Hash[ item_data[GID_MEMBER_CONTACT].map{ |k,v| [k.to_i, v] }.select{ |
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
171
|
+
member_contact = item_data[GID_MEMBER_CONTACT].nil? ? nil : Hash[ item_data[GID_MEMBER_CONTACT].map{ |k,v| [k.to_i, v] }.select{ |k,v| k < CUSTOM_FIELD_IDS_START_AT } ]
|
172
|
+
member_custom = item_data[GID_MEMBER_CONTACT].nil? ? DirtyHashy.new : DirtyHashy[ item_data[GID_MEMBER_CONTACT].select{ |k,v| k.to_i >= CUSTOM_FIELD_IDS_START_AT }.map{ |k,v| [var_names[GID_MEMBER_CONTACT][k.to_i], v] } ]
|
173
|
+
primary_contact = item_data[GID_PRIMARY_CONTACT].nil? ? nil : Hash[ item_data[GID_PRIMARY_CONTACT].map{ |k,v| [k.to_i, v] }.select{ |k,v| k < CUSTOM_FIELD_IDS_START_AT } ]
|
174
|
+
primary_custom = item_data[GID_PRIMARY_CONTACT].nil? ? DirtyHashy.new : DirtyHashy[ item_data[GID_PRIMARY_CONTACT].select{ |k,v| k.to_i >= CUSTOM_FIELD_IDS_START_AT }.map{ |k,v| [var_names[GID_PRIMARY_CONTACT][k.to_i], v] } ]
|
175
|
+
secondary_contact = item_data[GID_SECONDARY_CONTACT].nil? ? nil : Hash[ item_data[GID_SECONDARY_CONTACT].map{ |k,v| [k.to_i, v] }.select{ |k,v| k < CUSTOM_FIELD_IDS_START_AT } ]
|
176
|
+
secondary_custom = item_data[GID_SECONDARY_CONTACT].nil? ? DirtyHashy.new : DirtyHashy[ item_data[GID_SECONDARY_CONTACT].select{ |k,v| k.to_i >= CUSTOM_FIELD_IDS_START_AT }.map{ |k,v| [var_names[GID_SECONDARY_CONTACT][k.to_i], v] } ]
|
177
|
+
emergency_contact = item_data[GID_EMERGENCY_CONTACT].nil? ? nil : Hash[ item_data[GID_EMERGENCY_CONTACT].map{ |k,v| [k.to_i, v] }.select{ |k,v| k < CUSTOM_FIELD_IDS_START_AT } ]
|
178
|
+
emergency_custom = item_data[GID_EMERGENCY_CONTACT].nil? ? DirtyHashy.new : DirtyHashy[ item_data[GID_EMERGENCY_CONTACT].select{ |k,v| k.to_i >= CUSTOM_FIELD_IDS_START_AT }.map{ |k,v| [var_names[GID_EMERGENCY_CONTACT][k.to_i], v] } ]
|
179
|
+
doctor_contact = item_data[GID_DOCTOR_CONTACT].nil? ? nil : Hash[ item_data[GID_DOCTOR_CONTACT].map{ |k,v| [k.to_i, v] }.select{ |k,v| k < CUSTOM_FIELD_IDS_START_AT } ]
|
180
|
+
doctor_custom = item_data[GID_DOCTOR_CONTACT].nil? ? DirtyHashy.new : DirtyHashy[ item_data[GID_DOCTOR_CONTACT].select{ |k,v| k.to_i >= CUSTOM_FIELD_IDS_START_AT }.map{ |k,v| [var_names[GID_DOCTOR_CONTACT][k.to_i], v] } ]
|
181
|
+
floating_data = item_data[GID_FLOATING].nil? ? {} : Hash[ item_data[GID_FLOATING].map{ |k,v| [k.to_i, v] }.select{ |k,v| k < CUSTOM_FIELD_IDS_START_AT } ]
|
182
|
+
custom_data = item_data[GID_CUSTOM].nil? ? DirtyHashy.new : DirtyHashy[ item_data[GID_CUSTOM].map{ |k,v| [var_names[GID_CUSTOM][k.to_i], v] } ]
|
176
183
|
|
177
184
|
result.push Osm::Member.new(
|
178
185
|
:id => Osm::to_i_or_nil(item['member_id']),
|
@@ -205,8 +212,8 @@ module Osm
|
|
205
212
|
receive_phone_2: member_contact[CID_RECIEVE_PHONE_2],
|
206
213
|
receive_email_1: member_contact[CID_RECIEVE_EMAIL_1],
|
207
214
|
receive_email_2: member_contact[CID_RECIEVE_EMAIL_2],
|
208
|
-
custom:
|
209
|
-
custom_labels: custom_labels[GID_MEMBER_CONTACT]
|
215
|
+
custom: member_custom,
|
216
|
+
custom_labels: custom_labels[GID_MEMBER_CONTACT],
|
210
217
|
),
|
211
218
|
:primary_contact => primary_contact.nil? ? nil : PrimaryContact.new(
|
212
219
|
first_name: primary_contact[CID_FIRST_NAME],
|
@@ -224,10 +231,10 @@ module Osm
|
|
224
231
|
receive_phone_2: primary_contact[CID_RECIEVE_PHONE_2],
|
225
232
|
receive_email_1: primary_contact[CID_RECIEVE_EMAIL_1],
|
226
233
|
receive_email_2: primary_contact[CID_RECIEVE_EMAIL_2],
|
227
|
-
custom:
|
228
|
-
custom_labels: custom_labels[GID_PRIMARY_CONTACT]
|
234
|
+
custom: primary_custom,
|
235
|
+
custom_labels: custom_labels[GID_PRIMARY_CONTACT],
|
229
236
|
),
|
230
|
-
:secondary_contact => secondary_contact.nil? ? nil :
|
237
|
+
:secondary_contact => secondary_contact.nil? ? nil : SecondaryContact.new(
|
231
238
|
first_name: secondary_contact[CID_FIRST_NAME],
|
232
239
|
last_name: secondary_contact[CID_LAST_NAME],
|
233
240
|
address_1: secondary_contact[CID_ADDRESS_1],
|
@@ -243,8 +250,8 @@ module Osm
|
|
243
250
|
receive_phone_2: secondary_contact[CID_RECIEVE_PHONE_2],
|
244
251
|
receive_email_1: secondary_contact[CID_RECIEVE_EMAIL_1],
|
245
252
|
receive_email_2: secondary_contact[CID_RECIEVE_EMAIL_2],
|
246
|
-
custom:
|
247
|
-
custom_labels: custom_labels[GID_SECONDARY_CONTACT]
|
253
|
+
custom: secondary_custom,
|
254
|
+
custom_labels: custom_labels[GID_SECONDARY_CONTACT],
|
248
255
|
),
|
249
256
|
:emergency_contact => emergency_contact.nil? ? nil : EmergencyContact.new(
|
250
257
|
first_name: emergency_contact[CID_FIRST_NAME],
|
@@ -258,8 +265,8 @@ module Osm
|
|
258
265
|
phone_2: emergency_contact[CID_PHONE_2],
|
259
266
|
email_1: emergency_contact[CID_EMAIL_1],
|
260
267
|
email_2: emergency_contact[CID_EMAIL_2],
|
261
|
-
custom:
|
262
|
-
custom_labels: custom_labels[GID_EMERGENCY_CONTACT]
|
268
|
+
custom: emergency_custom,
|
269
|
+
custom_labels: custom_labels[GID_EMERGENCY_CONTACT],
|
263
270
|
),
|
264
271
|
:doctor => doctor_contact.nil? ? nil : DoctorContact.new(
|
265
272
|
first_name: doctor_contact[CID_FIRST_NAME],
|
@@ -272,11 +279,11 @@ module Osm
|
|
272
279
|
postcode: doctor_contact[CID_POSTCODE],
|
273
280
|
phone_1: doctor_contact[CID_PHONE_1],
|
274
281
|
phone_2: doctor_contact[CID_PHONE_2],
|
275
|
-
custom:
|
276
|
-
custom_labels: custom_labels[GID_DOCTOR_CONTACT]
|
282
|
+
custom:doctor_custom,
|
283
|
+
custom_labels: custom_labels[GID_DOCTOR_CONTACT],
|
277
284
|
),
|
278
|
-
custom:
|
279
|
-
custom_labels: custom_labels[GID_CUSTOM]
|
285
|
+
custom: custom_data,
|
286
|
+
custom_labels: custom_labels[GID_CUSTOM],
|
280
287
|
)
|
281
288
|
end
|
282
289
|
|
@@ -292,49 +299,21 @@ module Osm
|
|
292
299
|
|
293
300
|
# Create the user in OSM
|
294
301
|
# @param [Osm::Api] api The api to use to make the request
|
295
|
-
# @return [Boolan] whether the member was successfully added or not
|
302
|
+
# @return [Boolan, nil] whether the member was successfully added or not (nil is returned if the user was created but not with all the data)
|
296
303
|
# @raise [Osm::ObjectIsInvalid] If the Member is invalid
|
297
304
|
# @raise [Osm::Error] If the member already exists in OSM
|
298
305
|
def create(api)
|
306
|
+
raise Osm::Error, 'the member already exists in OSM' unless id.nil?
|
299
307
|
raise Osm::ObjectIsInvalid, 'member is invalid' unless valid?
|
300
308
|
require_ability_to(api, :write, :member, section_id)
|
301
|
-
raise Osm::Error, 'the member already exists in OSM' unless id.nil?
|
302
309
|
|
303
310
|
data = api.perform_query("users.php?action=newMember", {
|
304
311
|
'firstname' => first_name,
|
305
312
|
'lastname' => last_name,
|
306
313
|
'dob' => date_of_birth.strftime(Osm::OSM_DATE_FORMAT),
|
307
|
-
'started' =>
|
308
|
-
'startedsection' =>
|
309
|
-
'patrolid' => grouping_id,
|
310
|
-
'patrolleader' => grouping_leader,
|
314
|
+
'started' => joined_movement.strftime(Osm::OSM_DATE_FORMAT),
|
315
|
+
'startedsection' => started_section.strftime(Osm::OSM_DATE_FORMAT),
|
311
316
|
'sectionid' => section_id,
|
312
|
-
'email1' => email1,
|
313
|
-
'email2' => email2,
|
314
|
-
'email3' => email3,
|
315
|
-
'email4' => email4,
|
316
|
-
'phone1' => phone1,
|
317
|
-
'phone2' => phone2,
|
318
|
-
'phone3' => phone3,
|
319
|
-
'phone4' => phone4,
|
320
|
-
'address' => address,
|
321
|
-
'address2' => address2,
|
322
|
-
'parents' => parents,
|
323
|
-
'notes' => notes,
|
324
|
-
'medical' => medical,
|
325
|
-
'religion' => religion,
|
326
|
-
'school' => school,
|
327
|
-
'ethnicity' => ethnicity,
|
328
|
-
'subs' => subs,
|
329
|
-
'custom1' => custom1,
|
330
|
-
'custom2' => custom2,
|
331
|
-
'custom3' => custom3,
|
332
|
-
'custom4' => custom4,
|
333
|
-
'custom5' => custom5,
|
334
|
-
'custom6' => custom6,
|
335
|
-
'custom7' => custom7,
|
336
|
-
'custom8' => custom8,
|
337
|
-
'custom9' => custom9,
|
338
317
|
})
|
339
318
|
|
340
319
|
if (data.is_a?(Hash) && (data['result'] == 'ok') && (data['scoutid'].to_i > 0))
|
@@ -343,7 +322,9 @@ module Osm
|
|
343
322
|
Osm::Term.get_for_section(api, section_id).each do |term|
|
344
323
|
cache_delete(api, ['members', section_id, term.id])
|
345
324
|
end
|
346
|
-
|
325
|
+
# Now it's created we need to give OSM the rest of the data
|
326
|
+
updated = update(api, true)
|
327
|
+
return updated ? true : nil
|
347
328
|
else
|
348
329
|
return false
|
349
330
|
end
|
@@ -351,76 +332,80 @@ module Osm
|
|
351
332
|
|
352
333
|
# Update the member in OSM
|
353
334
|
# @param [Osm::Api] api The api to use to make the request
|
354
|
-
# @
|
335
|
+
# @param [Boolean] force Whether to force updates (ie tell OSM every attribute changed even if we don't think it did)
|
336
|
+
# @return [Boolean] whether the member was successfully updated or not
|
355
337
|
# @raise [Osm::ObjectIsInvalid] If the Member is invalid
|
356
|
-
def update(api)
|
338
|
+
def update(api, force=false)
|
357
339
|
raise Osm::ObjectIsInvalid, 'member is invalid' unless valid?
|
358
340
|
require_ability_to(api, :write, :member, section_id)
|
359
341
|
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
values['phone4'] = phone4 if to_update.include?('phone3')
|
375
|
-
values['address'] = address if to_update.include?('address')
|
376
|
-
values['address2'] = address2 if to_update.include?('address2')
|
377
|
-
values['parents'] = parents if to_update.include?('parents')
|
378
|
-
values['notes'] = notes if to_update.include?('notes')
|
379
|
-
values['medical'] = medical if to_update.include?('medical')
|
380
|
-
values['religion'] = religion if to_update.include?('religion')
|
381
|
-
values['school'] = school if to_update.include?('school')
|
382
|
-
values['ethnicity'] = ethnicity if to_update.include?('ethnicity')
|
383
|
-
values['subs'] = subs if to_update.include?('subs')
|
384
|
-
values['custom1'] = custom1 if to_update.include?('custom1')
|
385
|
-
values['custom2'] = custom2 if to_update.include?('custom2')
|
386
|
-
values['custom3'] = custom3 if to_update.include?('custom3')
|
387
|
-
values['custom4'] = custom4 if to_update.include?('custom4')
|
388
|
-
values['custom5'] = custom5 if to_update.include?('custom5')
|
389
|
-
values['custom6'] = custom6 if to_update.include?('custom6')
|
390
|
-
values['custom7'] = custom7 if to_update.include?('custom7')
|
391
|
-
values['custom8'] = custom8 if to_update.include?('custom8')
|
392
|
-
values['custom9'] = custom9 if to_update.include?('custom9')
|
393
|
-
|
394
|
-
result = true
|
395
|
-
values.each do |column, value|
|
396
|
-
data = api.perform_query("users.php?action=updateMember&dateFormat=generic", {
|
342
|
+
updated = true
|
343
|
+
|
344
|
+
# Do core attributes
|
345
|
+
attribute_map = [
|
346
|
+
['first_name', 'firstname', first_name],
|
347
|
+
['last_name', 'lastname', last_name],
|
348
|
+
['grouping_id', 'patrolid', grouping_id],
|
349
|
+
['grouping_leader', 'patrolleader', grouping_leader],
|
350
|
+
['date_of_birth', 'dob', date_of_birth.strftime(Osm::OSM_DATE_FORMAT)],
|
351
|
+
['started_section', 'startedsection', started_section.strftime(Osm::OSM_DATE_FORMAT)],
|
352
|
+
['joined_movement', 'started', joined_movement.strftime(Osm::OSM_DATE_FORMAT)],
|
353
|
+
] # our name => OSM name
|
354
|
+
attribute_map.select{ |attr,col,val| force || changed_attributes.include?(attr) }.each do |attr,col,val|
|
355
|
+
data = api.perform_query("ext/members/contact/?action=update", {
|
397
356
|
'scoutid' => self.id,
|
398
|
-
'column' =>
|
399
|
-
'value' =>
|
357
|
+
'column' => col,
|
358
|
+
'value' => val,
|
400
359
|
'sectionid' => section_id,
|
401
360
|
})
|
402
|
-
|
403
|
-
end
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
'
|
410
|
-
'
|
361
|
+
updated = updated && data.is_a?(Hash) && data['ok'].eql?(true)
|
362
|
+
end # each attr to update
|
363
|
+
|
364
|
+
# Do 'floating' attributes
|
365
|
+
if force || changed_attributes.include?('gender')
|
366
|
+
new_value = {male: 'Male', female: 'Female', other: 'Other'}[gender] || 'Unspecified'
|
367
|
+
data = api.perform_query("ext/members/contact/?action=update", {
|
368
|
+
'associated_id' => self.id,
|
369
|
+
'associated_type' => 'member',
|
370
|
+
'value' => new_value,
|
371
|
+
'column_id' => CID_GENDER,
|
372
|
+
'group_id' => GID_FLOATING,
|
373
|
+
'context' => 'members',
|
411
374
|
})
|
412
|
-
|
375
|
+
updated = updated && data.is_a?(Hash) && data['data'].is_a?(Hash) && data['data']['value'].eql?(new_value)
|
413
376
|
end
|
414
377
|
|
415
|
-
|
378
|
+
# Do custom attributes
|
379
|
+
custom.keys.select{ |a| force || custom.changes.keys.include?(a) }.each do |attr|
|
380
|
+
new_value = custom[attr]
|
381
|
+
data = api.perform_query("ext/customdata/?action=updateColumn§ion_id=#{section_id}", {
|
382
|
+
'associated_id' => self.id,
|
383
|
+
'associated_type' => 'member',
|
384
|
+
'value' => new_value,
|
385
|
+
'column_id' => attr,
|
386
|
+
'group_id' => GID_CUSTOM,
|
387
|
+
'context' => 'members',
|
388
|
+
})
|
389
|
+
updated = updated && data.is_a?(Hash) && data['data'].is_a?(Hash) && data['data']['value'].eql?(new_value)
|
390
|
+
end # each attr to update
|
391
|
+
|
392
|
+
# Do contacts
|
393
|
+
updated = contact.update(api, self, force) && updated
|
394
|
+
updated = primary_contact.update(api, self, force) && updated
|
395
|
+
updated = secondary_contact.update(api, self, force) && updated
|
396
|
+
updated = emergency_contact.update(api, self, force) && updated
|
397
|
+
updated = doctor.update(api, self, force) && updated
|
398
|
+
|
399
|
+
# Finish off
|
400
|
+
if updated
|
416
401
|
reset_changed_attributes
|
417
|
-
|
402
|
+
custom.clean_up!
|
403
|
+
# The cached columns for the members will be out of date - remove them
|
418
404
|
Osm::Term.get_for_section(api, section_id).each do |term|
|
419
405
|
Osm::Model.cache_delete(api, ['members', section_id, term.id])
|
420
406
|
end
|
421
407
|
end
|
422
|
-
|
423
|
-
return result
|
408
|
+
return updated
|
424
409
|
end
|
425
410
|
|
426
411
|
# Get the years element of this scout's age
|
@@ -683,12 +668,74 @@ module Osm
|
|
683
668
|
def all_phones
|
684
669
|
[phone_1, phone_2].select{ |n| !n.blank? }.map{ |n| n.gsub(/[^\d\+]/, '') }
|
685
670
|
end
|
671
|
+
|
672
|
+
# Update the contact in OSM
|
673
|
+
# @param [Osm::Api] api The api to use to make the request
|
674
|
+
# @param [Osm::Member] section The member to update the contact for
|
675
|
+
# @param [Boolean] force Whether to force updates (ie tell OSM every attribute changed even if we don't think it did)
|
676
|
+
# @return [Boolean] whether the member was successfully updated or not
|
677
|
+
# @raise [Osm::ObjectIsInvalid] If the Contact is invalid
|
678
|
+
def update(api, member, force=false)
|
679
|
+
raise Osm::ObjectIsInvalid, 'member is invalid' unless valid?
|
680
|
+
require_ability_to(api, :write, :member, member.section_id)
|
681
|
+
|
682
|
+
attribute_map = {
|
683
|
+
'first_name' => 'data[firstname]',
|
684
|
+
'last_name' => 'data[lastname]',
|
685
|
+
'surgery' => 'data[surgery]',
|
686
|
+
'address_1' => 'data[address1]',
|
687
|
+
'address_2' => 'data[address2]',
|
688
|
+
'address_3' => 'data[address3]',
|
689
|
+
'address_4' => 'data[address4]',
|
690
|
+
'postcode' => 'data[postcode]',
|
691
|
+
'phone_1' => 'data[phone1]',
|
692
|
+
'receive_phone_1' => 'data[phone1_sms]',
|
693
|
+
'phone_2' => 'data[phone2]',
|
694
|
+
'receive_phone_2' => 'data[phone2_sms]',
|
695
|
+
'email_1' => 'data[email1]',
|
696
|
+
'receive_email_1' => 'data[email1_leaders]',
|
697
|
+
'email_2' => 'data[email2]',
|
698
|
+
'receive_email_2' => 'data[email2_leaders]',
|
699
|
+
} # our name => OSM name
|
700
|
+
|
701
|
+
data = {}
|
702
|
+
attributes.keys.select{ |a| !['custom', 'custom_labels'].include?(a) }.select{ |a| force || changed_attributes.include?(a) }.each do |attr|
|
703
|
+
value = send(attr)
|
704
|
+
value = 'yes' if value.eql?(true)
|
705
|
+
data[attribute_map[attr]] = value
|
706
|
+
end
|
707
|
+
custom.keys.select{ |a| force || custom.changes.keys.include?(a) }.each do |attr|
|
708
|
+
data["data[#{key}]"] = custom[key]
|
709
|
+
end
|
710
|
+
|
711
|
+
updated = false
|
712
|
+
unless data.empty?
|
713
|
+
result = api.perform_query("ext/customdata/?action=update§ion_id=#{member.section_id}", {
|
714
|
+
'associated_id' => member.id,
|
715
|
+
'associated_type' => 'member',
|
716
|
+
'context' => 'members',
|
717
|
+
'group_id' => self.class::GROUP_ID,
|
718
|
+
}.merge(data))
|
719
|
+
updated = result.is_a?(Hash) && result['status'].eql?(true)
|
720
|
+
end
|
721
|
+
|
722
|
+
# Finish off
|
723
|
+
if updated
|
724
|
+
reset_changed_attributes
|
725
|
+
custom.clean_up!
|
726
|
+
end
|
727
|
+
return updated
|
728
|
+
end
|
729
|
+
|
686
730
|
end
|
687
731
|
|
688
732
|
|
689
733
|
class MemberContact < Osm::Member::Contact
|
690
734
|
include EnableableEmailableContact
|
691
735
|
include EnableablePhoneableContact
|
736
|
+
|
737
|
+
GROUP_ID = Osm::Member::GID_MEMBER_CONTACT
|
738
|
+
|
692
739
|
# @!attribute [rw] email_1
|
693
740
|
# @return [String] the primary email address for the member
|
694
741
|
# @!attribute [rw] email_2
|
@@ -724,6 +771,9 @@ module Osm
|
|
724
771
|
class PrimaryContact < Osm::Member::Contact
|
725
772
|
include EnableableEmailableContact
|
726
773
|
include EnableablePhoneableContact
|
774
|
+
|
775
|
+
GROUP_ID = Osm::Member::GID_PRIMARY_CONTACT
|
776
|
+
|
727
777
|
# @!attribute [rw] email_1
|
728
778
|
# @return [String] the primary email address for the contact
|
729
779
|
# @!attribute [rw] email_2
|
@@ -755,9 +805,15 @@ module Osm
|
|
755
805
|
validates_inclusion_of :receive_phone_2, :in => [true, false]
|
756
806
|
end # class PrimaryContact
|
757
807
|
|
808
|
+
class SecondaryContact < Osm::Member::PrimaryContact
|
809
|
+
GROUP_ID = Osm::Member::GID_SECONDARY_CONTACT
|
810
|
+
end # class SecondaryContact
|
758
811
|
|
759
812
|
class EmergencyContact < Osm::Member::Contact
|
760
813
|
include EmailableContact
|
814
|
+
|
815
|
+
GROUP_ID = Osm::Member::GID_EMERGENCY_CONTACT
|
816
|
+
|
761
817
|
# @!attribute [rw] email_1
|
762
818
|
# @return [String] the primary email address for the contact
|
763
819
|
# @!attribute [rw] email_2
|
@@ -780,6 +836,8 @@ module Osm
|
|
780
836
|
|
781
837
|
|
782
838
|
class DoctorContact < Osm::Member::Contact
|
839
|
+
GROUP_ID = Osm::Member::GID_DOCTOR_CONTACT
|
840
|
+
|
783
841
|
# @!attribute [rw] first_name
|
784
842
|
# @return [String] the contact's first name
|
785
843
|
# @!attribute [rw] last_name
|
data/spec/osm/member_spec.rb
CHANGED
@@ -277,8 +277,8 @@ describe "Member" do
|
|
277
277
|
member.joined_movement.should == Date.new(2006, 7, 17)
|
278
278
|
member.started_section.should == Date.new(2008, 7, 12)
|
279
279
|
member.finished_section.should == Date.new(2010, 6, 3)
|
280
|
-
member.custom.should == {
|
281
|
-
member.custom_labels.should == {
|
280
|
+
member.custom.should == {"label_for_4848" => "Data for 4848"}
|
281
|
+
member.custom_labels.should == {"label_for_4848" => 'Label for 4848'}
|
282
282
|
member.contact.first_name.should == 'John'
|
283
283
|
member.contact.last_name.should == 'Smith'
|
284
284
|
member.contact.address_1.should == 'Address 1'
|
@@ -294,8 +294,8 @@ describe "Member" do
|
|
294
294
|
member.contact.receive_email_1.should == true
|
295
295
|
member.contact.email_2.should == ''
|
296
296
|
member.contact.receive_email_2.should == false
|
297
|
-
member.contact.custom.should == {
|
298
|
-
member.contact.custom_labels.should == {
|
297
|
+
member.contact.custom.should == {"label_for_8446"=>"Data for 8446"}
|
298
|
+
member.contact.custom_labels.should == {"label_for_8446"=>"Label for 8446"}
|
299
299
|
member.primary_contact.first_name.should == 'Primary'
|
300
300
|
member.primary_contact.last_name.should == 'Contact'
|
301
301
|
member.primary_contact.address_1.should == 'Address 1'
|
@@ -311,8 +311,8 @@ describe "Member" do
|
|
311
311
|
member.primary_contact.receive_email_1.should == true
|
312
312
|
member.primary_contact.email_2.should == ''
|
313
313
|
member.primary_contact.receive_email_2.should == false
|
314
|
-
member.primary_contact.custom.should == {
|
315
|
-
member.primary_contact.custom_labels.should == {
|
314
|
+
member.primary_contact.custom.should == {"label_for_8441"=>"Data for 8441"}
|
315
|
+
member.primary_contact.custom_labels.should == {"label_for_8441"=>"Label for 8441"}
|
316
316
|
member.secondary_contact.first_name.should == 'Secondary'
|
317
317
|
member.secondary_contact.last_name.should == 'Contact'
|
318
318
|
member.secondary_contact.address_1.should == 'Address 1'
|
@@ -328,8 +328,8 @@ describe "Member" do
|
|
328
328
|
member.secondary_contact.receive_email_1.should == true
|
329
329
|
member.secondary_contact.email_2.should == ''
|
330
330
|
member.secondary_contact.receive_email_2.should == false
|
331
|
-
member.secondary_contact.custom.should == {
|
332
|
-
member.secondary_contact.custom_labels.should == {
|
331
|
+
member.secondary_contact.custom.should == {"label_for_8442"=>"Data for 8442"}
|
332
|
+
member.secondary_contact.custom_labels.should == {"label_for_8442"=>"Label for 8442"}
|
333
333
|
member.emergency_contact.first_name.should == 'Emergency'
|
334
334
|
member.emergency_contact.last_name.should == 'Contact'
|
335
335
|
member.emergency_contact.address_1.should == 'Address 1'
|
@@ -341,8 +341,8 @@ describe "Member" do
|
|
341
341
|
member.emergency_contact.phone_2.should == '0987 654321'
|
342
342
|
member.emergency_contact.email_1.should == 'emergency@example.com'
|
343
343
|
member.emergency_contact.email_2.should == ''
|
344
|
-
member.emergency_contact.custom.should == {
|
345
|
-
member.emergency_contact.custom_labels.should == {
|
344
|
+
member.emergency_contact.custom.should == {"label_for_8443"=>"Data for 8443"}
|
345
|
+
member.emergency_contact.custom_labels.should == {"label_for_8443"=>"Label for 8443"}
|
346
346
|
member.doctor.first_name.should == 'Doctor'
|
347
347
|
member.doctor.last_name.should == 'Contact'
|
348
348
|
member.doctor.surgery.should == 'Surgery'
|
@@ -353,8 +353,8 @@ describe "Member" do
|
|
353
353
|
member.doctor.postcode.should == 'Postcode'
|
354
354
|
member.doctor.phone_1.should == '01234 567890'
|
355
355
|
member.doctor.phone_2.should == '0987 654321'
|
356
|
-
member.doctor.custom.should == {
|
357
|
-
member.doctor.custom_labels.should == {
|
356
|
+
member.doctor.custom.should == {"label_for_8444"=>"Data for 8444"}
|
357
|
+
member.doctor.custom_labels.should == {"label_for_8444"=>"Label for 8444"}
|
358
358
|
member.valid?.should == true
|
359
359
|
end
|
360
360
|
|
@@ -412,6 +412,105 @@ describe "Member" do
|
|
412
412
|
member.valid?.should == true
|
413
413
|
end
|
414
414
|
|
415
|
+
it "Get from OSM (handles no custom data)" do
|
416
|
+
body = {
|
417
|
+
'status' => true,
|
418
|
+
'error' => nil,
|
419
|
+
'data' => {
|
420
|
+
'123' => {
|
421
|
+
'active' => true,
|
422
|
+
'age' => '12 / 00',
|
423
|
+
'date_of_birth' => '2000-03-08',
|
424
|
+
'end_date' => '2010-06-03',
|
425
|
+
'first_name' => 'John',
|
426
|
+
'joined' => '2008-07-12',
|
427
|
+
'last_name' => 'Smith',
|
428
|
+
'member_id' => 123,
|
429
|
+
'patrol' => 'Leaders',
|
430
|
+
'patrol_id' => -2,
|
431
|
+
'patrol_role_level' => 1,
|
432
|
+
'patrol_role_level_label' => 'Assistant leader',
|
433
|
+
'section_id' => 1,
|
434
|
+
'started' => '2006-07-17',
|
435
|
+
'custom_data' => {
|
436
|
+
'7' => {'34' => 'Unspecified'},
|
437
|
+
},
|
438
|
+
}
|
439
|
+
},
|
440
|
+
'meta' => {
|
441
|
+
'leader_count' => 20,
|
442
|
+
'member_count' => 30,
|
443
|
+
'status' => true,
|
444
|
+
'structure' => [
|
445
|
+
{'group_id' => 5, 'description' => 'This allows you to add extra information for your members.', 'identifier' => 'customisable_data', 'name' => 'Customisable Data', 'columns' => [
|
446
|
+
{'column_id' => 4848, 'group_column_id' => '5_4848', 'label' => 'Label for 4848', 'varname' => 'label_for_4848', 'read_only' => 'no', 'required' => 'no', 'type' => 'text', 'width' => 120},
|
447
|
+
]},
|
448
|
+
{'group_id' => 7, 'description' => '', 'identifier' => 'floating', 'name' => 'Floating', 'columns' => [
|
449
|
+
{'column_id' => 34, 'group_column_id' => '7_34', 'label' => 'Gender', 'varname' => 'gender', 'read_only' => 'no', 'required' => 'no', 'type' => 'text', 'width' => 120},
|
450
|
+
]},
|
451
|
+
],
|
452
|
+
},
|
453
|
+
}
|
454
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/ext/members/contact/grid/?action=getMembers", :body => body.to_json, :content_type => 'application/json')
|
455
|
+
|
456
|
+
members = Osm::Member.get_for_section(@api, 1, 2)
|
457
|
+
members.size.should == 1
|
458
|
+
member = members[0]
|
459
|
+
member.id.should == 123
|
460
|
+
member.custom.should == {}
|
461
|
+
member.valid?.should == true
|
462
|
+
end
|
463
|
+
|
464
|
+
it "Get from OSM (handles missing floating data)" do
|
465
|
+
body = {
|
466
|
+
'status' => true,
|
467
|
+
'error' => nil,
|
468
|
+
'data' => {
|
469
|
+
'123' => {
|
470
|
+
'active' => true,
|
471
|
+
'age' => '12 / 00',
|
472
|
+
'date_of_birth' => '2000-03-08',
|
473
|
+
'end_date' => '2010-06-03',
|
474
|
+
'first_name' => 'John',
|
475
|
+
'joined' => '2008-07-12',
|
476
|
+
'last_name' => 'Smith',
|
477
|
+
'member_id' => 123,
|
478
|
+
'patrol' => 'Leaders',
|
479
|
+
'patrol_id' => -2,
|
480
|
+
'patrol_role_level' => 1,
|
481
|
+
'patrol_role_level_label' => 'Assistant leader',
|
482
|
+
'section_id' => 1,
|
483
|
+
'started' => '2006-07-17',
|
484
|
+
'custom_data' => {
|
485
|
+
'5' => {'4848' => 'Data for 4848'},
|
486
|
+
},
|
487
|
+
}
|
488
|
+
},
|
489
|
+
'meta' => {
|
490
|
+
'leader_count' => 20,
|
491
|
+
'member_count' => 30,
|
492
|
+
'status' => true,
|
493
|
+
'structure' => [
|
494
|
+
{'group_id' => 5, 'description' => 'This allows you to add extra information for your members.', 'identifier' => 'customisable_data', 'name' => 'Customisable Data', 'columns' => [
|
495
|
+
{'column_id' => 4848, 'group_column_id' => '5_4848', 'label' => 'Label for 4848', 'varname' => 'label_for_4848', 'read_only' => 'no', 'required' => 'no', 'type' => 'text', 'width' => 120},
|
496
|
+
]},
|
497
|
+
{'group_id' => 7, 'description' => '', 'identifier' => 'floating', 'name' => 'Floating', 'columns' => [
|
498
|
+
{'column_id' => 34, 'group_column_id' => '7_34', 'label' => 'Gender', 'varname' => 'gender', 'read_only' => 'no', 'required' => 'no', 'type' => 'text', 'width' => 120},
|
499
|
+
]},
|
500
|
+
],
|
501
|
+
},
|
502
|
+
}
|
503
|
+
FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/ext/members/contact/grid/?action=getMembers", :body => body.to_json, :content_type => 'application/json')
|
504
|
+
|
505
|
+
members = Osm::Member.get_for_section(@api, 1, 2)
|
506
|
+
members.size.should == 1
|
507
|
+
member = members[0]
|
508
|
+
member.id.should == 123
|
509
|
+
member.gender.should == nil
|
510
|
+
member.valid?.should == true
|
511
|
+
end
|
512
|
+
|
513
|
+
|
415
514
|
it "Get from OSM (handles an empty data array)" do
|
416
515
|
body = {
|
417
516
|
'status' => true,
|
@@ -425,280 +524,344 @@ describe "Member" do
|
|
425
524
|
end
|
426
525
|
|
427
526
|
|
428
|
-
|
429
|
-
member = Osm::Member.new(
|
430
|
-
:section_id => 2,
|
431
|
-
:first_name => 'First',
|
432
|
-
:last_name => 'Last',
|
433
|
-
:email1 => 'email1@example.com',
|
434
|
-
:email2 => 'email2@example.com',
|
435
|
-
:email3 => 'email3@example.com',
|
436
|
-
:email4 => 'email4@example.com',
|
437
|
-
:phone1 => '11111 111111',
|
438
|
-
:phone2 => '222222',
|
439
|
-
:phone3 => '+33 3333 333333',
|
440
|
-
:phone4 => '4444 444 444',
|
441
|
-
:address => '1 Some Road',
|
442
|
-
:address2 => 'Address 2',
|
443
|
-
:date_of_birth => '2000-01-02',
|
444
|
-
:started => '2006-01-02',
|
445
|
-
:joined => '2006-01-03',
|
446
|
-
:parents => 'John and Jane Doe',
|
447
|
-
:notes => 'None',
|
448
|
-
:medical => 'Nothing',
|
449
|
-
:religion => 'Unknown',
|
450
|
-
:school => 'Some School',
|
451
|
-
:ethnicity => 'Yes',
|
452
|
-
:subs => 'Upto end of 2007',
|
453
|
-
:custom1 => 'Custom Field 1',
|
454
|
-
:custom2 => 'Custom Field 2',
|
455
|
-
:custom3 => 'Custom Field 3',
|
456
|
-
:custom4 => 'Custom Field 4',
|
457
|
-
:custom5 => 'Custom Field 5',
|
458
|
-
:custom6 => 'Custom Field 6',
|
459
|
-
:custom7 => 'Custom Field 7',
|
460
|
-
:custom8 => 'Custom Field 8',
|
461
|
-
:custom9 => 'Custom Field 9',
|
462
|
-
:grouping_id => '3',
|
463
|
-
:grouping_leader => 0,
|
464
|
-
)
|
527
|
+
describe "Create in OSM" do
|
465
528
|
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
'religion' => 'Unknown',
|
492
|
-
'school' => 'Some School',
|
493
|
-
'ethnicity' => 'Yes',
|
494
|
-
'subs' => 'Upto end of 2007',
|
495
|
-
'custom1' => 'Custom Field 1',
|
496
|
-
'custom2' => 'Custom Field 2',
|
497
|
-
'custom3' => 'Custom Field 3',
|
498
|
-
'custom4' => 'Custom Field 4',
|
499
|
-
'custom5' => 'Custom Field 5',
|
500
|
-
'custom6' => 'Custom Field 6',
|
501
|
-
'custom7' => 'Custom Field 7',
|
502
|
-
'custom8' => 'Custom Field 8',
|
503
|
-
'custom9' => 'Custom Field 9',
|
504
|
-
'patrolid' => 3,
|
505
|
-
'patrolleader' => 0,
|
506
|
-
}
|
529
|
+
before :each do
|
530
|
+
attributes = {
|
531
|
+
:section_id => 2,
|
532
|
+
:first_name => 'First',
|
533
|
+
:last_name => 'Last',
|
534
|
+
:date_of_birth => '2000-01-02',
|
535
|
+
:grouping_id => '3',
|
536
|
+
:grouping_leader => 0,
|
537
|
+
:grouping_label => 'Grouping',
|
538
|
+
:grouping_leader_label => '6er',
|
539
|
+
:age => '06 / 07',
|
540
|
+
:gender => :other,
|
541
|
+
:joined_movement => '2006-01-02',
|
542
|
+
:started_section => '2006-01-07',
|
543
|
+
:finished_section => '2007-12-31',
|
544
|
+
:custom => {'12_3' => '123'},
|
545
|
+
:custom_labels => {'12_3' => 'Label for 123'},
|
546
|
+
:contact => Osm::Member::MemberContact.new(postcode: 'A'),
|
547
|
+
:primary_contact => Osm::Member::PrimaryContact.new(postcode: 'B'),
|
548
|
+
:secondary_contact => Osm::Member::PrimaryContact.new(postcode: 'C'),
|
549
|
+
:emergency_contact => Osm::Member::EmergencyContact.new(postcode: 'D'),
|
550
|
+
:doctor => Osm::Member::DoctorContact.new(postcode: 'E'),
|
551
|
+
}
|
552
|
+
@member = Osm::Member.new(attributes)
|
553
|
+
end
|
507
554
|
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
555
|
+
it "Success" do
|
556
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/users.php?action=newMember', {:body => {
|
557
|
+
"apiid" => "1",
|
558
|
+
"token" => "API TOKEN",
|
559
|
+
"userid" => "user_id",
|
560
|
+
"secret" => "secret",
|
561
|
+
"sectionid" => 2,
|
562
|
+
"firstname" => "First",
|
563
|
+
"lastname" => "Last",
|
564
|
+
"dob" => "2000-01-02",
|
565
|
+
"started" => "2006-01-02",
|
566
|
+
"startedsection" => "2006-01-07",
|
567
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"result":"ok","scoutid":577743}'}) }
|
568
|
+
|
569
|
+
@member.stub(:update) { true }
|
570
|
+
Osm::Term.stub(:get_for_section) { [] }
|
571
|
+
|
572
|
+
@member.create(@api).should == true
|
573
|
+
@member.id.should == 577743
|
574
|
+
end
|
513
575
|
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
:last_name => 'Last',
|
519
|
-
:date_of_birth => '2000-01-02',
|
520
|
-
:started => '2006-01-02',
|
521
|
-
:joined => '2006-01-03',
|
522
|
-
:grouping_id => '3',
|
523
|
-
:grouping_leader => 0,
|
524
|
-
)
|
576
|
+
it "Failed the create stage in OSM" do
|
577
|
+
HTTParty.stub(:post) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
578
|
+
@member.create(@api).should == false
|
579
|
+
end
|
525
580
|
|
526
|
-
|
527
|
-
|
528
|
-
|
581
|
+
it "Failed the update stage in OSM" do
|
582
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/users.php?action=newMember', {:body => {
|
583
|
+
"apiid" => "1",
|
584
|
+
"token" => "API TOKEN",
|
585
|
+
"userid" => "user_id",
|
586
|
+
"secret" => "secret",
|
587
|
+
"sectionid" => 2,
|
588
|
+
"firstname" => "First",
|
589
|
+
"lastname" => "Last",
|
590
|
+
"dob" => "2000-01-02",
|
591
|
+
"started" => "2006-01-02",
|
592
|
+
"startedsection" => "2006-01-07",
|
593
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"result":"ok","scoutid":577743}'}) }
|
594
|
+
|
595
|
+
@member.stub(:update) { false }
|
596
|
+
Osm::Term.stub(:get_for_section) { [] }
|
597
|
+
|
598
|
+
@member.create(@api).should == nil
|
599
|
+
@member.id.should == 577743
|
600
|
+
end
|
529
601
|
|
602
|
+
it "Raises error if member is invalid" do
|
603
|
+
expect{ Osm::Member.new.create(@api) }.to raise_error(Osm::ObjectIsInvalid, 'member is invalid')
|
604
|
+
end
|
530
605
|
|
531
|
-
|
532
|
-
|
533
|
-
member.id = 1
|
534
|
-
member.section_id = 2
|
535
|
-
member.first_name = 'First'
|
536
|
-
member.last_name = 'Last'
|
537
|
-
member.email1 = 'email1@example.com'
|
538
|
-
member.email2 = 'email2@example.com'
|
539
|
-
member.email3 = 'email3@example.com'
|
540
|
-
member.email4 = 'email4@example.com'
|
541
|
-
member.phone1 = '11111 111111'
|
542
|
-
member.phone2 = '222222'
|
543
|
-
member.phone3 = '+33 3333 333333'
|
544
|
-
member.phone4 = '4444 444 444'
|
545
|
-
member.address = '1 Some Road'
|
546
|
-
member.address2 = 'Address 2'
|
547
|
-
member.date_of_birth = '2000-01-02'
|
548
|
-
member.started = '2006-01-02'
|
549
|
-
member.joined = '2006-01-03'
|
550
|
-
member.parents = 'John and Jane Doe'
|
551
|
-
member.notes = 'None'
|
552
|
-
member.medical = 'Nothing'
|
553
|
-
member.religion = 'Unknown'
|
554
|
-
member.school = 'Some School'
|
555
|
-
member.ethnicity = 'Yes'
|
556
|
-
member.subs = 'Upto end of 2007'
|
557
|
-
member.custom1 = 'Custom Field 1'
|
558
|
-
member.custom2 = 'Custom Field 2'
|
559
|
-
member.custom3 = 'Custom Field 3'
|
560
|
-
member.custom4 = 'Custom Field 4'
|
561
|
-
member.custom5 = 'Custom Field 5'
|
562
|
-
member.custom6 = 'Custom Field 6'
|
563
|
-
member.custom7 = 'Custom Field 7'
|
564
|
-
member.custom8 = 'Custom Field 8'
|
565
|
-
member.custom9 = 'Custom Field 9'
|
566
|
-
member.grouping_id = 3
|
567
|
-
member.grouping_leader = 0
|
568
|
-
|
569
|
-
url = 'https://www.onlinescoutmanager.co.uk/users.php?action=updateMember&dateFormat=generic'
|
570
|
-
body_data = {
|
571
|
-
'firstname' => 'First',
|
572
|
-
'lastname' => 'Last',
|
573
|
-
'email1' => 'email1@example.com',
|
574
|
-
'email2' => 'email2@example.com',
|
575
|
-
'email3' => 'email3@example.com',
|
576
|
-
'email4' => 'email4@example.com',
|
577
|
-
'phone1' => '11111 111111',
|
578
|
-
'phone2' => '222222',
|
579
|
-
'phone3' => '+33 3333 333333',
|
580
|
-
'phone4' => '4444 444 444',
|
581
|
-
'address' => '1 Some Road',
|
582
|
-
'address2' => 'Address 2',
|
583
|
-
'dob' => '2000-01-02',
|
584
|
-
'started' => '2006-01-02',
|
585
|
-
'startedsection' => '2006-01-03',
|
586
|
-
'parents' => 'John and Jane Doe',
|
587
|
-
'notes' => 'None',
|
588
|
-
'medical' => 'Nothing',
|
589
|
-
'religion' => 'Unknown',
|
590
|
-
'school' => 'Some School',
|
591
|
-
'ethnicity' => 'Yes',
|
592
|
-
'subs' => 'Upto end of 2007',
|
593
|
-
'custom1' => 'Custom Field 1',
|
594
|
-
'custom2' => 'Custom Field 2',
|
595
|
-
'custom3' => 'Custom Field 3',
|
596
|
-
'custom4' => 'Custom Field 4',
|
597
|
-
'custom5' => 'Custom Field 5',
|
598
|
-
'custom6' => 'Custom Field 6',
|
599
|
-
'custom7' => 'Custom Field 7',
|
600
|
-
'custom8' => 'Custom Field 8',
|
601
|
-
'custom9' => 'Custom Field 9',
|
602
|
-
'patrolid' => 3,
|
603
|
-
'patrolleader' => 0,
|
604
|
-
}
|
605
|
-
body = (body_data.inject({}) {|h,(k,v)| h[k]=v.to_s; h}).to_json
|
606
|
-
|
607
|
-
body_data.each do |column, value|
|
608
|
-
unless ['patrolid', 'patrolleader'].include?(column)
|
609
|
-
HTTParty.should_receive(:post).with(url, {:body => {
|
610
|
-
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
611
|
-
'token' => @CONFIGURATION[:api][:osm][:token],
|
612
|
-
'userid' => 'user_id',
|
613
|
-
'secret' => 'secret',
|
614
|
-
'scoutid' => member.id,
|
615
|
-
'column' => column,
|
616
|
-
'value' => value,
|
617
|
-
'sectionid' => member.section_id,
|
618
|
-
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>body}) }
|
619
|
-
end
|
606
|
+
it "Raises error if member exists in OSM (has an ID)" do
|
607
|
+
expect{ Osm::Member.new(id: 12345).create(@api) }.to raise_error(Osm::Error, 'the member already exists in OSM')
|
620
608
|
end
|
621
|
-
|
622
|
-
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
623
|
-
'token' => @CONFIGURATION[:api][:osm][:token],
|
624
|
-
'userid' => 'user_id',
|
625
|
-
'secret' => 'secret',
|
626
|
-
'scoutid' => member.id,
|
627
|
-
'patrolid' => member.grouping_id,
|
628
|
-
'pl' => member.grouping_leader,
|
629
|
-
'sectionid' => member.section_id,
|
630
|
-
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>body}) }
|
631
|
-
Osm::Term.stub(:get_for_section) { [] }
|
632
|
-
|
633
|
-
member.update(@api).should == true
|
609
|
+
|
634
610
|
end
|
635
611
|
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
612
|
+
|
613
|
+
describe "Update in OSM" do
|
614
|
+
|
615
|
+
before :each do
|
616
|
+
attributes = {
|
617
|
+
:id => 1,
|
618
|
+
:section_id => 2,
|
619
|
+
:first_name => 'First',
|
620
|
+
:last_name => 'Last',
|
621
|
+
:date_of_birth => '2000-01-02',
|
622
|
+
:grouping_id => '3',
|
623
|
+
:grouping_leader => 0,
|
624
|
+
:grouping_label => 'Grouping',
|
625
|
+
:grouping_leader_label => '6er',
|
626
|
+
:age => '06 / 07',
|
627
|
+
:gender => :other,
|
628
|
+
:joined_movement => '2006-01-02',
|
629
|
+
:started_section => '2006-01-07',
|
630
|
+
:finished_section => '2007-12-31',
|
631
|
+
:custom => DirtyHashy[ '12_3' => '123' ],
|
632
|
+
:custom_labels => {'12_3' => 'Label for 123'},
|
633
|
+
:contact => Osm::Member::MemberContact.new(postcode: 'A'),
|
634
|
+
:primary_contact => Osm::Member::PrimaryContact.new(postcode: 'B'),
|
635
|
+
:secondary_contact => Osm::Member::SecondaryContact.new(postcode: 'C'),
|
636
|
+
:emergency_contact => Osm::Member::EmergencyContact.new(postcode: 'D'),
|
637
|
+
:doctor => Osm::Member::DoctorContact.new(postcode: 'E'),
|
638
|
+
}
|
639
|
+
@member = Osm::Member.new(attributes)
|
640
|
+
end
|
641
|
+
|
642
|
+
it "Only updated fields" do
|
643
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/members/contact/?action=update', {:body => {
|
644
|
+
"apiid" => "1",
|
645
|
+
"token" => "API TOKEN",
|
646
|
+
"userid" => "user_id",
|
647
|
+
"secret" => "secret",
|
648
|
+
"sectionid" => 2,
|
649
|
+
"scoutid" => 1,
|
650
|
+
"column" => "firstname",
|
651
|
+
"value" => "John",
|
652
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true}'}) }
|
653
|
+
|
654
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/members/contact/?action=update', {:body => {
|
655
|
+
"apiid" => "1",
|
656
|
+
"token" => "API TOKEN",
|
657
|
+
"userid" => "user_id",
|
658
|
+
"secret" => "secret",
|
659
|
+
"context" => "members",
|
660
|
+
"associated_type" => "member",
|
661
|
+
"associated_id" => 1,
|
662
|
+
"group_id" => 7,
|
663
|
+
"column_id" => 34,
|
664
|
+
"value" => "Unspecified",
|
665
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"data":{"value":"Unspecified"}}'}) }
|
666
|
+
|
667
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
668
|
+
"apiid" => "1",
|
669
|
+
"token" => "API TOKEN",
|
670
|
+
"userid" => "user_id",
|
671
|
+
"secret" => "secret",
|
672
|
+
"context" => "members",
|
673
|
+
"associated_type" => "member",
|
674
|
+
"associated_id" => 1,
|
675
|
+
"group_id" => 6,
|
676
|
+
"data[address1]" => "Address 1",
|
677
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
678
|
+
|
679
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
680
|
+
"apiid" => "1",
|
681
|
+
"token" => "API TOKEN",
|
682
|
+
"userid" => "user_id",
|
683
|
+
"secret" => "secret",
|
684
|
+
"context" => "members",
|
685
|
+
"associated_type" => "member",
|
686
|
+
"associated_id" => 1,
|
687
|
+
"group_id" => 1,
|
688
|
+
"data[address2]" => "Address 2",
|
689
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
690
|
+
|
691
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
692
|
+
"apiid" => "1",
|
693
|
+
"token" => "API TOKEN",
|
694
|
+
"userid" => "user_id",
|
695
|
+
"secret" => "secret",
|
696
|
+
"context" => "members",
|
697
|
+
"associated_type" => "member",
|
698
|
+
"associated_id" => 1,
|
699
|
+
"group_id" => 2,
|
700
|
+
"data[address3]" => "Address 3",
|
701
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
702
|
+
|
703
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
704
|
+
"apiid" => "1",
|
705
|
+
"token" => "API TOKEN",
|
706
|
+
"userid" => "user_id",
|
707
|
+
"secret" => "secret",
|
708
|
+
"context" => "members",
|
709
|
+
"associated_type" => "member",
|
710
|
+
"associated_id" => 1,
|
711
|
+
"group_id" => 3,
|
712
|
+
"data[address4]" => "Address 4",
|
713
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
714
|
+
|
715
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
716
|
+
"apiid" => "1",
|
717
|
+
"token" => "API TOKEN",
|
718
|
+
"userid" => "user_id",
|
719
|
+
"secret" => "secret",
|
720
|
+
"context" => "members",
|
721
|
+
"associated_type" => "member",
|
722
|
+
"associated_id" => 1,
|
723
|
+
"group_id" => 4,
|
724
|
+
"data[surgery]" => "Surgery",
|
725
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
726
|
+
|
727
|
+
Osm::Term.stub(:get_for_section) { [] }
|
728
|
+
|
729
|
+
@member.first_name = 'John'
|
730
|
+
@member.gender = :unspecified
|
731
|
+
@member.contact.address_1 = 'Address 1'
|
732
|
+
@member.primary_contact.address_2 = 'Address 2'
|
733
|
+
@member.secondary_contact.address_3 = 'Address 3'
|
734
|
+
@member.emergency_contact.address_4 = 'Address 4'
|
735
|
+
@member.doctor.surgery = 'Surgery'
|
736
|
+
@member.update(@api).should == true
|
737
|
+
end
|
738
|
+
|
739
|
+
it "All fields" do
|
740
|
+
{'firstname'=>'First', 'lastname'=>'Last', 'patrolid'=>3, 'patrolleader'=>0, 'dob'=>'2000-01-02', 'startedsection'=>'2006-01-07', 'started'=>'2006-01-02'}.each do |key, value|
|
741
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/members/contact/?action=update', {:body => {
|
742
|
+
"apiid" => "1",
|
743
|
+
"token" => "API TOKEN",
|
744
|
+
"userid" => "user_id",
|
745
|
+
"secret" => "secret",
|
746
|
+
"sectionid" => 2,
|
747
|
+
"scoutid" => 1,
|
748
|
+
"column" => key,
|
749
|
+
"value" => value,
|
750
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"ok":true}'}) }
|
670
751
|
end
|
752
|
+
|
753
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/members/contact/?action=update', {:body => {
|
754
|
+
"apiid" => "1",
|
755
|
+
"token" => "API TOKEN",
|
756
|
+
"userid" => "user_id",
|
757
|
+
"secret" => "secret",
|
758
|
+
"context" => "members",
|
759
|
+
"associated_type" => "member",
|
760
|
+
"associated_id" => 1,
|
761
|
+
"group_id" => 7,
|
762
|
+
"column_id" => 34,
|
763
|
+
"value" => "Other",
|
764
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"data":{"value":"Other"}}'}) }
|
765
|
+
|
766
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=updateColumn§ion_id=2', {:body => {
|
767
|
+
"apiid" => "1",
|
768
|
+
"token" => "API TOKEN",
|
769
|
+
"userid" => "user_id",
|
770
|
+
"secret" => "secret",
|
771
|
+
"context" => "members",
|
772
|
+
"associated_type" => "member",
|
773
|
+
"associated_id" => 1,
|
774
|
+
"group_id" => 5,
|
775
|
+
"column_id" => "12_3",
|
776
|
+
"value" => "123",
|
777
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"data":{"value":"123"}}'}) }
|
778
|
+
|
779
|
+
{6=>'A', 1=>'B', 2=>'C'}.each do |group_id, postcode|
|
780
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
781
|
+
"apiid" => "1",
|
782
|
+
"token" => "API TOKEN",
|
783
|
+
"userid" => "user_id",
|
784
|
+
"secret" => "secret",
|
785
|
+
"context" => "members",
|
786
|
+
"associated_type" => "member",
|
787
|
+
"associated_id" => 1,
|
788
|
+
"group_id" => group_id,
|
789
|
+
"data[firstname]" => nil,
|
790
|
+
"data[lastname]" => nil,
|
791
|
+
"data[address1]" => nil,
|
792
|
+
"data[address2]" => nil,
|
793
|
+
"data[address3]" => nil,
|
794
|
+
"data[address4]" => nil,
|
795
|
+
"data[postcode]" => postcode,
|
796
|
+
"data[phone1]" => nil,
|
797
|
+
"data[phone2]" => nil,
|
798
|
+
"data[email1]" => nil,
|
799
|
+
"data[email1_leaders]" => false,
|
800
|
+
"data[email2]" => nil,
|
801
|
+
"data[email2_leaders]" => false,
|
802
|
+
"data[phone1_sms]" => false,
|
803
|
+
"data[phone2_sms]" => false,
|
804
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
805
|
+
end
|
806
|
+
|
807
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
808
|
+
"apiid" => "1",
|
809
|
+
"token" => "API TOKEN",
|
810
|
+
"userid" => "user_id",
|
811
|
+
"secret" => "secret",
|
812
|
+
"context" => "members",
|
813
|
+
"associated_type" => "member",
|
814
|
+
"associated_id" => 1,
|
815
|
+
"group_id" => 3,
|
816
|
+
"data[firstname]" => nil,
|
817
|
+
"data[lastname]" => nil,
|
818
|
+
"data[address1]" => nil,
|
819
|
+
"data[address2]" => nil,
|
820
|
+
"data[address3]" => nil,
|
821
|
+
"data[address4]" => nil,
|
822
|
+
"data[postcode]" => "D",
|
823
|
+
"data[phone1]" => nil,
|
824
|
+
"data[phone2]" => nil,
|
825
|
+
"data[email1]" => nil,
|
826
|
+
"data[email2]" => nil,
|
827
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
828
|
+
|
829
|
+
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/ext/customdata/?action=update§ion_id=2', {:body => {
|
830
|
+
"apiid" => "1",
|
831
|
+
"token" => "API TOKEN",
|
832
|
+
"userid" => "user_id",
|
833
|
+
"secret" => "secret",
|
834
|
+
"context" => "members",
|
835
|
+
"associated_type" => "member",
|
836
|
+
"associated_id" => 1,
|
837
|
+
"group_id" => 4,
|
838
|
+
"data[firstname]" => nil,
|
839
|
+
"data[lastname]" => nil,
|
840
|
+
"data[surgery]" => nil,
|
841
|
+
"data[address1]" => nil,
|
842
|
+
"data[address2]" => nil,
|
843
|
+
"data[address3]" => nil,
|
844
|
+
"data[address4]" => nil,
|
845
|
+
"data[postcode]" => "E",
|
846
|
+
"data[phone1]" => nil,
|
847
|
+
"data[phone2]" => nil,
|
848
|
+
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"status":true}'}) }
|
849
|
+
|
850
|
+
Osm::Term.stub(:get_for_section) { [] }
|
851
|
+
|
852
|
+
@member.update(@api, true).should == true
|
671
853
|
end
|
672
|
-
HTTParty.should_receive(:post).with('https://www.onlinescoutmanager.co.uk/users.php?action=updateMemberPatrol', {:body => {
|
673
|
-
'apiid' => @CONFIGURATION[:api][:osm][:id],
|
674
|
-
'token' => @CONFIGURATION[:api][:osm][:token],
|
675
|
-
'userid' => 'user_id',
|
676
|
-
'secret' => 'secret',
|
677
|
-
'scoutid' => member.id,
|
678
|
-
'patrolid' => member.grouping_id,
|
679
|
-
'pl' => member.grouping_leader,
|
680
|
-
'sectionid' => member.section_id,
|
681
|
-
}}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>body}) }
|
682
|
-
Osm::Term.stub(:get_for_section) { [] }
|
683
|
-
|
684
|
-
member.update(@api).should == true
|
685
|
-
end
|
686
854
|
|
687
|
-
|
688
|
-
|
689
|
-
:
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
:grouping_leader => 0,
|
697
|
-
)
|
698
|
-
member.first_name = 'First'
|
855
|
+
it "Failed to update in OSM" do
|
856
|
+
@member.first_name = 'John'
|
857
|
+
HTTParty.stub(:post) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
858
|
+
@member.update(@api).should == false
|
859
|
+
end
|
860
|
+
|
861
|
+
it "Raises error if member is invalid" do
|
862
|
+
expect{ Osm::Member.new.create(@api) }.to raise_error(Osm::ObjectIsInvalid, 'member is invalid')
|
863
|
+
end
|
699
864
|
|
700
|
-
HTTParty.stub(:post) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{}'}) }
|
701
|
-
member.update(@api).should == false
|
702
865
|
end
|
703
866
|
|
704
867
|
it "Get Photo link" do
|
data/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: osm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.18.dev.
|
4
|
+
version: 1.2.18.dev.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Gauld
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|