API-kodexempel

  • Uppdaterad

Exempelscenario med Python för att skapa en tenta och tilldela studenter

Nedan finns ett Python-kodklipp som skapar en tenta och tilldelar några studenter. Skriptet läser client_id, autentiseringstoken och API-URL från miljövariabler (environment variables). För lokal testning kan du även hårdkoda dessa på rad 7–10. Exemplet läser studentinformation från en CSV-fil som anges som den enda kommandoradsparametern till skriptet. Detta kan naturligtvis ersättas av data från en databas, integrationsplattform eller liknande – användningen av CSV här är endast för demonstrationssyfte (faktum är att för CSV-import kan du helt enkelt använda det vanliga användargränssnittet i Inspera Assessment för att importera studenter). Exemplet visar hur man ställer in extra tid per student, samt anger byggnad och rum för varje student.

Det bör noteras att IA API även stöder att skicka med studenterna samtidigt som tentan skapas, men för att demonstrera API:erna används två anrop (utöver steget för att generera sessionstoken) i exemplet nedan. Detaljerna för HTTP-anropen hanteras via det utmärkta biblioteket "requests".

  1. import requests
    import os
    import csv
    import sys
    
    # Detta måste ersättas manuellt med en giltig auth-token och client-id om miljövariabler inte är inställda
    auth_token = os.environ['IA_ACCESS_TOKEN']
    client_id = os.environ['IA_CLIENT_ID']
    # Denna har vanligtvis formen https://<domän>.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 ersätts av testId innan URL:en används
    
    # Detta blir det externa ID:t för tentan som skapas
    ext_test_id = "externalTest123456789"
    
    # Detta blir namnet på tentan som skapas
    test_name = "UNSW API testing test updated";
    
    def get_student_list_from_csv(csv_file_name):
        """Hjälpfunktion för att hämta en lista över studenter från en lokal CSV-fil.
           Detta skulle kunna vara data från din databas/integrationsplattform."""
        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):
        """Hjälpfunktion som skapar en tenta i IA med givet (externt) id och namn,
           genom att använda Inspera API med sessionstoken."""
        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):
        """Hjälpfunktion som tilldelar listan med studenter till en tenta i IA baserat på tentans 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("Skapar en tenta i IA och hämtar studenter från CSV...")
    if not len(sys.argv) == 2:
        print("Vänligen ange CSV-filnamnet som enda parameter till skriptet")
    else:	
        session_token = requests.post(api_base_url + api_auth_path, data = auth_params, headers={"code": auth_token}).json()["access_token"]
        print("Fortsätter 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("Kommer att tilldela studenter till tenta " + str(ia_test_id))
        students = get_student_list_from_csv(sys.argv[1])
        assign_candidates(session_token, ia_test_id, students)
        print("Tilldelade " + str(len(students)) + " studenter till tenta " + str(ia_test_id))
    

CSV-filen som användes i detta exempel var:

12345,Byggnad 1,Rum 101,extId12345,0
12346,Byggnad 1,Rum 101,extId12346,30

(Exemplet ovan uppdaterades till Python 3.8 den 29 maj 2020. Om du av någon anledning önskar versionen för Python 2.7, kontakta din kontaktperson.)

Exempelscenario med Python för att skapa två Huvudansvariga (administratörer)

Nedan finns ett Python-kodklipp som skapar två Huvudansvariga med hjälp av Users API. Det läser client_id, autentiseringstoken och rot-API-URL från miljövariabler. För lokal testning kan du även hårdkoda dessa på rad 9–12. Exemplet läser information om de Huvudansvariga från en CSV-fil som anges som parameter. Detta kan naturligtvis ersättas av data från en databas eller liknande – användningen av CSV här är endast för demo. Exemplet visar hur man ställer in organisatorisk enhet (t.ex. skola eller institution) för varje användare – vilket i sin tur kan användas för att ställa in rollbaserade behörigheter i IA.

  1. import requests
    import os
    import csv
    import sys
    
    # Detta exempel skapar några Huvudansvariga från 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):
        """Hjälpfunktion för att hämta en lista över Huvudansvariga från 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):
        """Hjälpfunktion som skapar en Huvudansvarig i IA med de givna värdena."""
        create_planner_params = planner
        # Roller är nu en matris (array) som ersätter den gamla "role"
        planner["roles"] = ["plan"]; # "evaluate", "plan", "author" stöds
        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("Skapar Huvudansvariga i IA från CSV...")
    if not len(sys.argv) == 2:
        print("Vänligen ange CSV-filnamnet som enda 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("Fortsätter med token " + session_token)
        planners = get_planner_list_from_csv(sys.argv[1])
        ia_planner_ids = []
        for planner in planners:
            print("Skapar Huvudansvarig " + str(planner["firstName"]) + " " + str(planner["lastName"]))
            ia_planner_ids.append(create_ia_test_planner(session_token, planner))
        print("Skapade " + str(len(planners)) + " i IA, användar-ID:n i IA: " + str(ia_planner_ids))
    

CSV-filen som användes i detta exempel var:

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

Formatet här är i ordning: externalId, externalSystem, username, firstName, lastName, email, orgUnitName. Det extra fältet "roles" (nu en matris) sätts direkt i skriptet till "plan" (Huvudansvarig), men skulle enkelt kunna ha lagts till i CSV-filen.

Var denna artikel till hjälp?

0 av 0 tyckte detta var till hjälp