ps_utilities 0.2.1 → 0.3.0
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 +4 -4
- data/lib/ps_utilities/connection.rb +18 -80
- data/lib/ps_utilities/pre_built_get.rb +138 -18
- data/lib/ps_utilities/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: daddd46f3c769ec3b61c29558b7cc82d70ea60372eadf8b5b01bba22f1a37068
|
4
|
+
data.tar.gz: 31cdcb88c3c8e66a5fd1c5005cf00e62eb1a1d8cb8000db52ef63c1ef0437e51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1aea5bd941ef10d5373fb9409aa04fece491cf148c1acce8d9a5000309e4c079818e41b954a7f91bfb11ac582c0fb1ac5f97bb16b9d631f149c4a83ec7d12839
|
7
|
+
data.tar.gz: 577b9af25d14b005a8e57126c00ace8e98021062dc4ef03e752067dea68ea206523d91564cc299c74643b5bf79408399c2b8e799daf7f6411089b3dcb86fa563
|
@@ -24,18 +24,19 @@ module PsUtilities
|
|
24
24
|
# @note You should use environment variables to initialize your server.
|
25
25
|
class Connection
|
26
26
|
|
27
|
-
attr_reader :credentials, :headers, :base_uri, :auth_path, :
|
27
|
+
attr_reader :credentials, :headers, :base_uri, :auth_path, :auth_token
|
28
|
+
attr_reader :version
|
28
29
|
|
29
30
|
include PsUtilities::PreBuiltGet
|
30
31
|
include PsUtilities::PreBuiltPut
|
31
32
|
include PsUtilities::PreBuiltPost
|
32
33
|
|
33
34
|
def initialize(attributes: {}, headers: {})
|
35
|
+
@version = "v#{PsUtilities::Version::VERSION}"
|
34
36
|
@credentials = attr_defaults.merge(attributes)
|
35
|
-
@headers = header_defaults.merge(headers)
|
36
37
|
@base_uri = credentials[:base_uri]
|
37
38
|
@auth_path = credentials[:auth_endpoint]
|
38
|
-
@
|
39
|
+
@headers = header_defaults.merge(headers)
|
39
40
|
|
40
41
|
raise ArgumentError, "missing client_secret" if credentials[:client_secret].nil? or
|
41
42
|
credentials[:client_secret].empty?
|
@@ -45,24 +46,14 @@ module PsUtilities
|
|
45
46
|
credentials[:base_uri].empty?
|
46
47
|
end
|
47
48
|
|
48
|
-
# with no command it just authenticates
|
49
|
-
def run(command: nil,
|
49
|
+
# with no command it just checks authenticates if needed
|
50
|
+
def run(command: nil, api_path: "", options: {}, params: {})
|
50
51
|
authenticate unless token_valid?
|
52
|
+
@headers[:headers].merge!('Authorization' => 'Bearer ' + authorized_token)
|
51
53
|
case command
|
52
54
|
when nil, :authenticate
|
53
|
-
|
54
|
-
# when :get
|
55
|
-
# api(:get, api_path, options) unless api_path.empty?
|
56
|
-
# when :put
|
57
|
-
# send(:api, :put, api_path, options) unless api_path.empty?
|
58
|
-
# when :post
|
59
|
-
# api(, api_path, options) unless api_path.empty?
|
60
|
-
when :get, :put, :post
|
55
|
+
when :delete, :get, :patch, :post, :put
|
61
56
|
api(command, api_path, options) unless api_path.empty?
|
62
|
-
# when :get, :put, :post
|
63
|
-
# send(command, api_path, options) unless api_path.empty?
|
64
|
-
# when :get, :put, :post
|
65
|
-
# send(:api, command, api_path, options) unless api_path.empty?
|
66
57
|
else
|
67
58
|
send(command, params)
|
68
59
|
end
|
@@ -70,71 +61,22 @@ module PsUtilities
|
|
70
61
|
|
71
62
|
private
|
72
63
|
|
73
|
-
|
74
|
-
|
75
|
-
count = 0
|
76
|
-
retries = 3
|
77
|
-
ps_url = base_uri + api_path
|
78
|
-
options = options.merge(headers)
|
79
|
-
begin
|
80
|
-
HTTParty.send(verb, ps_url, options)
|
81
|
-
rescue Net::ReadTimeout, Net::OpenTimeout
|
82
|
-
if count < retries
|
83
|
-
count += 1
|
84
|
-
retry
|
85
|
-
else
|
86
|
-
{ error: "no response (timeout) from URL: #{url}" }
|
87
|
-
end
|
88
|
-
end
|
64
|
+
def authorized_token
|
65
|
+
"#{credentials[:access_token]}"
|
89
66
|
end
|
90
67
|
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
options = options.merge(headers)
|
97
|
-
begin
|
98
|
-
HTTParty.get(ps_url, options)
|
99
|
-
# self.class.get(url, query: options[:query], headers: options[:headers])
|
100
|
-
rescue Net::ReadTimeout, Net::OpenTimeout
|
101
|
-
if count < retries
|
102
|
-
count += 1
|
103
|
-
retry
|
104
|
-
else
|
105
|
-
{ error: "no response (timeout) from URL: #{url}" }
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# options = {body: {}}
|
111
|
-
def put(api_path, options={})
|
112
|
-
count = 0
|
113
|
-
retries = 3
|
114
|
-
ps_url = base_uri + api_path
|
115
|
-
options = options.merge(headers)
|
116
|
-
begin
|
117
|
-
HTTParty.get(ps_url, options)
|
118
|
-
# self.class.get(url, query: options[:query], headers: options[:headers])
|
119
|
-
rescue Net::ReadTimeout, Net::OpenTimeout
|
120
|
-
if count < retries
|
121
|
-
count += 1
|
122
|
-
retry
|
123
|
-
else
|
124
|
-
{ error: "no response (timeout) from URL: #{url}" }
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
# options = {body: {}}
|
130
|
-
def post(api_path, options={})
|
68
|
+
# verb = :delete, :get, :patch, :post, :put
|
69
|
+
# options = {query: {}, body: {}}
|
70
|
+
# get usually needs a query info
|
71
|
+
# put usually needs a body with data
|
72
|
+
def api(verb, api_path, options={})
|
131
73
|
count = 0
|
132
74
|
retries = 3
|
133
75
|
ps_url = base_uri + api_path
|
134
76
|
options = options.merge(headers)
|
77
|
+
pp options
|
135
78
|
begin
|
136
|
-
HTTParty.
|
137
|
-
# self.class.get(url, query: options[:query], headers: options[:headers])
|
79
|
+
HTTParty.send(verb, ps_url, options)
|
138
80
|
rescue Net::ReadTimeout, Net::OpenTimeout
|
139
81
|
if count < retries
|
140
82
|
count += 1
|
@@ -147,15 +89,13 @@ module PsUtilities
|
|
147
89
|
|
148
90
|
# In PowerSchool go to System>System Settings>Plugin Management Configuration>your plugin>Data Provider Configuration to manually check plugin expiration date
|
149
91
|
def authenticate
|
150
|
-
@headers[:headers] ||= {}
|
151
92
|
ps_url = base_uri + auth_path
|
152
|
-
# ps_url = credentials[:base_uri] + credentials[:auth_endpoint]
|
153
93
|
response = HTTParty.post(ps_url, {headers: auth_headers,
|
154
94
|
body: 'grant_type=client_credentials'})
|
155
95
|
|
156
96
|
@credentials[:token_expires] = Time.now + response.parsed_response['expires_in'].to_i
|
157
97
|
@credentials[:access_token] = response.parsed_response['access_token'].to_s
|
158
|
-
@headers[:headers].merge!('Authorization' => 'Bearer ' + credentials[:access_token])
|
98
|
+
# @headers[:headers].merge!('Authorization' => 'Bearer ' + credentials[:access_token])
|
159
99
|
|
160
100
|
# throw error if no token returned -- nothing else will work
|
161
101
|
raise AuthError.new("No Auth Token Returned",
|
@@ -190,8 +130,6 @@ module PsUtilities
|
|
190
130
|
auth_endpoint: ENV['PS_AUTH_ENDPOINT'] || '/oauth/access_token',
|
191
131
|
client_id: ENV['PS_CLIENT_ID'],
|
192
132
|
client_secret: ENV['PS_CLIENT_SECRET'],
|
193
|
-
# not recommended here - it changes (ok as a parameter though)
|
194
|
-
# access_token: ENV['PS_ACCESS_TOKEN'] || nil,
|
195
133
|
}
|
196
134
|
end
|
197
135
|
|
@@ -2,31 +2,151 @@ module PsUtilities
|
|
2
2
|
|
3
3
|
module PreBuiltGet
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
options = { query: {"q" => "school_enrollment.enroll_status_code==0"} }
|
9
|
-
get(api_path, options)
|
5
|
+
def get_all_active_students(params={})
|
6
|
+
params[:status_code] = 0
|
7
|
+
get_all_matching_students(params)
|
10
8
|
end
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
10
|
+
# params = {username: "xxxxxxx"} or {local_id: "12345"}
|
11
|
+
# or {enroll_status: "x"} or {status_code: "0"}
|
12
|
+
# or {first_name: "John"} or {last_name: "Brown"}
|
13
|
+
# api_path = "/ws/v1/district/student?expansions=school_enrollment,contact&q=enroll_status==A;name.last_name==J*"
|
14
|
+
def get_all_matching_students(params)
|
15
|
+
params[:page_size] ||= 100
|
16
|
+
count = get_matching_students_count(params)
|
17
|
+
pages = calc_pages(count, params[:page_size])
|
18
|
+
answer = {}
|
19
|
+
students = []
|
20
|
+
(1..pages).each do |page|
|
21
|
+
params[:page_number] = page
|
22
|
+
answer = get_matching_students_page(params)
|
23
|
+
students << (answer.dig("students","student") || [])
|
24
|
+
end
|
25
|
+
# answer["students"]["student"] = students.flatten
|
26
|
+
# return answer
|
27
|
+
{ students: students.flatten }
|
19
28
|
end
|
29
|
+
# {students: [
|
30
|
+
# {"id"=>4916, "local_id"=>112406, "student_username"=>"cccc406", "name"=>{"first_name"=>"Ssssss", "last_name"=>"CCCCC"}},
|
31
|
+
# {"id"=>4932, "local_id"=>112520, "student_username"=>"jjjj520", "name"=>{"first_name"=>"Ppppppp", "last_name"=>"JJJJJJJJ"}},
|
32
|
+
# {"id"=>4969, "local_id"=>112766, "student_username"=>"aaaa766", "name"=>{"first_name"=>"Sssss", "middle_name"=>"Aaaaaaaa", "last_name"=>"Aaaaaaaaaa"}}
|
33
|
+
# ]
|
34
|
+
# }
|
20
35
|
|
21
|
-
# params = {username: "xxxxxxx"}
|
22
|
-
def
|
36
|
+
# params = {username: "xxxxxxx"} or {local_id: "12345"}
|
37
|
+
def get_one_student(params)
|
23
38
|
# api_path = "/ws/v1/district/student?expansions=school_enrollment,contact&q=student_username==xxxxxx237"
|
39
|
+
api_path = "/ws/v1/district/student"
|
40
|
+
options = {query:
|
41
|
+
{"expansions" => "school_enrollment,contact,contact_info"}}
|
42
|
+
query = []
|
43
|
+
query << "student_username==#{params[:username]}" if params.has_key?(:username)
|
44
|
+
query << "local_id==#{params[:local_id]}" if params.has_key?(:local_id)
|
45
|
+
|
46
|
+
options[:query]["q"] = query.join(";")
|
47
|
+
return {"errorMessage"=>{"message"=>"A valid parameter must be entered."}} if query.empty?
|
48
|
+
|
49
|
+
answer = api(:get, api_path, options)
|
50
|
+
{ student: (answer.dig("students","student") || []) }
|
51
|
+
end
|
52
|
+
# {student:
|
53
|
+
# {"id"=>5023,
|
54
|
+
# "local_id"=>112193,
|
55
|
+
# "student_username"=>"xxxxxxx193",
|
56
|
+
# "name"=>{"first_name"=>"Aaaaaaaaa", "last_name"=>"EEEEEEEEE"},
|
57
|
+
# "school_enrollment"=>
|
58
|
+
# {"enroll_status"=>"A",
|
59
|
+
# "enroll_status_description"=>"Active",
|
60
|
+
# "enroll_status_code"=>0,
|
61
|
+
# "grade_level"=>12,
|
62
|
+
# "entry_date"=>"2017-08-25",
|
63
|
+
# "exit_date"=>"2018-06-09",
|
64
|
+
# "school_number"=>33,
|
65
|
+
# "school_id"=>6,
|
66
|
+
# "entry_comment"=>"Promote Same School",
|
67
|
+
# "full_time_equivalency"=>{"fteid"=>1070, "name"=>"FTE Value: 1"}
|
68
|
+
# },
|
69
|
+
# "contact"=>
|
70
|
+
# {"guardian_email"=>"parent1@example.fr,parent2@example.ch", "mother"=>"EEEEEEE, Vvvvv", "father"=>"EEEEEEEE, Sssssss"},
|
71
|
+
# "contact_info"=>{"email"=>"xxxxxxx193@xxxx.de"}
|
72
|
+
# }
|
73
|
+
# }
|
74
|
+
|
75
|
+
private
|
76
|
+
# given page_size = 100
|
77
|
+
# 430 kids = 5 pages
|
78
|
+
# 400 kids = 4 pages
|
79
|
+
def calc_pages(count, page_size)
|
80
|
+
max_page = ( (count.to_i-1) / page_size.to_i ).to_i + 1
|
81
|
+
end
|
82
|
+
# 5
|
83
|
+
|
84
|
+
# api_path = "/ws/v1/district/student/count?q=school_enrollment.enroll_status_code==0"
|
85
|
+
# returns: {"resource"=>{"count"=>423}}
|
86
|
+
def get_matching_students_count(params={})
|
87
|
+
api_path = "/ws/v1/district/student/count"
|
88
|
+
|
89
|
+
query = []
|
90
|
+
query << "student_username==#{params[:username]}" if params.has_key?(:username)
|
91
|
+
query << "local_id==#{params[:local_id]}" if params.has_key?(:local_id)
|
92
|
+
query << "name.last_name==#{params[:last_name]}" if params.has_key?(:last_name)
|
93
|
+
query << "name.first_name==#{params[:first_name]}" if params.has_key?(:first_name)
|
94
|
+
query << "school_enrollment.enroll_status==#{params[:enroll_status]}" if params.has_key?(:enroll_status)
|
95
|
+
query << "school_enrollment.enroll_status_code==#{params[:status_code]}" if params.has_key?(:status_code)
|
96
|
+
|
97
|
+
options = {query: {"q" => query.join(";")} }
|
98
|
+
pp options
|
99
|
+
return {"errorMessage"=>{"message"=>"A valid parameter must be entered."}} if query.empty?
|
100
|
+
|
101
|
+
answer = api(:get, api_path, options) # {"resource"=>{"count"=>423}}
|
102
|
+
answer.dig("resource", "count").to_i
|
103
|
+
end
|
104
|
+
# 423
|
105
|
+
|
106
|
+
# params = {username: "xxxxxxx"} or {local_id: "12345"}
|
107
|
+
# or {enroll_status: "x"} or {status_code: "0"}
|
108
|
+
# or {first_name: "John"} or {last_name: "Brown"}
|
109
|
+
# api_path = "/ws/v1/district/student?expansions=school_enrollment,contact&q=student_username==xxxxxx237"
|
110
|
+
def get_matching_students_page(params)
|
24
111
|
api_path = "/ws/v1/district/student"
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
112
|
+
params[:page_size] ||= 100
|
113
|
+
params[:page_number] ||= 1
|
114
|
+
pp params
|
115
|
+
options = { query:
|
116
|
+
{ "pagesize" => "#{params[:page_size]}",
|
117
|
+
"page" => "#{params[:page_number]}"} }
|
118
|
+
query = []
|
119
|
+
query << "student_username==#{params[:username]}" if params.has_key?(:username)
|
120
|
+
query << "local_id==#{params[:local_id]}" if params.has_key?(:local_id)
|
121
|
+
query << "name.last_name==#{params[:last_name]}" if params.has_key?(:last_name)
|
122
|
+
query << "name.first_name==#{params[:first_name]}" if params.has_key?(:first_name)
|
123
|
+
query << "school_enrollment.enroll_status==#{params[:enroll_status]}" if params.has_key?(:enroll_status)
|
124
|
+
query << "school_enrollment.enroll_status_code==#{params[:status_code]}" if params.has_key?(:status_code)
|
125
|
+
|
126
|
+
options[:query]["q"] = query.join(";")
|
127
|
+
return {"errorMessage"=>{"message"=>"A valid parameter must be entered."}} if query.empty?
|
128
|
+
pp options
|
129
|
+
api(:get, api_path, options)
|
29
130
|
end
|
131
|
+
# {"students"=>
|
132
|
+
# {"@expansions"=>
|
133
|
+
# "demographics, addresses, alerts, phones, school_enrollment, ethnicity_race, contact, contact_info, initial_enrollment, schedule_setup, fees, lunch",
|
134
|
+
# "@extensions"=>
|
135
|
+
# "s_stu_crdc_x,activities,c_studentlocator,u_students_extension,u_studentsuserfields,s_stu_ncea_x,s_stu_edfi_x,studentcorefields",
|
136
|
+
# "student"=>
|
137
|
+
# [{"id"=>4916, "local_id"=>112406, "student_username"=>"cccc406", "name"=>{"first_name"=>"Ssssss", "last_name"=>"CCCCC"}},
|
138
|
+
# {"id"=>4932,
|
139
|
+
# "local_id"=>112520,
|
140
|
+
# "student_username"=>"jjjjjjjj520",
|
141
|
+
# "name"=>{"first_name"=>"Ppppppp", "last_name"=>"JJJJJJJJ"}},
|
142
|
+
# {"id"=>4969,
|
143
|
+
# "local_id"=>112766,
|
144
|
+
# "student_username"=>"aaaaaaaa766",
|
145
|
+
# "name"=>{"first_name"=>"Sssss", "middle_name"=>"Aaaaaaaa", "last_name"=>"Aaaaaaaaaa"}}
|
146
|
+
# ]
|
147
|
+
# }
|
148
|
+
# }
|
149
|
+
|
30
150
|
|
31
151
|
end
|
32
152
|
|
data/lib/ps_utilities/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ps_utilities
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Weisbecker
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-06-
|
12
|
+
date: 2018-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|