bright 0.1.0 → 1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,34 +3,34 @@ module Bright
3
3
  class PowerSchool < Base
4
4
  DATE_FORMAT = '%Y-%m-%d'
5
5
  INVALID_SEARCH_CHAR_RE = /[\,\;]/
6
-
6
+
7
7
  @@description = "Connects to the PowerSchool API for accessing student information"
8
- @@doc_url = ""
8
+ @@doc_url = "http://psimages.sunnysideschools.org/api-developer-guide-1.6.0/"
9
9
  @@api_version = "1.6.0"
10
-
10
+
11
11
  attr_accessor :connection_options, :expansion_options
12
-
12
+
13
13
  def initialize(options = {})
14
14
  self.connection_options = options[:connection] || {}
15
15
  self.expansion_options = options[:expansion] || {}
16
16
  # {
17
- # :client_id => "",
17
+ # :client_id => "",
18
18
  # :client_secret => "",
19
19
  # :uri => ""
20
20
  # :access_token => "", #optional
21
21
  # }
22
22
  end
23
-
23
+
24
24
  def get_student_by_api_id(api_id, params = {})
25
25
  params = self.apply_expansions(params)
26
26
  st_hsh = self.request(:get, "ws/v1/student/#{api_id}", params)
27
27
  Student.new(convert_to_student_data(st_hsh["student"])) if st_hsh and st_hsh["student"]
28
28
  end
29
-
29
+
30
30
  def get_student(params = {}, options = {})
31
31
  self.get_students(params, options.merge(:per_page => 1, :wrap_in_collection => false)).first
32
32
  end
33
-
33
+
34
34
  def get_students(params = {}, options = {})
35
35
  params = self.apply_expansions(params)
36
36
  params = self.apply_options(params, options)
@@ -44,23 +44,25 @@ module Bright
44
44
  students_response_hash = self.request(:get, 'ws/v1/district/student', self.map_student_search_params(params))
45
45
  if students_response_hash and students_response_hash["students"] && students_response_hash["students"]["student"]
46
46
  students_hash = [students_response_hash["students"]["student"]].flatten
47
-
47
+
48
48
  students = students_hash.compact.collect {|st_hsh|
49
49
  Student.new(convert_to_student_data(st_hsh))
50
50
  }
51
-
51
+
52
52
  if options[:wrap_in_collection] != false
53
53
  api = self
54
54
  load_more_call = proc { |page|
55
55
  # pages start at one, so add a page here
56
- api.get_students(params, {:wrap_in_collection => false, :page => (page + 1)})
56
+ params[:page] = (page + 1)
57
+ api.get_students(params, {:wrap_in_collection => false})
57
58
  }
58
59
 
59
60
  ResponseCollection.new({
60
- :seed_page => students,
61
+ :seed_page => students,
61
62
  :total => total_results,
62
- :per_page => params[:pagesize],
63
- :load_more_call => load_more_call
63
+ :per_page => params[:pagesize],
64
+ :load_more_call => load_more_call,
65
+ :no_threads => options[:no_threads]
64
66
  })
65
67
  else
66
68
  students
@@ -69,7 +71,7 @@ module Bright
69
71
  []
70
72
  end
71
73
  end
72
-
74
+
73
75
  def create_student(student, additional_params = {})
74
76
  response = self.request(:post, 'ws/v1/student', self.convert_from_student_data(student, "INSERT", additional_params))
75
77
  if response["results"] and response["results"]["insert_count"] == 1
@@ -87,7 +89,7 @@ module Bright
87
89
  end
88
90
  student
89
91
  end
90
-
92
+
91
93
  def update_student(student, additional_params = {})
92
94
  response = self.request(:post, 'ws/v1/student', self.convert_from_student_data(student, "UPDATE", additional_params))
93
95
  if response["results"] and response["results"]["update_count"] == 1
@@ -98,11 +100,11 @@ module Bright
98
100
  student
99
101
  end
100
102
  end
101
-
103
+
102
104
  def subscribe_student(student)
103
105
  raise NotImplementedError
104
106
  end
105
-
107
+
106
108
  def get_schools(params = {}, options = {})
107
109
  params = self.apply_options(params, options)
108
110
 
@@ -113,32 +115,33 @@ module Bright
113
115
  end
114
116
 
115
117
  schools_response_hash = self.request(:get, 'ws/v1/district/school', params)
116
- puts schools_response_hash.inspect
117
118
  schools_hsh = [schools_response_hash["schools"]["school"]].flatten
118
-
119
+
119
120
  schools = schools_hsh.compact.collect {|st_hsh|
120
121
  School.new(convert_to_school_data(st_hsh))
121
122
  }
122
-
123
+
123
124
  if options[:wrap_in_collection] != false
124
125
  api = self
125
126
  load_more_call = proc { |page|
126
127
  # pages start at one, so add a page here
127
- api.get_schools(params, {:wrap_in_collection => false, :page => (page + 1)})
128
+ params[:page] = (page + 1)
129
+ api.get_schools(params, {:wrap_in_collection => false})
128
130
  }
129
131
 
130
132
  ResponseCollection.new({
131
- :seed_page => schools,
133
+ :seed_page => schools,
132
134
  :total => total_results,
133
- :per_page => params[:pagesize],
134
- :load_more_call => load_more_call
135
+ :per_page => params[:pagesize],
136
+ :load_more_call => load_more_call,
137
+ :no_threads => options[:no_threads]
135
138
  })
136
139
  else
137
140
  schools
138
141
  end
139
142
  end
140
-
141
- def retrive_access_token
143
+
144
+ def retrieve_access_token
142
145
  connection = Bright::Connection.new("#{self.connection_options[:uri]}/oauth/access_token/")
143
146
  response = connection.request(:post, "grant_type=client_credentials", self.headers_for_access_token)
144
147
  if !response.error?
@@ -149,7 +152,7 @@ module Bright
149
152
  end
150
153
  response_hash
151
154
  end
152
-
155
+
153
156
  def request(method, path, params = {})
154
157
  uri = "#{self.connection_options[:uri]}/#{path}"
155
158
  body = nil
@@ -159,12 +162,14 @@ module Bright
159
162
  else
160
163
  body = JSON.dump(params)
161
164
  end
162
-
163
- headers = self.headers_for_auth
164
165
 
165
- connection = Bright::Connection.new(uri)
166
- response = connection.request(method, body, headers)
167
-
166
+
167
+ response = connection_retry_wrapper {
168
+ connection = Bright::Connection.new(uri)
169
+ headers = self.headers_for_auth
170
+ connection.request(method, body, headers)
171
+ }
172
+
168
173
  if !response.error?
169
174
  response_hash = JSON.parse(response.body)
170
175
  else
@@ -173,13 +178,13 @@ module Bright
173
178
  end
174
179
  response_hash
175
180
  end
176
-
181
+
177
182
  protected
178
-
183
+
179
184
  def map_student_search_params(params)
180
185
  params = params.dup
181
186
  default_params = {}
182
-
187
+
183
188
  q = ""
184
189
  %w(first_name middle_name last_name).each do |f|
185
190
  if fn = params.delete(f.to_sym)
@@ -199,23 +204,23 @@ module Bright
199
204
 
200
205
  default_params.merge(params).reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
201
206
  end
202
-
207
+
203
208
  def convert_to_student_data(attrs)
204
209
  cattrs = {}
205
-
210
+
206
211
  if attrs["name"]
207
212
  cattrs[:first_name] = attrs["name"]["first_name"]
208
213
  cattrs[:middle_name] = attrs["name"]["middle_name"]
209
214
  cattrs[:last_name] = attrs["name"]["last_name"]
210
215
  end
211
-
216
+
212
217
  cattrs[:api_id] = attrs["id"].to_s
213
218
  cattrs[:sis_student_id] = attrs["local_id"].to_s
214
- cattrs[:state_student_id] = attrs["state_province_id"].to_s
215
-
219
+ cattrs[:state_student_id] = attrs["state_province_id"].to_s
220
+
216
221
  if attrs["demographics"]
217
222
  if attrs["demographics"]["birth_date"]
218
- begin
223
+ begin
219
224
  cattrs[:birth_date] = Date.strptime(attrs["demographics"]["birth_date"], DATE_FORMAT)
220
225
  rescue => e
221
226
  puts "#{e.inspect} #{bd}"
@@ -227,17 +232,48 @@ module Bright
227
232
  pg = attrs["demographics"]["projected_graduation_year"].to_i
228
233
  cattrs[:projected_graduation_year] = pg if pg > 0
229
234
  end
230
-
235
+
236
+ #Student Address
231
237
  begin
232
- cattrs[:addresses] = attrs["addresses"].to_a.collect{|a| self.convert_to_address_data(a)} if attrs["addresses"]
233
- rescue
234
- end
238
+ cattrs[:addresses] = attrs["addresses"].to_a.collect{|a| self.convert_to_address_data(a)}.select{|a| !a[:street].blank?}.uniq{|a| a[:street]} if attrs["addresses"]
239
+ rescue
240
+ end
241
+
242
+ #Ethnicity / Race Info
243
+ if attrs["ethnicity_race"].is_a?(Hash)
244
+ if !(race_hshs = attrs.dig("ethnicity_race", "races")).nil?
245
+ #this should be an array, but it doesn't appear PS always sends it as one
246
+ cattrs[:race] = [race_hshs].flatten.map{|race_hsh| race_hsh["district_race_code"]}.compact.uniq
247
+ end
248
+
249
+ if !attrs.dig("ethnicity_race", "federal_ethnicity").nil?
250
+ cattrs[:hispanic_ethnicity] = attrs.dig("ethnicity_race", "federal_ethnicity").to_bool
251
+ end
252
+ end
253
+
254
+ #Contacts Info
255
+ [1,2].each do |contact_id|
256
+ if !attrs.dig("contact", "emergency_contact_name#{contact_id}").blank? and !attrs.dig("contact", "emergency_phone#{contact_id}").blank?
257
+ cattrs[:contacts] ||= []
258
+ contact_attrs = {
259
+ :first_name => attrs.dig("contact", "emergency_contact_name#{contact_id}").to_s.split(",").last.strip,
260
+ :last_name => attrs.dig("contact", "emergency_contact_name#{contact_id}").to_s.split(",").first.strip,
261
+ :phone_numbers => [
262
+ {
263
+ :phone_number => attrs.dig("contact", "emergency_phone#{contact_id}")
264
+ }
265
+ ]
266
+ }
267
+ cattrs[:contacts] << contact_attrs
268
+ end
269
+ end
270
+
235
271
  cattrs.reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
236
272
  end
237
-
273
+
238
274
  def convert_from_student_data(student, action = nil, additional_params = {})
239
275
  return {} if student.nil?
240
-
276
+
241
277
  student_data = {
242
278
  :client_uid => student.client_id,
243
279
  :action => action,
@@ -245,7 +281,7 @@ module Bright
245
281
  :local_id => student.sis_student_id,
246
282
  :state_province_id => student.state_student_id,
247
283
  :name => {
248
- :first_name => student.first_name,
284
+ :first_name => student.first_name,
249
285
  :middle_name => student.middle_name,
250
286
  :last_name => student.last_name
251
287
  }.reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?},
@@ -255,12 +291,12 @@ module Bright
255
291
  :projected_graduation_year => student.projected_graduation_year
256
292
  }.reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
257
293
  }.merge(additional_params).reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
258
-
294
+
259
295
  # apply enrollment info
260
296
  if student.enrollment
261
- student_data.merge!(self.convert_from_enrollment_data(student.enrollment))
297
+ student_data.merge!(self.convert_from_enrollment_data(student.enrollment))
262
298
  end
263
-
299
+
264
300
  # apply addresses
265
301
  address_data = {}
266
302
  if ph = student.addresses.detect{|a| a.type == "physical"}
@@ -275,12 +311,12 @@ module Bright
275
311
  address_data.merge!(self.convert_from_address_data(cany))
276
312
  end
277
313
  if address_data.size > 0
278
- student_data.merge!({:addresses => address_data})
314
+ student_data.merge!({:addresses => address_data})
279
315
  end
280
-
316
+
281
317
  {:students => {:student => student_data}}
282
318
  end
283
-
319
+
284
320
  def convert_from_enrollment_data(enrollment)
285
321
  return {} if enrollment.nil?
286
322
  {:school_enrollment => {
@@ -294,17 +330,24 @@ module Bright
294
330
  }.reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
295
331
  }
296
332
  end
297
-
333
+
298
334
  def convert_to_school_data(attrs)
299
335
  cattrs = {}
300
-
301
336
  cattrs[:api_id] = attrs["id"]
302
337
  cattrs[:name] = attrs["name"]
303
338
  cattrs[:number] = attrs["school_number"]
304
-
339
+ cattrs[:low_grade] = attrs["low_grade"]
340
+ cattrs[:high_grade] = attrs["high_grade"]
341
+ if (address_attributes = attrs.dig("addresses"))
342
+ cattrs[:address] = convert_to_address_data(address_attributes)
343
+ end
344
+ if (phone_number_attributes = attrs.dig("phones", "main", "number"))
345
+ cattrs[:phone_number] = {:phone_number => phone_number_attributes}
346
+ end
347
+
305
348
  cattrs.reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
306
349
  end
307
-
350
+
308
351
  def convert_from_address_data(address)
309
352
  {
310
353
  (address.type || "physcial") => {
@@ -316,10 +359,10 @@ module Bright
316
359
  }.reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
317
360
  }
318
361
  end
319
-
362
+
320
363
  def convert_to_address_data(attrs)
321
364
  cattrs = {}
322
-
365
+
323
366
  if attrs.is_a?(Array)
324
367
  if attrs.first.is_a?(String)
325
368
  cattrs[:type] = attrs.first
@@ -337,12 +380,12 @@ module Bright
337
380
  cattrs[:state] = attrs["state_province"]
338
381
  cattrs[:postal_code] = attrs["postal_code"]
339
382
  if attrs["grid_location"] and lat_lng = attrs["grid_location"].split(/,\s?/)
340
- cattrs[:lattitude], cattrs[:longitude] = lat_lng
383
+ cattrs[:latitude], cattrs[:longitude] = lat_lng
341
384
  end
342
-
385
+
343
386
  cattrs.reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
344
387
  end
345
-
388
+
346
389
  def apply_expansions(params)
347
390
  if self.expansion_options.empty?
348
391
  hsh = self.request(:get, 'ws/v1/district/student', {:pagesize => 1, :q => "local_id==0"})
@@ -359,22 +402,22 @@ module Bright
359
402
  :extensions => (%w(studentcorefields) & (self.expansion_options[:extensions] || [])).join(",")
360
403
  }.reject{|k,v| v.empty?})
361
404
  end
362
-
405
+
363
406
  def apply_options(params, options)
364
407
  options[:per_page] = params[:pagesize] ||= params.delete(:per_page) || options[:per_page] || 100
365
408
  params[:page] ||= options[:page] || 1
366
409
  params
367
410
  end
368
-
411
+
369
412
  def headers_for_access_token
370
413
  {
371
414
  "Authorization" => "Basic #{Base64.strict_encode64("#{self.connection_options[:client_id]}:#{self.connection_options[:client_secret]}")}",
372
415
  "Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8"
373
416
  }
374
417
  end
375
-
418
+
376
419
  def headers_for_auth
377
- self.retrive_access_token if self.connection_options[:access_token].nil?
420
+ self.retrieve_access_token if self.connection_options[:access_token].nil?
378
421
  {
379
422
  "Authorization" => "Bearer #{self.connection_options[:access_token]}",
380
423
  "Accept" => "application/json;charset=UTF-8",
@@ -383,4 +426,4 @@ module Bright
383
426
  end
384
427
  end
385
428
  end
386
- end
429
+ end
@@ -0,0 +1,276 @@
1
+ module Bright
2
+ module SisApi
3
+ class Skyward < Base
4
+
5
+ @@description = "Connects to the Skyward API for accessing student information"
6
+ @@doc_url = "https://esdemo1.skyward.com/api/swagger/ui/index"
7
+ @@api_version = "v1"
8
+
9
+ attr_accessor :connection_options, :schools_cache
10
+
11
+ DEMOGRAPHICS_CONVERSION = {
12
+ "I"=>"American Indian Or Alaska Native",
13
+ "A"=>"Asian",
14
+ "B"=>"Black Or African American",
15
+ "P"=>"Native Hawaiian Or Other Pacific Islander",
16
+ "W"=>"White"
17
+ }
18
+
19
+ PHONE_TYPE_CONVERSION = {
20
+ "Cellular" => "Cell",
21
+ "Work" => "Work",
22
+ "Home" => "Home",
23
+ "Other" => "Other"
24
+ }
25
+
26
+ def initialize(options = {})
27
+ self.connection_options = options[:connection] || {}
28
+ # {
29
+ # :client_id => "",
30
+ # :client_secret => "",
31
+ # :uri => "https://skywardinstall.com/API"
32
+ # }
33
+ end
34
+
35
+ def get_student_by_api_id(api_id, params = {})
36
+ st_hsh = self.request(:get, "v1/students/#{api_id}", params)[:parsed_body]
37
+ Student.new(convert_to_user_data(st_hsh, {:type => "Student"})) unless st_hsh.blank?
38
+ end
39
+
40
+ def get_students(params = {}, options = {})
41
+ params["paging.limit"] = params[:limit] || options[:limit] || 1000
42
+ students_response = self.request(:get, 'v1/students', params)
43
+ if !students_response[:parsed_body].blank?
44
+ students = students_response[:parsed_body].compact.collect {|st_hsh|
45
+ Student.new(convert_to_user_data(st_hsh, {:type => "Student"}))
46
+ }
47
+ end
48
+
49
+ next_cursor = nil
50
+ if students_response[:headers]["Link"]
51
+ students_response[:headers]["Link"].split(",").each do |part, index|
52
+ section = part.split(';')
53
+ url = section[0][/<(.*)>/,1]
54
+ name = section[1][/rel="(.*)"/,1].to_s
55
+ if name == "next"
56
+ next_cursor = CGI.parse(URI.parse(url).query)["cursor"].first
57
+ end
58
+ end
59
+ end
60
+ if options[:wrap_in_collection] != false
61
+ api = self
62
+ load_more_call = proc {|cursor|
63
+ params["paging.cursor"] = cursor
64
+ options = {:wrap_in_collection => false, :include_cursor => true}
65
+ api.get_students(params, options)
66
+ }
67
+ CursorResponseCollection.new({
68
+ :seed_page => students,
69
+ :load_more_call => load_more_call,
70
+ :next_cursor => next_cursor
71
+ })
72
+ elsif options[:include_cursor] == true
73
+ return {:objects => students, :next_cursor => next_cursor}
74
+ else
75
+ return students
76
+ end
77
+ end
78
+
79
+ def get_school_by_api_id(api_id, params = {})
80
+ sc_hsh = self.request(:get, "v1/schools/#{api_id}", params)[:parsed_body]
81
+ School.new(convert_to_school_data(sc_hsh)) unless sc_hsh.blank?
82
+ end
83
+
84
+ def get_schools(params = {}, options = {})
85
+ params["paging.limit"] = params[:limit] || options[:limit] || 10000
86
+ schools_hshs = self.request(:get, "v1/schools", params)[:parsed_body]
87
+ if !schools_hshs.blank?
88
+ schools = schools_hshs.compact.collect {|sc_hsh|
89
+ School.new(convert_to_school_data(sc_hsh))
90
+ }
91
+ end
92
+ return schools
93
+ end
94
+
95
+ def get_contact_by_api_id(api_id, params = {})
96
+ contact_hsh = self.request(:get, "v1/names/#{api_id}", params)[:parsed_body]
97
+ Contact.new(convert_to_user_data(contact_hsh, {:type => "Contact"})) unless contact_hsh.blank?
98
+ end
99
+
100
+ def get_guardians_by_api_id(api_id, params = {})
101
+ guardians = []
102
+ guardians_array = self.request(:get, "v1/guardians", params.merge({"studentNameId" => api_id}))[:parsed_body]
103
+ if !guardians_array.blank?
104
+ guardians_array.each do |guardian_hsh|
105
+ relationship_type = guardian_hsh.delete("Students").detect{|s_hsh| s_hsh["StudentNameId"].to_s == api_id.to_s}["RelationshipDesc"]
106
+ guardian_hsh["RelationshipType"] = relationship_type
107
+ guardian_hsh["NameId"] = guardian_hsh.delete("GuardianNameId")
108
+ guardians << Contact.new(convert_to_user_data(guardian_hsh, {:type => "Contact"}))
109
+ end
110
+ end
111
+ return guardians
112
+ end
113
+
114
+ def retrieve_access_token
115
+ connection = Bright::Connection.new("#{self.connection_options[:uri]}/token")
116
+ response = connection.request(:post,
117
+ {"grant_type" => "password",
118
+ "username" => self.connection_options[:client_id],
119
+ "password" => self.connection_options[:client_secret]
120
+ },
121
+ self.headers_for_access_token)
122
+ if !response.error?
123
+ response_hash = JSON.parse(response.body)
124
+ end
125
+ if response_hash["access_token"]
126
+ self.connection_options[:access_token] = response_hash["access_token"]
127
+ self.connection_options[:access_token_expires] = (Time.now - 10) + response_hash["expires_in"]
128
+ end
129
+ response_hash
130
+ end
131
+
132
+ def request(method, path, params = {})
133
+ uri = "#{self.connection_options[:uri]}/#{path}"
134
+ body = nil
135
+ if method == :get
136
+ query = URI.encode_www_form(params)
137
+ uri += "?#{query}"
138
+ else
139
+ body = JSON.dump(params)
140
+ end
141
+
142
+ response = connection_retry_wrapper {
143
+ connection = Bright::Connection.new(uri)
144
+ headers = self.headers_for_auth
145
+ connection.request(method, body, headers)
146
+ }
147
+
148
+ if !response.error?
149
+ response_hash = JSON.parse(response.body)
150
+ else
151
+ puts "#{response.inspect}"
152
+ puts "#{response.body}"
153
+ end
154
+ return {:parsed_body => response_hash, :headers => response.headers}
155
+ end
156
+
157
+ protected
158
+
159
+ def convert_to_user_data(user_params, options = {})
160
+ # :type => "Contact" || "Student"
161
+ return {} if user_params.blank?
162
+
163
+ user_data_hsh = {
164
+ :api_id => user_params["NameId"],
165
+ :first_name => user_params["FirstName"],
166
+ :middle_name => user_params["MiddleName"],
167
+ :last_name => user_params["LastName"],
168
+ :sis_student_id => user_params["DisplayId"],
169
+ :state_student_id => user_params["StateId"],
170
+ :projected_graduation_year => user_params["GradYr"],
171
+ :gender => user_params["Gender"],
172
+ :hispanic_ethnicity => user_params["HispanicLatinoEthnicity"],
173
+ :relationship_type => user_params["RelationshipType"]
174
+ }.reject{|k,v| v.blank?}
175
+ unless user_params["DateOfBirth"].blank?
176
+ user_data_hsh[:birth_date] = Date.parse(user_params["DateOfBirth"]).to_s
177
+ end
178
+
179
+ DEMOGRAPHICS_CONVERSION.each do |demographics_key, demographics_value|
180
+ if user_params["FederalRace"].to_s.upcase.include?(demographics_key)
181
+ user_data_hsh[:race] ||= []
182
+ user_data_hsh[:race] << demographics_value
183
+ end
184
+ end
185
+
186
+ unless user_params["SchoolEmail"].blank?
187
+ user_data_hsh[:email_address] = {
188
+ :email_address => user_params["SchoolEmail"]
189
+ }
190
+ end
191
+
192
+ unless user_params["Email"].blank?
193
+ user_data_hsh[:email_address] = {
194
+ :email_address => user_params["Email"]
195
+ }
196
+ end
197
+
198
+ unless user_params["DefaultSchoolId"].blank?
199
+ self.schools_cache ||= {}
200
+ if (attending_school = self.schools_cache[user_params["DefaultSchoolId"]]).nil?
201
+ attending_school = self.get_school_by_api_id(user_params["DefaultSchoolId"])
202
+ self.schools_cache[attending_school.api_id] = attending_school
203
+ end
204
+ user_data_hsh[:school] = attending_school
205
+ end
206
+
207
+ unless user_params["StreetAddress"].blank?
208
+ user_data_hsh[:addresses] = [{
209
+ :street => user_params["StreetAddress"],
210
+ :city => user_params["City"],
211
+ :state => user_params["State"],
212
+ :postal_code => user_params["ZipCode"]
213
+ }]
214
+ end
215
+
216
+ ["PhoneNumber", "PhoneNumber2", "PhoneNumber3"].each do |phone_param|
217
+ if !user_params[phone_param].blank?
218
+ user_data_hsh[:phone_numbers] ||= []
219
+ user_data_hsh[:phone_numbers] << {
220
+ :phone_number => user_params[phone_param],
221
+ :type => PHONE_TYPE_CONVERSION[user_params["#{phone_param}Type"]]
222
+ }
223
+ end
224
+ end
225
+
226
+ if options[:type] == "Student"
227
+ #generate the contacts for a student
228
+ user_data_hsh[:contacts] = self.get_guardians_by_api_id(user_data_hsh[:api_id])
229
+ end
230
+
231
+ return user_data_hsh
232
+ end
233
+
234
+ def convert_to_school_data(school_params)
235
+ return {} if school_params.nil?
236
+
237
+ school_data_hsh = {
238
+ :api_id => school_params["SchoolId"],
239
+ :name => school_params["SchoolName"],
240
+ :low_grade => school_params["GradeLow"],
241
+ :high_grade => school_params["GradeHigh"],
242
+ }
243
+
244
+ unless school_params["StreetAddress"].blank?
245
+ school_data_hsh[:address] = {
246
+ :street => school_params["StreetAddress"],
247
+ :city => school_params["City"],
248
+ :state => school_params["State"],
249
+ :postal_code => school_params["ZipCode"]
250
+ }
251
+ end
252
+
253
+ return school_data_hsh
254
+ end
255
+
256
+ def headers_for_access_token
257
+ {
258
+ "Authorization" => "Basic #{Base64.strict_encode64("#{self.connection_options[:client_id]}:#{self.connection_options[:client_secret]}")}",
259
+ "Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8"
260
+ }
261
+ end
262
+
263
+ def headers_for_auth
264
+ if self.connection_options[:access_token].nil? or self.connection_options[:access_token_expires] < Time.now
265
+ self.retrieve_access_token
266
+ end
267
+ {
268
+ "Authorization" => "Bearer #{self.connection_options[:access_token]}",
269
+ "Accept" => "application/json;charset=UTF-8",
270
+ "Content-Type" =>"application/json;charset=UTF-8"
271
+ }
272
+ end
273
+
274
+ end
275
+ end
276
+ end