openapply 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +165 -387
- data/examples/demo/README.md +74 -18
- data/examples/demo/demo_site.rb +40 -74
- data/lib/openapply/convert.rb +371 -0
- data/lib/openapply/get_student.rb +125 -223
- data/lib/openapply/get_students.rb +143 -340
- data/lib/openapply/version.rb +1 -1
- data/lib/openapply.rb +12 -8
- data/openapply.gemspec +5 -0
- metadata +59 -3
- data/examples/demo/.rbenv-vars +0 -5
@@ -1,125 +1,21 @@
|
|
1
1
|
module Get
|
2
2
|
|
3
|
-
#
|
3
|
+
# SINGLE STUDENT CODE
|
4
|
+
#####################
|
5
|
+
|
6
|
+
|
7
|
+
# STUDENT FULL RECORD
|
8
|
+
#####################
|
9
|
+
|
10
|
+
# Summary record for ONE student - this API return has the parent info 2x!
|
4
11
|
#
|
5
|
-
# @param
|
6
12
|
# ==== Attributes
|
7
|
-
#
|
8
|
-
# *
|
13
|
+
# # @student_id - openapply student_id
|
14
|
+
# * @options - see httparty options
|
9
15
|
#
|
10
16
|
# ==== Example code
|
11
17
|
# @demo = Openapply.new
|
12
18
|
# @demo.student_by_id(96)
|
13
|
-
#
|
14
|
-
# ==== Result
|
15
|
-
# {:student=>
|
16
|
-
# {:id=>96,
|
17
|
-
# :serial_number=>86,
|
18
|
-
# :custom_id=>"86",
|
19
|
-
# :applicant_id=>"00000086",
|
20
|
-
# :email=>"Jerry.Patel@eduvo.com",
|
21
|
-
# :first_name=>"Jerry",
|
22
|
-
# :last_name=>"Patel",
|
23
|
-
# ...,
|
24
|
-
# :profile_photo=>
|
25
|
-
# "https://openapply-sandbox-devel-01.s3.amazonaws.com/uploads/student/avatar/000/000/096/m_9.jpg?v=1499755604",
|
26
|
-
# :profile_photo_updated_at=>"2017-07-11T14:46:44.000+08:00",
|
27
|
-
# :custom_fields=>
|
28
|
-
# {:language=>"Hindi",
|
29
|
-
# :nationality=>"Indian (India)",
|
30
|
-
# :referral_source=>"Friends",
|
31
|
-
# :middle_name_s=>"Danesh",
|
32
|
-
# :mobile_phone=>"852 4545 1195",
|
33
|
-
# ...,
|
34
|
-
# :school_file=>
|
35
|
-
# {:id=>73,
|
36
|
-
# :filename=>"Robert_Patel_Report.pdf",
|
37
|
-
# :url=>"https://demo.openapply.com/api/v1/secure_download/files/73"},
|
38
|
-
# :has_your_child_attended_school_regularly=>"Yes",
|
39
|
-
# ...,
|
40
|
-
# :parent_guardian=>
|
41
|
-
# [{:id=>268,
|
42
|
-
# :serial_number=>257,
|
43
|
-
# :custom_id=>"257",
|
44
|
-
# :name=>"James Patel",
|
45
|
-
# :first_name=>"James",
|
46
|
-
# :last_name=>"Patel",
|
47
|
-
# ...,
|
48
|
-
# :custom_fields=>
|
49
|
-
# {:title=>"CFO",
|
50
|
-
# :treat_parent_as_emergency_contact=>"Yes",
|
51
|
-
# :home_telephone=>"",
|
52
|
-
# ...,
|
53
|
-
# :parent_residency=>"Citizen"}},
|
54
|
-
# {:id=>267,
|
55
|
-
# :serial_number=>256,
|
56
|
-
# :custom_id=>"256",
|
57
|
-
# ...,
|
58
|
-
# :profile_photo=>
|
59
|
-
# "https://openapply-sandbox-devel-01.s3.amazonaws.com/uploads/parent/avatar/000/000/267/patel_mom.jpg?v=1499755607",
|
60
|
-
# :profile_photo_updated_at=>"2017-07-11T14:46:47.000+08:00",
|
61
|
-
# :parent_id=>"256",
|
62
|
-
# :custom_fields=>
|
63
|
-
# {:title=>"",
|
64
|
-
# :treat_parent_as_emergency_contact=>"Yes",
|
65
|
-
# ...,
|
66
|
-
# :parent_prior_countries_list=>nil,
|
67
|
-
# :parent_residency=>"Citizen"}}],
|
68
|
-
# :siblings_information=>
|
69
|
-
# [{:first_name=>"Deidre",
|
70
|
-
# :last_name=>"Patel",
|
71
|
-
# :gender=>"Female",
|
72
|
-
# :birth_date=>"2008-06-06"}],
|
73
|
-
# :emergency_contact=>[],
|
74
|
-
# :prior_school_list=>
|
75
|
-
# [{:school_name=>"Michael Varner Elementary",
|
76
|
-
# :school_country=>"United States",
|
77
|
-
# :school_contact_name=>"Ann Farris",
|
78
|
-
# :school_contact_phone=>"(415) 777-0876"},
|
79
|
-
# {:school_name=>"ISS International School",
|
80
|
-
# :school_contact_name=>"Taylor Michaels",
|
81
|
-
# :school_contact_phone=>"65 6235 5844",
|
82
|
-
# :school_country=>"Singapore"}],
|
83
|
-
# :immunization_record=>[],
|
84
|
-
# :health_information=>[]},
|
85
|
-
# :parent_ids=>[268, 267]},
|
86
|
-
# :linked=>
|
87
|
-
# {:parents=>
|
88
|
-
# [{:id=>268,
|
89
|
-
# :serial_number=>257,
|
90
|
-
# :custom_id=>"257",
|
91
|
-
# :name=>"James Patel",
|
92
|
-
# :first_name=>"James",
|
93
|
-
# :last_name=>"Patel",
|
94
|
-
# ...,
|
95
|
-
# :address=>"1641 26th Avenue",
|
96
|
-
# :address_ii=>"",
|
97
|
-
# :city=>"San Francisco",
|
98
|
-
# :state=>"California",
|
99
|
-
# :postal_code=>"94122",
|
100
|
-
# :country=>"United States",
|
101
|
-
# ...,
|
102
|
-
# :custom_fields=>
|
103
|
-
# {:title=>"CFO",
|
104
|
-
# :treat_parent_as_emergency_contact=>"Yes",
|
105
|
-
# :home_telephone=>"",
|
106
|
-
# ...,
|
107
|
-
# :parent_residency=>"Citizen"}},
|
108
|
-
# {:id=>267,
|
109
|
-
# :serial_number=>256,
|
110
|
-
# :custom_id=>"256",
|
111
|
-
# :name=>"Jane Patel",
|
112
|
-
# :first_name=>"Jane",
|
113
|
-
# ...,
|
114
|
-
# :profile_photo=>
|
115
|
-
# "https://openapply-sandbox-devel-01.s3.amazonaws.com/uploads/parent/avatar/000/000/267/patel_mom.jpg?v=1499755607",
|
116
|
-
# :profile_photo_updated_at=>"2017-07-11T14:46:47.000+08:00",
|
117
|
-
# :parent_id=>"256",
|
118
|
-
# :custom_fields=>
|
119
|
-
# {:title=>"",
|
120
|
-
# :treat_parent_as_emergency_contact=>"Yes",
|
121
|
-
# ...,
|
122
|
-
# :parent_residency=>"Citizen"}}]}}
|
123
19
|
def student_by_id(student_id, options ={})
|
124
20
|
url = "#{api_path}#{student_id}?auth_token=#{api_key}"
|
125
21
|
return oa_answer( url, options )
|
@@ -127,6 +23,9 @@ module Get
|
|
127
23
|
alias_method :student, :student_by_id
|
128
24
|
|
129
25
|
|
26
|
+
# STUDENT PAYMENT INFO
|
27
|
+
######################
|
28
|
+
|
130
29
|
# Payment details for ONE student
|
131
30
|
#
|
132
31
|
# ==== Attributes
|
@@ -136,17 +35,6 @@ module Get
|
|
136
35
|
# ==== Example code
|
137
36
|
# @demo = Openapply.new
|
138
37
|
# @demo.payments_by_id(96)
|
139
|
-
#
|
140
|
-
# ==== Result
|
141
|
-
# {:payments=>
|
142
|
-
# [{:invoice_status=>"Paid",
|
143
|
-
# :type=>"Application",
|
144
|
-
# :invoice_number=>1047,
|
145
|
-
# :amount=>"90.0",
|
146
|
-
# :issue_date=>"2016-03-11",
|
147
|
-
# :due_date=>"2016-03-31",
|
148
|
-
# :payment_method=>"check",
|
149
|
-
# :payment_date=>"2013-03-07"}]}
|
150
38
|
def payments_by_id(student_id, options={})
|
151
39
|
url = "#{api_path}#{student_id}/payments?auth_token=#{api_key}"
|
152
40
|
return oa_answer( url, options )
|
@@ -154,119 +42,73 @@ module Get
|
|
154
42
|
alias_method :payments, :payments_by_id
|
155
43
|
|
156
44
|
|
45
|
+
# STUDENT FULL RECORD AND PAYMENTS COMBINED
|
46
|
+
###########################################
|
47
|
+
|
157
48
|
# Combines the student_by_id & payments_by_id into one call with all the data
|
158
49
|
#
|
159
50
|
# ==== Attributes
|
160
51
|
# * +student_id+ - openapply student_id
|
52
|
+
# * +flatten_keys+ - an array of keys to bring to the top level
|
53
|
+
# (with this key prepened) -- default (blank does nothing)
|
54
|
+
# * +reject_keys+ - an array of keys to remove from the data -- default (blank does nothing)
|
161
55
|
#
|
162
|
-
#
|
163
|
-
#
|
164
|
-
#
|
165
|
-
#
|
166
|
-
#
|
167
|
-
#
|
168
|
-
#
|
169
|
-
#
|
170
|
-
#
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
#
|
178
|
-
# {:student=>
|
179
|
-
# {:id=>96,
|
180
|
-
# :record=>
|
181
|
-
# {:id=>96,
|
182
|
-
# :serial_number=>86,
|
183
|
-
# :custom_id=>"86",
|
184
|
-
# :applicant_id=>"00000086",
|
185
|
-
# :email=>"Jerry.Patel@eduvo.com",
|
186
|
-
# :first_name=>"Jerry",
|
187
|
-
# :last_name=>"Patel",
|
188
|
-
# ...,
|
189
|
-
# :profile_photo=>
|
190
|
-
# "https://openapply-sandbox-devel-01.s3.amazonaws.com/uploads/student/avatar/000/000/096/m_9.jpg?v=1499755604",
|
191
|
-
# :profile_photo_updated_at=>"2017-07-11T14:46:44.000+08:00",
|
192
|
-
# :custom_fields=>
|
193
|
-
# {:language=>"Hindi",
|
194
|
-
# :nationality=>"Indian (India)",
|
195
|
-
# :referral_source=>"Friends",
|
196
|
-
# ...,
|
197
|
-
# :siblings_information=>
|
198
|
-
# [{:first_name=>"Deidre",
|
199
|
-
# :last_name=>"Patel",
|
200
|
-
# :gender=>"Female",
|
201
|
-
# :birth_date=>"2008-06-06"}],
|
202
|
-
# :emergency_contact=>[],
|
203
|
-
# :immunization_record=>[],
|
204
|
-
# :health_information=>[]},
|
205
|
-
# :parent_ids=>[268, 267]},
|
206
|
-
# :payments=>
|
207
|
-
# [{:invoice_status=>"Paid",
|
208
|
-
# :type=>"Application",
|
209
|
-
# :invoice_number=>1047,
|
210
|
-
# :amount=>"90.0",
|
211
|
-
# :issue_date=>"2016-03-11",
|
212
|
-
# :due_date=>"2016-03-31",
|
213
|
-
# :payment_method=>"check",
|
214
|
-
# :payment_date=>"2013-03-07"}],
|
215
|
-
# :guardians=>
|
216
|
-
# [{:id=>268,
|
217
|
-
# :serial_number=>257,
|
218
|
-
# :custom_id=>"257",
|
219
|
-
# :name=>"James Patel",
|
220
|
-
# :first_name=>"James",
|
221
|
-
# :last_name=>"Patel",
|
222
|
-
# ...,
|
223
|
-
# :custom_fields=>
|
224
|
-
# {:title=>"CFO",
|
225
|
-
# :treat_parent_as_emergency_contact=>"Yes",
|
226
|
-
# :home_telephone=>"",
|
227
|
-
# ...,
|
228
|
-
# :parent_residency=>"Citizen"}},
|
229
|
-
# {:id=>267,
|
230
|
-
# :serial_number=>256,
|
231
|
-
# :custom_id=>"256",
|
232
|
-
# :name=>"Jane Patel",
|
233
|
-
# :first_name=>"Jane",
|
234
|
-
# :last_name=>"Patel",
|
235
|
-
# ...,
|
236
|
-
# :profile_photo=>
|
237
|
-
# "https://openapply-sandbox-devel-01.s3.amazonaws.com/uploads/parent/avatar/000/000/267/patel_mom.jpg?v=1499755607",
|
238
|
-
# :profile_photo_updated_at=>"2017-07-11T14:46:47.000+08:00",
|
239
|
-
# :parent_id=>"256",
|
240
|
-
# :custom_fields=>
|
241
|
-
# {:title=>"",
|
242
|
-
# :treat_parent_as_emergency_contact=>"Yes",
|
243
|
-
# :home_telephone=>"",
|
244
|
-
# ...,
|
245
|
-
# :parent_residency=>"Citizen"}}]}}
|
246
|
-
def student_details_by_id(id, flatten = false)
|
56
|
+
# === Returned Data
|
57
|
+
# returns the data structured as:
|
58
|
+
# { student:
|
59
|
+
# { id: xxx,
|
60
|
+
# record: {xxx} # complete student record
|
61
|
+
# guardians: [ {} ] # all guardian information
|
62
|
+
# payments: [ {} ] # all payments made via openapply
|
63
|
+
# }
|
64
|
+
# }
|
65
|
+
def student_details_by_id(id, flatten_keys=[], reject_keys=[])
|
66
|
+
|
67
|
+
check = check_details_keys_validity(flatten_keys, reject_keys)
|
68
|
+
return check unless check.nil? # or check[:error].nil?
|
69
|
+
|
70
|
+
# get full student record and guardian information
|
247
71
|
student_info = student_by_id( "#{id}" )
|
72
|
+
# get student payment records
|
248
73
|
payment_info = payments_by_id( "#{id}" )
|
249
74
|
|
250
|
-
# be sure there is data to process
|
251
|
-
return {student: {id: id, empty: []}}
|
252
|
-
|
253
|
-
|
75
|
+
# be sure there is student data to process -- if not return an empty record
|
76
|
+
return {student: {id: id, empty: []}} if student_info.nil? or
|
77
|
+
student_info[:student].nil?
|
78
|
+
student_info[:student].empty?
|
79
|
+
student = []
|
254
80
|
guardians = []
|
81
|
+
# extract guardian information
|
255
82
|
guardians = student_info[:linked][:parents].dup unless
|
256
|
-
|
257
|
-
|
258
|
-
|
83
|
+
student_info[:linked].nil? or
|
84
|
+
student_info[:linked].empty? or
|
85
|
+
student_info[:linked][:parents].nil?
|
259
86
|
payments = []
|
87
|
+
# extract payment information
|
260
88
|
payments = payment_info[:payments].dup unless payment_info.nil? or
|
261
|
-
|
262
|
-
#
|
263
|
-
|
264
|
-
|
265
|
-
record[:custom_fields][:parent_guardian] = nil
|
89
|
+
payment_info[:payments].nil?
|
90
|
+
# if flatten and reject are not set - set them so they do nothing
|
91
|
+
flatten_keys = [:flatten_no_keys] if flatten_keys.nil? or flatten_keys.empty?
|
92
|
+
reject_keys = [:reject_no_keys] if reject_keys.nil? or reject_keys.empty?
|
266
93
|
|
94
|
+
# extract the student info into the desired format (and removes \n in strings)
|
95
|
+
# student = student_info[:student] - this is the effective result wo
|
96
|
+
# flatten/reject keys
|
97
|
+
student = flatten_record(student_info[:student], flatten_keys, reject_keys)
|
98
|
+
|
99
|
+
# process guardian records - the same way student records
|
100
|
+
# (loop on guardian arrary since there can be multiple parents)
|
101
|
+
g_flat = []
|
102
|
+
guardians = guardians.each do |guard|
|
103
|
+
next if guard.empty?
|
104
|
+
g_flat << flatten_record( guard, flatten_keys, reject_keys )
|
105
|
+
end unless guardians.empty?
|
106
|
+
guardians = g_flat unless g_flat.empty?
|
107
|
+
|
108
|
+
# organize the student details
|
267
109
|
return { student:
|
268
110
|
{ id: id,
|
269
|
-
record:
|
111
|
+
record: student,
|
270
112
|
payments: payments,
|
271
113
|
guardians: guardians,
|
272
114
|
}
|
@@ -274,4 +116,64 @@ module Get
|
|
274
116
|
end
|
275
117
|
alias_method :student_details, :student_details_by_id
|
276
118
|
|
119
|
+
# UTILITIES
|
120
|
+
###########
|
121
|
+
|
122
|
+
# return value & remove linebreaks & trim spaces (if a string)
|
123
|
+
def clean_data( value )
|
124
|
+
return value.gsub("\n",' ').strip if value.is_a? String
|
125
|
+
return value
|
126
|
+
end
|
127
|
+
|
128
|
+
# This method preprocesses records - brings keys to the top level and
|
129
|
+
# removes fields and removes \n from strings
|
130
|
+
#
|
131
|
+
# === Attributes
|
132
|
+
# * +hash+ -- **ONE students** student_details
|
133
|
+
# * +flatten_keys+ -- keys to bring to the top level (with top key prepended)
|
134
|
+
# * +reject_keys+ -- remove data matching these keys
|
135
|
+
# TODO: add recursion?
|
136
|
+
def flatten_record(hash, flatten_keys=[:flatten_no_keys],reject_keys=[:reject_no_keys])
|
137
|
+
answer = {}
|
138
|
+
|
139
|
+
# loop through each key value of the student record
|
140
|
+
hash.each do |key,val|
|
141
|
+
# skip loop if this key matches a value to remove
|
142
|
+
next if reject_keys.include? key
|
143
|
+
|
144
|
+
# put data back into hash if not to be flattened
|
145
|
+
answer[key] = clean_data(val) unless flatten_keys.include? key
|
146
|
+
|
147
|
+
# if current key matches a flatten value & HAS nested data values
|
148
|
+
# then bring nested data to top level
|
149
|
+
val.each do |k,v|
|
150
|
+
# remove any nested values if they match a reject_key
|
151
|
+
next if reject_keys.include? k
|
152
|
+
|
153
|
+
# (prepend flatten_key_to_current_key to prevent conflicts)
|
154
|
+
new_key = "#{key.to_s}_#{k.to_s}".to_sym
|
155
|
+
# clean the data and add back to to top level with a new key
|
156
|
+
answer[new_key] = clean_data(v)
|
157
|
+
end if flatten_keys.include?(key) and
|
158
|
+
not val.empty?
|
159
|
+
end
|
160
|
+
return answer
|
161
|
+
end
|
162
|
+
|
163
|
+
# Check the validity of keys to process student_details
|
164
|
+
#
|
165
|
+
# === Attributes
|
166
|
+
# * +flatten_keys+ - is an array of symbols
|
167
|
+
# * +reject_keys+ - is an array of symbols
|
168
|
+
def check_details_keys_validity(flatten_keys, reject_keys)
|
169
|
+
# # be sure flatten_keys are in an array
|
170
|
+
return {error: "invalid flatten_keys - need array"} unless flatten_keys.is_a? Array
|
171
|
+
# # be sure reject_keys are in an array
|
172
|
+
return {error: "invalid reject_keys - need array"} unless reject_keys.is_a? Array
|
173
|
+
# # test if any values are non-symbols (remain after removing symbols)
|
174
|
+
return {error: "invalid flatten_keys - use symbols"} if flatten_keys.reject{|k| k.is_a? Symbol}.count > 0
|
175
|
+
# # test if any values are non-symbols (remain after removing symbols)
|
176
|
+
return {error: "invalid reject_keys - use symbols"} if reject_keys.reject{|k| k.is_a? Symbol}.count > 0
|
177
|
+
end
|
178
|
+
|
277
179
|
end
|