Lampiran jenis aktivitas

Ini adalah panduan kelima dalam seri panduan add-on Classroom.

Dalam panduan ini, Anda akan mengubah contoh dari langkah panduan sebelumnya untuk menghasilkan lampiran jenis aktivitas . Lampiran ini adalah lampiran yang memerlukan pengiriman dari siswa, seperti respons tertulis, kuis, atau artefak lain yang dibuat siswa.

Perbedaan antara lampiran jenis konten dan jenis aktivitas sangatlah penting. Lampiran jenis aktivitas berbeda dari jenis konten dalam hal berikut:

  • Tombol "Kirim" muncul di kanan atas iframe Tampilan Siswa.
  • Mereka memberikan ID unik untuk tugas siswa.
  • Kartu lampiran mereka akan muncul di UI penilai Classroom.
  • Mereka dapat menetapkan nilai untuk tugas yang menjadi bagiannya.

Lihat panduan berikutnya untuk mengetahui diskusi tentang penilaian. Selama penelusuran ini, Anda akan menyelesaikan hal berikut:

  • Ubah permintaan pembuatan lampiran sebelumnya ke Classroom API untuk membuat lampiran jenis aktivitas.
  • Menerapkan penyimpanan persisten untuk kiriman siswa.
  • Ubah rute Tampilan Siswa sebelumnya untuk menerima input siswa.
  • Menyediakan rute untuk menayangkan iframe Peninjauan Tugas Siswa.

Setelah selesai, Anda dapat membuat lampiran jenis aktivitas pada tugas melalui UI Google Classroom saat login sebagai pengajar. Siswa di kelas juga dapat menyelesaikan aktivitas di iframe dan mengirimkan respons. Pengajar dapat melihat tugas yang dikirimkan siswa di UI penilaian Classroom.

Untuk contoh ini, gunakan kembali template lampiran dari panduan sebelumnya yang menampilkan gambar landmark terkenal dan teks dengan nama landmark tersebut. Aktivitas ini terdiri dari meminta siswa untuk memberikan nama landmark.

Ubah permintaan pembuatan lampiran

Buka bagian kode tempat Anda membuat lampiran content-type di panduan sebelumnya. Item utama di sini adalah instance objek AddOnAttachment, yang sebelumnya kita tentukan teacherViewUri, studentViewUri, dan title untuk lampiran.

Meskipun semua lampiran add-on memerlukan ketiga kolom ini, kehadiran atau ketiadaan studentWorkReviewUri menentukan apakah lampiran berjenis aktivitas atau berjenis konten. Permintaan CREATE dengan studentWorkReviewUri yang terisi akan menjadi lampiran jenis aktivitas, sedangkan permintaan CREATE tanpa studentWorkReviewUri akan menjadi lampiran jenis konten.

Satu-satunya modifikasi yang harus dilakukan pada permintaan ini adalah mengisi kolom studentWorkReviewUri. Tambahkan rute yang diberi nama dengan tepat di sini; Anda akan menerapkannya di langkah selanjutnya.

Python

Dalam contoh yang kami berikan, hal ini ada di metode create_attachments dalam 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}",
}

Menambahkan penyimpanan persisten untuk lampiran jenis konten

Merekam respons siswa terhadap aktivitas kami. Anda dapat mencarinya nanti saat pengajar melihat kiriman di iframe Peninjauan Tugas Siswa.

Menyiapkan skema database untuk Submission. Contoh yang kami berikan mengharapkan siswa memasukkan nama tempat terkenal yang ditampilkan dalam gambar. Submission oleh karena itu berisi atribut berikut:

  • attachment_id: ID unik untuk lampiran. Ditetapkan oleh Classroom dan ditampilkan dalam respons saat membuat lampiran.
  • submission_id: ID untuk kiriman siswa. Ditugaskan oleh Classroom dan ditampilkan dalam respons getAddOnContext di Tampilan Siswa.
  • student_response: Jawaban yang diberikan oleh siswa.

Python

Perluas implementasi SQLite dan flask_sqlalchemy dari langkah-langkah sebelumnya.

Buka file tempat Anda telah menentukan tabel sebelumnya (models.py jika Anda mengikuti contoh yang kami berikan). Tambahkan kode berikut di bagian bawah 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))

Impor class Submission baru ke dalam file server dengan rute penanganan lampiran Anda.

Mengubah rute Tampilan Siswa

Selanjutnya, ubah rute Tampilan Siswa sebelumnya untuk menampilkan formulir kecil dan menerima input dari siswa. Anda dapat menggunakan kembali sebagian besar kode dari panduan sebelumnya.

Temukan kode server yang menyediakan rute untuk Tampilan Siswa Anda. Ini adalah rute yang ditentukan di kolom studentViewUri saat membuat lampiran. Perubahan pertama yang harus dilakukan adalah mengekstrak submissionId dari respons getAddOnContext.

Python

Dalam contoh yang kami berikan, hal ini ada dalam metode load_activity_attachment di 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")

Anda juga dapat mengeluarkan permintaan untuk mendapatkan status kiriman siswa. Respons berisi nilai SubmissionState, yang menunjukkan status seperti apakah siswa telah membuka lampiran atau menyerahkannya. Hal ini dapat berguna jika Anda ingin melarang pengeditan pada tugas yang diserahkan, atau jika Anda tertarik untuk memberikan insight pengajar tentang progres siswa mereka:

Python

Dalam contoh yang kami berikan, ini adalah kelanjutan dari metode load_activity_attachment di atas.

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

Terakhir, ambil informasi lampiran dari database kita dan sajikan formulir input. Formulir dalam contoh yang kami berikan terdiri dari kolom input string dan tombol kirim. Tampilkan gambar landmark dan minta siswa untuk memasukkan namanya. Setelah mereka memberikan respons, catat respons tersebut dalam database kami.

Python

Dalam contoh yang kami berikan, ini adalah kelanjutan dari metode load_activity_attachment di atas.

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

Untuk membedakan pengguna, pertimbangkan untuk menonaktifkan fungsi kirim dan menampilkan jawaban yang benar di Tampilan Pengajar.

Menambahkan rute untuk iframe Peninjauan Tugas Siswa

Terakhir, tambahkan rute untuk menayangkan iframe Ulasan Tugas Siswa. Nama rute ini harus cocok dengan nama yang diberikan untuk studentWorkReviewUri saat membuat lampiran. Rute ini terbuka saat pengajar melihat tugas siswa di UI pemberi nilai Classroom.

Anda menerima parameter kueri submissionId saat Classroom membuka iframe Peninjauan Tugas Siswa. Gunakan untuk mengambil tugas siswa dari database lokal Anda:

Python

Dalam contoh yang kami berikan, hal ini ada dalam 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)

Menguji add-on

Ulangi langkah-langkah Menguji add-on dari panduan sebelumnya. Anda harus memiliki lampiran yang dapat dibuka oleh siswa.

Selesaikan langkah-langkah berikut untuk menguji lampiran aktivitas:

  • Login ke Google Classroom sebagai salah satu pengguna pengujian siswa di kelas yang sama dengan pengguna pengujian pengajar.
  • Buka tab Tugas Kelas, lalu luaskan Tugas tes.
  • Klik kartu lampiran add-on untuk membuka Tampilan Siswa dan mengirimkan respons untuk aktivitas.
  • Tutup iframe setelah menyelesaikan aktivitas. Jika ingin, klik tombol Turn In.

Anda tidak akan melihat perubahan apa pun di Classroom setelah menyelesaikan aktivitas. Sekarang, uji iframe Peninjauan Tugas Siswa:

  • Login ke Classroom sebagai pengguna pengujian pengajar.
  • Temukan kolom untuk tugas tes Anda di tab Nilai. Klik nama tugas pengujian Anda.
  • Temukan kartu untuk pengguna siswa uji. Klik lampiran pada kartu.

Pastikan kiriman yang benar muncul untuk siswa.

Selamat! Anda siap melanjutkan ke langkah berikutnya: menyelaraskan nilai lampiran.