bright 1.3 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,8 @@
1
- require 'oauth'
1
+ require "oauth"
2
2
 
3
3
  module Bright
4
4
  module SisApi
5
5
  class Focus < Base
6
-
7
6
  @@description = "Connects to the Focus OneRoster API for accessing student information"
8
7
  @@doc_url = ""
9
8
  @@api_version = "1.1"
@@ -13,12 +12,12 @@ module Bright
13
12
  DEFAULT_NO_THREADS = 2
14
13
 
15
14
  DEMOGRAPHICS_CONVERSION = {
16
- "americanIndianOrAlaskaNative"=>"American Indian Or Alaska Native",
17
- "asian"=>"Asian",
18
- "blackOrAfricanAmerican"=>"Black Or African American",
19
- "nativeHawaiianOrOtherPacificIslander"=>"Native Hawaiian Or Other Pacific Islander",
20
- "white"=>"White",
21
- "hispanicOrLatinoEthnicity"=>"Hispanic Or Latino"
15
+ "americanIndianOrAlaskaNative" => "American Indian Or Alaska Native",
16
+ "asian" => "Asian",
17
+ "blackOrAfricanAmerican" => "Black Or African American",
18
+ "nativeHawaiianOrOtherPacificIslander" => "Native Hawaiian Or Other Pacific Islander",
19
+ "white" => "White",
20
+ "hispanicOrLatinoEthnicity" => "Hispanic Or Latino"
22
21
  }
23
22
 
24
23
  def initialize(options = {})
@@ -33,26 +32,26 @@ module Bright
33
32
  end
34
33
 
35
34
  def api_version
36
- Gem::Version.new(self.connection_options.dig(:api_version) || @@api_version)
35
+ Gem::Version.new(connection_options.dig(:api_version) || @@api_version)
37
36
  end
38
37
 
39
38
  def get_student_by_api_id(api_id, params = {})
40
- st_hsh = self.request(:get, "students/#{api_id}", params)
39
+ st_hsh = request(:get, "students/#{api_id}", params)
41
40
  Student.new(convert_to_user_data(st_hsh["user"])) if st_hsh and st_hsh["user"]
42
41
  end
43
42
 
44
43
  def get_student(params = {}, options = {})
45
- self.get_students(params, options.merge(:limit => 1, :wrap_in_collection => false)).first
44
+ get_students(params, options.merge(limit: 1, wrap_in_collection: false)).first
46
45
  end
47
46
 
48
47
  def get_students(params = {}, options = {})
49
48
  params[:limit] = params[:limit] || options[:limit] || 100
50
- students_response_hash = self.request(:get, 'students', self.map_search_params(params))
49
+ students_response_hash = request(:get, "students", map_search_params(params))
51
50
  total_results = students_response_hash[:response_headers]["x-total-count"].to_i
52
51
  if students_response_hash and students_response_hash["users"]
53
52
  students_hash = [students_response_hash["users"]].flatten
54
53
 
55
- students = students_hash.compact.collect {|st_hsh|
54
+ students = students_hash.compact.collect { |st_hsh|
56
55
  Student.new(convert_to_user_data(st_hsh))
57
56
  }
58
57
  end
@@ -61,14 +60,14 @@ module Bright
61
60
  load_more_call = proc { |page|
62
61
  # pages start at one, so add a page here
63
62
  params[:offset] = (params[:limit].to_i * page)
64
- api.get_students(params, {:wrap_in_collection => false})
63
+ api.get_students(params, {wrap_in_collection: false})
65
64
  }
66
65
  ResponseCollection.new({
67
- :seed_page => students,
68
- :total => total_results,
69
- :per_page => params[:limit],
70
- :load_more_call => load_more_call,
71
- :no_threads => options[:no_threads] || DEFAULT_NO_THREADS
66
+ seed_page: students,
67
+ total: total_results,
68
+ per_page: params[:limit],
69
+ load_more_call: load_more_call,
70
+ no_threads: options[:no_threads] || DEFAULT_NO_THREADS
72
71
  })
73
72
  else
74
73
  students
@@ -84,22 +83,22 @@ module Bright
84
83
  end
85
84
 
86
85
  def get_school_by_api_id(api_id, params = {})
87
- sc_hsh = self.request(:get, "schools/#{api_id}", params)
86
+ sc_hsh = request(:get, "schools/#{api_id}", params)
88
87
  School.new(convert_to_school_data(sc_hsh["org"])) if sc_hsh and sc_hsh["org"]
89
88
  end
90
89
 
91
90
  def get_school(params = {}, options = {})
92
- self.get_schools(params, options.merge(:limit => 1, :wrap_in_collection => false)).first
91
+ get_schools(params, options.merge(limit: 1, wrap_in_collection: false)).first
93
92
  end
94
93
 
95
94
  def get_schools(params = {}, options = {})
96
95
  params[:limit] = params[:limit] || options[:limit] || 100
97
- schools_response_hash = self.request(:get, 'schools', self.map_school_search_params(params))
96
+ schools_response_hash = request(:get, "schools", map_school_search_params(params))
98
97
  total_results = schools_response_hash[:response_headers]["x-total-count"].to_i
99
98
  if schools_response_hash and schools_response_hash["orgs"]
100
99
  schools_hash = [schools_response_hash["orgs"]].flatten
101
100
 
102
- schools = schools_hash.compact.collect {|sc_hsh|
101
+ schools = schools_hash.compact.collect { |sc_hsh|
103
102
  School.new(convert_to_school_data(sc_hsh))
104
103
  }
105
104
  end
@@ -108,27 +107,27 @@ module Bright
108
107
  load_more_call = proc { |page|
109
108
  # pages start at one, so add a page here
110
109
  params[:offset] = (params[:limit].to_i * page)
111
- api.get_schools(params, {:wrap_in_collection => false})
110
+ api.get_schools(params, {wrap_in_collection: false})
112
111
  }
113
112
  ResponseCollection.new({
114
- :seed_page => schools,
115
- :total => total_results,
116
- :per_page => params[:limit],
117
- :load_more_call => load_more_call,
118
- :no_threads => options[:no_threads]
113
+ seed_page: schools,
114
+ total: total_results,
115
+ per_page: params[:limit],
116
+ load_more_call: load_more_call,
117
+ no_threads: options[:no_threads]
119
118
  })
120
119
  else
121
120
  schools
122
121
  end
123
122
  end
124
123
 
125
- def get_contact_by_api_id(api_id, params ={})
126
- contact_hsh = self.request(:get, "users/#{api_id}", params)
124
+ def get_contact_by_api_id(api_id, params = {})
125
+ contact_hsh = request(:get, "users/#{api_id}", params)
127
126
  Contact.new(convert_to_user_data(contact_hsh["user"], bright_type: "Contact")) if contact_hsh and contact_hsh["user"]
128
127
  end
129
128
 
130
129
  def request(method, path, params = {})
131
- uri = "#{self.connection_options[:uri]}/#{path}"
130
+ uri = "#{connection_options[:uri]}/#{path}"
132
131
  body = nil
133
132
  if method == :get
134
133
  query = URI.encode_www_form(params)
@@ -139,7 +138,7 @@ module Bright
139
138
 
140
139
  response = connection_retry_wrapper {
141
140
  connection = Bright::Connection.new(uri)
142
- headers = self.headers_for_auth(uri)
141
+ headers = headers_for_auth(uri)
143
142
  connection.request(method, body, headers)
144
143
  }
145
144
 
@@ -158,46 +157,45 @@ module Bright
158
157
  def headers_for_auth(uri)
159
158
  case api_version
160
159
  when Gem::Version.new("1.1")
161
- site = URI.parse(self.connection_options[:uri])
160
+ site = URI.parse(connection_options[:uri])
162
161
  site = "#{site.scheme}://#{site.host}"
163
- consumer = OAuth::Consumer.new(self.connection_options[:client_id], self.connection_options[:client_secret], { :site => site, :scheme => :header })
164
- options = {:timestamp => Time.now.to_i, :nonce => SecureRandom.uuid}
162
+ consumer = OAuth::Consumer.new(connection_options[:client_id], connection_options[:client_secret], {site: site, scheme: :header})
163
+ options = {timestamp: Time.now.to_i, nonce: SecureRandom.uuid}
165
164
  {"Authorization" => consumer.create_signed_request(:get, uri, nil, options)["Authorization"]}
166
165
  when Gem::Version.new("1.2")
167
- if self.connection_options[:access_token].nil? or self.connection_options[:access_token_expires] < Time.now
168
- self.retrieve_access_token
166
+ if connection_options[:access_token].nil? or connection_options[:access_token_expires] < Time.now
167
+ retrieve_access_token
169
168
  end
170
169
  {
171
- "Authorization" => "Bearer #{self.connection_options[:access_token]}",
170
+ "Authorization" => "Bearer #{connection_options[:access_token]}",
172
171
  "Accept" => "application/json;charset=UTF-8",
173
- "Content-Type" =>"application/json;charset=UTF-8"
172
+ "Content-Type" => "application/json;charset=UTF-8"
174
173
  }
175
174
  end
176
175
  end
177
176
 
178
177
  def retrieve_access_token
179
- connection = Bright::Connection.new(self.connection_options[:token_uri])
178
+ connection = Bright::Connection.new(connection_options[:token_uri])
180
179
  response = connection.request(:post,
181
180
  {
182
181
  "grant_type" => "client_credentials",
183
- "username" => self.connection_options[:client_id],
184
- "password" => self.connection_options[:client_secret]
182
+ "username" => connection_options[:client_id],
183
+ "password" => connection_options[:client_secret]
185
184
  },
186
- self.headers_for_access_token
187
- )
185
+ headers_for_access_token)
188
186
  if !response.error?
189
187
  response_hash = JSON.parse(response.body)
190
188
  end
191
189
  if response_hash["access_token"]
192
- self.connection_options[:access_token] = response_hash["access_token"]
193
- self.connection_options[:access_token_expires] = (Time.now - 10) + response_hash["expires_in"]
190
+ connection_options[:access_token] = response_hash["access_token"]
191
+ connection_options[:access_token_expires] = (Time.now - 10) + response_hash["expires_in"]
194
192
  end
195
193
  response_hash
196
194
  end
197
195
 
198
196
  def headers_for_access_token
199
197
  {
200
- "Authorization" => "Basic #{Base64.strict_encode64("#{self.connection_options[:client_id]}:#{self.connection_options[:client_secret]}")}",
198
+ "Authorization" => "Basic #{Base64.strict_encode64("#{connection_options[:client_id]}:#{connection_options[:client_secret]}")}",
201
199
  "Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8"
202
200
  }
203
201
  end
@@ -207,7 +205,7 @@ module Bright
207
205
  default_params = {}
208
206
 
209
207
  filter = []
210
- params.each do |k,v|
208
+ params.each do |k, v|
211
209
  case k.to_s
212
210
  when "first_name"
213
211
  filter << "givenName='#{v}'"
@@ -228,14 +226,14 @@ module Bright
228
226
  unless filter.empty?
229
227
  params = {"filter" => filter.join(" AND ")}
230
228
  end
231
- default_params.merge(params).reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
229
+ default_params.merge(params).reject { |k, v| v.respond_to?(:empty?) ? v.empty? : v.nil? }
232
230
  end
233
231
 
234
232
  def map_school_search_params(params)
235
233
  params = params.dup
236
234
  default_params = {}
237
235
  filter = []
238
- params.each do |k,v|
236
+ params.each do |k, v|
239
237
  case k.to_s
240
238
  when "number"
241
239
  filter << "identifier='#{v}'"
@@ -248,29 +246,28 @@ module Bright
248
246
  unless filter.empty?
249
247
  params = {"filter" => filter.join(" AND ")}
250
248
  end
251
- default_params.merge(params).reject{|k,v| v.respond_to?(:empty?) ? v.empty? : v.nil?}
249
+ default_params.merge(params).reject { |k, v| v.respond_to?(:empty?) ? v.empty? : v.nil? }
252
250
  end
253
251
 
254
252
  def convert_to_school_data(school_params)
255
253
  return {} if school_params.blank?
256
- school_data_hsh = {
257
- :api_id => school_params["sourcedId"],
258
- :name => school_params["name"],
259
- :number => school_params["identifier"],
260
- :last_modified => school_params["dateLastModified"]
254
+ {
255
+ api_id: school_params["sourcedId"],
256
+ name: school_params["name"],
257
+ number: school_params["identifier"],
258
+ last_modified: school_params["dateLastModified"]
261
259
  }
262
- return school_data_hsh
263
260
  end
264
261
 
265
262
  def convert_to_user_data(user_params, bright_type: "Student")
266
263
  return {} if user_params.blank?
267
264
  user_data_hsh = {
268
- :api_id => user_params["sourcedId"],
269
- :first_name => user_params["givenName"],
270
- :middle_name => user_params["middleName"],
271
- :last_name => user_params["familyName"],
272
- :last_modified => user_params["dateLastModified"]
273
- }.reject{|k,v| v.blank?}
265
+ api_id: user_params["sourcedId"],
266
+ first_name: user_params["givenName"],
267
+ middle_name: user_params["middleName"],
268
+ last_name: user_params["familyName"],
269
+ last_modified: user_params["dateLastModified"]
270
+ }.reject { |k, v| v.blank? }
274
271
  unless user_params["identifier"].blank?
275
272
  user_data_hsh[:sis_student_id] = user_params["identifier"]
276
273
  end
@@ -282,14 +279,14 @@ module Bright
282
279
  end
283
280
  unless user_params["email"].blank?
284
281
  user_data_hsh[:email_address] = {
285
- :email_address => user_params["email"]
282
+ email_address: user_params["email"]
286
283
  }
287
284
  end
288
285
  unless user_params["orgs"].blank?
289
- if (s = user_params["orgs"].detect{|org| org["href"] =~ /\/schools\//})
286
+ if (s = user_params["orgs"].detect { |org| org["href"] =~ /\/schools\// })
290
287
  self.schools_cache ||= {}
291
288
  if (attending_school = self.schools_cache[s["sourcedId"]]).nil?
292
- attending_school = self.get_school_by_api_id(s["sourcedId"])
289
+ attending_school = get_school_by_api_id(s["sourcedId"])
293
290
  self.schools_cache[attending_school.api_id] = attending_school
294
291
  end
295
292
  end
@@ -298,26 +295,24 @@ module Bright
298
295
  end
299
296
  end
300
297
  unless user_params["phone"].blank?
301
- user_data_hsh[:phone_numbers] = [{:phone_number => user_params["phone"]}]
298
+ user_data_hsh[:phone_numbers] = [{phone_number: user_params["phone"]}]
302
299
  end
303
300
  unless user_params["sms"].blank?
304
301
  user_data_hsh[:phone_numbers] ||= []
305
- user_data_hsh[:phone_numbers] << {:phone_number => user_params["sms"]}
302
+ user_data_hsh[:phone_numbers] << {phone_number: user_params["sms"]}
306
303
  end
307
304
 
308
- #add the demographic information
305
+ # add the demographic information
309
306
  demographics_hash = get_demographic_information(user_data_hsh[:api_id])
310
307
  user_data_hsh.merge!(demographics_hash) unless demographics_hash.blank?
311
308
 
312
- #if you're a student, build the contacts too
309
+ # if you're a student, build the contacts too
313
310
  if bright_type == "Student" and !user_params["agents"].blank?
314
311
  user_data_hsh[:contacts] = user_params["agents"].collect do |agent_hsh|
315
- begin
316
- self.get_contact_by_api_id(agent_hsh["sourcedId"])
317
- rescue Bright::ResponseError => e
318
- if !e.message.to_s.include?("404")
319
- raise e
320
- end
312
+ get_contact_by_api_id(agent_hsh["sourcedId"])
313
+ rescue Bright::ResponseError => e
314
+ if !e.message.to_s.include?("404")
315
+ raise e
321
316
  end
322
317
  end.compact
323
318
  user_data_hsh[:grade] = (user_params["grades"] || []).first
@@ -326,7 +321,7 @@ module Bright
326
321
  end
327
322
  end
328
323
 
329
- return user_data_hsh
324
+ user_data_hsh
330
325
  end
331
326
 
332
327
  def get_demographic_information(api_id)
@@ -335,7 +330,7 @@ module Bright
335
330
  begin
336
331
  demographics_params = request(:get, "demographics/#{api_id}")["demographics"]
337
332
  rescue Bright::ResponseError => e
338
- if e.message.to_s.include?('404')
333
+ if e.message.to_s.include?("404")
339
334
  return demographic_hsh
340
335
  else
341
336
  raise e
@@ -358,22 +353,21 @@ module Bright
358
353
  end
359
354
  end
360
355
  end
361
- return demographic_hsh
356
+ demographic_hsh
362
357
  end
363
358
 
364
359
  def get_grade_school_year(date = Date.today)
365
360
  # return the school year of a specific date
366
361
  self.school_years_cache ||= {}
367
362
  if self.school_years_cache[date].nil?
368
- academic_periods_params = self.request(:get, "academicSessions", {"filter" => "startDate<='#{date.to_s}' AND endDate>='#{date.to_s}' AND status='active'"})["academicSessions"]
369
- school_years = academic_periods_params.map{|ap| ap["schoolYear"]}.uniq
363
+ academic_periods_params = request(:get, "academicSessions", {"filter" => "startDate<='#{date}' AND endDate>='#{date}' AND status='active'"})["academicSessions"]
364
+ school_years = academic_periods_params.map { |ap| ap["schoolYear"] }.uniq
370
365
  if school_years.size == 1
371
366
  self.school_years_cache[date] = school_years.first
372
367
  end
373
368
  end
374
- return self.school_years_cache[date]
369
+ self.school_years_cache[date]
375
370
  end
376
-
377
371
  end
378
372
  end
379
373
  end
@@ -0,0 +1,15 @@
1
+ module Bright
2
+ module SisApi
3
+ class OneRoster::InfiniteCampus < OneRoster
4
+ def convert_to_user_data(user_params, bright_type: "Student")
5
+ user_data_hsh = super
6
+
7
+ unless user_params["userMasterIdentifier"].blank?
8
+ user_data_hsh[:state_student_id] = user_params["userMasterIdentifier"]
9
+ end
10
+
11
+ user_data_hsh
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ module Bright
2
+ module SisApi
3
+ class OneRoster::Skyward < OneRoster
4
+ end
5
+ end
6
+ end