Pièces jointes liées à l'activité

Il s'agit du cinquième tutoriel des modules complémentaires Classroom cette série de tutoriels.

Dans ce tutoriel, vous allez modifier l'exemple de l'étape précédente. pour générer un rattachement de type activité. Il s'agit des pièces jointes qui exiger la soumission d'un élève, sous la forme d'une réponse écrite, d'un questionnaire ou généré par les élèves.

La distinction entre les pièces jointes type de contenu et type d'activité est importante. Les pièces jointes de type activité diffèrent du type de contenu de la manière suivante:

  • La question "Rendre" apparaît en haut à droite de l'iFrame Vue élève.
  • Ils permettent d'identifier de manière unique les devoirs des élèves.
  • La fiche de la pièce jointe s'affiche dans l'interface utilisateur de l'outil de notation de Classroom.
  • Ils peuvent attribuer une note au devoir auquel ils appartiennent.

Pour en savoir plus sur la notation, consultez le tutoriel suivant. Au cours de ce vous allez effectuer les opérations suivantes:

  • Remplacez les précédentes demandes de création de pièces jointes par API Classroom pour créer un rattachement de type activité.
  • Mettre en place un stockage persistant pour les devoirs des élèves
  • Modifiez l'itinéraire précédent pour la vue élève afin d'accepter les entrées des élèves.
  • Indiquez un itinéraire pour diffuser l'iFrame de révision des devoirs des élèves.

Une fois que vous avez terminé, vous pouvez créer des pièces jointes de type d’activité aux devoirs via l'interface utilisateur de Google Classroom lorsque vous êtes connecté en tant qu'enseignant. Les élèves de la classe peuvent terminer l'activité dans l'iFrame et envoyer une réponse. L'enseignant peut afficher le travail de l'élève dans l'interface de notation de Classroom ;

Pour les besoins de cet exemple, réutilisez le modèle de pièce jointe du Visite guidée précédente qui montre une image d'un site célèbre et une légende avec le nom du point de repère. L'activité consiste à inviter l'élève à indiquez le nom du point de repère.

Modifier la demande de création de pièce jointe

Accédez à la section de votre code dans laquelle vous avez créé un élément content-type dans le tutoriel précédent. L'élément clé ici est une instance L'objet AddOnAttachment dans lequel nous avons précédemment spécifié le paramètre teacherViewUri, studentViewUri et title pour la pièce jointe.

Bien que ces trois champs soient obligatoires pour toutes les pièces jointes de module complémentaire, la présence ou l'absence de studentWorkReviewUri détermine si le rattachement est activity-type ou content-type. Une requête CREATE avec studentWorkReviewUri devient une pièce jointe de type activité, tandis qu'un CREATE devient une pièce jointe de type activité. sans studentWorkReviewUri devient une pièce jointe de type contenu.

La seule modification à apporter à cette requête consiste à renseigner le champ studentWorkReviewUri. Ajoutez un itinéraire avec un nom approprié ici. vous pour l'implémenter ultérieurement.

Python

Dans l'exemple fourni, elle se trouve dans la méthode create_attachments du 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}",
}

Ajouter un espace de stockage persistant pour les pièces jointes liées au type de contenu

Enregistrez sa réponse à notre activité. Vous pourrez le consulter ultérieurement, lorsque L'enseignant voit le devoir dans l'iFrame de révision des devoirs des élèves.

Configurez un schéma de base de données pour un Submission. Dans l'exemple fourni, aux élèves de saisir le nom du point de repère affiché sur une image. Submission contient donc les attributs suivants:

  • attachment_id: identifiant unique d'un rattachement. Attribué par Classroom et est renvoyé dans la réponse lors de la création d'une en pièce jointe.
  • submission_id: identifiant associé au travail d'un élève. Attribué par Classroom et renvoyé dans la réponse getAddOnContext dans la vue élève.
  • student_response: réponse fournie par l'élève.

Python

Étendez l'implémentation de SQLite et flask_sqlalchemy des étapes précédentes.

Accédez au fichier dans lequel vous avez défini les tables précédentes. (models.py si vous suivez l'exemple fourni). Ajoutez le code suivant à l'adresse au bas du fichier.

# 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))

Importez la nouvelle classe Submission dans le fichier serveur contenant votre pièce jointe. de gestion des routes.

Modifier le parcours de la vue élève

Ensuite, modifiez l'itinéraire précédent dans la vue élève pour afficher un petit formulaire et l'accepter. les commentaires de l'élève. Vous pouvez réutiliser la plus grande partie du code de ce tutoriel.

Recherchez le code du serveur qui fournit l'itinéraire pour la vue élève. C'est la route spécifiée dans le champ studentViewUri lors de la création d'un rattachement. La première modification à apporter consiste à extraire submissionId du Réponse getAddOnContext.

Python

Dans l'exemple fourni, elle se trouve dans la méthode load_activity_attachment de le fichier 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")

Vous pouvez également envoyer une demande pour connaître l'état du devoir remis par un élève. La réponse contient une valeur SubmissionState, qui indique des états tels que par exemple si l'élève a ouvert ou remis la pièce jointe. Il peut s'agir utile si vous voulez interdire les modifications d'un devoir remis ou si vous qui souhaitent fournir aux enseignants des informations sur les besoins de leurs élèves progression:

Python

Dans l'exemple que nous avons fourni, ceci fait suite à la load_activity_attachment ci-dessus.

# 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()

Enfin, extrayez les informations de la pièce jointe de notre base de données et diffusez une entrée . Dans l'exemple que nous avons fourni, le formulaire se compose d'un champ de saisie de type chaîne et d'un Envoyer. Montrez l'image du point de repère et invitez l'élève à saisir son nom. Une fois leur réponse reçue, enregistrez-la dans notre base de données.

Python

Dans l'exemple que nous avons fourni, ceci fait suite à la load_activity_attachment ci-dessus.

# 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)

Afin de différencier les utilisateurs, envisagez de désactiver l'envoi et afficher à la place la bonne réponse dans la vue "Enseignant".

Ajouter une route pour l'iFrame d'évaluation des devoirs des élèves

Enfin, ajoutez un itinéraire pour diffuser l'iFrame de révision des devoirs des élèves. Le nom de ce doit correspondre à celle fournie pour studentWorkReviewUri lors de la création une pièce jointe. Ce chemin s'ouvre lorsque l'enseignant consulte le devoir de l'élève dans l'UI de l'outil de notation de Classroom.

Vous recevez le paramètre de requête submissionId lorsque Classroom ouvre l'iFrame de révision des devoirs des élèves. Utilisez-le pour récupérer le travail de l'élève dans votre base de données locale:

Python

Dans l'exemple fourni, elle se trouve dans le fichier 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)

Tester le module complémentaire

Répétez les étapes du module complémentaire Tester les étapes du module complémentaire du tutoriel précédent. Vous devez avoir une pièce jointe qui peut être ouverte par l'élève.

Pour tester la pièce jointe de l'activité, procédez comme suit:

  • Connectez-vous à Google Classroom. comme l'une des utilisateurs de test d'élève dans la même classe que l'utilisateur test de l'enseignant.
  • Accédez à l'onglet Travaux et devoirs et développez le devoir test.
  • Cliquez sur la fiche de pièce jointe du module complémentaire pour ouvrir la vue Élève et envoyer une pour l'activité.
  • Fermez l'iFrame une fois l'activité terminée. Vous pouvez également cliquer sur le bouton d'entrée.

Vous ne devriez constater aucun changement dans Classroom une fois que vous aurez terminé l'activité. À présent, testez l'iFrame de révision des devoirs des élèves:

  • Connectez-vous à Classroom en tant qu'utilisateur test enseignant.
  • Recherchez la colonne correspondant à votre devoir de test dans l'onglet Notes. Cliquez sur l'icône le nom de votre test.
  • Recherchez la fiche de l'élève test. Cliquez sur la pièce jointe de la fiche.

Vérifiez que le devoir correct s'affiche pour l'élève.

Félicitations ! Vous êtes prêt à passer à l'étape suivante: synchroniser la pièce jointe. notes.