Inizia a utilizzare le griglie

Un rubric è un modello che gli insegnanti possono utilizzare durante la valutazione dei contenuti inviati dagli studenti. L'API Classroom ti consente di agire per conto dell'insegnante per gestire queste griglie.

Visualizzazione di una griglia nell'interfaccia utente di Classroom Figura 1. Visualizzazione di una griglia di esempio su un compito di Classroom.

Questa guida illustra i concetti di base e le funzionalità dell'API Rubrics. Consulta questi articoli del Centro assistenza per informazioni sulla struttura generale di una griglia e su come avviene la valutazione della griglia nell'interfaccia utente di Classroom.

Prerequisiti

Questa guida presuppone che tu abbia:

Autorizzare le credenziali per un'applicazione desktop

Per eseguire l'autenticazione come utente finale e accedere ai dati utente nella tua app, devi creare uno o più ID client OAuth 2.0. L'ID client viene utilizzato per identificare una singola app nei server OAuth di Google. Se l'app viene eseguita su più piattaforme, devi creare un ID client separato per ogni piattaforma.

  1. Vai alla pagina Credenziali della piattaforma Google Cloud nella console Google Cloud.
  2. Fai clic su Crea credenziali > ID client OAuth.
  3. Fai clic su Tipo di applicazione > App desktop.
  4. Nel campo Nome, digita un nome per la credenziale. Questo nome viene visualizzato solo nella console Google Cloud. Ad esempio, "Client anteprima griglie".
  5. Fai clic su Crea. Viene visualizzata la schermata di creazione del client OAuth, che mostra il nuovo ID client e il client secret.
  6. Fai clic su Scarica JSON, quindi su OK. La credenziale appena creata viene visualizzata negli ID client OAuth 2.0.
  7. Salva il file JSON scaricato con il nome credentials.json e spostalo nella directory di lavoro.
  8. Fai clic su Crea credenziali > Chiave API e prendi nota della chiave API.

Per saperne di più, consulta Creare credenziali di accesso.

Configura ambiti OAuth

A seconda degli ambiti OAuth esistenti del progetto, potrebbe essere necessario configurare ambiti di aggiunta.

  1. Vai alla schermata consenso OAuth.
  2. Fai clic su Edit App (Modifica app) > Save and Continue (Salva e continua) per accedere alla schermata Ambiti.
  3. Fai clic su Aggiungi o rimuovi ambiti.
  4. Aggiungi i seguenti ambiti se non li hai già:
    • https://www.googleapis.com/auth/classroom.coursework.students
    • https://www.googleapis.com/auth/classroom.courses
  5. Fai clic su Aggiorna > Salva e continua > Salva e continua > Torna alla dashboard.

Per saperne di più, consulta Configurare la schermata per il consenso OAuth.

L'ambito classroom.coursework.students consente l'accesso in lettura e scrittura alle griglie (insieme all'accesso a CourseWork), mentre l'ambito classroom.courses consente la lettura e la scrittura dei corsi.

Gli ambiti richiesti per un determinato metodo sono elencati nella documentazione di riferimento del metodo. Vedi courses.courseWork.rubrics.create ambiti di autorizzazione come esempio. Puoi visualizzare tutti gli ambiti di Classroom in Ambiti OAuth 2.0 per le API di Google. Le griglie non sono menzionate qui perché l'API è ancora in anteprima.

Configura l'esempio

Nella directory di lavoro, installa la libreria client di Google per Python:

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Crea un file denominato main.py che crei la libreria client e autorizza l'utente, utilizzando la tua chiave API al posto di YOUR_API_KEY:

import json
import os.path

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/classroom.courses',
          'https://www.googleapis.com/auth/classroom.coursework.students']

def build_authenticated_service(api_key):
    """Builds the Classroom service."""
    creds = None
    # The file token.json stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run.
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        # Build the Classroom service.
        service = build(
            serviceName="classroom",
            version="v1",
            credentials=creds,
            discoveryServiceUrl=f"https://classroom.googleapis.com/$discovery/rest?labels=DEVELOPER_PREVIEW&key={api_key}")

        return service

    except HttpError as error:
        print('An error occurred: %s' % error)

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

Esegui lo script utilizzando python main.py. Dovresti ricevere la richiesta di accedere agli ambiti OAuth e di dare il tuo consenso.

Crea un'assegnazione

Una griglia è associata a un compito, o CourseWork, ed è significativa solo nel contesto di questo CourseWork. Le griglie possono essere create solo dal progetto Google Cloud che ha creato l'elemento CourseWork principale. Ai fini della presente guida, crea un nuovo compito CourseWork con uno script.

Aggiungi quanto segue a main.py:

def get_latest_course(service):
    """Retrieves the last created course."""
    try:
        response = service.courses().list(pageSize=1).execute()
        courses = response.get("courses", [])
        if not courses:
            print("No courses found. Did you remember to create one in the UI?")
            return
        course = courses[0]
        return course

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

def create_coursework(service, course_id):
    """Creates and returns a sample coursework."""
    try:
        coursework = {
            "title": "Romeo and Juliet analysis.",
            "description": """Write a paper arguing that Romeo and Juliet were
                                time travelers from the future.""",
            "workType": "ASSIGNMENT",
            "state": "PUBLISHED",
        }
        coursework = service.courses().courseWork().create(
            courseId=course_id, body=coursework).execute()
        return coursework

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

Ora aggiorna main.py per recuperare course_id della classe di test appena creata, creare una nuova assegnazione di esempio e recuperare l'coursework_id del compito:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    course = get_latest_course(service)
    course_id = course.get("id")
    course_name = course.get("name")
    print(f"'{course_name}' course ID: {course_id}")

    coursework = create_coursework(service, course_id)
    coursework_id = coursework.get("id")
    print(f"Assignment created with ID {coursework_id}")

    #TODO(developer): Save the printed course and coursework IDs.

Salva course_id e coursework_id. Sono necessari per tutte le operazioni CRUD delle griglie.

A questo punto dovresti avere un CourseWork di esempio in Classroom.

Visualizzazione di un compito nell'interfaccia utente di Classroom Figura 2. Visualizzazione di un compito di esempio in Classroom.

Crea una griglia

Ora puoi iniziare a gestire le griglie.

È possibile creare una griglia in un CourseWork con una chiamata a Create contenente l'oggetto completo della griglia, in cui le proprietà ID di criteri e livelli vengono omesse (vengono generate al momento della creazione).

Aggiungi la seguente funzione a main.py:

def create_rubric(service, course_id, coursework_id):
    """Creates an example rubric on a coursework."""
    try:
        body = {
            "criteria": [
                {
                    "title": "Argument",
                    "description": "How well structured your argument is.",
                    "levels": [
                        {"title": "Convincing",
                         "description": "A compelling case is made.", "points": 30},
                        {"title": "Passable",
                         "description": "Missing some evidence.", "points": 20},
                        {"title": "Needs Work",
                         "description": "Not enough strong evidence..", "points": 0},
                    ]
                },
                {
                    "title": "Spelling",
                    "description": "How well you spelled all the words.",
                    "levels": [
                        {"title": "Perfect",
                         "description": "No mistakes.", "points": 20},
                        {"title": "Great",
                         "description": "A mistake or two.", "points": 15},
                        {"title": "Needs Work",
                         "description": "Many mistakes.", "points": 5},
                    ]
                },
                {
                    "title": "Grammar",
                    "description": "How grammatically correct your sentences are.",
                    "levels": [
                        {"title": "Perfect",
                         "description": "No mistakes.", "points": 20},
                        {"title": "Great",
                         "description": "A mistake or two.", "points": 15},
                        {"title": "Needs Work",
                         "description": "Many mistakes.", "points": 5},
                    ]
                },
            ]
        }

        rubric = service.courses().courseWork().rubrics().create(
            courseId=course_id, courseWorkId=coursework_id, body=body,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
            ).execute()
        print(f"Rubric created with ID {rubric.get('id')}")
        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

Quindi aggiorna ed esegui main.py per creare la griglia di esempio, utilizzando gli ID Course e CourseWork dei precedenti:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    rubric = create_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
    print(json.dumps(rubric, indent=4))

Alcuni punti relativi alla rappresentazione della griglia:

  • L'ordine dei criteri e dei livelli si riflette nell'interfaccia utente di Classroom.
  • I livelli con punteggio (quelli con la proprietà points) devono essere ordinati per punti in ordine crescente o decrescente (non possono essere ordinati in modo casuale).
  • Gli insegnanti possono riordinare i criteri e i livelli con punteggio (ma non i livelli senza punteggio) nell'interfaccia utente; in questo modo, cambia l'ordine dei dati.

Consulta le limitazioni per ulteriori avvertenze sulla struttura delle griglie.

Tornando nell'interfaccia utente, dovresti visualizzare la griglia relativa al compito.

Visualizzazione di una griglia nell'interfaccia utente di Classroom Figura 3. Visualizzazione di una griglia di esempio su un compito di Classroom.

Leggere una griglia

Le griglie possono essere lette con i metodi List e Get standard.

Per ogni compito può esistere al massimo una griglia, quindi List può sembrare poco intuitivo, ma è utile se non hai già l'ID della griglia. Se non esistono griglie associate a CourseWork, la risposta List è vuota.

Aggiungi la seguente funzione a main.py:

def get_rubric(service, course_id, coursework_id):
    """
    Get the rubric on a coursework. There can only be at most one.
    Returns null if there is no rubric.
    """
    try:
        response = service.courses().courseWork().rubrics().list(
            courseId=course_id, courseWorkId=coursework_id,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
            ).execute()

        rubrics = response.get("rubrics", [])
        if not rubrics:
            print("No rubric found for this assignment.")
            return
        rubric = rubrics[0]
        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

Aggiorna ed esegui main.py per recuperare la griglia che hai aggiunto:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    rubric = get_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
    print(json.dumps(rubric, indent=4))

    #TODO(developer): Save the printed rubric ID.

Prendi nota della proprietà id nella griglia per i passaggi successivi.

Get funziona bene se hai l'ID griglia. L'uso di Get nella funzione invece potrebbe avere il seguente aspetto:

def get_rubric(service, course_id, coursework_id, rubric_id):
    """
    Get the rubric on a coursework. There can only be at most one.
    Returns a 404 if there is no rubric.
    """
    try:
        rubric = service.courses().courseWork().rubrics().get(
            courseId=course_id,
            courseWorkId=coursework_id,
            id=rubric_id,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).execute()

        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

Questa implementazione restituisce un errore 404 se non è presente una griglia.

Aggiornare una griglia

Gli aggiornamenti a una griglia vengono eseguiti con le chiamate a Patch. A causa della struttura complessa di una griglia, gli aggiornamenti devono essere eseguiti con un pattern di lettura, modifica e scrittura, in cui l'intera proprietà criteria viene sostituita.

Le regole di aggiornamento sono le seguenti:

  1. I criteri o i livelli aggiunti senza un ID sono considerati aggiunte.
  2. I criteri o i livelli mancanti rispetto a prima sono considerati eliminazioni.
  3. I criteri o i livelli con un ID esistente ma dati modificati sono considerati modifiche. Le proprietà non modificate vengono lasciate così come sono.
  4. I criteri o i livelli forniti con ID nuovi o sconosciuti sono considerati errori.
  5. L'ordine dei nuovi criteri e livelli è considerato il nuovo ordine dell'interfaccia utente (con le limitazioni indicate in precedenza).

Aggiungi una funzione per l'aggiornamento di una griglia:

def update_rubric(service, course_id, coursework_id, rubric_id, body):
    """
    Updates the rubric on a coursework.
    """
    try:
        rubric = service.courses().courseWork().rubrics().patch(
            courseId=course_id,
            courseWorkId=coursework_id,
            id=rubric_id,
            body=body,
            updateMask='criteria',
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).execute()

        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

In questo esempio, il campo criteria viene specificato per la modifica con un updateMask.

Quindi modifica main.py per apportare modifiche a ciascuna delle regole di aggiornamento menzionate sopra:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    # Get the latest rubric.
    rubric = get_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
    criteria = rubric.get("criteria")
    """
    The "criteria" property should look like this:
    [
        {
            "id": "NkEyMdMyMzM2Nxkw",
            "title": "Argument",
            "description": "How well structured your argument is.",
            "levels": [
                {
                    "id": "NkEyMdMyMzM2Nxkx",
                    "title": "Convincing",
                    "description": "A compelling case is made.",
                    "points": 30
                },
                {
                    "id": "NkEyMdMyMzM2Nxky",
                    "title": "Passable",
                    "description": "Missing some evidence.",
                    "points": 20
                },
                {
                    "id": "NkEyMdMyMzM2Nxkz",
                    "title": "Needs Work",
                    "description": "Not enough strong evidence..",
                    "points": 0
                }
            ]
        },
        {
            "id": "NkEyMdMyMzM2Nxk0",
            "title": "Spelling",
            "description": "How well you spelled all the words.",
            "levels": [...]
        },
        {
            "id": "NkEyMdMyMzM2Nxk4",
            "title": "Grammar",
            "description": "How grammatically correct your sentences are.",
            "levels": [...]
        }
    ]
    """

    # Make edits. This example will make one of each type of change.

    # Add a new level to the first criteria. Levels must remain sorted by
    # points.
    new_level = {
        "title": "Profound",
        "description": "Truly unique insight.",
        "points": 50
    }
    criteria[0]["levels"].insert(0, new_level)

    # Remove the last criteria.
    del criteria[-1]

    # Update the criteria titles with numeric prefixes.
    for index, criterion in enumerate(criteria):
        criterion["title"] = f"{index}: {criterion['title']}"

    # Resort the levels from descending to ascending points.
    for criterion in criteria:
        criterion["levels"].sort(key=lambda level: level["points"])

    # Update the rubric with a patch call.
    new_rubric = update_rubric(
        service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID, YOUR_RUBRIC_ID, rubric)

    print(json.dumps(new_rubric, indent=4))

Le modifiche ora dovrebbero essere applicate all'insegnante in Classroom.

Visualizzazione di una griglia aggiornata nell'interfaccia utente di Classroom Figura 4. Visualizzazione della griglia aggiornata.

Visualizza i contenuti inviati valutati tramite griglia

Per il momento, i contenuti inviati dagli studenti non possono essere valutati con una griglia dell'API, ma è possibile leggere i voti della griglia per i contributi valutati con una griglia nell'interfaccia utente di Classroom.

Come studente nell'interfaccia utente di Classroom, completa e consegni il compito di esempio. Quindi, in qualità di insegnante, valuta manualmente il compito utilizzando la griglia.

Visualizzazione di un voto della griglia nell'interfaccia utente di Classroom Figura 5. Vista degli insegnanti della griglia durante la valutazione.

I compiti inviati dagli studenti che sono stati valutati con una griglia hanno due nuove proprietà: draftRubricGrades e assignedRubricGrades, che rappresentano rispettivamente i punti e i livelli scelti dall'insegnante durante la bozza e gli stati di valutazione assegnati.

Inoltre, i contenuti inviati dagli studenti a cui è associata una griglia contengono un campo rubricId, anche prima della valutazione. Si tratta dell'ultima griglia associata a CourseWork e questo valore potrebbe cambiare se gli insegnanti eliminano e ricreano una griglia.

Puoi utilizzare i metodi studentSubmissions.Get e studentSubmissions.List esistenti per visualizzare i contenuti valutati.

Aggiungi la seguente funzione a main.py per elencare i contenuti inviati dagli studenti:

def get_latest_submission(service, course_id, coursework_id):
    """Retrieves the last submission for an assignment."""
    try:
        response = service.courses().courseWork().studentSubmissions().list(
            courseId = course_id,
            courseWorkId = coursework_id,
            pageSize=1,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).execute()
        submissions = response.get("studentSubmissions", [])
        if not submissions:
            print(
                """No submissions found. Did you remember to turn in and grade
                   the assignment in the UI?""")
            return
        submission = submissions[0]
        return submission

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

Quindi aggiorna ed esegui main.py per visualizzare i voti inviati.

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    submission = get_latest_submission(
        service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
    print(json.dumps(submission, indent=4))

draftRubricGrades e assignedRubricGrades contengono:

  • Il criterionId dei criteri della griglia corrispondenti.
  • I points assegnati dall'insegnante per ciascun criterio. Potrebbe provenire dal livello selezionato, ma anche l'insegnante potrebbe averlo sovrascritto.
  • Il levelId del livello scelto per ciascun criterio. Se l'insegnante non ha scelto un livello, ma ha comunque assegnato punti per il criterio, questo campo non sarà presente.

Questi elenchi contengono solo le voci relative ai criteri in base ai quali un insegnante ha selezionato un livello o un set point. Ad esempio, se un insegnante sceglie di interagire con un solo criterio durante la valutazione, draftRubricGrades e assignedRubricGrades avranno un solo elemento, anche se la griglia ha molti criteri.

Eliminare una griglia

Una griglia può essere eliminata con una richiesta Delete standard. Il codice seguente mostra una funzione di esempio per la completezza, ma poiché la valutazione è già iniziata, non puoi eliminare la griglia corrente:

def delete_rubric(service, course_id, coursework_id, rubric_id):
    """Deletes the rubric on a coursework."""
    try:
        service.courses().courseWork().rubrics().delete(
            courseId=course_id,
            courseWorkId=coursework_id,
            id=rubric_id,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).execute()

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

Esportare e importare le griglie

Le griglie possono essere esportate manualmente in Fogli Google per essere riutilizzate dagli insegnanti.

Oltre a specificare i criteri della griglia nel codice, è possibile creare e aggiornare le griglie da questi fogli esportati specificando sourceSpreadsheetId in un corpo della griglia anziché criteria:

def create_rubric_from_sheet(service, course_id, coursework_id, sheet_id):
    """Creates an example rubric on a coursework."""
    try:
        body = {
            "sourceSpreadsheetId": sheet_id
        }

        rubric = service.courses().courseWork().rubrics().create(
            courseId=course_id, courseWorkId=coursework_id, body=body,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
            ).execute()

        print(f"Rubric created with ID {rubric.get('id')}")
        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

Feedback

Se riscontri problemi o hai commenti da ricevere, condividi il tuo feedback.