ps_utilities 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ps_utilities/connection.rb +10 -11
- data/lib/ps_utilities/pre_built_get.rb +22 -3
- data/lib/ps_utilities/pre_built_post.rb +261 -0
- 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: c62242e43417fc95e14b36ba194604f4dfa79aac9e45887793ab982abedeb814
|
4
|
+
data.tar.gz: e0cf20edad5ba754ff741a99629e4554b38a831973dbb66ca51f61cdf74afc08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8603dbf338731a62a39f386b6458579e4f49a3eca1eb41b2320beedafa352792f2a539cae7abc9f043934c17ccaec84085b7d1a692ba8d66b90a0116a07f70c4
|
7
|
+
data.tar.gz: 2a300ec71565e9e48e081740b402b87f450ca83e1effcfaf3705a0090d46938923353204a217c53538521758ba0d35c32ae5e0d8748459158385d84a4ff6b2f7
|
@@ -66,14 +66,13 @@ module PsUtilities
|
|
66
66
|
end
|
67
67
|
|
68
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
|
69
|
+
# options = {query: {}, body: {}} - get uses :query, put and post use :body
|
72
70
|
def api(verb, api_path, options={})
|
73
71
|
count = 0
|
74
72
|
retries = 3
|
75
73
|
ps_url = base_uri + api_path
|
76
74
|
options = options.merge(headers)
|
75
|
+
pp ps_url
|
77
76
|
pp options
|
78
77
|
begin
|
79
78
|
HTTParty.send(verb, ps_url, options)
|
@@ -87,6 +86,14 @@ module PsUtilities
|
|
87
86
|
end
|
88
87
|
end
|
89
88
|
|
89
|
+
def header_defaults
|
90
|
+
{ headers:
|
91
|
+
{ 'User-Agent' => "PsUtilities - #{version}",
|
92
|
+
'Accept' => 'application/json',
|
93
|
+
'Content-Type' => 'application/json'}
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
90
97
|
# In PowerSchool go to System>System Settings>Plugin Management Configuration>your plugin>Data Provider Configuration to manually check plugin expiration date
|
91
98
|
def authenticate
|
92
99
|
ps_url = base_uri + auth_path
|
@@ -133,13 +140,5 @@ module PsUtilities
|
|
133
140
|
}
|
134
141
|
end
|
135
142
|
|
136
|
-
def header_defaults
|
137
|
-
{ headers:
|
138
|
-
{ 'User-Agent' => "PsUtilitiesGem - v#{PsUtilities::Version::VERSION}",
|
139
|
-
'Accept' => 'application/json',
|
140
|
-
'Content-Type' => 'application/json'}
|
141
|
-
}
|
142
|
-
end
|
143
|
-
|
144
143
|
end
|
145
144
|
end
|
@@ -33,22 +33,41 @@ module PsUtilities
|
|
33
33
|
# ]
|
34
34
|
# }
|
35
35
|
|
36
|
+
# params = {dcid: "xxxxxxx"} or {id: "12345"}
|
37
|
+
def get_student(params)
|
38
|
+
# api_path = "/ws/v1/district/student/{dcid}?expansions=school_enrollment,contact&q=student_username==xxxxxx237"
|
39
|
+
ps_dcid = params[:dcid] || params[:dc_id] || params[:id]
|
40
|
+
api_path = "/ws/v1/student/#{ps_dcid.to_i}"
|
41
|
+
options = { query:
|
42
|
+
{ "extensions" => "s_stu_crdc_x,activities,c_studentlocator,u_students_extension,u_studentsuserfields,s_stu_ncea_x,s_stu_edfi_x,studentcorefields",
|
43
|
+
"expansions" => "demographics,addresses,alerts,phones,school_enrollment,ethnicity_race,contact,contact_info,initial_enrollment,schedule_setup,fees,lunch"
|
44
|
+
}
|
45
|
+
}
|
46
|
+
return {"errorMessage"=>{"message"=>"A valid dcid must be entered."}} if "#{ps_dcid.to_i}".eql? "0"
|
47
|
+
|
48
|
+
answer = api(:get, api_path, options)
|
49
|
+
{ student: (answer["student"] || []) }
|
50
|
+
end
|
51
|
+
|
36
52
|
# params = {username: "xxxxxxx"} or {local_id: "12345"}
|
37
|
-
def
|
53
|
+
def find_student(params)
|
38
54
|
# api_path = "/ws/v1/district/student?expansions=school_enrollment,contact&q=student_username==xxxxxx237"
|
39
55
|
api_path = "/ws/v1/district/student"
|
40
|
-
options = {query:
|
41
|
-
{"expansions" => "
|
56
|
+
options = { query:
|
57
|
+
{"expansions" => "contact,contact_info,phones"}}
|
42
58
|
query = []
|
43
59
|
query << "student_username==#{params[:username]}" if params.has_key?(:username)
|
44
60
|
query << "local_id==#{params[:local_id]}" if params.has_key?(:local_id)
|
45
61
|
|
46
62
|
options[:query]["q"] = query.join(";")
|
63
|
+
pp options
|
47
64
|
return {"errorMessage"=>{"message"=>"A valid parameter must be entered."}} if query.empty?
|
48
65
|
|
49
66
|
answer = api(:get, api_path, options)
|
50
67
|
{ student: (answer.dig("students","student") || []) }
|
51
68
|
end
|
69
|
+
alias_method :find_student_by_local_id, :find_student
|
70
|
+
alias_method :find_student_by_username, :find_student
|
52
71
|
# {student:
|
53
72
|
# {"id"=>5023,
|
54
73
|
# "local_id"=>112193,
|
@@ -2,6 +2,267 @@ module PsUtilities
|
|
2
2
|
|
3
3
|
module PreBuiltPost
|
4
4
|
|
5
|
+
# params[:students] (Array of Hashes) - kids with their attributes
|
6
|
+
# params = {dcid: 7531, student_id: 23456}
|
7
|
+
# or
|
8
|
+
# params = { [ {dcid: 7531, student_id: 23456},
|
9
|
+
# {dcid: 9753, student_id: 65432} ] }
|
10
|
+
def create_students(params)
|
11
|
+
action = "INSERT"
|
12
|
+
kids_api_array = build_kids_api_array(action, params)
|
13
|
+
options = { body: { students: { student: kids_api_array } }.to_json }
|
14
|
+
answer = api(:post, "/ws/v1/student", options)
|
15
|
+
end
|
16
|
+
alias_method :create_student, :create_students
|
17
|
+
# { "results": {
|
18
|
+
# "update_count": 2
|
19
|
+
# "result": [
|
20
|
+
# { "client_uid": 124,
|
21
|
+
# "status": "SUCCESS",
|
22
|
+
# "action": "INSERT",
|
23
|
+
# "success_message" :{
|
24
|
+
# "id": 442,
|
25
|
+
# "ref": "https://server/ws/v1/student/442" }
|
26
|
+
# },
|
27
|
+
# { ... }
|
28
|
+
# ]
|
29
|
+
# }
|
30
|
+
# }
|
31
|
+
|
32
|
+
# params[:students] (Array of Hashes) - kids with their attributes
|
33
|
+
def update_students(params)
|
34
|
+
action = "UPDATE"
|
35
|
+
kids_api_array = build_kids_api_array(action, params)
|
36
|
+
options = { body: { students: { student: kids_api_array } }.to_json }
|
37
|
+
answer = api(:post, "/ws/v1/student", options)
|
38
|
+
end
|
39
|
+
alias_method :update_student, :update_students
|
40
|
+
# { "results": {
|
41
|
+
# "update_count": 2
|
42
|
+
# "result": [
|
43
|
+
# { "client_uid": 124,
|
44
|
+
# "status": "SUCCESS",
|
45
|
+
# "action": "INSERT",
|
46
|
+
# "success_message" :{
|
47
|
+
# "id": 442,
|
48
|
+
# "ref": "https://server/ws/v1/student/442" }
|
49
|
+
# },
|
50
|
+
# { ... }
|
51
|
+
# ]
|
52
|
+
# }
|
53
|
+
# }
|
54
|
+
|
55
|
+
def build_kids_api_array(action, params)
|
56
|
+
unless params[:students].is_a? Array
|
57
|
+
return {"errorMessage"=>{"message"=>"Student Data (in Hash format) must be in an Array."}}
|
58
|
+
end
|
59
|
+
kids_api_array = []
|
60
|
+
params[:students].each do |kid|
|
61
|
+
kid[:las_extensions] = true if params[:las_extensions]
|
62
|
+
kids_api_array << build_kid_attributes(action, kid)
|
63
|
+
end
|
64
|
+
return kids_api_array
|
65
|
+
end
|
66
|
+
|
67
|
+
def build_kid_attributes(action, kid)
|
68
|
+
# ALWAYS NEEDED INFO
|
69
|
+
attribs = {action: action}
|
70
|
+
attribs[:id] = kid[:id] || kid[:dcid]
|
71
|
+
attribs[:client_uid] = kid[:student_id].to_s
|
72
|
+
attribs[:student_username] = kid[:username]
|
73
|
+
|
74
|
+
# REQUIRED ON ENROLLMENT (optional later)
|
75
|
+
attribs[:name] = {}
|
76
|
+
case action
|
77
|
+
when 'INSERT'
|
78
|
+
# must be set on creation
|
79
|
+
attribs[:local_id] = kid[:oa_id].to_i
|
80
|
+
# to create an account both first and last name must be present
|
81
|
+
attribs[:name][:last_name] = kid[:last_name] if kid[:last_name] or kid[:first_name]
|
82
|
+
attribs[:name][:first_name] = kid[:first_name] if kid[:last_name] or kid[:first_name]
|
83
|
+
attribs[:name][:middle_name] = kid[:middle_name] if kid[:middle_name]
|
84
|
+
# school_enrollment can only be SET on INSERT!
|
85
|
+
attribs[:school_enrollment] = {}
|
86
|
+
if kid[:enroll_status_code]
|
87
|
+
attribs[:school_enrollment][:enroll_status_code] = kid[:enroll_status_code]
|
88
|
+
elsif kid[:status_code]
|
89
|
+
attribs[:school_enrollment][:status_code] = kid[:status_code]
|
90
|
+
end
|
91
|
+
attribs[:school_enrollment][:grade_level] = kid[:grade_level] if kid[:grade_level]
|
92
|
+
attribs[:school_enrollment][:entry_date] = kid[:entry_date] if kid[:entry_date]
|
93
|
+
attribs[:school_enrollment][:exit_date] = kid[:exit_date] if kid[:exit_date]
|
94
|
+
attribs[:school_enrollment][:school_number] = kid[:school_number] if kid[:school_number]
|
95
|
+
attribs[:school_enrollment][:school_id] = kid[:school_id] if kid[:school_id]
|
96
|
+
when 'UPDATE'
|
97
|
+
# don't allow nil / blank name updates
|
98
|
+
attribs[:name][:last_name] = kid[:last_name] if kid[:last_name]
|
99
|
+
attribs[:name][:first_name] = kid[:first_name] if kid[:first_name]
|
100
|
+
attribs[:name][:middle_name] = kid[:middle_name] if kid[:middle_name]
|
101
|
+
end
|
102
|
+
|
103
|
+
# OPTIONAL
|
104
|
+
attribs[:contact] = {}
|
105
|
+
if kid[:emergency_phone1] && kid[:emergency_contact_name1]
|
106
|
+
attribs[:contact][:emergency_phone1] = kid[:emergency_phone1]
|
107
|
+
attribs[:contact][:emergency_contact_name1] = kid[:emergency_contact_name1]
|
108
|
+
end
|
109
|
+
if kid[:emergency_phone2] && kid[:emergency_contact_name2]
|
110
|
+
attribs[:contact][:emergency_phone2] = kid[:emergency_phone2]
|
111
|
+
attribs[:contact][:emergency_contact_name2] = kid[:emergency_contact_name2]
|
112
|
+
end
|
113
|
+
if kid[:doctor_phone] && kid[:doctor_name]
|
114
|
+
attribs[:contact][:doctor_phone] = kid[:doctor_phone]
|
115
|
+
attribs[:contact][:doctor_name] = kid[:doctor_name]
|
116
|
+
end
|
117
|
+
attribs[:contact][:guardian_email] = kid[:guardian_email] if kid[:guardian_email]
|
118
|
+
attribs[:contact][:guardian_fax] = kid[:guardian_fax] if kid[:guardian_fax]
|
119
|
+
attribs[:contact][:mother] = kid[:mother] if kid[:mother]
|
120
|
+
attribs[:contact][:father] = kid[:father] if kid[:father]
|
121
|
+
attribs[:contact] = nil if attribs[:contact].empty?
|
122
|
+
#
|
123
|
+
attribs[:demographics] = {}
|
124
|
+
attribs[:demographics][:gender] = kid[:gender] if kid[:gender]
|
125
|
+
attribs[:demographics][:birth_date] = kid[:birth_date] if kid[:birth_date]
|
126
|
+
attribs[:demographics][:projected_graduation_year] = kid[:projected_graduation_year] if kid[:projected_graduation_year]
|
127
|
+
attribs[:demographics][:ssn] = kid[:ssn] if kid[:ssn]
|
128
|
+
#
|
129
|
+
attribs[:schedule_setup] = {}
|
130
|
+
attribs[:schedule_setup][:home_room] = kid[:home_room] if kid[:home_room]
|
131
|
+
attribs[:schedule_setup][:next_school] = kid[:next_school] if kid[:next_school]
|
132
|
+
attribs[:schedule_setup][:sched_next_year_grade] = kid[:sched_next_year_grade] if kid[:sched_next_year_grade]
|
133
|
+
#
|
134
|
+
attribs[:school_enrollment] = {}
|
135
|
+
if kid[:enroll_status_code]
|
136
|
+
attribs[:school_enrollment][:enroll_status_code] = kid[:enroll_status_code]
|
137
|
+
elsif kid[:status_code]
|
138
|
+
attribs[:school_enrollment][:status_code] = kid[:status_code]
|
139
|
+
end
|
140
|
+
attribs[:school_enrollment][:grade_level] = kid[:grade_level] if kid[:grade_level]
|
141
|
+
attribs[:school_enrollment][:entry_date] = kid[:entry_date] if kid[:entry_date]
|
142
|
+
attribs[:school_enrollment][:exit_date] = kid[:exit_date] if kid[:exit_date]
|
143
|
+
attribs[:school_enrollment][:school_number] = kid[:school_number] if kid[:school_number]
|
144
|
+
#
|
145
|
+
attribs[:contact_info] = {email: kid[:email]} if kid[:email]
|
146
|
+
attribs[:phone] = {main: {number: kid[:mobile]}} if kid[:mobile]
|
147
|
+
|
148
|
+
# Update LAS Database Extensions as needed
|
149
|
+
attribs["_extension_data"] = calc_las_extensions(kid) if kid[:las_extensions].to_s.eql?("true")
|
150
|
+
|
151
|
+
# return attributes - first remove, nils, empty strings and empty hashes
|
152
|
+
answer = attribs.reject { |k,v| v.nil? || v.to_s.empty? || v.to_s.eql?("{}")}
|
153
|
+
pp answer
|
154
|
+
return answer
|
155
|
+
end
|
156
|
+
# Data structure to send to API
|
157
|
+
# options = {body: {
|
158
|
+
# "students":{
|
159
|
+
# "student":[
|
160
|
+
# {
|
161
|
+
# "client_uid":"124",
|
162
|
+
# "action":"UPDATE",
|
163
|
+
# "id":"442",
|
164
|
+
# "name":{
|
165
|
+
# "first_name":"Aaronia",
|
166
|
+
# "last_name":"Stephaniia"
|
167
|
+
# },
|
168
|
+
# },
|
169
|
+
# { ... }
|
170
|
+
# ]
|
171
|
+
# }
|
172
|
+
# }
|
173
|
+
# }
|
174
|
+
|
175
|
+
def calc_las_extensions(kid)
|
176
|
+
# attribs = {}
|
177
|
+
# attribs["_table_extension"] = []
|
178
|
+
attribs = { "_table_extension" => [] }
|
179
|
+
if kid[:email] or kid[:preferred_name]
|
180
|
+
db_extensions =
|
181
|
+
{ "recordFound"=>false,
|
182
|
+
"name"=>"u_students_extension",
|
183
|
+
"_field"=> [ ]
|
184
|
+
}
|
185
|
+
if kid[:email]
|
186
|
+
db_extensions["_field"] << {"name"=>"student_email", "type"=>"String", "value"=>"#{kid[:email]}"}
|
187
|
+
end
|
188
|
+
if kid[:preferredname]
|
189
|
+
db_extensions["_field"] << {"name"=>"preferredname", "type"=>"String", "value"=>"#{kid[:preferredname]}"}
|
190
|
+
end
|
191
|
+
if kid[:preferred_name]
|
192
|
+
db_extensions["_field"] << {"name"=>"preferredname", "type"=>"String", "value"=>"#{kid[:preferred_name]}"}
|
193
|
+
end
|
194
|
+
attribs["_table_extension"] << db_extensions
|
195
|
+
# { "recordFound"=>false,
|
196
|
+
# "name"=>"u_students_extension",
|
197
|
+
# "_field"=> [
|
198
|
+
# {"name"=>"preferredname", "type"=>"String", "value"=>"Niko"},
|
199
|
+
# {"name"=>"student_email", "type"=>"String", "value"=>"#{kid[:email]}"}
|
200
|
+
# ]
|
201
|
+
# }
|
202
|
+
end
|
203
|
+
if kid[:transcriptaddrline1] or kid[:transcriptaddrline2] or
|
204
|
+
kid[:transcriptaddrcity] or kid[:transcriptaddrstate] or
|
205
|
+
kid[:transcriptaddrzip] or kid[:transcriptaddrcountry]
|
206
|
+
db_extensions =
|
207
|
+
{ "recordFound"=>false,
|
208
|
+
"name"=>"u_studentsuserfields",
|
209
|
+
"_field"=> [ ]
|
210
|
+
}
|
211
|
+
if kid[:transcriptaddrline1]
|
212
|
+
db_extensions["_field"] << {"name"=>"transcriptaddrline1", "type"=>"String", "value"=>"#{kid[:transcriptaddrline1]}"}
|
213
|
+
end
|
214
|
+
if kid[:transcriptaddrline2]
|
215
|
+
db_extensions["_field"] << {"name"=>"transcriptaddrline2", "type"=>"String", "value"=>"#{kid[:transcriptaddrline2]}"}
|
216
|
+
end
|
217
|
+
if kid[:transcriptaddrcity]
|
218
|
+
db_extensions["_field"] << {"name"=>"transcriptaddrcity", "type"=>"String", "value"=>"#{kid[:transcriptaddrcity]}"}
|
219
|
+
end
|
220
|
+
if kid[:transcriptaddrzip]
|
221
|
+
db_extensions["_field"] << {"name"=>"transcriptaddrzip", "type"=>"String", "value"=>"#{kid[:transcriptaddrzip]}"}
|
222
|
+
end
|
223
|
+
if kid[:transcriptaddrstate]
|
224
|
+
db_extensions["_field"] << {"name"=>"transcriptaddrstate", "type"=>"String", "value"=>"#{kid[:transcriptaddrstate]}"}
|
225
|
+
end
|
226
|
+
if kid[:transcriptaddrcountry]
|
227
|
+
db_extensions["_field"] << {"name"=>"transcriptaddrcountry", "type"=>"String", "value"=>"#{kid[:transcriptaddrcountry]}"}
|
228
|
+
end
|
229
|
+
attribs["_table_extension"] << db_extensions
|
230
|
+
# { "recordFound"=>false,
|
231
|
+
# "name"=>"u_studentsuserfields",
|
232
|
+
# "_field"=> [
|
233
|
+
# {"name"=>"transcriptaddrzip", "type"=>"String", "value"=>75230},
|
234
|
+
# {"name"=>"transcriptaddrcountry", "type"=>"String", "value"=>"United States"},
|
235
|
+
# {"name"=>"transcriptaddrcity", "type"=>"String", "value"=>"dallas"},
|
236
|
+
# {"name"=>"transcriptaddrstate", "type"=>"String", "value"=>"Texas"},
|
237
|
+
# {"name"=>"transcriptaddrline1", "type"=>"String", "value"=>"6138 meadow rd"}
|
238
|
+
# ]
|
239
|
+
# }
|
240
|
+
end
|
241
|
+
pp attribs
|
242
|
+
attribs
|
243
|
+
end
|
244
|
+
# to inject into _extension_data
|
245
|
+
# { "_table_extension"=> [
|
246
|
+
# { "recordFound"=>false,
|
247
|
+
# "name"=>"u_students_extension",
|
248
|
+
# "_field"=> [
|
249
|
+
# {"name"=>"preferredname", "type"=>"String", "value"=>"Jimmy"},
|
250
|
+
# {"name"=>"student_email", "type"=>"String", "value"=>"bbaaccdd@las.ch"}
|
251
|
+
# ]
|
252
|
+
# },
|
253
|
+
# { "recordFound"=>false,
|
254
|
+
# "name"=>"u_studentsuserfields",
|
255
|
+
# "_field"=> [
|
256
|
+
# {"name"=>"transcriptaddrzip", "type"=>"String", "value"=>8154},
|
257
|
+
# {"name"=>"transcriptaddrcountry", "type"=>"String", "value"=>"Switzerland"},
|
258
|
+
# {"name"=>"transcriptaddrcity", "type"=>"String", "value"=>"Leysin"},
|
259
|
+
# {"name"=>"transcriptaddrstate", "type"=>"String", "value"=>"Vaud"},
|
260
|
+
# {"name"=>"transcriptaddrline1", "type"=>"String", "value"=>"6789 linden st"}
|
261
|
+
# ]
|
262
|
+
# }
|
263
|
+
# ]
|
264
|
+
# }
|
265
|
+
|
5
266
|
end
|
6
267
|
|
7
268
|
end
|
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.3.
|
4
|
+
version: 0.3.1
|
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-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|