Ini adalah panduan kelima di add-on Classroom seri panduan kami.
Dalam panduan ini, Anda akan mengubah contoh dari langkah panduan sebelumnya untuk membuat lampiran jenis aktivitas. Ini adalah setiap lampiran yang memerlukan kiriman siswa, seperti respons tertulis, kuis, atau artefak buatan siswa.
Perbedaan antara lampiran jenis konten dan jenis aktivitas itu penting. Lampiran jenis aktivitas berbeda dengan jenis konten dalam hal berikut:
- "Serahkan" muncul di kanan atas iframe Tampilan Siswa.
- Keduanya memberikan ID unik untuk tugas siswa.
- Kartu lampiran siswa akan muncul di UI penilai Classroom.
- Mereka dapat menetapkan nilai untuk tugas mereka.
Lihat panduan berikutnya untuk diskusi tentang penilaian. Selama program ini panduan, Anda menyelesaikan hal berikut:
- Ubah permintaan pembuatan lampiran sebelumnya ke Classroom API untuk membuat lampiran jenis aktivitas.
- Terapkan penyimpanan persisten untuk kiriman siswa.
- Ubah rute Tampilan Siswa sebelumnya untuk menerima masukan dari siswa.
- Berikan rute untuk menayangkan iframe Ulasan Tugas Siswa.
Setelah selesai, Anda dapat membuat lampiran jenis aktivitas pada tugas melalui UI Google Classroom saat login sebagai pengajar. Siswa di kelas dapat menyelesaikan aktivitas di iframe dan mengirimkan jawaban. Pengajar dapat melihat kiriman siswa di UI penilaian Classroom.
Untuk tujuan contoh ini, gunakan kembali {i>template<i} lampiran dari panduan sebelumnya yang menampilkan gambar bangunan terkenal dan teks dengan nama tempat terkenal tersebut. Kegiatan ini terdiri dari meminta siswa untuk berikan nama tempat terkenal tersebut.
Mengubah permintaan pembuatan lampiran
Buka bagian kode tempat Anda membuat jenis konten
lampiran di dalam panduan sebelumnya. Item utama di sini adalah instance
Objek AddOnLampiran, yang sebelumnya telah kita tentukan teacherViewUri
,
studentViewUri
, dan title
untuk lampiran.
Meskipun semua lampiran add-on memerlukan tiga kolom ini, adanya atau
ketiadaan studentWorkReviewUri
menentukan apakah lampiran
activity-type atau content-type. Permintaan CREATE
dengan kolom terisi
studentWorkReviewUri
menjadi lampiran jenis aktivitas, sedangkan CREATE
permintaan tanpa studentWorkReviewUri
akan menjadi lampiran jenis konten.
Satu-satunya perubahan yang dilakukan pada permintaan ini adalah mengisi
Kolom studentWorkReviewUri
. Tambahkan nama rute yang sesuai di sini; Anda
menerapkannya di
langkah selanjutnya.
Python
Dalam contoh yang kami berikan, ini ada dalam metode create_attachments
di
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
Rekam respons siswa terhadap aktivitas kita. Anda dapat mencarinya nanti saat pengajar melihat kiriman di iframe Ulasan Tugas Siswa.
Menyiapkan skema database untuk Submission
. Contoh yang kami berikan mengharapkan
siswa memasukkan nama tempat terkenal yang ditampilkan dalam gambar. Submission
sehingga mengandung atribut berikut:
attachment_id
: ID unik untuk lampiran. Ditugaskan oleh Classroom dan dimunculkan dalam respons saat membuat lampiran.submission_id
: ID untuk kiriman siswa. Ditugaskan oleh Classroom dan ditampilkan di responsgetAddOnContext
di Tampilan Siswa.
student_response
: Jawaban yang diberikan oleh siswa.
Python
Memperluas implementasi SQLite dan flask_sqlalchemy
dari langkah sebelumnya.
Navigasikan ke {i>file<i} tempat Anda 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 file server dengan lampiran Anda
rute yang sangat spesifik.
Mengubah rute Tampilan Siswa
Berikutnya, ubah rute Tampilan Siswa sebelumnya untuk menampilkan formulir kecil dan menerima input dari siswa. Anda dapat menggunakan kembali sebagian besar kode dari panduan kami.
Temukan kode server yang menyediakan rute untuk Tampilan Siswa. Ini adalah
rute yang ditentukan di kolom studentViewUri
saat membuat lampiran.
Perubahan pertama yang harus dilakukan adalah mengekstrak submissionId
dari
getAddOnContext
respons.
Python
Dalam contoh yang kami berikan, 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")
Sebaiknya Anda juga mengajukan permintaan untuk mendapatkan status kiriman siswa.
Respons berisi nilai SubmissionState
, yang menunjukkan status seperti
seperti apakah siswa telah membuka lampiran atau menyerahkannya. Mungkin ini adalah
berguna jika Anda ingin melarang pengeditan pada kiriman yang telah diserahkan, atau jika Anda
tertarik untuk memberikan insight pengajar tentang kemampuan siswa progres:
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 berikan input formulir. Formulir dalam contoh yang kami berikan terdiri dari isian {i>input <i}string dan sebuah tombol kirim. Tampilkan gambar tempat terkenal dan minta siswa 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 antarpengguna, pertimbangkan untuk menonaktifkan fitur pengiriman dan menampilkan jawaban yang benar dalam Tampilan Pengajar.
Menambahkan rute untuk iframe Ulasan Tugas Siswa
Terakhir, tambahkan rute untuk menayangkan iframe Ulasan Tugas Siswa. Nama layanan
rute harus cocok dengan yang diberikan untuk studentWorkReviewUri
saat membuat
lampiran. Rute ini akan terbuka saat pengajar melihat kiriman siswa di
UI penilai Classroom.
Anda menerima parameter kueri submissionId
saat Classroom
membuka iframe Ulasan Tugas Siswa. Gunakan untuk mengambil tugas siswa dari
{i>database<i} lokal Anda:
Python
Dalam contoh yang kami berikan, nilainya 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 Menguji langkah-langkah add-on dari panduan sebelumnya. Anda seharusnya memiliki lampiran yang dapat dibuka oleh siswa.
Selesaikan langkah-langkah berikut untuk menguji lampiran aktivitas:
- Login ke Google Classroom sebagai salah satu siswa menguji pengguna di kelas yang sama dengan pengguna uji coba pengajar.
- Pilih tab Tugas Kelas dan luaskan Tugas pengujian.
- Klik kartu lampiran add-on untuk membuka Tampilan Siswa dan mengirimkan respons untuk aktivitas tersebut.
- Tutup iframe setelah menyelesaikan aktivitas. Atau, klik tombol Turn Tombol In.
Anda tidak akan melihat perubahan apa pun di Classroom setelah menyelesaikan melakukan aktivitas tersebut. Sekarang uji iframe Ulasan Tugas Siswa:
- Login ke Classroom sebagai pengguna uji coba pengajar.
- Temukan kolom untuk tugas ujian Anda di tab Nilai. Klik nama tugas pengujian Anda.
- Temukan kartu untuk pengguna siswa yang mengikuti ujian. Klik lampiran pada kartu.
Pastikan bahwa kiriman yang benar muncul untuk siswa.
Selamat! Anda siap untuk melanjutkan ke langkah berikutnya: menyinkronkan lampiran kelas.