นี่คือคำแนะนำทีละขั้นตอนที่ 5 ในชุดคำแนะนำทีละขั้นตอนเกี่ยวกับส่วนเสริมของ Classroom
ในคำแนะนำทีละขั้นตอนนี้ คุณจะแก้ไขตัวอย่างจากขั้นตอนคำแนะนำทีละขั้นตอนก่อนหน้าเพื่อสร้างไฟล์แนบประเภทกิจกรรม ซึ่งเป็นไฟล์แนบที่ต้องให้นักเรียนส่งงาน เช่น คำตอบที่เป็นข้อความ แบบทดสอบ หรือสิ่งประดิษฐ์อื่นๆ ที่นักเรียนสร้างขึ้น
ความแตกต่างระหว่างไฟล์แนบประเภทเนื้อหากับประเภทกิจกรรมมีความสำคัญ ไฟล์แนบประเภทกิจกรรมแตกต่างจากประเภทเนื้อหาในลักษณะต่อไปนี้
- ปุ่ม "ส่ง" จะปรากฏที่ด้านขวาบนของ iframe ของมุมมองของนักเรียน
- ไฟล์แนบประเภทกิจกรรมมีตัวระบุที่ไม่ซ้ำกันสำหรับงานของนักเรียน
- การ์ดไฟล์แนบจะปรากฏใน UI ของเครื่องมือให้คะแนนของ Classroom
- ไฟล์แนบประเภทกิจกรรมสามารถกำหนดคะแนนสำหรับงานที่ไฟล์แนบนั้นเป็นของได้
ดูการสนทนาเกี่ยวกับการให้คะแนนได้ในคำแนะนำทีละขั้นตอนถัดไป ในคำแนะนำทีละขั้นตอนนี้ คุณจะทำสิ่งต่อไปนี้
- แก้ไขคำขอสร้างไฟล์แนบก่อนหน้าไปยัง Classroom API เพื่อสร้างไฟล์แนบประเภทกิจกรรม
- ใช้พื้นที่เก็บข้อมูลแบบถาวรสำหรับงานที่นักเรียนส่ง
- แก้ไขเส้นทางของมุมมองของนักเรียนก่อนหน้าเพื่อยอมรับข้อมูลจากนักเรียน
- ระบุเส้นทางเพื่อแสดง iframe ของการตรวจงานของนักเรียน
เมื่อเสร็จแล้ว คุณจะสร้างไฟล์แนบประเภทกิจกรรมในงานผ่าน UI ของ Google Classroom ได้เมื่อเข้าสู่ระบบในฐานะครู นอกจากนี้ นักเรียนในชั้นเรียนยังทำกิจกรรมใน iframe และส่งคำตอบได้ด้วย ครูจะดูงานที่นักเรียนส่งได้ใน UI การให้คะแนนของ Classroom
สำหรับตัวอย่างนี้ ให้ใช้เทมเพลตไฟล์แนบจากคำแนะนำทีละขั้นตอนก่อนหน้าซ้ำ ซึ่งแสดงรูปภาพของจุดสังเกตที่มีชื่อเสียงและคำบรรยายพร้อมชื่อจุดสังเกต กิจกรรมประกอบด้วยการแจ้งให้นักเรียนระบุชื่อจุดสังเกต
แก้ไขคำขอสร้างไฟล์แนบ
ไปที่ส่วนของโค้ดที่คุณสร้างไฟล์แนบประเภทเนื้อหาในคำแนะนำทีละขั้นตอนก่อนหน้า รายการสำคัญที่นี่คืออินสแตนซ์ของ
ออบเจ็กต์ AddOnAttachment ซึ่งก่อนหน้านี้เราได้ระบุ teacherViewUri,
studentViewUri และ title สำหรับไฟล์แนบ
แม้ว่าไฟล์แนบของส่วนเสริมทั้งหมดจะต้องมี 3 ช่องนี้ แต่การมีหรือ
ไม่มี studentWorkReviewUri จะเป็นตัวกำหนดว่าไฟล์แนบเป็น
ประเภทกิจกรรมหรือประเภทเนื้อหา คำขอ CREATE ที่มี studentWorkReviewUri ที่ป้อนข้อมูลแล้วจะกลายเป็นไฟล์แนบประเภทกิจกรรม ในขณะที่คำขอ CREATE ที่ไม่มี studentWorkReviewUri จะกลายเป็นไฟล์แนบประเภทเนื้อหา
การแก้ไขเพียงอย่างเดียวที่ต้องทำกับคำขอนี้คือการป้อนข้อมูลในช่อง studentWorkReviewUri เพิ่มเส้นทางที่มีชื่อเหมาะสมที่นี่ แล้วคุณจะใช้เส้นทางนี้ในขั้นตอนต่อๆ ไป
Python
ในตัวอย่างที่เราให้ไว้ เส้นทางนี้จะอยู่ในเมธอด create_attachments ในไฟล์ 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}",
}
เพิ่มพื้นที่เก็บข้อมูลถาวรสำหรับไฟล์แนบประเภทเนื้อหา
บันทึกคำตอบของนักเรียนสำหรับกิจกรรมของเรา คุณสามารถค้นหาคำตอบได้ในภายหลังเมื่อครูดูงานที่ส่งใน iframe ของการตรวจงานของนักเรียน
ตั้งค่าสคีมาฐานข้อมูลสำหรับ Submission ตัวอย่างที่เราให้ไว้คาดหวังให้นักเรียนป้อนชื่อจุดสังเกตที่แสดงในรูปภาพ ดังนั้น Submission จึงมีแอตทริบิวต์ต่อไปนี้
attachment_id: ตัวระบุที่ไม่ซ้ำกันสำหรับไฟล์แนบ ซึ่ง Classroom จะกำหนดและส่งคืนในคำตอบเมื่อสร้างไฟล์แนบsubmission_id: ตัวระบุสำหรับงานที่นักเรียนส่ง ซึ่ง Classroom จะกำหนดและส่งคืนในคำตอบgetAddOnContextresponse ใน มุมมองของนักเรียน
student_response: คำตอบที่นักเรียนให้ไว้
Python
ขยายการใช้งาน SQLite และ flask_sqlalchemy จากขั้นตอนก่อนหน้า
ไปที่ไฟล์ที่คุณกำหนดตารางก่อนหน้า (models.py หากคุณทำตามตัวอย่างที่เราให้ไว้) เพิ่มโค้ดต่อไปนี้ที่ด้านล่างของไฟล์
# 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))
นำเข้าคลาส Submission ใหม่ลงในไฟล์เซิร์ฟเวอร์ที่มีเส้นทางการจัดการไฟล์แนบ
แก้ไขเส้นทางของมุมมองของนักเรียน
จากนั้นแก้ไขเส้นทางของมุมมองของนักเรียนก่อนหน้าเพื่อแสดงแบบฟอร์มขนาดเล็กและยอมรับข้อมูลจากนักเรียน คุณสามารถใช้โค้ดส่วนใหญ่จากคำแนะนำทีละขั้นตอนก่อนหน้าซ้ำได้
ค้นหาโค้ดเซิร์ฟเวอร์ที่ระบุเส้นทางสำหรับมุมมองของนักเรียน ซึ่งเป็นเส้นทางที่ระบุไว้ในช่อง studentViewUri เมื่อสร้างไฟล์แนบ
การเปลี่ยนแปลงแรกที่ต้องทำคือการแยก submissionId ออกจาก
getAddOnContext response
Python
ในตัวอย่างที่เราให้ไว้ เส้นทางนี้จะอยู่ในเมธอด load_activity_attachment ในไฟล์ 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")
นอกจากนี้ คุณอาจต้องการส่งคำขอเพื่อรับสถานะงานที่นักเรียนส่ง
คำตอบจะมีค่า SubmissionState ซึ่งระบุสถานะต่างๆ เช่น นักเรียนนักศึกษาเปิดไฟล์แนบแล้วหรือยัง หรือส่งไฟล์แนบแล้วหรือยัง ข้อมูลนี้อาจมีประโยชน์หากคุณต้องการไม่อนุญาตให้แก้ไขงานที่ส่งแล้ว หรือหากคุณต้องการให้ข้อมูลเชิงลึกแก่ครูเกี่ยวกับความคืบหน้าของนักเรียน
Python
ในตัวอย่างที่เราให้ไว้ นี่คือส่วนต่อขยายของเมธอด load_activity_attachment ด้านบน
# 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()
สุดท้าย ให้ดึงข้อมูลไฟล์แนบจากฐานข้อมูลของเราและแสดงแบบฟอร์มข้อมูล แบบฟอร์มในตัวอย่างที่เราให้ไว้ประกอบด้วยช่องป้อนข้อมูลสตริงและปุ่มส่ง แสดงรูปภาพจุดสังเกตและแจ้งให้นักเรียนป้อนชื่อ เมื่อนักเรียนให้คำตอบแล้ว ให้บันทึกคำตอบนั้นลงในฐานข้อมูลของเรา
Python
ในตัวอย่างที่เราให้ไว้ นี่คือส่วนต่อขยายของเมธอด load_activity_attachment ด้านบน
# 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)
หากต้องการแยกความแตกต่างระหว่างผู้ใช้ ให้ลองปิดใช้ฟังก์ชันส่งและแสดงคำตอบที่ถูกต้องในมุมมองของครูแทน
เพิ่มเส้นทางสำหรับ iframe ของการตรวจงานของนักเรียน
สุดท้าย ให้เพิ่มเส้นทางเพื่อแสดง iframe ของการตรวจงานของนักเรียน ชื่อเส้นทางนี้ควรตรงกับชื่อที่ระบุไว้สำหรับ studentWorkReviewUri เมื่อสร้างไฟล์แนบ เส้นทางนี้จะเปิดขึ้นเมื่อครูดูงานที่นักเรียนส่งใน UI ของเครื่องมือให้คะแนนของ Classroom
คุณจะได้รับพารามิเตอร์การค้นหา submissionId เมื่อ Classroom เปิด iframe ของการตรวจงานของนักเรียน ใช้พารามิเตอร์นี้เพื่อดึงงานของนักเรียนจากฐานข้อมูลในเครื่อง
Python
ในตัวอย่างที่เราให้ไว้ เส้นทางนี้จะอยู่ในไฟล์ 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)
ทดสอบส่วนเสริม
ทำซ้ำขั้นตอนทดสอบส่วนเสริมจากคำแนะนำทีละขั้นตอนก่อนหน้า คุณควรมีไฟล์แนบที่นักเรียนเปิดได้
ทำตามขั้นตอนต่อไปนี้เพื่อทดสอบไฟล์แนบกิจกรรม
- ลงชื่อเข้าใช้ Google Classroom ในฐานะผู้ใช้ทดสอบ นักเรียนนักศึกษาคนใดคนหนึ่งในชั้นเรียนเดียวกับผู้ใช้ทดสอบที่เป็นครู
- ไปที่แท็บงานของชั้นเรียน แล้วขยายงาน ที่ทดสอบ
- คลิกการ์ดไฟล์แนบของส่วนเสริม เพื่อเปิดมุมมองของนักเรียนและส่งคำตอบสำหรับกิจกรรม
- ปิด iframe หลังจากทำกิจกรรมเสร็จแล้ว หรือจะคลิกปุ่มส่ง ก็ได้
คุณไม่ควรเห็นการเปลี่ยนแปลงใดๆ ใน Classroom หลังจากทำกิจกรรมเสร็จแล้ว ตอนนี้ให้ทดสอบ iframe ของการตรวจงานของนักเรียน
- ลงชื่อเข้าใช้ Classroom ในฐานะผู้ใช้ทดสอบที่เป็น ครู
- ค้นหาคอลัมน์สำหรับงานทดสอบในแท็บคะแนน คลิกชื่องานทดสอบ
- ค้นหาการ์ดสำหรับผู้ใช้ทดสอบที่เป็นนักเรียน คลิกไฟล์แนบในการ์ด
ยืนยันว่างานที่ส่งที่ถูกต้องปรากฏขึ้นสำหรับนักเรียน
ยินดีด้วย คุณพร้อมที่จะไปยังขั้นตอนถัดไปแล้ว นั่นคือการซิงค์คะแนนไฟล์แนบ