นี่คือคำแนะนำที่ 6 ในชุดคำแนะนำเกี่ยวกับส่วนเสริมของ Classroom
ในคำแนะนำนี้ คุณจะแก้ไขตัวอย่างจากขั้นตอนคำแนะนำก่อนหน้าเพื่อสร้างไฟล์แนบประเภทกิจกรรมที่ให้คะแนน นอกจากนี้ คุณยังส่งคะแนนกลับไปยัง Google Classroom โดยใช้โปรแกรม ซึ่งจะปรากฏในสมุดพกของครูเป็นคะแนนฉบับร่าง
คำแนะนำนี้แตกต่างจากคำแนะนำอื่นๆ ในชุดเล็กน้อยตรงที่มีแนวทางที่เป็นไปได้ 2 แนวทางในการส่งคะแนนกลับไปยัง Classroom ทั้ง 2 แนวทางส่งผลกระทบที่แตกต่างกันต่อประสบการณ์ของนักพัฒนาแอปและผู้ใช้ โปรดพิจารณาทั้ง 2 แนวทางเมื่อออกแบบส่วนเสริมของ Classroom อ่านหน้าคำแนะนำการโต้ตอบกับไฟล์แนบเพื่อดูการอภิปรายเพิ่มเติมเกี่ยวกับ ตัวเลือกการใช้งาน
โปรดทราบว่าฟีเจอร์การให้คะแนนใน API เป็น ตัวเลือก ซึ่งสามารถใช้กับ ไฟล์แนบประเภทกิจกรรมใดก็ได้
ในคำแนะนำนี้ คุณจะทำสิ่งต่อไปนี้
- แก้ไขคำขอสร้างไฟล์แนบก่อนหน้าไปยัง Classroom API เพื่อตั้งค่าตัวหารของคะแนนไฟล์แนบด้วย
- ให้คะแนนงานที่นักเรียนส่งและตั้งค่าตัวเศษของคะแนนไฟล์แนบโดยใช้โปรแกรม
- ใช้ 2 แนวทางในการส่งคะแนนของงานที่ส่งไปยัง Classroom โดยใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้หรือข้อมูลเข้าสู่ระบบแบบออฟไลน์
เมื่อเสร็จแล้ว คะแนนจะปรากฏในสมุดพกของ Classroom หลังจากที่ระบบทริกเกอร์ลักษณะการทำงานของการส่งคะแนนกลับ ช่วงเวลาที่แน่นอนที่เหตุการณ์นี้เกิดขึ้นจะขึ้นอยู่กับแนวทางการใช้งาน
สำหรับตัวอย่างนี้ ให้ใช้กิจกรรมจากคำแนะนำก่อนหน้าซ้ำ ซึ่งนักเรียนจะเห็นรูปภาพของสถานที่สำคัญที่มีชื่อเสียงและได้รับข้อความแจ้งให้ป้อนชื่อ ให้คะแนนเต็มสำหรับไฟล์แนบหากนักเรียนป้อนชื่อถูกต้อง และให้คะแนน 0 หากป้อนชื่อไม่ถูกต้อง
ทำความเข้าใจฟีเจอร์การให้คะแนนของ Classroom Add-ons API
ส่วนเสริมของคุณสามารถตั้งค่าทั้งตัวเศษและตัวหารของคะแนนสำหรับไฟล์แนบ โดยตั้งค่าเหล่านี้ตามลำดับโดยใช้ค่า pointsEarned และ maxPoints ใน API การ์ดไฟล์แนบใน UI ของ Classroom จะแสดงค่า maxPoints เมื่อมีการตั้งค่า
รูปที่ 1 UI การสร้างงานที่มีการ์ดไฟล์แนบของส่วนเสริม 3 รายการซึ่งตั้งค่า maxPoints ไว้
Classroom Add-ons API ช่วยให้คุณกำหนดค่าการตั้งค่าและตั้งค่าคะแนนที่ได้รับสำหรับคะแนนไฟล์แนบ ซึ่งไม่เหมือนกับคะแนนงาน อย่างไรก็ตาม การตั้งค่าคะแนนงานจะเป็นไปตามการตั้งค่าคะแนนไฟล์แนบของไฟล์แนบที่มีป้ายกำกับการซิงค์คะแนนในการ์ดไฟล์แนบ เมื่อไฟล์แนบ "การซิงค์คะแนน" ตั้งค่า pointsEarned สำหรับงานที่นักเรียนส่ง ระบบจะตั้งค่าคะแนนฉบับร่างของนักเรียนสำหรับงานด้วย
โดยปกติแล้ว ไฟล์แนบแรกที่เพิ่มลงในงานซึ่งตั้งค่า maxPoints จะได้รับป้ายกำกับ "การซิงค์คะแนน" ดูตัวอย่าง UI การสร้างงานที่แสดงในรูปที่ 1 เพื่อดูตัวอย่างป้ายกำกับ "การซิงค์คะแนน" โปรดทราบว่าการ์ด "ไฟล์แนบ 1" มีป้ายกำกับ "การซิงค์คะแนน" และคะแนนงานในกรอบสีแดงได้รับการอัปเดตเป็น 50 คะแนน นอกจากนี้ โปรดทราบว่าแม้ว่ารูปที่ 1 จะแสดงการ์ดไฟล์แนบ 3 รายการ แต่มีเพียงการ์ดเดียวเท่านั้นที่มีป้ายกำกับ "การซิงค์คะแนน" ซึ่งเป็นข้อจำกัดที่สำคัญของการใช้งานปัจจุบัน นั่นคือ มีเพียงไฟล์แนบเดียวเท่านั้นที่มีป้ายกำกับ "การซิงค์คะแนน" ได้
หากมีไฟล์แนบหลายรายการที่ตั้งค่า maxPoints การนำ
ไฟล์แนบที่มี "การซิงค์คะแนน" จะไม่เปิดใช้ "การซิงค์คะแนน" ในไฟล์แนบที่
เหลือ การเพิ่มไฟล์แนบอื่นที่ตั้งค่า maxPoints จะเปิดใช้การซิงค์คะแนนในไฟล์แนบใหม่ และคะแนนงานสูงสุดจะปรับให้ตรงกัน ไม่มีกลไกในการดูไฟล์แนบที่มีป้ายกำกับ "การซิงค์คะแนน" โดยใช้โปรแกรม หรือดูจำนวนไฟล์แนบของงานหนึ่งๆ
ตั้งค่าคะแนนสูงสุดของไฟล์แนบ
ส่วนนี้อธิบายการตั้งค่า ตัวหาร สำหรับคะแนนไฟล์แนบ ซึ่งก็คือคะแนนสูงสุดที่เป็นไปได้ที่นักเรียนทุกคนจะได้รับสำหรับงานที่ส่ง หากต้องการทำเช่นนั้น ให้ตั้งค่า maxPoints ของไฟล์แนบ
คุณต้องทำการแก้ไขเล็กน้อยกับการใช้งานที่มีอยู่เพื่อเปิดใช้ฟีเจอร์การให้คะแนน เมื่อสร้างไฟล์แนบ ให้เพิ่มค่า maxPoints ใน
ออบเจ็กต์ AddOnAttachment เดียวกัน ที่มี studentWorkReviewUri,
teacherViewUri, และฟิลด์อื่นๆ ของไฟล์แนบ
โปรดทราบว่าคะแนนสูงสุดเริ่มต้นสำหรับงานใหม่คือ 100 คะแนน เราขอแนะนำให้ตั้งค่า maxPoints เป็นค่าอื่นที่ไม่ใช่ 100 เพื่อให้คุณยืนยันได้ว่าระบบตั้งค่าคะแนนอย่างถูกต้อง ตั้งค่า maxPoints เป็น 50 เพื่อแสดงให้เห็นดังนี้
Python
เพิ่มฟิลด์ maxPoints เมื่อสร้างออบเจ็กต์ attachment ก่อนที่จะส่งคำขอ CREATE ไปยัง
courses.courseWork.addOnAttachments ปลายทาง คุณจะพบฟิลด์นี้ในไฟล์ 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.
"studentWorkReviewUri": {
"uri":
flask.url_for(
"view_submission", _scheme='https', _external=True)
},
# Sets the maximum points that a student can earn for this activity.
# This is the denominator in a fractional representation of a grade.
"maxPoints": 50,
# The title of the attachment.
"title": f"Attachment {attachment_count}",
}
สำหรับการสาธิตนี้ ให้จัดเก็บค่า maxPoints ไว้ในฐานข้อมูลไฟล์แนบในเครื่องด้วย ซึ่งจะช่วยให้คุณไม่ต้องเรียกใช้ API เพิ่มเติมในภายหลังเมื่อให้คะแนนงานที่นักเรียนส่ง อย่างไรก็ตาม โปรดทราบว่าครูอาจเปลี่ยนการตั้งค่าคะแนนงานโดยไม่ขึ้นอยู่กับส่วนเสริมของคุณ ส่ง
คำขอ GET ไปยังปลายทาง courses.courseWork เพื่อดูค่าระดับงาน
maxPoints เมื่อดำเนินการดังกล่าว ให้ส่ง itemId ในฟิลด์ CourseWork.id
ตอนนี้ให้อัปเดตโมเดลฐานข้อมูลเพื่อเก็บค่า maxPoints ของไฟล์แนบด้วย
เราขอแนะนำให้ใช้ค่า maxPoints จากการตอบกลับ CREATE
Python
ขั้นแรก ให้เพิ่มฟิลด์ max_points ลงในตาราง Attachment คุณจะพบฟิลด์นี้ในไฟล์ webapp/models.py หากทำตามตัวอย่างที่เราให้ไว้
# Database model to represent an attachment.
class Attachment(db.Model):
# The attachmentId is the unique identifier for the attachment.
attachment_id = db.Column(db.String(120), primary_key=True)
# The image filename to store.
image_filename = db.Column(db.String(120))
# The image caption to store.
image_caption = db.Column(db.String(120))
# The maximum number of points for this activity.
max_points = db.Column(db.Integer)
กลับไปที่คำขอ CREATE ของ courses.courseWork.addOnAttachments จัดเก็บค่า maxPoints ที่แสดงในการตอบกลับ
new_attachment = Attachment(
# The new attachment's unique ID, returned in the CREATE response.
attachment_id=resp.get("id"),
image_filename=key,
image_caption=value,
# Store the maxPoints value returned in the response.
max_points=int(resp.get("maxPoints")))
db.session.add(new_attachment)
db.session.commit()
ตอนนี้ไฟล์แนบมีคะแนนสูงสุดแล้ว คุณควรทดสอบลักษณะการทำงานนี้ได้แล้ว โดยเพิ่มไฟล์แนบลงในงานใหม่ และสังเกตว่าการ์ดไฟล์แนบแสดงป้ายกำกับ "การซิงค์คะแนน" และค่า "คะแนน" ของงานมีการเปลี่ยนแปลง
ตั้งค่าคะแนนงานที่นักเรียนส่งใน Classroom
ส่วนนี้อธิบายการตั้งค่า ตัวเศษ สำหรับคะแนนไฟล์แนบ ซึ่งก็คือคะแนนของนักเรียนแต่ละคนสำหรับไฟล์แนบ หากต้องการทำเช่นนั้น ให้ตั้งค่า pointsEarned ของงานที่นักเรียนส่งสำหรับไฟล์แนบ
ตอนนี้คุณต้องตัดสินใจที่สำคัญ นั่นคือ ส่วนเสริมของคุณควรส่ง
คำขอเพื่อตั้งค่า pointsEarned อย่างไร
ปัญหาคือการตั้งค่า pointsEarned ต้องใช้ขอบเขต OAuth ของ teacher
คุณไม่ควรมอบขอบเขต teacher ให้กับผู้ใช้ที่เป็นนักเรียน เพราะอาจทำให้เกิดลักษณะการทำงานที่ไม่คาดคิดเมื่อนักเรียนโต้ตอบกับส่วนเสริมของคุณ เช่น การโหลด iframe ของมุมมองของครูแทน iframe ของมุมมองของนักเรียน ดังนั้น คุณจึงมีตัวเลือก 2 ตัวเลือกในการตั้งค่า pointsEarned ดังนี้
- ใช้ข้อมูลเข้าสู่ระบบของครูที่เข้าสู่ระบบ
- ใช้ข้อมูลเข้าสู่ระบบของครูที่จัดเก็บไว้ (แบบออฟไลน์)
ส่วนต่อไปนี้จะอธิบายข้อดีข้อเสียของแต่ละแนวทางก่อนที่จะแสดงการใช้งานแต่ละแนวทาง โปรดทราบว่าตัวอย่างที่เราให้ไว้จะแสดงแนวทาง ทั้ง 2 แนวทาง ในการส่งคะแนนไปยัง Classroom โปรดดูวิธีการเฉพาะภาษาด้านล่างเพื่อดูวิธีเลือกแนวทางเมื่อเรียกใช้ตัวอย่างที่เราให้ไว้
Python
ค้นหาการประกาศ SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS ที่ด้านบนของไฟล์ webapp/attachment_routes.py ตั้งค่านี้เป็น True เพื่อส่งคะแนนกลับโดยใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้ ตั้งค่านี้เป็น False เพื่อส่งคะแนนกลับโดยใช้ข้อมูลเข้าสู่ระบบที่จัดเก็บไว้เมื่อนักเรียนส่งกิจกรรม
ตั้งค่าคะแนนโดยใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้
ใช้ข้อมูลเข้าสู่ระบบของผู้ใช้ที่ลงชื่อเข้าใช้เพื่อส่งคำขอตั้งค่า pointsEarned
ซึ่งควรจะดูสมเหตุสมผลเนื่องจากเป็นไปในทิศทางเดียวกับการใช้งานอื่นๆ ที่ทำมาจนถึงตอนนี้ และใช้ความพยายามเพียงเล็กน้อยในการดำเนินการ
อย่างไรก็ตาม โปรดพิจารณาว่าครูจะโต้ตอบกับงานที่นักเรียนส่ง เท่านั้น ใน iframe ของการตรวจสอบงานของนักเรียน ซึ่งส่งผลกระทบที่สำคัญบางประการดังนี้
- ระบบจะไม่ป้อนคะแนนใน Classroom จนกว่าครูจะดำเนินการใน UI ของ Classroom
- ครูอาจต้องเปิดงานที่นักเรียนส่งทุกรายการเพื่อป้อนคะแนนของนักเรียนทั้งหมด
- มีระยะเวลาสั้นๆ ที่ Classroom จะได้รับคะแนนและคะแนนจะปรากฏใน UI ของ Classroom โดยปกติแล้วระยะเวลาดังกล่าวจะอยู่ที่ 5-10 วินาที แต่บางครั้งอาจนานถึง 30 วินาที
การรวมกันของปัจจัยเหล่านี้หมายความว่าครูอาจต้องทำงานด้วยตนเองจำนวนมากและใช้เวลานานเพื่อป้อนคะแนนของชั้นเรียนให้ครบถ้วน
หากต้องการใช้แนวทางนี้ ให้เพิ่มการเรียก API อีก 1 รายการลงในเส้นทางการตรวจสอบงานของนักเรียนที่มีอยู่
หลังจากดึงข้อมูลงานที่นักเรียนส่งและบันทึกไฟล์แนบแล้ว ให้ประเมินงานที่นักเรียนส่งและจัดเก็บคะแนนที่ได้ ตั้งค่าคะแนนใน
pointsEarned ฟิลด์ของออบเจ็กต์ AddOnAttachmentStudentSubmission สุดท้าย
ให้ส่งคำขอ PATCH ไปยัง
courses.courseWork.addOnAttachments.studentSubmissions ปลายทาง โดยมีอินสแตนซ์
AddOnAttachmentStudentSubmission ในเนื้อหาของคำขอ โปรดทราบว่าเราต้องระบุ pointsEarned ใน updateMask ในคำขอ PATCH ด้วย
Python
# 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)
grade = 0
# See if the student response matches the stored name.
if student_submission.student_response.lower(
) == attachment.image_caption.lower():
grade = attachment.max_points
# Create an instance of the Classroom service.
classroom_service = ch._credential_handler.get_classroom_service()
# Build an AddOnAttachmentStudentSubmission instance.
add_on_attachment_student_submission = {
# Specifies the student's score for this attachment.
"pointsEarned": grade,
}
# Issue a PATCH request to set the grade numerator for this attachment.
patch_grade_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"],
attachmentId=flask.session["attachmentId"],
submissionId=flask.session["submissionId"],
# updateMask is a list of fields being modified.
updateMask="pointsEarned",
body=add_on_attachment_student_submission).execute()
ตั้งค่าคะแนนโดยใช้ข้อมูลเข้าสู่ระบบของครูแบบออฟไลน์
แนวทางที่ 2 ในการตั้งค่าคะแนนต้องใช้ข้อมูลเข้าสู่ระบบที่จัดเก็บไว้สำหรับครูที่สร้างไฟล์แนบ การใช้งานนี้กำหนดให้คุณสร้างข้อมูลเข้าสู่ระบบโดยใช้โทเค็นการรีเฟรชและโทเค็นเพื่อการเข้าถึงของครูที่ได้รับอนุญาตก่อนหน้านี้ จากนั้นใช้ข้อมูลเข้าสู่ระบบเหล่านี้เพื่อตั้งค่า pointsEarned
ข้อดีที่สำคัญของแนวทางนี้คือ ระบบจะป้อนคะแนนโดยไม่ต้องให้ ครูดำเนินการใน UI ของ Classroom ซึ่งช่วยหลีกเลี่ยงปัญหา ที่กล่าวถึงข้างต้น ผลลัพธ์คือผู้ใช้ปลายทางจะมองว่าประสบการณ์การให้คะแนนราบรื่นและมีประสิทธิภาพ นอกจากนี้ แนวทางนี้ยังช่วยให้คุณเลือกช่วงเวลาที่จะส่งคะแนนกลับได้ เช่น เมื่อนักเรียนทำกิจกรรมเสร็จหรือแบบไม่พร้อมกัน
ทำตามงานต่อไปนี้เพื่อใช้แนวทางนี้
- แก้ไขระเบียนฐานข้อมูลผู้ใช้เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึง
- แก้ไขระเบียนฐานข้อมูลไฟล์แนบเพื่อจัดเก็บรหัสครู
- เรียกข้อมูลเข้าสู่ระบบของครูและ (ไม่บังคับ) สร้างอินสแตนซ์บริการ Classroom ใหม่
- ตั้งค่าคะแนนของงานที่ส่ง
สำหรับการสาธิตนี้ ให้ตั้งค่าคะแนนเมื่อนักเรียนทำกิจกรรมเสร็จ นั่นคือเมื่อนักเรียนส่งแบบฟอร์มในเส้นทางมุมมองของนักเรียน
แก้ไขระเบียนฐานข้อมูลผู้ใช้เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึง
คุณต้องใช้โทเค็นที่ไม่ซ้ำกัน 2 รายการเพื่อเรียกใช้ API ได้แก่ โทเค็นการรีเฟรช และโทเค็นเพื่อการเข้าถึง หากคุณทำตามชุดคำแนะนำนี้มาจนถึงตอนนี้ สคีมาตาราง
Userควรจัดเก็บโทเค็นการรีเฟรชอยู่แล้ว การจัดเก็บโทเค็นการรีเฟรชก็เพียงพอแล้วเมื่อคุณเรียกใช้ API กับผู้ใช้ที่ลงชื่อเข้าใช้เท่านั้น เนื่องจากคุณจะได้รับโทเค็นเพื่อการเข้าถึงเป็นส่วนหนึ่งของขั้นตอนการตรวจสอบสิทธิ์
อย่างไรก็ตาม ตอนนี้คุณต้องเรียกใช้ในฐานะผู้ใช้คนอื่นที่ไม่ใช่ผู้ใช้ที่ลงชื่อเข้าใช้ ซึ่งหมายความว่าขั้นตอนการตรวจสอบสิทธิ์ไม่พร้อมใช้งาน ดังนั้น คุณจึงต้องจัดเก็บโทเค็นเพื่อการเข้าถึงไว้ข้างๆ โทเค็นการรีเฟรช อัปเดตสคีมาตาราง User เพื่อรวมโทเค็นเพื่อการเข้าถึงดังนี้
Python
ในตัวอย่างที่เราให้ไว้ โค้ดนี้จะอยู่ในไฟล์ webapp/models.py
# Database model to represent a user.
class User(db.Model):
# The user's identifying information:
id = db.Column(db.String(120), primary_key=True)
display_name = db.Column(db.String(80))
email = db.Column(db.String(120), unique=True)
portrait_url = db.Column(db.Text())
# The user's refresh token, which will be used to obtain an access token.
# Note that refresh tokens will become invalid if:
# - The refresh token has not been used for six months.
# - The user revokes your app's access permissions.
# - The user changes passwords.
# - The user belongs to a Google Cloud organization
# that has session control policies in effect.
refresh_token = db.Column(db.Text())
# An access token for this user.
access_token = db.Column(db.Text())
จากนั้นให้อัปเดตโค้ดใดๆ ที่สร้างหรืออัปเดตระเบียน User เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึงด้วย
Python
ในตัวอย่างที่เราให้ไว้ โค้ดนี้จะอยู่ในไฟล์ webapp/credential_handler.py
def save_credentials_to_storage(self, credentials):
# Issue a request for the user's profile details.
user_info_service = googleapiclient.discovery.build(
serviceName="oauth2", version="v2", credentials=credentials)
user_info = user_info_service.userinfo().get().execute()
flask.session["username"] = user_info.get("name")
flask.session["login_hint"] = user_info.get("id")
# See if we have any stored credentials for this user. If they have used
# the add-on before, we should have received login_hint in the query
# parameters.
existing_user = self.get_credentials_from_storage(user_info.get("id"))
# If we do have stored credentials, update the database.
if existing_user:
if user_info:
existing_user.id = user_info.get("id")
existing_user.display_name = user_info.get("name")
existing_user.email = user_info.get("email")
existing_user.portrait_url = user_info.get("picture")
if credentials and credentials.refresh_token is not None:
existing_user.refresh_token = credentials.refresh_token
# Update the access token.
existing_user.access_token = credentials.token
# If not, this must be a new user, so add a new entry to the database.
else:
new_user = User(
id=user_info.get("id"),
display_name=user_info.get("name"),
email=user_info.get("email"),
portrait_url=user_info.get("picture"),
refresh_token=credentials.refresh_token,
# Store the access token as well.
access_token=credentials.token)
db.session.add(new_user)
db.session.commit()
แก้ไขระเบียนฐานข้อมูลไฟล์แนบเพื่อจัดเก็บรหัสครู
หากต้องการตั้งค่าคะแนนสำหรับกิจกรรม ให้เรียกใช้เพื่อตั้งค่า pointsEarned ในฐานะครูในหลักสูตร คุณทำได้หลายวิธีดังนี้
- จัดเก็บการแมปข้อมูลเข้าสู่ระบบของครูกับรหัสหลักสูตรในเครื่อง อย่างไรก็ตาม โปรดทราบว่าครูคนเดียวกันอาจไม่ได้เชื่อมโยงกับหลักสูตรหนึ่งๆ เสมอไป
- ส่งคำขอ
GETไปยังปลายทางcoursesของ Classroom API เพื่อ รับครูคนปัจจุบัน จากนั้นค้นหาระเบียนผู้ใช้ในเครื่องเพื่อค้นหาข้อมูลเข้าสู่ระบบของครูที่ตรงกัน - เมื่อสร้างไฟล์แนบของส่วนเสริม ให้จัดเก็บรหัสครูในฐานข้อมูลไฟล์แนบในเครื่อง จากนั้นเรียกข้อมูลเข้าสู่ระบบของครูจาก
attachmentIdที่ส่งไปยัง iframe ของมุมมองของนักเรียน
ตัวอย่างนี้แสดงตัวเลือกสุดท้ายเนื่องจากคุณจะตั้งค่าคะแนนเมื่อนักเรียนทำไฟล์แนบของกิจกรรมเสร็จ
เพิ่มฟิลด์รหัสครูลงในตาราง Attachment ของฐานข้อมูล
Python
ในตัวอย่างที่เราให้ไว้ โค้ดนี้จะอยู่ในไฟล์ webapp/models.py
# Database model to represent an attachment.
class Attachment(db.Model):
# The attachmentId is the unique identifier for the attachment.
attachment_id = db.Column(db.String(120), primary_key=True)
# The image filename to store.
image_filename = db.Column(db.String(120))
# The image caption to store.
image_caption = db.Column(db.String(120))
# The maximum number of points for this activity.
max_points = db.Column(db.Integer)
# The ID of the teacher that created the attachment.
teacher_id = db.Column(db.String(120))
จากนั้นให้อัปเดตโค้ดใดๆ ที่สร้างหรืออัปเดตระเบียน Attachment เพื่อจัดเก็บรหัสของผู้สร้างด้วย
Python
ในตัวอย่างที่เราให้ไว้ โค้ดนี้จะอยู่ในเมธอด create_attachments ในไฟล์ webapp/attachment_routes.py
# Store the attachment by id.
new_attachment = Attachment(
# The new attachment's unique ID, returned in the CREATE response.
attachment_id=resp.get("id"),
image_filename=key,
image_caption=value,
max_points=int(resp.get("maxPoints")),
teacher_id=flask.session["login_hint"])
db.session.add(new_attachment)
db.session.commit()
เรียกข้อมูลเข้าสู่ระบบของครู
ค้นหาเส้นทางที่แสดง iframe ของมุมมองของนักเรียน หลังจากจัดเก็บคำตอบของนักเรียนในฐานข้อมูลในเครื่องแล้ว ให้เรียกข้อมูลเข้าสู่ระบบของครูจากที่เก็บข้อมูลในเครื่องทันที ซึ่งควรทำได้ง่ายเนื่องจากคุณได้เตรียมการไว้ใน 2 ขั้นตอนก่อนหน้าแล้ว นอกจากนี้ คุณยังใช้ข้อมูลเข้าสู่ระบบเหล่านี้เพื่อสร้างอินสแตนซ์บริการ Classroom ใหม่สำหรับผู้ใช้ที่เป็นครูได้ด้วย
Python
ในตัวอย่างที่เราให้ไว้ โค้ดนี้จะอยู่ในเมธอด load_activity_attachment ในไฟล์ webapp/attachment_routes.py
# Create an instance of the Classroom service using the tokens for the
# teacher that created the attachment.
# We're assuming that there are already credentials in the session, which
# should be true given that we are adding this within the Student View
# route; we must have had valid credentials for the student to reach this
# point. The student credentials will be valid to construct a Classroom
# service for another user except for the tokens.
if not flask.session.get("credentials"):
raise ValueError(
"No credentials found in session for the requested user.")
# Make a copy of the student credentials so we don't modify the original.
teacher_credentials_dict = deepcopy(flask.session.get("credentials"))
# Retrieve the requested user's stored record.
teacher_record = User.query.get(attachment.teacher_id)
# Apply the user's tokens to the copied credentials.
teacher_credentials_dict["refresh_token"] = teacher_record.refresh_token
teacher_credentials_dict["token"] = teacher_record.access_token
# Construct a temporary credentials object.
teacher_credentials = google.oauth2.credentials.Credentials(
**teacher_credentials_dict)
# Refresh the credentials if necessary; we don't know when this teacher last
# made a call.
if teacher_credentials.expired:
teacher_credentials.refresh(Request())
# Request the Classroom service for the specified user.
teacher_classroom_service = googleapiclient.discovery.build(
serviceName=CLASSROOM_API_SERVICE_NAME,
version=CLASSROOM_API_VERSION,
credentials=teacher_credentials)
ตั้งค่าคะแนนของงานที่ส่ง
ขั้นตอนจากนี้ไปจะเหมือนกับขั้นตอนการใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้ อย่างไรก็ตาม โปรดทราบว่าคุณควรเรียกใช้ด้วยข้อมูลเข้าสู่ระบบของครูที่เรียกข้อมูลในขั้นตอนก่อนหน้า
Python
# Issue a PATCH request as the teacher to set the grade numerator for this
# attachment.
patch_grade_response = teacher_classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"],
attachmentId=flask.session["attachmentId"],
submissionId=flask.session["submissionId"],
# updateMask is a list of fields being modified.
updateMask="pointsEarned",
body=add_on_attachment_student_submission).execute()
ทดสอบส่วนเสริม
สร้างงานที่มีไฟล์แนบประเภทกิจกรรมในฐานะครู ส่งคำตอบในฐานะนักเรียน จากนั้นเปิดงานที่ส่งใน iframe ของการตรวจสอบงานของนักเรียน ซึ่งคล้ายกับคำแนะนำก่อนหน้า คุณควรจะเห็นคะแนนปรากฏขึ้นในเวลาที่ต่างกันไปตามแนวทางการใช้งานดังนี้
- หากคุณเลือกที่จะส่งคะแนนกลับเมื่อนักเรียนทำกิจกรรมเสร็จ คุณควรจะเห็นคะแนนฉบับร่างของนักเรียนใน UI แล้วก่อนที่จะเปิด iframe ของการตรวจสอบงานของนักเรียน นอกจากนี้ คุณยังเห็นคะแนนในรายการนักเรียนเมื่อเปิดงาน และในช่อง "คะแนน" ข้าง iframe ของการตรวจสอบงานของนักเรียน
- หากคุณเลือกที่จะส่งคะแนนกลับเมื่อครูเปิด iframe ของการตรวจสอบงานของนักเรียน คะแนนควรปรากฏในช่อง "คะแนน" หลังจากโหลด iframe ไม่นาน ซึ่งอาจใช้เวลาถึง 30 วินาทีตามที่ กล่าวไว้ข้างต้น หลังจากนั้น คะแนน ของนักเรียนคนดังกล่าว ควรปรากฏในมุมมองสมุดพกอื่นๆ ของ Classroom ด้วย
ยืนยันว่าคะแนนที่ถูกต้องปรากฏขึ้นสำหรับนักเรียน
ยินดีด้วย คุณพร้อมที่จะไปยังขั้นตอนถัดไปแล้ว นั่นคือ การสร้างไฟล์แนบ ภายนอก Google Classroom