proctorserv-api 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +93 -63
- data/lib/proctorserv_api.rb +32 -27
- data/spec/proctorserv_api_spec.rb +2 -2
- metadata +2 -3
- data/lib/proctorserv_api/session_event.rb +0 -51
data/README.md
CHANGED
@@ -1,73 +1,102 @@
|
|
1
|
+
![ProctorCam Logo](http://i.imgur.com/vp5bSXc.png)
|
2
|
+
|
1
3
|
### ProctorservApi Client
|
2
4
|
|
3
5
|
A ruby wrapper around the Proctorserve scheduling API, which allows a web service to manage various scheduling actions. This gem is framework agnostic -- it will work as part of a Rails or Sinatra project as easily as from a stand-alone script.
|
4
6
|
|
5
|
-
Creating a session through the scheduling API sets up a future or immediate opportunity for a user of an integrating system to take their examination in a proctored and recorded environment. Important identifiers (eg. user or
|
7
|
+
Creating a session through the scheduling API sets up a future or immediate opportunity for a user of an integrating system to take their examination in a proctored and recorded environment. Important identifiers (eg. user or exam instance) are required so that an integrating web service can request an individual session or a more involved list (like all sessions for an exam or all exam sessions for a specific user/subject) to playback. However, Proctorserve does not serve as a database of record - the integrating system is responsible for housing test taker and exam information as well as keeping Proctorserve up to date. Optionally, when creating a reservation, the integrating system can opt to scope that session to a particular client of theirs -- Proctorserve can organize data by customer as well as that customer's clients.
|
6
8
|
|
7
9
|
**Note:** If you do not currently have a ProctorCam account, you will need one to actually use the code contained in this repo. You may create an account by calling 877-TES-T127.
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
*
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
11
|
+
The workflow involves
|
12
|
+
- ####Finding available session times
|
13
|
+
- getAvailableTimeslotsBetween
|
14
|
+
|
15
|
+
Getting the available session timeslots between two time-specific dates
|
16
|
+
|
17
|
+
- getAvailableTimeslotsAround
|
18
|
+
|
19
|
+
Getting the available session timeslots around one time-specific date
|
20
|
+
|
21
|
+
- ####Making a session reservation
|
22
|
+
- makeReservation
|
23
|
+
|
24
|
+
Making a future reservation based on a time-specific date
|
25
|
+
|
26
|
+
- makeImmediateReservation
|
27
|
+
|
28
|
+
Making an immediate reservation
|
29
|
+
|
30
|
+
- ####Canceling a reservation
|
31
|
+
|
32
|
+
- cancelReservation
|
33
|
+
|
34
|
+
Canceling a reservation based on a session ID which is created when making a reservation
|
35
|
+
|
36
|
+
- ####Launching a session
|
37
|
+
|
38
|
+
- generateJsonpToken
|
39
|
+
|
40
|
+
Generating a JSONP token that renders a 'Download' button for ProctorApp and grants temporary JSONP access for the web browser the user is using to launch the session.
|
41
|
+
|
42
|
+
- ####Creating a session event
|
43
|
+
|
44
|
+
- createSessionEvent
|
45
|
+
|
46
|
+
Creating a severity-defined session event based on regular and irregular session activity such as irregular eye movement, checking into a session, etc. A list of session events can be found in SessionEvent.php.
|
47
|
+
|
48
|
+
Session events are documented by the proctor and can be seen in the web interface after logging in with one's customer account.
|
49
|
+
|
50
|
+
|
51
|
+
- ####Reviewing the sesison
|
52
|
+
|
53
|
+
- generateSecureReviewUrl
|
54
|
+
|
55
|
+
Generating a secure URL that grants temporary customer access to the review screen of one of their users' sessions. The review screen consists of the exam taker's audio, video, and desktop activity as recorded by ProctorApp. It can be accessed live or after the session has ended.
|
56
|
+
|
57
|
+
|
58
|
+
### Example workflow
|
59
|
+
|
60
|
+
***Note:*** Required and optional parameters for each method can be found in the included documentaiton
|
61
|
+
|
62
|
+
#####*Finding available session times* (getAvailableTimeslotsBetween, getAvailableTimeslotsAround)
|
63
|
+
An exam taker in the integrating system is searching for a time to schedule a session
|
64
|
+
|
65
|
+
- The integrating system makes an API request to Proctorserve to search for available timeslots
|
66
|
+
- The integrating system presents the exam taker with a list of schedulable times
|
67
|
+
|
68
|
+
#####*Making a session reservation* (makeReservation, makeImmediateReservation)
|
69
|
+
|
70
|
+
- An exam taker in the integrating system either schedules a future exam or an immediate exam
|
71
|
+
|
72
|
+
- **Future Reservation**
|
73
|
+
- The integrating system makes an API request to Proctorserve to get a list of schedulable times
|
74
|
+
- The exam taker chooses a schedulable time, triggering an API request to Proctorserve to make a reservation for that user at that time
|
75
|
+
- **Immediate Reservation**
|
76
|
+
- The integrating system makes an API request to Proctorserve to make an immediate reservation
|
77
|
+
- On exam day, the integrating system presents the exam taker with the Proctorserve launch session component
|
78
|
+
- The exam taker downloads the ProctorApp desktop application and completes their session
|
79
|
+
|
80
|
+
#####*Canceling a reservation* (cancelReservation)
|
81
|
+
|
82
|
+
- A exam taker in the integrating system cancels a reserved session
|
83
|
+
- The integrating system make an API request with the exam taker's unique session ID to cancel the reservation
|
84
|
+
|
85
|
+
#####*Launching a session* (generateJsonpToken)
|
86
|
+
|
87
|
+
- A exam taker in the integrating system is ready to start his session
|
88
|
+
- The integrating system makes an API request to generate a JSONP token
|
89
|
+
- The integrating system can generate the token and implement the session launcher component wherever seems fit in the system
|
90
|
+
|
91
|
+
#####*Creating a session event* (createSessionEvent)
|
92
|
+
|
93
|
+
- A session reviewer wants to create a session event
|
94
|
+
- The integrating system makes an API request to the session's proctor along with the event type and severity
|
95
|
+
|
96
|
+
#####*Reviewing a session* (generateSecureReviewUrl)
|
97
|
+
- A customer wants to review a live or recorded session
|
98
|
+
- The integrating system makes an API request to generate a secure review URL for the customer
|
99
|
+
- The secure review URL can be loaded into an iframe or a new window
|
71
100
|
|
72
101
|
#### Installation
|
73
102
|
|
@@ -118,5 +147,6 @@ proctorserv_api.generate_jsonp_token
|
|
118
147
|
proctorserv_api.generate_secure_review_url
|
119
148
|
proctorserv_api.create_session_event
|
120
149
|
```
|
150
|
+
### Full Documentation
|
121
151
|
|
122
152
|
Further documentation for these methods can be found [here](http://rubydoc.info/github/ProctorCam/proctorserv-api-rb/master/frames)
|
data/lib/proctorserv_api.rb
CHANGED
@@ -3,7 +3,6 @@ require 'proctorserv_api/exceptions/invalid_client_exception'
|
|
3
3
|
require 'proctorserv_api/exceptions/invalid_ip_exception'
|
4
4
|
require 'proctorserv_api/exceptions/invalid_signature_exception'
|
5
5
|
require 'proctorserv_api/exceptions/missing_required_parameter_exception'
|
6
|
-
require 'proctorserv_api/session_event.rb'
|
7
6
|
|
8
7
|
#
|
9
8
|
# proctorserv_api.rb
|
@@ -30,7 +29,7 @@ module ProctorCam
|
|
30
29
|
module Proctorserv
|
31
30
|
class ProctorservApi
|
32
31
|
|
33
|
-
VERSION = "1.0.
|
32
|
+
VERSION = "1.0.5"
|
34
33
|
|
35
34
|
def initialize(api_identifier, shared_secret, service_protocol = "https", service_url = "service.proctorcam.com")
|
36
35
|
@service_protocol = service_protocol
|
@@ -40,9 +39,9 @@ module ProctorCam
|
|
40
39
|
end
|
41
40
|
|
42
41
|
# Get a list of schedulable timeslots (represented as Time objects) between two
|
43
|
-
# times for a given
|
42
|
+
# times for a given exam that needs to be scheduled. This API request takes the
|
44
43
|
# provided session_duration into account when comparing Proctorserve business hours.
|
45
|
-
# The timeslots returned are specific for
|
44
|
+
# The timeslots returned are specific for an exam of duration provided.
|
46
45
|
#
|
47
46
|
# This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
|
48
47
|
#
|
@@ -51,7 +50,7 @@ module ProctorCam
|
|
51
50
|
# - :lower_bound (Time or int seconds since epoch) - the earlier of two timestamps to find available timeslots between
|
52
51
|
# - :upper_bound (Time or int seconds since epoch) - the later of two timestamps to find available timeslots between
|
53
52
|
# - :session_duration (int) - is the length in minutes alloted for this examination
|
54
|
-
# @return [Array<Time>] list of Time objects that represent schedulable timeslots in Proctorserve for
|
53
|
+
# @return [Array<Time>] list of Time objects that represent schedulable timeslots in Proctorserve for an exam of length session_duration between lower_bound and upper_bound
|
55
54
|
def get_available_timeslots_between(options)
|
56
55
|
requires_of options, [:lower_bound, :upper_bound, :session_duration]
|
57
56
|
url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
|
@@ -64,19 +63,19 @@ module ProctorCam
|
|
64
63
|
end
|
65
64
|
|
66
65
|
# Get a list of schedulable timeslots (represented as Time objects) around the
|
67
|
-
# time for a given
|
66
|
+
# time for a given exam that needs to be scheduled. This API request takes the
|
68
67
|
# provided session_duration into account when comparing Proctorserve business hours.
|
69
|
-
# The timeslots returned are specific for
|
68
|
+
# The timeslots returned are specific for an exam of duration provided. At most
|
70
69
|
# 20 slots will be returned
|
71
70
|
#
|
72
71
|
# This method will raise exceptions related to authentication (InvalidClientException, InvalidSignatureException, InvalidIpException) or not providing required data (MissingRequiredParameterException)
|
73
72
|
#
|
74
73
|
# @param [Hash{Symbol => String}] options
|
75
74
|
# Required:
|
76
|
-
# - :time (Time or int seconds since epoch) - time around which to find slots
|
75
|
+
# - :time (Time or int seconds since epoch) - time around which to find schedulable slots
|
77
76
|
# - :num_slots (int) - number of slots to return
|
78
77
|
# - :session_duration (int) - length in minutes alloted for this examination
|
79
|
-
# @return [Array<Time>] list (length num_slots or 20) of Time objects that represent schedulable timeslots in Proctorserve for
|
78
|
+
# @return [Array<Time>] list (length num_slots or 20) of Time objects that represent schedulable timeslots in Proctorserve for an exam of length session_duration around time passed in options hash
|
80
79
|
def get_available_timeslots_around(options)
|
81
80
|
requires_of options, [:time, :num_slots, :session_duration]
|
82
81
|
url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
|
@@ -95,17 +94,17 @@ module ProctorCam
|
|
95
94
|
# @param [Hash{Symbol => String}] options
|
96
95
|
# Required:
|
97
96
|
# - :time (Time or int seconds since epoch) - Scheduable time for examination, as obtained by get_available_timeslots_between or get_available_timeslots_around
|
98
|
-
# - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this
|
99
|
-
# - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this
|
97
|
+
# - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this exam
|
98
|
+
# - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this exam
|
100
99
|
# - :client_code (String) - Unique identifier for API customer's client
|
101
|
-
# - :reservation_id (String) - Unique identifier representing this
|
100
|
+
# - :reservation_id (String) - Unique identifier representing this exam instance in API customer's system
|
102
101
|
# - :session_duration (int) - Session length in minutes
|
103
|
-
# - :exam_code (String) - Unique identifier representing the group of
|
102
|
+
# - :exam_code (String) - Unique identifier representing the group of exams this specific exam instance belongs to
|
104
103
|
# Optional:
|
105
104
|
# - :complete_url (String) - URL that the candidate is redirected to after exam completion
|
106
105
|
# - :first_name (String) - First name of the candidate taking the exam
|
107
106
|
# - :last_name (String) - Last name of the candidate taking the exam
|
108
|
-
# @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not
|
107
|
+
# @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not schedulable.
|
109
108
|
def make_reservation(options)
|
110
109
|
requires_of options, [:time, :customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
|
111
110
|
url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
|
@@ -126,17 +125,17 @@ module ProctorCam
|
|
126
125
|
#
|
127
126
|
# @param [Hash{Symbol => String}] options
|
128
127
|
# Required:
|
129
|
-
# - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this
|
130
|
-
# - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this
|
128
|
+
# - :customer_subject_id (String) - Unique identifier in API customer's system for the person taking this exam
|
129
|
+
# - :customer_client_subject_id (String) - Unique identifier in API customer's client's system for the person taking this exam
|
131
130
|
# - :client_code (String) - Unique identifier for API customer's client
|
132
|
-
# - :reservation_id (String) - Unique identifier representing this
|
131
|
+
# - :reservation_id (String) - Unique identifier representing this exam instance in API customer's system
|
133
132
|
# - :session_duration (int) - Session length in minutes
|
134
|
-
# - :exam_code (String) - Unique identifier representing the group of
|
133
|
+
# - :exam_code (String) - Unique identifier representing the group of exams this specific exam instance belongs to
|
135
134
|
# Optional:
|
136
135
|
# - :complete_url (String) - URL that the candidate is redirected to after exam completion
|
137
136
|
# - :first_name (String) - First name of the candidate taking the exam
|
138
137
|
# - :last_name (String) - Last name of the candidate taking the exam
|
139
|
-
# @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not
|
138
|
+
# @return [int] session_id - the Proctorserve id for the created session. Will return -1 if the time passed is not schedulable.
|
140
139
|
def make_immediate_reservation(options)
|
141
140
|
requires_of options, [:customer_subject_id, :customer_client_subject_id, :client_code, :reservation_id, :session_duration, :exam_code]
|
142
141
|
url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
|
@@ -158,7 +157,7 @@ module ProctorCam
|
|
158
157
|
# @param [Hash{Symbol => String}] options
|
159
158
|
# Required:
|
160
159
|
# - :session_id (int) Proctorserve id for the session to be canceled
|
161
|
-
# @return [Boolean] whether or not the
|
160
|
+
# @return [Boolean] whether or not the exam was successfully canceled.
|
162
161
|
def cancel_reservation(options)
|
163
162
|
requires_of options, [:session_id]
|
164
163
|
url = "#{@service_protocol}://#{@service_url}/api/scheduling/#{__method__}"
|
@@ -177,8 +176,11 @@ module ProctorCam
|
|
177
176
|
# Generate a secure token that can be used to grant temporary jsonp access to a session for a web browser user to take a session.
|
178
177
|
#
|
179
178
|
# @param [Hash{Symbol => String}] options
|
180
|
-
#
|
181
|
-
#
|
179
|
+
# Required:
|
180
|
+
# - :session_id (int) Proctorserve id for the session to grant access to
|
181
|
+
# Optional:
|
182
|
+
# - :duration (int) Number of minutes to grant access for (defaults to 1 hour, maximum 3 hours)
|
183
|
+
# @return [String] the jsonp token
|
182
184
|
def generate_jsonp_token(options)
|
183
185
|
requires_of options, [:session_id]
|
184
186
|
|
@@ -191,12 +193,15 @@ module ProctorCam
|
|
191
193
|
end
|
192
194
|
|
193
195
|
# Generate a secure token that can be used to grant temporary access to a session for a web browser user to review a session.
|
194
|
-
# Can be loaded an iframe or a new window to grant secure access to a single user for a specified period of time
|
196
|
+
# Can be loaded in an iframe or a new window to grant secure access to a single user for a specified period of time
|
195
197
|
#
|
196
198
|
# @param [Hash{Symbol => String}] options
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
199
|
+
# Required:
|
200
|
+
# - :session_id (int) Proctorserve id for the session to grant review access to
|
201
|
+
# - :proctor_id (String) unique identifier representing the user to grant access to. This will determine the user's display name in Proctorserve interfaces.
|
202
|
+
# Optional:
|
203
|
+
# - :duration (int) Number of minutes link stays active for (defaults to 5 minutes)
|
204
|
+
# @return [String] a URL to review the session
|
200
205
|
def generate_secure_review_url(options)
|
201
206
|
requires_of options, [:proctor_id, :session_id]
|
202
207
|
|
@@ -220,7 +225,7 @@ module ProctorCam
|
|
220
225
|
# - :time (String) (Time or int seconds since epoch) Date and Time that the session event happened at
|
221
226
|
# - :severity (int) (Defaults to 0) The severity of the session_event being created.
|
222
227
|
# - 0: Lowest severity
|
223
|
-
# - 1: Highest Severity, may be used for events like
|
228
|
+
# - 1: Highest Severity, may be used for events like exam revoked or emergency.
|
224
229
|
# - 2: Medium Severity, the session needs to be reviewed.
|
225
230
|
# - 3: Low Severity, common events like going through the system check.
|
226
231
|
# @return [Boolean] whether or not the session event was successfully created.
|
@@ -179,14 +179,14 @@ describe ProctorCam::Proctorserv::ProctorservApi do
|
|
179
179
|
end
|
180
180
|
|
181
181
|
it "returns true if it generates a session event for a testing session if options hash contains correct values" do
|
182
|
-
options = {:session_id =>
|
182
|
+
options = {:session_id => 427, :event_type => "completed", :proctor_id => "foo", :severity => 2}
|
183
183
|
result = @proctorserv_api.create_session_event options
|
184
184
|
result.should be_true
|
185
185
|
end
|
186
186
|
|
187
187
|
it "returns false if the customer does not have the session_id passed" do
|
188
188
|
proctorserv_api = ProctorCam::Proctorserv::ProctorservApi.new("test", "shared_secret", "http", "localhost:3000")
|
189
|
-
options = {:session_id => -1, :event_type =>
|
189
|
+
options = {:session_id => -1, :event_type => "completed", :proctor_id => "foo", :severity => 2}
|
190
190
|
result = proctorserv_api.create_session_event options
|
191
191
|
result.should be_false
|
192
192
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: proctorserv-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -57,7 +57,6 @@ files:
|
|
57
57
|
- lib/proctorserv_api/exceptions/missing_required_parameter_exception.rb
|
58
58
|
- lib/proctorserv_api/hashed_authenticator.rb
|
59
59
|
- lib/proctorserv_api/rest_request_client.rb
|
60
|
-
- lib/proctorserv_api/session_event.rb
|
61
60
|
- lib/proctorserv_api.rb
|
62
61
|
- LICENSE
|
63
62
|
- README.md
|
@@ -1,51 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# session_event.rb
|
3
|
-
# ProctorservApi
|
4
|
-
#
|
5
|
-
# Copyright 2013 ProctorCam, Inc
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License")
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
# Created by Pat Durgin on 7/19/13.
|
20
|
-
#
|
21
|
-
module SessionEvent
|
22
|
-
|
23
|
-
ERROR = "ERROR"
|
24
|
-
CHECK_IN_BEGUN = "CHECK_IN_BEGUN"
|
25
|
-
APP_CONNECTED = "APP_CONNECTED"
|
26
|
-
STARTED = "STARTED"
|
27
|
-
COMPLETED = "COMPLETED"
|
28
|
-
APP_WORKFLOW = "APP_WORKFLOW"
|
29
|
-
APP_HARDWARE_ISSUE = "APP_HARDWARE_ISSUE"
|
30
|
-
APP_ISSUE = "APP_ISSUE"
|
31
|
-
APP_STREAMING_STARTED = "APP_STREAMING_STARTED"
|
32
|
-
APP_STREAMING_STOPPED = "APP_STREAMING_STOPPED"
|
33
|
-
APP_READY_FOR_GREET = "APP_READY_FOR_GREET"
|
34
|
-
SERVICE_TEST_RELEASED = "SERVICE_TEST_RELEASED"
|
35
|
-
|
36
|
-
ACCESS_CODE_RESET = "ACCESS_CODE_RESET"
|
37
|
-
UNAPPROVED_RESOURCE = "UNAPPROVED_RESOURCE"
|
38
|
-
VOICE_HEARD = "VOICE_HEARD"
|
39
|
-
PUSHED_TO_COMPLETE = "PUSHED_TO_COMPLETE"
|
40
|
-
USING_PHONE = "USING_PHONE"
|
41
|
-
LEFT_THE_ROOM = "LEFT_THE_ROOM"
|
42
|
-
EMERGENCY = "EMERGENCY"
|
43
|
-
UNUSUAL_EYE_MOVEMENT = "UNUSUAL_EYE_MOVEMENT"
|
44
|
-
OTHER = "OTHER"
|
45
|
-
APP_SUBJECT_HAND_RAISED = "APP_SUBJECT_HAND_RAISED"
|
46
|
-
SERVICE_TEST_PAUSED = "SERVICE_TEST_PAUSED"
|
47
|
-
SERVICE_TEST_RESUMED = "SERVICE_TEST_RESUMED"
|
48
|
-
SERVICE_TEST_REVOKED = "SERVICE_TEST_REVOKED"
|
49
|
-
SERVICE_PROCTOR_OUTREACH = "SERVICE_PROCTOR_OUTREACH"
|
50
|
-
|
51
|
-
end
|