Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Below is a Python snippet that creates a test and assigns a few students. It reads the client_id and authentication token as well as the API URL from environment variables. For local testing, you could even hardcode these on lines 7:810. The example reads the student info from a CSV file given as the only command line parameter to the script. This could naturally be replaced by data coming from a database, integration platform or similar - the use of CSV here is only for demo purposes (in fact, for CSV import you can simply use the normal user interface in Inspera Assessment to import the candidates). The example shows how to set extra time per candidate, as well as specifying the building and room for each candidate.

It should be noted that the IA API also supports posting the candidates along with the test creation, but for the sake of demonstrating the APIs, two calls (in addition to the session token generation step) were used in the below example. The http request details are done through the wonderful requests library.

Code Block
languagepy
themeMidnight
titleCreate test and assign candidates using the IA API
linenumberstrue
import requests
import os
import csv
import sys

# this has to be manually replaced by a valid auth token and client id, if env vars not set
auth_token = os.environ['IA_ACCESS_TOKEN']
client_id = os.environ['IA_CLIENT_ID']
api_base_url = "
# this typically has the form https://ias<CLIENT>.inspera.no/api/"
api_authbase_pathurl = "authenticate/token/"
auth_os.environ['IA_API_URL']
api_auth_path = "authenticate/token/"
auth_params = {"code": auth_token, "client_id": client_id, "grant_type": "authorization_code"}
api_create_test_path = "v1/test"
api_assign_candidates_path = "v1/test/%d/candidates" # %d to be replaced by testId before using the URL, sprintf-style

"""Helper to grab a list of students from a local CSV file. 
   # this will be the external id of the test created
ext_test_id = "externalTest123456789"

# this will be the name of the test created
test_name = "UNSW API testing test updated";

def get_student_list_from_csv(csv_file_name):
    """Helper to grab a list of students from a local CSV file.
       This could be data coming from your DB/integration platform. """
def get_student_list_from_csv(csv_file_name):
    students = []
    with open(csv_file_name, 'rbr') as csvfile:
        csvreader = csv.reader(csvfile, delimiter = ',')
        for s in csvreader:
            student = {}
            student["candidateId"] = s[0]
            student["buildingName"] = s[1]
            student["roomName"] = s[2]
            student["externalId"] = s[3]
            student["extraTimeMinutes"] = s[4]
            students.append(student)
    return students

def create_ia_test(token, test_name, test_id,  students.append(student)
start_time, end_time):
   return students

"""Helper that creates a test in IA with the given (external) id and name,
       using the Inspera API with the given session token."""
def create_ia_test(token, test_name, test_id, start_time, end_time):session token."""
    create_test_params = {  "externalTestId": test_id,
                            "title": test_name,
                            "startTime": start_time,
                            "endTime": end_time
                          }
    result = requests.post(api_base_url + api_create_test_path, json = create_test_params,
                           headers = {"Authorization": "bearer " + token, "Content-type": "application/json"})
    #print result.text
    return result.json()["assessmentRunId"]

def assign_candidates(token, test_id, candidates):
    """Helper that assignes the given list of candidates to a test in IA given the IA id of the test,
       using the Inspera API with the given session token."""
def assign_candidates(token, test_id, candidates):"""
    assign_candidate_params = {"testId": test_id, "candidates" : candidates}
    assign_candiates_url = api_base_url + (api_assign_candidates_path % test_id)
    result = requests.post(assign_candiates_url, json = assign_candidate_params,
                           headers = {"Authorization": "bearer " + token, "Content-type": "application/json"})
    #uncomment
to show raw JSON return value from the API print print(result.text)

print ("Creating a test in IA and populating some students from CSV...")
if not len(sys.argv) == 2:
    print ("Please provide the CSV file name as the only script parameter")
else:	
    session_token = requests.post(api_base_url + api_auth_path, data = auth_params).json()["access_token"]
    print ("Will go on using token " + session_token)
    ia_test_id = create_ia_test(session_token, "My API testing test", "externalTest1234"test_name, ext_test_id, "2018-05-21T1225T12:3530:40Z00Z", "2018-0605-21T1525T17:0030:40Z00Z")
    print ("Will assign students to test " + str(ia_test_id))
    students = get_student_list_from_csv(sys.argv[1])
    assign_candidates(session_token, ia_test_id, students)
    print ("Assigned " + str(len(students)) + " candidates to test " + str(ia_test_id))



The CSV file used in this sample was:

Code Block
12345,Building 1,Room 101,extId12345,0
12346,Building 1,Room 101,extId12346,30extId12346,30

(The above sample was updated to Python 3.8 on May 29th 2020, if you for any reason would like the Python 2.7 version, reach out to your contact.)

Sample scenario using Python to create two test planners (admins)

Below is a Python snippet that creates two test plannners, using the users API. It reads the client_id and authentication token as well as root API URL from environment variables. For local testing, you could even hardcode these on lines 9:1012. The example reads the planner info from a CSV file given as the only command line parameter to the script. This could naturally be replaced by data coming from a database, integration platform or similar - the use of CSV here is only for demo purposes. The example shows how to set the organization unit, such as the school, of each user - which in terms can be used for setting role-based permissions in IA.

Code Block
languagepy
themeMidnight
titleCreate test and assign candidates some planners using the IA API
linenumberstrue
import requests
import os
import csv
import sys

# this example creates a few test planners from a CSV file given as a parameter to the script

# this has to be manually replaced by a valid auth token and client id, if env vars not set
auth_token = os.environ['IA_ACCESS_TOKEN']
client_id = os.environ['IA_CLIENT_ID']
# this typically has the form https://<CLIENT>.inspera.no/api/
api_base_url = "https://ias.inspera.no/api/"os.environ['IA_API_URL']
api_auth_path = "authenticate/token/"
auth_params = {"code": auth_token, "client_id": client_id, "grant_type": "authorization_code"}
api_create_admin_path = "v1/users/admin/"

def get_planner_list_from_csv(csv_file_name):
    """Helper to grab a list of test planners from a local CSV file.
       This could be data coming from your DB/integration platform. """
def get_planner_list_from_csv(csv_file_name):. """
    admins = []
    with open(csv_file_name, 'rbr') as csvfile:
        csvreader = csv.reader(csvfile, delimiter = ',')
        for a in csvreader:
            admin = {}
            admin["externalId"] = a[0]
            admin["externalSystemauthType"] = a[1]
            admin["username"] = a[2]
            admin["firstName"] = a[3]
            admin["lastName"] = a[4]
            admin["email"] = a[5]
            admin["orgUnitNameorgUnitMemberships"] = a[6]
            admins.append(admin)
    return admins

def create_ia_test_planner(token, planner):
    """Helper that creates a planner in IA with the given values,
       using the Inspera API with the given session token."""
def create_ia_test_planner(token, planner):
    create_planner_params = planner
    # roles is now an array replacing the old "role"
    planner["roleroles"] = ["plan"]; # "evaluate", "plan", "author" supported, could also come from ext system, but hardcoded for demo
    result = requests.post(api_base_url + api_create_admin_path, json=create_planner_params,
                           headers={"Authorization": "bearer " + token, "Content-type": "application/json"})

   #uncomment to show raw JSON return value from the API print result.text print(result.text)
    print(result.request.body)
    return result.json()["userId"]


print ("Creating test planners in IA from CSV...")
if not len(sys.argv) == 2:
    print ("Please provide the CSV file name as the only script parameter")
else:	
    session_tokenresponse = requests.post(api_base_url + api_auth_path, data = auth_params)
    print(response.text)
    session_token = response.json()["access_token"]
    print ("Will go on using token " + session_token)
    planners = get_planner_list_from_csv(sys.argv[1])
    ia_planner_ids = []
    for planner in planners:
        print ("Will create planner " + str(planner["firstName"]) + " " + str(planner["lastName"]))
        ia_planner_ids.append(create_ia_test_planner(session_token, planner))
    print ("Created " + str(len(planners)) + " in IA, userIds in IA: " + str(ia_planner_ids))




The CSV file used in this sample was:

...

The format here is in order externalId, externalSystem, username, firstName, lastName, email, orgUnitName - the additional field "role" roles" (now an array, changed this this example was originally created) is set directly in the sample script to "plan", could easily have been added to the CSV file.

...