นี่คือคำแนะนำแบบทีละขั้นที่ 6 ในส่วนเสริมของ Classroom คำแนะนำแบบทีละขั้น
ในคำแนะนำแบบทีละขั้นนี้ คุณแก้ไขตัวอย่างจากขั้นตอนคำแนะนำแบบทีละขั้นก่อนหน้านี้ เพื่อสร้างไฟล์แนบประเภทกิจกรรมที่ให้คะแนนแล้ว และคุณยังส่งคะแนนคืนด้วย Google Classroom โดยอัตโนมัติ ซึ่งจะปรากฏในระดับคะแนนของครู เป็นคะแนนคร่าวๆ
คำแนะนำแบบทีละขั้นนี้แตกต่างจากเรื่องอื่นๆ ในซีรีส์เล็กน้อยตรงที่มี นำเสนอ 2 วิธีที่เป็นไปได้ในการส่งเกรดกลับไปที่ Classroom ทั้ง 2 อย่างมีผลกระทบที่แตกต่างกันต่อนักพัฒนาแอปและผู้ใช้ ประสบการณ์ใหม่ สิ่งที่ควรพิจารณาเมื่อออกแบบส่วนเสริมของ Classroom โปรดอ่านหน้าคู่มือการโต้ตอบกับไฟล์แนบสำหรับการสนทนาเพิ่มเติมเกี่ยวกับ ตัวเลือกในการใช้งาน
โปรดทราบว่าฟีเจอร์การให้คะแนนใน API เป็นแบบไม่บังคับ โดยใช้ ไฟล์แนบประเภทกิจกรรมใดก็ได้
ในคำแนะนำแบบทีละขั้นนี้ คุณจะต้องดำเนินการต่อไปนี้ให้เสร็จสมบูรณ์
- แก้ไขคำขอสร้างไฟล์แนบก่อนหน้านี้เป็น Classroom API สามารถตั้งค่าคะแนนเต็มของไฟล์แนบได้ด้วย
- ให้คะแนนงานที่นักเรียนส่งโดยใช้โปรแกรมและตั้งค่า ตัวเศษเกรด
- ใช้ 2 วิธีเพื่อให้ผ่านการให้คะแนนการส่งงาน Classroom โดยใช้ข้อมูลเข้าสู่ระบบของครูที่มีการลงชื่อเข้าใช้หรือแบบออฟไลน์
เมื่อเสร็จสิ้นแล้ว คะแนนจะปรากฏในสมุดพกของ Classroom หลังจาก ระบบจะเรียกใช้ลักษณะการทำงานของรายการส่งคืน ช่วงเวลาที่เหตุการณ์เช่นนี้เกิดขึ้นนั้นขึ้นอยู่กับ แนวทางการนำไปใช้งาน
สำหรับวัตถุประสงค์ของตัวอย่างนี้ ให้ใช้กิจกรรมจากกิจกรรมก่อนหน้านี้ คำแนะนำแบบทีละขั้น ซึ่งนักเรียนได้เห็นภาพจุดสังเกตที่มีชื่อเสียง ข้อความแจ้งให้ป้อนชื่อ ให้คะแนนไฟล์แนบแบบเต็มหากนักเรียน ป้อนชื่อที่ถูกต้อง หรือไม่เช่นนั้น
ทำความเข้าใจฟีเจอร์การให้คะแนน API ของส่วนเสริมของ Classroom
ส่วนเสริมของคุณสามารถตั้งค่าทั้งตัวเศษคะแนนและตัวส่วนเกรดสำหรับ
ไฟล์แนบ โดยจะตั้งค่าตามลำดับโดยใช้ pointsEarned
และ maxPoints
ใน API การ์ดไฟล์แนบใน UI ของ Classroom แสดง
ค่า maxPoints
เมื่อตั้งค่าไว้
รูปที่ 1 UI การสร้างงานซึ่งมีการ์ดไฟล์แนบของส่วนเสริม 3 ใบ
ตั้งค่า maxPoints
ไว้
API ส่วนเสริมของ Classroom จะช่วยให้คุณกำหนดค่าและตั้งค่า
คะแนนที่ได้รับจากคะแนนไฟล์แนบ ซึ่งไม่เหมือนกับ
assignment ใหม่ แต่การตั้งค่าคะแนนของงานจะเป็นไปตาม
การตั้งค่าคะแนนในไฟล์แนบของไฟล์แนบที่มีป้ายกำกับการซิงค์คะแนนเปิดอยู่
การ์ดไฟล์แนบ เมื่อ "ซิงค์คะแนน" ไฟล์แนบชุด pointsEarned
สำหรับ
การส่งงานของนักเรียน และยังกำหนดคะแนนคร่าวๆ ของนักเรียนสำหรับงานดังกล่าวอีกด้วย
ปกติแล้ว ไฟล์แนบแรกที่เพิ่มในงาน ซึ่งตั้งค่า
maxPoints
จะได้รับ "การซิงค์คะแนน" ป้ายกำกับ ดู UI การสร้างงาน
ตัวอย่างที่แสดงในรูปที่ 1 ตัวอย่างของ "การซิงค์คะแนน" ป้ายกำกับ โปรดทราบว่า
"ไฟล์แนบ 1" การ์ดมี "การซิงค์คะแนน" ป้ายกำกับและคะแนนของงาน
ในช่องสีแดงได้อัปเดตเป็น 50 จุด โปรดทราบด้วยว่า แม้ว่ารูปที่ 1
แสดงการ์ดไฟล์แนบ 3 ใบ มีการ์ด "การซิงค์คะแนน" เพียงใบเดียว ป้ายกำกับ นี่คือ
ข้อจำกัดสำคัญของการติดตั้งในปัจจุบัน: ไฟล์แนบได้เพียง 1 ไฟล์เท่านั้น
"การซิงค์คะแนน" ป้ายกำกับ [label]
หากมีไฟล์แนบหลายรายการที่ตั้งค่า 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 มุมมองของนักเรียน ดังนั้นคุณมี
ตัวเลือกสำหรับวิธีตั้งค่า 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
- กำหนดคะแนนของงาน
สำหรับการสาธิตนี้ ให้ตั้งค่าคะแนนเมื่อนักเรียนเสร็จสิ้น กิจกรรม กล่าวคือ เมื่อนักเรียนส่งแบบฟอร์มในมุมมองของนักเรียน เส้นทาง
แก้ไขระเบียนฐานข้อมูลผู้ใช้เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึง
การเรียก API ต้องใช้โทเค็นที่ไม่ซ้ำกัน 2 รายการ ได้แก่ โทเค็นการรีเฟรช
โทเค็นเพื่อการเข้าถึง หากคุณติดตามดูชุดคำแนะนำแบบทีละขั้นมาก่อนหน้านี้
สคีมาของตาราง 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