API-kodeeksempel

  • Oppdatert

Eksempel på scenario med Python for å opprette en prøve og tildele kandidater

Nedenfor er et Python-utdrag (snippet) som oppretter en prøve og tildeler noen kandidater. Skriptet leser client_id, autentiseringstoken og API-URL fra miljøvariabler (environment variables). For lokal testing kan du også hardkode disse på linje 7–10. Eksempelet leser studentinformasjon fra en CSV-fil som oppgis som den eneste kommandolinjeparameteren til skriptet. Dette kan naturligvis erstattes av data fra en database, integrasjonsplattform eller lignende – bruken av CSV her er kun for demonstrasjonsformål (faktisk kan du for CSV-import helt enkelt bruke det vanlige brukergrensesnittet i Inspera Assessment for å importere kandidater). Eksempelet viser hvordan man angir ekstra tid per kandidat, samt spesifisering av bygg og rom for hver kandidat.

Det bør bemerkes at IA API-et også støtter å sende med kandidatene samtidig som prøven opprettes, men for å demonstrere API-ene brukes to kall (i tillegg til trinnet for generering av sesjonstoken) i eksempelet nedenfor. Detaljene for HTTP-forespørslene håndteres gjennom det utmerkede biblioteket "requests".

  1. import requests
    import os
    import csv
    import sys
    
    # Dette må erstattes manuelt med et gyldig auth-token og client-id hvis miljøvariabler ikke er satt
    auth_token = os.environ['IA_ACCESS_TOKEN']
    client_id = os.environ['IA_CLIENT_ID']
    # Denne har vanligvis formen https://<domene>.inspera.no/api/
    api_base_url = os.environ['IA_API_URL']
    api_auth_path = "authenticate/token/"
    auth_params = {"client_id": client_id, "grant_type": "authorization_code"}
    api_create_test_path = "v1/test"
    api_assign_candidates_path = "v1/test/%d/candidates" # %d erstattes av testId før bruk av URL-en
    
    # Dette vil være den eksterne ID-en for prøven som opprettes
    ext_test_id = "externalTest123456789"
    
    # Dette vil være navnet på prøven som opprettes
    test_name = "UNSW API testing test updated";
    
    def get_student_list_from_csv(csv_file_name):
        """Hjelpefunksjon for å hente en liste over studenter fra en lokal CSV-fil.
           Dette kunne vært data fra din database/integrasjonsplattform."""
        students = []
        with open(csv_file_name, 'r') 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, start_time, end_time):
        """Hjelpefunksjon som oppretter en prøve i IA med gitt (ekstern) id og navn,
           ved bruk av Inspera API med sesjonstoken."""
        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"})
        return result.json()["assessmentRunId"]
    
    def assign_candidates(token, test_id, candidates):
        """Hjelpefunksjon som tildeler listen med kandidater til en prøve i IA basert på prøvens ID."""
        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"})
        print(result.text)
    
    print("Oppretter en prøve i IA og henter studenter fra CSV...")
    if not len(sys.argv) == 2:
        print("Vennligst oppgi CSV-filnavnet som eneste parameter til skriptet")
    else:	
        session_token = requests.post(api_base_url + api_auth_path, data = auth_params, headers={"code": auth_token}).json()["access_token"]
        print("Fortsetter med token " + session_token)
        ia_test_id = create_ia_test(session_token, test_name, ext_test_id, "2018-05-25T12:30:00Z", "2018-05-25T17:30:00Z")
        print("Vil tildele studenter til prøve " + str(ia_test_id))
        students = get_student_list_from_csv(sys.argv[1])
        assign_candidates(session_token, ia_test_id, students)
        print("Tildelte " + str(len(students)) + " kandidater til prøve " + str(ia_test_id))
    

CSV-filen som ble brukt i dette eksempelet var:

12345,Bygning 1,Rom 101,extId12345,0
12346,Bygning 1,Rom 101,extId12346,30

(Eksempelet over ble oppdatert til Python 3.8 den 29. mai 2020. Hvis du av en eller annen grunn ønsker versjonen for Python 2.7, kan du kontakte din kontaktperson.)

Eksempel på scenario med Python for å opprette to Hovedansvarlige (administratorer)

Nedenfor er et Python-utdrag som oppretter to Hovedansvarlige ved bruk av Users API. Det leser client_id, autentiseringstoken og rot-API-URL fra miljøvariabler. For lokal testing kan du også hardkode disse på linje 9–12. Eksempelet leser informasjon om Hovedansvarlige fra en CSV-fil oppgitt som parameter. Dette kan erstattes av data fra en database eller lignende – bruken av CSV her er kun for demo. Eksempelet viser hvordan man angir organisasjonsenhet (f.eks. fakultet eller institutt) for hver bruker – som igjen kan brukes til å sette rollebaserte tilganger i IA.

  1. import requests
    import os
    import csv
    import sys
    
    # Dette eksempelet oppretter noen Hovedansvarlige fra en CSV-fil
    
    auth_token = os.environ['IA_ACCESS_TOKEN']
    client_id = os.environ['IA_CLIENT_ID']
    api_base_url = os.environ['IA_API_URL']
    api_auth_path = "authenticate/token/"
    auth_params = {"client_id": client_id, "grant_type": "authorization_code"}
    api_create_admin_path = "v1/users/admin/"
    
    def get_planner_list_from_csv(csv_file_name):
        """Hjelpefunksjon for å hente en liste over Hovedansvarlige fra en lokal CSV-fil."""
        admins = []
        with open(csv_file_name, 'r') as csvfile:
            csvreader = csv.reader(csvfile, delimiter=',')
            for a in csvreader:
                admin = {}
                admin["externalId"] = a[0]
                admin["authType"] = a[1]
                admin["username"] = a[2]
                admin["firstName"] = a[3]
                admin["lastName"] = a[4]
                admin["email"] = a[5]
                admin["orgUnitMemberships"] = a[6]
                admins.append(admin)
        return admins
    
    def create_ia_test_planner(token, planner):
        """Hjelpefunksjon som oppretter en Hovedansvarlig i IA med de gitte verdiene."""
        create_planner_params = planner
        # Roller er nå en matrise (array) som erstatter den gamle "role"
        planner["roles"] = ["plan"]; # "evaluate", "plan", "author" støttes
        result = requests.post(api_base_url + api_create_admin_path, json=create_planner_params,
                               headers={"Authorization": "bearer " + token, "Content-type": "application/json"})
        print(result.text)
        return result.json()["userId"]
    
    print("Oppretter Hovedansvarlige i IA fra CSV...")
    if not len(sys.argv) == 2:
        print("Vennligst oppgi CSV-filnavnet som eneste parameter")
    else:	
        response = requests.post(api_base_url + api_auth_path, data=auth_params, headers={"code": auth_token})
        session_token = response.json()["access_token"]
        print("Fortsetter med token " + session_token)
        planners = get_planner_list_from_csv(sys.argv[1])
        ia_planner_ids = []
        for planner in planners:
            print("Oppretter Hovedansvarlig " + str(planner["firstName"]) + " " + str(planner["lastName"]))
            ia_planner_ids.append(create_ia_test_planner(session_token, planner))
        print("Opprettet " + str(len(planners)) + " i IA, bruker-ID-er i IA: " + str(ia_planner_ids))
    

CSV-filen som ble brukt i dette eksempelet var:

1234566,MSADFS,pp1,Peter,Planner,peter.planner@test.com,Organisasjonsenhet A
1234567,MSADFS,pp2,Petter,Pan,petter.pan@test.com,Organisasjonsenhet A

Formatet her er i rekkefølge: externalId, externalSystem, username, firstName, lastName, email, orgUnitName. Det ekstra feltet "roles" (nå en matrise) settes direkte i skriptet til "plan" (Hovedansvarlig), men kunne enkelt vært lagt til i CSV-filen.

Var denne artikkelen nyttig?

0 av 0 syntes dette var nyttig