Questa è la quinta procedura dettagliata della serie di procedure dettagliate sui componenti aggiuntivi di Classroom.
In questa procedura dettagliata, modificherai l'esempio del passaggio precedente per produrre un allegato di tipo attività. Si tratta di allegati che richiedono l'invio di contenuti da parte dello studente, ad esempio una risposta scritta, un quiz o un altro artefatto generato dallo studente.
È importante distinguere tra allegati di tipo contenuti e di tipo attività. Gli allegati di tipo attività differiscono da quelli di tipo contenuti nei seguenti modi:
- Nella parte in alto a destra dell'iframe della visualizzazione dello studente viene visualizzato un pulsante "Consegna".
- Forniscono un identificatore univoco per il lavoro dello studente.
- La scheda dell'allegato viene visualizzata nell'UI di valutazione di Classroom.
- Possono impostare un voto per il compito a cui appartengono.
Nella prossima procedura dettagliata verrà illustrata la valutazione. Nel corso di questa procedura dettagliata, completerai le seguenti operazioni:
- Modifica le richieste di creazione degli allegati precedenti all'API Classroom per creare un allegato di tipo attività.
- Implementa l'archiviazione permanente per i contenuti inviati dagli studenti.
- Modifica il percorso della visualizzazione dello studente precedente per accettare l'input dello studente.
- Fornisci un percorso per pubblicare l'iframe di revisione del lavoro dello studente.
Al termine, potrai creare allegati di tipo attività nei compiti tramite l'UI di Google Classroom quando hai eseguito l'accesso come insegnante. Gli studenti del corso possono anche completare l'attività nell'iframe e inviare una risposta. L'insegnante può visualizzare i contenuti inviati dallo studente nell'UI di valutazione di Classroom.
Ai fini di questo esempio, riutilizza il modello di allegato della procedura dettagliata precedente, che mostra l'immagine di un famoso monumento e una didascalia con il nome del monumento. L'attività consiste nel chiedere allo studente di fornire il nome del monumento.
Modificare la richiesta di creazione dell'allegato
Vai alla sezione del codice in cui hai creato un allegato di tipo contenuti nella procedura dettagliata precedente. L'elemento chiave è un'istanza di un
oggetto AddOnAttachment, in cui in precedenza abbiamo specificato teacherViewUri,
studentViewUri e title per l'allegato.
Sebbene tutti gli allegati dei componenti aggiuntivi richiedano questi tre campi, la presenza o
l'assenza di un studentWorkReviewUri determina se l'allegato è di tipo
attività o di tipo contenuti. Una richiesta CREATE con un studentWorkReviewUri compilato diventa un allegato di tipo attività, mentre una richiesta CREATE senza un studentWorkReviewUri diventa un allegato di tipo contenuti.
L'unica modifica da apportare a questa richiesta è compilare il campo studentWorkReviewUri. Aggiungi qui un percorso con un nome appropriato; lo implementerai in un passaggio successivo.
Python
Nell'esempio fornito, questo si trova nel metodo create_attachments del file webapp/attachment_routes.py.
attachment = {
# Specifies the route for a teacher user.
"teacherViewUri": {
"uri":
flask.url_for(
"load_activity_attachment",
_scheme='https',
_external=True),
},
# Specifies the route for a student user.
"studentViewUri": {
"uri":
flask.url_for(
"load_activity_attachment",
_scheme='https',
_external=True)
},
# Specifies the route for a teacher user when the attachment is
# loaded in the Classroom grading view.
# The presence of this field marks this as an activity-type attachment.
"studentWorkReviewUri": {
"uri":
flask.url_for(
"view_submission", _scheme='https', _external=True)
},
# The title of the attachment.
"title": f"Attachment {attachment_count}",
}
Aggiungere l'archiviazione permanente per gli allegati di tipo contenuti
Registra la risposta dello studente alla nostra attività. Potrai cercarla in un secondo momento quando l'insegnante visualizza i contenuti inviati nell'iframe di revisione del lavoro dello studente.
Configura uno schema di database per un Submission. L'esempio fornito prevede che gli studenti inseriscano il nome del monumento mostrato in un'immagine. Un Submission contiene quindi i seguenti attributi:
attachment_id: un identificatore univoco per un allegato. Assegnato da Classroom e restituito nella risposta durante la creazione di un allegato.submission_id: un identificatore per i contenuti inviati da uno studente. Assegnato da Classroom e restituito nellagetAddOnContextrisposta nella visualizzazione dello studente.
student_response: la risposta fornita dallo studente.
Python
Estendi l'implementazione di SQLite e flask_sqlalchemy dei passaggi precedenti.
Vai al file in cui hai definito le tabelle precedenti (models.py se stai seguendo l'esempio fornito). Aggiungi quanto segue nella parte inferiore del file.
# Database model to represent a student submission.
class Submission(db.Model):
# The attachmentId is the unique identifier for the attachment.
submission_id = db.Column(db.String(120), primary_key=True)
# The unique identifier for the student's submission.
attachment_id = db.Column(db.String(120), primary_key=True)
# The student's response to the question prompt.
student_response = db.Column(db.String(120))
Importa la nuova classe Submission nel file del server con i percorsi di gestione degli allegati.
Modificare il percorso della visualizzazione dello studente
Modifica quindi il percorso della visualizzazione dello studente precedente per mostrare un piccolo modulo e accettare l'input dello studente. Puoi riutilizzare la maggior parte del codice della procedura dettagliata precedente.
Individua il codice del server che fornisce il percorso per la visualizzazione dello studente. Questo è il percorso specificato nel campo studentViewUri durante la creazione di un allegato.
La prima modifica da apportare è estrarre submissionId dalla
getAddOnContext risposta.
Python
Nell'esempio fornito, questo si trova nel metodo load_activity_attachment del file webapp/attachment_routes.py.
# Issue a request to the courseWork.getAddOnContext endpoint
addon_context_response = classroom_service.courses().courseWork(
).getAddOnContext(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"]).execute()
# One of studentContext or teacherContext will be populated.
user_context = "student" if addon_context_response.get(
"studentContext") else "teacher"
# If the user is a student...
if user_context == "student":
# Extract the submissionId from the studentContext object.
# This value is provided by Google Classroom.
flask.session["submissionId"] = addon_context_response.get(
"studentContext").get("submissionId")
Potresti anche voler inviare una richiesta per ottenere lo stato dei contenuti inviati dallo studente.
La risposta contiene un valore SubmissionState, che indica stati come
se lo studente abbia aperto o consegnato l'allegato. Questa opzione può essere utile se vuoi impedire le modifiche ai contenuti inviati o se ti interessa fornire agli insegnanti informazioni sui progressi dei loro studenti:
Python
Nell'esempio fornito, questa è una continuazione del metodo load_activity_attachment sopra.
# Issue a request to get the status of the student submission.
submission_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().get(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"],
attachmentId=flask.session["attachmentId"],
submissionId=flask.session["submissionId"]).execute()
Infine, recupera le informazioni sull'allegato dal nostro database e pubblica un modulo di input. Il modulo nell'esempio fornito è costituito da un campo di immissione stringa e da un pulsante di invio. Mostra l'immagine del monumento e chiedi allo studente di inserire il suo nome. Una volta fornita una risposta, registrala nel nostro database.
Python
Nell'esempio fornito, questa è una continuazione del metodo load_activity_attachment sopra.
# Look up the attachment in the database.
attachment = Attachment.query.get(flask.session["attachmentId"])
message_str = f"I see that you're a {user_context}! "
message_str += (
f"I've loaded the attachment with ID {attachment.attachment_id}. "
if user_context == "teacher" else
"Please complete the activity below.")
form = activity_form_builder()
if form.validate_on_submit():
# Record the student's response in our database.
# Check if the student has already submitted a response.
# If so, update the response stored in the database.
student_submission = Submission.query.get(flask.session["submissionId"])
if student_submission is not None:
student_submission.student_response = form.student_response.data
else:
# Store the student's response by the submission ID.
new_submission = Submission(
submission_id=flask.session["submissionId"],
attachment_id=flask.session["attachmentId"],
student_response=form.student_response.data)
db.session.add(new_submission)
db.session.commit()
return flask.render_template(
"acknowledge-submission.html",
message="Your response has been recorded. You can close the " \
"iframe now.",
instructions="Please Turn In your assignment if you have " \
"completed all tasks."
)
# Show the activity.
return flask.render_template(
"show-activity-attachment.html",
message=message_str,
image_filename=attachment.image_filename,
image_caption=attachment.image_caption,
user_context=user_context,
form=form,
responses=response_strings)
Per distinguere gli utenti, valuta la possibilità di disattivare la funzione di invio e mostrare invece la risposta corretta nella visualizzazione dell'insegnante.
Aggiungere un percorso per l'iframe di revisione del lavoro dello studente
Infine, aggiungi un percorso per pubblicare l'iframe di revisione del lavoro dello studente. Il nome di questo percorso deve corrispondere a quello fornito per studentWorkReviewUri durante la creazione di un allegato. Questo percorso si apre quando l'insegnante visualizza i contenuti inviati dallo studente nell'UI di valutazione di Classroom.
Quando Classroom apre l'iframe di revisione del lavoro dello studente, ricevi il parametro di query submissionId. Utilizzalo per recuperare il lavoro dello studente dal database locale:
Python
Nell'esempio fornito, questo si trova nel file webapp/attachment_routes.py.
@app.route("/view-submission")
def view_submission():
"""
Render a student submission using the show-student-submission.html template.
"""
# Save the query parameters passed to the iframe in the session, just as we did
# in previous routes. Abbreviated here for readability.
add_iframe_query_parameters_to_session(flask.request.args)
# For the sake of brevity in this example, we'll skip the conditional logic
# to see if we need to authorize the user as we have done in previous steps.
# We can assume that the user that reaches this route is a teacher that has
# already authorized and created an attachment using the add-on.
# In production, we recommend fully validating the user's authorization at
# this stage as well.
# Look up the student's submission in our database.
student_submission = Submission.query.get(flask.session["submissionId"])
# Look up the attachment in the database.
attachment = Attachment.query.get(student_submission.attachment_id)
# Render the student's response alongside the correct answer.
return flask.render_template(
"show-student-submission.html",
message=f"Loaded submission {student_submission.submission_id} for "\
f"attachment {attachment.attachment_id}.",
student_response=student_submission.student_response,
correct_answer=attachment.image_caption)
Testare il componente aggiuntivo
Ripeti i passaggi per testare il componente aggiuntivo della procedura dettagliata precedente. Dovresti avere un allegato che può essere aperto dallo studente.
Completa i seguenti passaggi per testare l'allegato dell'attività:
- Accedi a Google Classroom come uno dei tuoi studenti utenti di test nello stesso corso dell'utente di test insegnante.
- Vai alla scheda Lavori del corso ed espandi il compito di test.
- Fai clic sulla scheda dell'allegato del componente aggiuntivo per aprire la visualizzazione dello studente e inviare una risposta per l'attività.
- Chiudi l'iframe dopo aver completato l'attività. (Facoltativo) Fai clic sul pulsante Consegna.
Dopo aver completato l'attività, non dovresti vedere alcuna modifica in Classroom. Ora testa l'iframe di revisione del lavoro dello studente:
- Accedi a Classroom come utente di test insegnante.
- Trova la colonna per il compito di test nella scheda Voti. Fai clic sul nome del compito di test.
- Trova la scheda dell'utente di test studente. Fai clic sull'allegato nella scheda.
Verifica che vengano visualizzati i contenuti inviati corretti per lo studente.
Complimenti! Ora puoi passare al passaggio successivo: sincronizzare i voti degli allegati.